--- a/.hgtags-top-repo Thu Oct 16 12:01:56 2014 -0700
+++ b/.hgtags-top-repo Wed Jul 05 20:04:29 2017 +0200
@@ -277,3 +277,4 @@
7e3512dae8e020d44399c0f1c579ff1fe3090ed6 jdk9-b32
e4ba01b726e263953ae129be37c94de6ed145b1d jdk9-b33
087b23f35631e68e950496a36fce8ccca612966a jdk9-b34
+c173ba994245380fb11ef077d1e59823386840eb jdk9-b35
--- a/hotspot/.hgtags Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/.hgtags Wed Jul 05 20:04:29 2017 +0200
@@ -437,3 +437,4 @@
af46576a8d7cb4003028b8ee8bf408cfe227315b jdk9-b32
9b3f5e4f33725f7c1d9b8e523133fe8383a54d9f jdk9-b33
821164b0131a47ca065697c7d27d8f215e608c8d jdk9-b34
+438cb613151c4bd290bb732697517cba1cafcb04 jdk9-b35
--- a/hotspot/make/aix/makefiles/fastdebug.make Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/make/aix/makefiles/fastdebug.make Wed Jul 05 20:04:29 2017 +0200
@@ -67,7 +67,6 @@
# not justified.
LFLAGS_QIPA=
-G_SUFFIX = _g
VERSION = optimized
SYSDEFS += -DASSERT -DFASTDEBUG
PICFLAGS = DEFAULT
--- a/hotspot/make/aix/makefiles/mapfile-vers-debug Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/make/aix/makefiles/mapfile-vers-debug Wed Jul 05 20:04:29 2017 +0200
@@ -84,6 +84,7 @@
JVM_EnableCompiler;
JVM_Exit;
JVM_FillInStackTrace;
+ JVM_FindClassFromCaller;
JVM_FindClassFromClass;
JVM_FindClassFromClassLoader;
JVM_FindClassFromBootLoader;
@@ -117,7 +118,6 @@
JVM_GetClassDeclaredMethods;
JVM_GetClassFieldsCount;
JVM_GetClassInterfaces;
- JVM_GetClassLoader;
JVM_GetClassMethodsCount;
JVM_GetClassModifiers;
JVM_GetClassName;
--- a/hotspot/make/aix/makefiles/mapfile-vers-product Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/make/aix/makefiles/mapfile-vers-product Wed Jul 05 20:04:29 2017 +0200
@@ -84,6 +84,7 @@
JVM_EnableCompiler;
JVM_Exit;
JVM_FillInStackTrace;
+ JVM_FindClassFromCaller;
JVM_FindClassFromClass;
JVM_FindClassFromClassLoader;
JVM_FindClassFromBootLoader;
@@ -117,7 +118,6 @@
JVM_GetClassDeclaredMethods;
JVM_GetClassFieldsCount;
JVM_GetClassInterfaces;
- JVM_GetClassLoader;
JVM_GetClassMethodsCount;
JVM_GetClassModifiers;
JVM_GetClassName;
--- a/hotspot/make/bsd/makefiles/mapfile-vers-darwin-debug Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/make/bsd/makefiles/mapfile-vers-darwin-debug Wed Jul 05 20:04:29 2017 +0200
@@ -82,6 +82,7 @@
_JVM_EnableCompiler
_JVM_Exit
_JVM_FillInStackTrace
+ _JVM_FindClassFromCaller
_JVM_FindClassFromClass
_JVM_FindClassFromClassLoader
_JVM_FindClassFromBootLoader
@@ -115,7 +116,6 @@
_JVM_GetClassDeclaredMethods
_JVM_GetClassFieldsCount
_JVM_GetClassInterfaces
- _JVM_GetClassLoader
_JVM_GetClassMethodsCount
_JVM_GetClassModifiers
_JVM_GetClassName
--- a/hotspot/make/bsd/makefiles/mapfile-vers-darwin-product Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/make/bsd/makefiles/mapfile-vers-darwin-product Wed Jul 05 20:04:29 2017 +0200
@@ -82,6 +82,7 @@
_JVM_EnableCompiler
_JVM_Exit
_JVM_FillInStackTrace
+ _JVM_FindClassFromCaller
_JVM_FindClassFromClass
_JVM_FindClassFromClassLoader
_JVM_FindClassFromBootLoader
@@ -115,7 +116,6 @@
_JVM_GetClassDeclaredMethods
_JVM_GetClassFieldsCount
_JVM_GetClassInterfaces
- _JVM_GetClassLoader
_JVM_GetClassMethodsCount
_JVM_GetClassModifiers
_JVM_GetClassName
--- a/hotspot/make/bsd/makefiles/mapfile-vers-debug Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/make/bsd/makefiles/mapfile-vers-debug Wed Jul 05 20:04:29 2017 +0200
@@ -84,6 +84,7 @@
JVM_EnableCompiler;
JVM_Exit;
JVM_FillInStackTrace;
+ JVM_FindClassFromCaller;
JVM_FindClassFromClass;
JVM_FindClassFromClassLoader;
JVM_FindClassFromBootLoader;
@@ -117,7 +118,6 @@
JVM_GetClassDeclaredMethods;
JVM_GetClassFieldsCount;
JVM_GetClassInterfaces;
- JVM_GetClassLoader;
JVM_GetClassMethodsCount;
JVM_GetClassModifiers;
JVM_GetClassName;
--- a/hotspot/make/bsd/makefiles/mapfile-vers-product Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/make/bsd/makefiles/mapfile-vers-product Wed Jul 05 20:04:29 2017 +0200
@@ -84,6 +84,7 @@
JVM_EnableCompiler;
JVM_Exit;
JVM_FillInStackTrace;
+ JVM_FindClassFromCaller;
JVM_FindClassFromClass;
JVM_FindClassFromClassLoader;
JVM_FindClassFromBootLoader;
@@ -117,7 +118,6 @@
JVM_GetClassDeclaredMethods;
JVM_GetClassFieldsCount;
JVM_GetClassInterfaces;
- JVM_GetClassLoader;
JVM_GetClassMethodsCount;
JVM_GetClassModifiers;
JVM_GetClassName;
--- a/hotspot/make/linux/makefiles/mapfile-vers-debug Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/make/linux/makefiles/mapfile-vers-debug Wed Jul 05 20:04:29 2017 +0200
@@ -84,6 +84,7 @@
JVM_EnableCompiler;
JVM_Exit;
JVM_FillInStackTrace;
+ JVM_FindClassFromCaller;
JVM_FindClassFromClass;
JVM_FindClassFromClassLoader;
JVM_FindClassFromBootLoader;
@@ -117,7 +118,6 @@
JVM_GetClassDeclaredMethods;
JVM_GetClassFieldsCount;
JVM_GetClassInterfaces;
- JVM_GetClassLoader;
JVM_GetClassMethodsCount;
JVM_GetClassModifiers;
JVM_GetClassName;
--- a/hotspot/make/linux/makefiles/mapfile-vers-product Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/make/linux/makefiles/mapfile-vers-product Wed Jul 05 20:04:29 2017 +0200
@@ -84,6 +84,7 @@
JVM_EnableCompiler;
JVM_Exit;
JVM_FillInStackTrace;
+ JVM_FindClassFromCaller;
JVM_FindClassFromClass;
JVM_FindClassFromClassLoader;
JVM_FindClassFromBootLoader;
@@ -117,7 +118,6 @@
JVM_GetClassDeclaredMethods;
JVM_GetClassFieldsCount;
JVM_GetClassInterfaces;
- JVM_GetClassLoader;
JVM_GetClassMethodsCount;
JVM_GetClassModifiers;
JVM_GetClassName;
--- a/hotspot/make/solaris/makefiles/mapfile-vers Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/make/solaris/makefiles/mapfile-vers Wed Jul 05 20:04:29 2017 +0200
@@ -84,6 +84,7 @@
JVM_EnableCompiler;
JVM_Exit;
JVM_FillInStackTrace;
+ JVM_FindClassFromCaller;
JVM_FindClassFromClass;
JVM_FindClassFromClassLoader;
JVM_FindClassFromBootLoader;
@@ -117,7 +118,6 @@
JVM_GetClassDeclaredMethods;
JVM_GetClassFieldsCount;
JVM_GetClassInterfaces;
- JVM_GetClassLoader;
JVM_GetClassMethodsCount;
JVM_GetClassModifiers;
JVM_GetClassName;
--- a/hotspot/src/cpu/ppc/vm/assembler_ppc.hpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/cpu/ppc/vm/assembler_ppc.hpp Wed Jul 05 20:04:29 2017 +0200
@@ -268,8 +268,35 @@
ISEL_OPCODE = (31u << OPCODE_SHIFT | 15u << 1),
- MTLR_OPCODE = (31u << OPCODE_SHIFT | 467u << 1 | 8 << SPR_0_4_SHIFT),
- MFLR_OPCODE = (31u << OPCODE_SHIFT | 339u << 1 | 8 << SPR_0_4_SHIFT),
+ // Special purpose registers
+ MTSPR_OPCODE = (31u << OPCODE_SHIFT | 467u << 1),
+ MFSPR_OPCODE = (31u << OPCODE_SHIFT | 339u << 1),
+
+ MTXER_OPCODE = (MTSPR_OPCODE | 1 << SPR_0_4_SHIFT),
+ MFXER_OPCODE = (MFSPR_OPCODE | 1 << SPR_0_4_SHIFT),
+
+ MTDSCR_OPCODE = (MTSPR_OPCODE | 3 << SPR_0_4_SHIFT),
+ MFDSCR_OPCODE = (MFSPR_OPCODE | 3 << SPR_0_4_SHIFT),
+
+ MTLR_OPCODE = (MTSPR_OPCODE | 8 << SPR_0_4_SHIFT),
+ MFLR_OPCODE = (MFSPR_OPCODE | 8 << SPR_0_4_SHIFT),
+
+ MTCTR_OPCODE = (MTSPR_OPCODE | 9 << SPR_0_4_SHIFT),
+ MFCTR_OPCODE = (MFSPR_OPCODE | 9 << SPR_0_4_SHIFT),
+
+ MTTFHAR_OPCODE = (MTSPR_OPCODE | 128 << SPR_0_4_SHIFT),
+ MFTFHAR_OPCODE = (MFSPR_OPCODE | 128 << SPR_0_4_SHIFT),
+ MTTFIAR_OPCODE = (MTSPR_OPCODE | 129 << SPR_0_4_SHIFT),
+ MFTFIAR_OPCODE = (MFSPR_OPCODE | 129 << SPR_0_4_SHIFT),
+ MTTEXASR_OPCODE = (MTSPR_OPCODE | 130 << SPR_0_4_SHIFT),
+ MFTEXASR_OPCODE = (MFSPR_OPCODE | 130 << SPR_0_4_SHIFT),
+ MTTEXASRU_OPCODE = (MTSPR_OPCODE | 131 << SPR_0_4_SHIFT),
+ MFTEXASRU_OPCODE = (MFSPR_OPCODE | 131 << SPR_0_4_SHIFT),
+
+ MTVRSAVE_OPCODE = (MTSPR_OPCODE | 256 << SPR_0_4_SHIFT),
+ MFVRSAVE_OPCODE = (MFSPR_OPCODE | 256 << SPR_0_4_SHIFT),
+
+ MFTB_OPCODE = (MFSPR_OPCODE | 268 << SPR_0_4_SHIFT),
MTCRF_OPCODE = (31u << OPCODE_SHIFT | 144u << 1),
MFCR_OPCODE = (31u << OPCODE_SHIFT | 19u << 1),
@@ -291,9 +318,6 @@
// CTR-related opcodes
BCCTR_OPCODE = (19u << OPCODE_SHIFT | 528u << 1),
- MTCTR_OPCODE = (31u << OPCODE_SHIFT | 467u << 1 | 9 << SPR_0_4_SHIFT),
- MFCTR_OPCODE = (31u << OPCODE_SHIFT | 339u << 1 | 9 << SPR_0_4_SHIFT),
-
LWZ_OPCODE = (32u << OPCODE_SHIFT),
LWZX_OPCODE = (31u << OPCODE_SHIFT | 23u << 1),
@@ -585,6 +609,37 @@
MTVSCR_OPCODE = (4u << OPCODE_SHIFT | 1604u ),
MFVSCR_OPCODE = (4u << OPCODE_SHIFT | 1540u ),
+ // AES (introduced with Power 8)
+ VCIPHER_OPCODE = (4u << OPCODE_SHIFT | 1288u),
+ VCIPHERLAST_OPCODE = (4u << OPCODE_SHIFT | 1289u),
+ VNCIPHER_OPCODE = (4u << OPCODE_SHIFT | 1352u),
+ VNCIPHERLAST_OPCODE = (4u << OPCODE_SHIFT | 1353u),
+ VSBOX_OPCODE = (4u << OPCODE_SHIFT | 1480u),
+
+ // SHA (introduced with Power 8)
+ VSHASIGMAD_OPCODE = (4u << OPCODE_SHIFT | 1730u),
+ VSHASIGMAW_OPCODE = (4u << OPCODE_SHIFT | 1666u),
+
+ // Vector Binary Polynomial Multiplication (introduced with Power 8)
+ VPMSUMB_OPCODE = (4u << OPCODE_SHIFT | 1032u),
+ VPMSUMD_OPCODE = (4u << OPCODE_SHIFT | 1224u),
+ VPMSUMH_OPCODE = (4u << OPCODE_SHIFT | 1096u),
+ VPMSUMW_OPCODE = (4u << OPCODE_SHIFT | 1160u),
+
+ // Vector Permute and Xor (introduced with Power 8)
+ VPERMXOR_OPCODE = (4u << OPCODE_SHIFT | 45u),
+
+ // Transactional Memory instructions (introduced with Power 8)
+ TBEGIN_OPCODE = (31u << OPCODE_SHIFT | 654u << 1),
+ TEND_OPCODE = (31u << OPCODE_SHIFT | 686u << 1),
+ TABORT_OPCODE = (31u << OPCODE_SHIFT | 910u << 1),
+ TABORTWC_OPCODE = (31u << OPCODE_SHIFT | 782u << 1),
+ TABORTWCI_OPCODE = (31u << OPCODE_SHIFT | 846u << 1),
+ TABORTDC_OPCODE = (31u << OPCODE_SHIFT | 814u << 1),
+ TABORTDCI_OPCODE = (31u << OPCODE_SHIFT | 878u << 1),
+ TSR_OPCODE = (31u << OPCODE_SHIFT | 750u << 1),
+ TCHECK_OPCODE = (31u << OPCODE_SHIFT | 718u << 1),
+
// Icache and dcache related instructions
DCBA_OPCODE = (31u << OPCODE_SHIFT | 758u << 1),
DCBZ_OPCODE = (31u << OPCODE_SHIFT | 1014u << 1),
@@ -1420,6 +1475,25 @@
inline void mcrf( ConditionRegister crd, ConditionRegister cra);
inline void mtcr( Register s);
+ // Special purpose registers
+ // Exception Register
+ inline void mtxer(Register s1);
+ inline void mfxer(Register d);
+ // Vector Register Save Register
+ inline void mtvrsave(Register s1);
+ inline void mfvrsave(Register d);
+ // Timebase
+ inline void mftb(Register d);
+ // Introduced with Power 8:
+ // Data Stream Control Register
+ inline void mtdscr(Register s1);
+ inline void mfdscr(Register d );
+ // Transactional Memory Registers
+ inline void mftfhar(Register d);
+ inline void mftfiar(Register d);
+ inline void mftexasr(Register d);
+ inline void mftexasru(Register d);
+
// PPC 1, section 2.4.1 Branch Instructions
inline void b( address a, relocInfo::relocType rt = relocInfo::none);
inline void b( Label& L);
@@ -1860,6 +1934,39 @@
inline void mtvscr( VectorRegister b);
inline void mfvscr( VectorRegister d);
+ // AES (introduced with Power 8)
+ inline void vcipher( VectorRegister d, VectorRegister a, VectorRegister b);
+ inline void vcipherlast( VectorRegister d, VectorRegister a, VectorRegister b);
+ inline void vncipher( VectorRegister d, VectorRegister a, VectorRegister b);
+ inline void vncipherlast(VectorRegister d, VectorRegister a, VectorRegister b);
+ inline void vsbox( VectorRegister d, VectorRegister a);
+
+ // SHA (introduced with Power 8)
+ // Not yet implemented.
+
+ // Vector Binary Polynomial Multiplication (introduced with Power 8)
+ inline void vpmsumb( VectorRegister d, VectorRegister a, VectorRegister b);
+ inline void vpmsumd( VectorRegister d, VectorRegister a, VectorRegister b);
+ inline void vpmsumh( VectorRegister d, VectorRegister a, VectorRegister b);
+ inline void vpmsumw( VectorRegister d, VectorRegister a, VectorRegister b);
+
+ // Vector Permute and Xor (introduced with Power 8)
+ inline void vpermxor( VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c);
+
+ // Transactional Memory instructions (introduced with Power 8)
+ inline void tbegin_(); // R=0
+ inline void tbeginrot_(); // R=1 Rollback-Only Transaction
+ inline void tend_(); // A=0
+ inline void tendall_(); // A=1
+ inline void tabort_(Register a);
+ inline void tabortwc_(int t, Register a, Register b);
+ inline void tabortwci_(int t, Register a, int si);
+ inline void tabortdc_(int t, Register a, Register b);
+ inline void tabortdci_(int t, Register a, int si);
+ inline void tsuspend_(); // tsr with L=0
+ inline void tresume_(); // tsr with L=1
+ inline void tcheck(int f);
+
// The following encoders use r0 as second operand. These instructions
// read r0 as '0'.
inline void lwzx( Register d, Register s2);
--- a/hotspot/src/cpu/ppc/vm/assembler_ppc.inline.hpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/cpu/ppc/vm/assembler_ppc.inline.hpp Wed Jul 05 20:04:29 2017 +0200
@@ -312,6 +312,25 @@
{ emit_int32(MCRF_OPCODE | bf(crd) | bfa(cra)); }
inline void Assembler::mtcr( Register s) { Assembler::mtcrf(0xff, s); }
+// Special purpose registers
+// Exception Register
+inline void Assembler::mtxer(Register s1) { emit_int32(MTXER_OPCODE | rs(s1)); }
+inline void Assembler::mfxer(Register d ) { emit_int32(MFXER_OPCODE | rt(d)); }
+// Vector Register Save Register
+inline void Assembler::mtvrsave(Register s1) { emit_int32(MTVRSAVE_OPCODE | rs(s1)); }
+inline void Assembler::mfvrsave(Register d ) { emit_int32(MFVRSAVE_OPCODE | rt(d)); }
+// Timebase
+inline void Assembler::mftb(Register d ) { emit_int32(MFTB_OPCODE | rt(d)); }
+// Introduced with Power 8:
+// Data Stream Control Register
+inline void Assembler::mtdscr(Register s1) { emit_int32(MTDSCR_OPCODE | rs(s1)); }
+inline void Assembler::mfdscr(Register d ) { emit_int32(MFDSCR_OPCODE | rt(d)); }
+// Transactional Memory Registers
+inline void Assembler::mftfhar(Register d ) { emit_int32(MFTFHAR_OPCODE | rt(d)); }
+inline void Assembler::mftfiar(Register d ) { emit_int32(MFTFIAR_OPCODE | rt(d)); }
+inline void Assembler::mftexasr(Register d ) { emit_int32(MFTEXASR_OPCODE | rt(d)); }
+inline void Assembler::mftexasru(Register d ) { emit_int32(MFTEXASRU_OPCODE | rt(d)); }
+
// SAP JVM 2006-02-13 PPC branch instruction.
// PPC 1, section 2.4.1 Branch Instructions
inline void Assembler::b( address a, relocInfo::relocType rt) { emit_data(BXX_OPCODE| li(disp( intptr_t(a), intptr_t(pc()))) |aa(0)|lk(0), rt); }
@@ -735,6 +754,39 @@
inline void Assembler::mtvscr( VectorRegister b) { emit_int32( MTVSCR_OPCODE | vrb(b)); }
inline void Assembler::mfvscr( VectorRegister d) { emit_int32( MFVSCR_OPCODE | vrt(d)); }
+// AES (introduced with Power 8)
+inline void Assembler::vcipher( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VCIPHER_OPCODE | vrt(d) | vra(a) | vrb(b)); }
+inline void Assembler::vcipherlast( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VCIPHERLAST_OPCODE | vrt(d) | vra(a) | vrb(b)); }
+inline void Assembler::vncipher( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VNCIPHER_OPCODE | vrt(d) | vra(a) | vrb(b)); }
+inline void Assembler::vncipherlast(VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VNCIPHERLAST_OPCODE | vrt(d) | vra(a) | vrb(b)); }
+inline void Assembler::vsbox( VectorRegister d, VectorRegister a) { emit_int32( VSBOX_OPCODE | vrt(d) | vra(a) ); }
+
+// SHA (introduced with Power 8)
+// Not yet implemented.
+
+// Vector Binary Polynomial Multiplication (introduced with Power 8)
+inline void Assembler::vpmsumb( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VPMSUMB_OPCODE | vrt(d) | vra(a) | vrb(b)); }
+inline void Assembler::vpmsumd( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VPMSUMD_OPCODE | vrt(d) | vra(a) | vrb(b)); }
+inline void Assembler::vpmsumh( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VPMSUMH_OPCODE | vrt(d) | vra(a) | vrb(b)); }
+inline void Assembler::vpmsumw( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VPMSUMW_OPCODE | vrt(d) | vra(a) | vrb(b)); }
+
+// Vector Permute and Xor (introduced with Power 8)
+inline void Assembler::vpermxor( VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c) { emit_int32( VPMSUMW_OPCODE | vrt(d) | vra(a) | vrb(b) | vrc(c)); }
+
+// Transactional Memory instructions (introduced with Power 8)
+inline void Assembler::tbegin_() { emit_int32( TBEGIN_OPCODE | rc(1)); }
+inline void Assembler::tbeginrot_() { emit_int32( TBEGIN_OPCODE | /*R=1*/ 1u << (31-10) | rc(1)); }
+inline void Assembler::tend_() { emit_int32( TEND_OPCODE | rc(1)); }
+inline void Assembler::tendall_() { emit_int32( TEND_OPCODE | /*A=1*/ 1u << (31-6) | rc(1)); }
+inline void Assembler::tabort_(Register a) { emit_int32( TABORT_OPCODE | ra(a) | rc(1)); }
+inline void Assembler::tabortwc_(int t, Register a, Register b) { emit_int32( TABORTWC_OPCODE | to(t) | ra(a) | rb(b) | rc(1)); }
+inline void Assembler::tabortwci_(int t, Register a, int si) { emit_int32( TABORTWCI_OPCODE | to(t) | ra(a) | sh1620(si) | rc(1)); }
+inline void Assembler::tabortdc_(int t, Register a, Register b) { emit_int32( TABORTDC_OPCODE | to(t) | ra(a) | rb(b) | rc(1)); }
+inline void Assembler::tabortdci_(int t, Register a, int si) { emit_int32( TABORTDCI_OPCODE | to(t) | ra(a) | sh1620(si) | rc(1)); }
+inline void Assembler::tsuspend_() { emit_int32( TSR_OPCODE | rc(1)); }
+inline void Assembler::tresume_() { emit_int32( TSR_OPCODE | /*L=1*/ 1u << (31-10) | rc(1)); }
+inline void Assembler::tcheck(int f) { emit_int32( TCHECK_OPCODE | bf(f)); }
+
// ra0 version
inline void Assembler::lwzx( Register d, Register s2) { emit_int32( LWZX_OPCODE | rt(d) | rb(s2));}
inline void Assembler::lwz( Register d, int si16 ) { emit_int32( LWZ_OPCODE | rt(d) | d1(si16));}
--- a/hotspot/src/cpu/ppc/vm/globalDefinitions_ppc.hpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/cpu/ppc/vm/globalDefinitions_ppc.hpp Wed Jul 05 20:04:29 2017 +0200
@@ -37,6 +37,8 @@
// signatures accordingly.
const bool CCallingConventionRequiresIntsAsLongs = true;
+#define SUPPORTS_NATIVE_CX8
+
// The PPC CPUs are NOT multiple-copy-atomic.
#define CPU_NOT_MULTIPLE_COPY_ATOMIC
--- a/hotspot/src/cpu/ppc/vm/interp_masm_ppc_64.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/cpu/ppc/vm/interp_masm_ppc_64.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -25,7 +25,6 @@
#include "precompiled.hpp"
-#include "asm/assembler.hpp"
#include "asm/macroAssembler.inline.hpp"
#include "interp_masm_ppc_64.hpp"
#include "interpreter/interpreterRuntime.hpp"
--- a/hotspot/src/cpu/ppc/vm/interpreter_ppc.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/cpu/ppc/vm/interpreter_ppc.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -24,7 +24,6 @@
*/
#include "precompiled.hpp"
-#include "asm/assembler.hpp"
#include "asm/macroAssembler.inline.hpp"
#include "interpreter/bytecodeHistogram.hpp"
#include "interpreter/interpreter.hpp"
--- a/hotspot/src/cpu/ppc/vm/macroAssembler_ppc.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/cpu/ppc/vm/macroAssembler_ppc.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -2366,7 +2366,7 @@
#endif // INCLUDE_ALL_GCS
// Values for last_Java_pc, and last_Java_sp must comply to the rules
-// in frame_ppc64.hpp.
+// in frame_ppc.hpp.
void MacroAssembler::set_last_Java_frame(Register last_Java_sp, Register last_Java_pc) {
// Always set last_Java_pc and flags first because once last_Java_sp
// is visible has_last_Java_frame is true and users will look at the
@@ -2493,6 +2493,7 @@
}
void MacroAssembler::decode_klass_not_null(Register dst, Register src) {
+ assert(dst != R0, "Dst reg may not be R0, as R0 is used here.");
if (src == noreg) src = dst;
Register shifted_src = src;
if (Universe::narrow_klass_shift() != 0 ||
@@ -2527,14 +2528,11 @@
void MacroAssembler::reinit_heapbase(Register d, Register tmp) {
if (Universe::heap() != NULL) {
- if (Universe::narrow_oop_base() == NULL) {
- Assembler::xorr(R30, R30, R30);
- } else {
- load_const(R30, Universe::narrow_ptrs_base(), tmp);
- }
+ load_const_optimized(R30, Universe::narrow_ptrs_base(), tmp);
} else {
- load_const(R30, Universe::narrow_ptrs_base_addr(), tmp);
- ld(R30, 0, R30);
+ // Heap not yet allocated. Load indirectly.
+ int simm16_offset = load_const_optimized(R30, Universe::narrow_ptrs_base_addr(), tmp, true);
+ ld(R30, simm16_offset, R30);
}
}
--- a/hotspot/src/cpu/ppc/vm/ppc.ad Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/cpu/ppc/vm/ppc.ad Wed Jul 05 20:04:29 2017 +0200
@@ -1249,6 +1249,7 @@
// Emit the trampoline stub which will be related to the branch-and-link below.
CallStubImpl::emit_trampoline_stub(_masm, entry_point_toc_offset, offsets.insts_call_instruction_offset);
+ if (Compile::current()->env()->failing()) { return offsets; } // Code cache may be full.
__ relocate(rtype);
}
@@ -1410,7 +1411,7 @@
while (bang_offset <= bang_end) {
// Need at least one stack bang at end of shadow zone.
- // Again I had to copy code, this time from assembler_ppc64.cpp,
+ // Again I had to copy code, this time from assembler_ppc.cpp,
// bang_stack_with_offset - see there for comments.
// Stack grows down, caller passes positive offset.
@@ -2000,7 +2001,7 @@
// Inline_cache contains a klass.
Register ic_klass = as_Register(Matcher::inline_cache_reg_encode());
- Register receiver_klass = R0; // tmp
+ Register receiver_klass = R12_scratch2; // tmp
assert_different_registers(ic_klass, receiver_klass, R11_scratch1, R3_ARG1);
assert(R11_scratch1 == R11, "need prologue scratch register");
@@ -3484,6 +3485,7 @@
// Emit the trampoline stub which will be related to the branch-and-link below.
CallStubImpl::emit_trampoline_stub(_masm, entry_point_toc_offset, start_offset);
+ if (Compile::current()->env()->failing()) { return; } // Code cache may be full.
__ relocate(_optimized_virtual ?
relocInfo::opt_virtual_call_type : relocInfo::static_call_type);
}
@@ -3527,6 +3529,7 @@
// Emit the trampoline stub which will be related to the branch-and-link below.
CallStubImpl::emit_trampoline_stub(_masm, entry_point_toc_offset, start_offset);
+ if (ra_->C->env()->failing()) { return; } // Code cache may be full.
assert(_optimized_virtual, "methodHandle call should be a virtual call");
__ relocate(relocInfo::opt_virtual_call_type);
}
@@ -3577,9 +3580,7 @@
const address entry_point_const = __ address_constant(entry_point, RelocationHolder::none);
const int entry_point_const_toc_offset = __ offset_to_method_toc(entry_point_const);
CallStubImpl::emit_trampoline_stub(_masm, entry_point_const_toc_offset, __ offset());
-
- if (ra_->C->env()->failing())
- return;
+ if (ra_->C->env()->failing()) { return; } // Code cache may be full.
// Build relocation at call site with ic position as data.
assert((_load_ic_hi_node != NULL && _load_ic_node == NULL) ||
@@ -5638,19 +5639,6 @@
ins_pipe(pipe_class_memory);
%}
-//// Load compressed klass and decode it if narrow_klass_shift == 0.
-//// TODO: will narrow_klass_shift ever be 0?
-//instruct decodeNKlass2Klass(iRegPdst dst, memory mem) %{
-// match(Set dst (DecodeNKlass (LoadNKlass mem)));
-// predicate(false /* TODO: PPC port Universe::narrow_klass_shift() == 0*);
-// ins_cost(MEMORY_REF_COST);
-//
-// format %{ "LWZ $dst, $mem \t// DecodeNKlass (unscaled)" %}
-// size(4);
-// ins_encode( enc_lwz(dst, mem) );
-// ins_pipe(pipe_class_memory);
-//%}
-
// Load Klass Pointer
instruct loadKlass(iRegPdst dst, memoryAlg4 mem) %{
match(Set dst (LoadKlass mem));
@@ -6070,11 +6058,15 @@
%}
%}
-instruct loadConNKlass_hi(iRegNdst dst, immNKlass src) %{
+// We have seen a safepoint between the hi and lo parts, and this node was handled
+// as an oop. Therefore this needs a match rule so that build_oop_map knows this is
+// not a narrow oop.
+instruct loadConNKlass_hi(iRegNdst dst, immNKlass_NM src) %{
+ match(Set dst src);
effect(DEF dst, USE src);
ins_cost(DEFAULT_COST);
- format %{ "LIS $dst, $src \t// narrow oop hi" %}
+ format %{ "LIS $dst, $src \t// narrow klass hi" %}
size(4);
ins_encode %{
// TODO: PPC port $archOpcode(ppc64Opcode_addis);
@@ -6084,6 +6076,21 @@
ins_pipe(pipe_class_default);
%}
+// As loadConNKlass_hi this must be recognized as narrow klass, not oop!
+instruct loadConNKlass_mask(iRegNdst dst, immNKlass_NM src1, iRegNsrc src2) %{
+ match(Set dst src1);
+ effect(TEMP src2);
+ ins_cost(DEFAULT_COST);
+
+ format %{ "MASK $dst, $src2, 0xFFFFFFFF" %} // mask
+ size(4);
+ ins_encode %{
+ // TODO: PPC port $archOpcode(ppc64Opcode_rldicl);
+ __ clrldi($dst$$Register, $src2$$Register, 0x20);
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
// This needs a match rule so that build_oop_map knows this is
// not a narrow oop.
instruct loadConNKlass_lo(iRegNdst dst, immNKlass_NM src1, iRegNsrc src2) %{
@@ -6091,10 +6098,10 @@
effect(TEMP src2);
ins_cost(DEFAULT_COST);
- format %{ "ADDI $dst, $src1, $src2 \t// narrow oop lo" %}
- size(4);
- ins_encode %{
- // TODO: PPC port $archOpcode(ppc64Opcode_addi);
+ format %{ "ORI $dst, $src1, $src2 \t// narrow klass lo" %}
+ size(4);
+ ins_encode %{
+ // TODO: PPC port $archOpcode(ppc64Opcode_ori);
intptr_t Csrc = Klass::encode_klass((Klass *)$src1$$constant);
assert(__ oop_recorder() != NULL, "this assembler needs an OopRecorder");
int klass_index = __ oop_recorder()->find_index((Klass *)$src1$$constant);
@@ -6125,10 +6132,11 @@
MachNode *m2 = m1;
if (!Assembler::is_uimm((jlong)Klass::encode_klass((Klass *)op_src->constant()), 31)) {
// Value might be 1-extended. Mask out these bits.
- m2 = new clearMs32bNode();
+ m2 = new loadConNKlass_maskNode();
m2->add_req(NULL, m1);
m2->_opnds[0] = op_dst;
- m2->_opnds[1] = op_dst;
+ m2->_opnds[1] = op_src;
+ m2->_opnds[2] = op_dst;
ra_->set_pair(m2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this));
nodes->push(m2);
}
@@ -6973,7 +6981,7 @@
size(4);
ins_encode %{
// TODO: PPC port $archOpcode(ppc64Opcode_rldicl);
- __ rldicl($dst$$Register, $src$$Register, 64-Universe::narrow_oop_shift(), 32);
+ __ rldicl($dst$$Register, $src$$Register, 64-Universe::narrow_klass_shift(), 32);
%}
ins_pipe(pipe_class_default);
%}
--- a/hotspot/src/cpu/ppc/vm/stubGenerator_ppc.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/cpu/ppc/vm/stubGenerator_ppc.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -24,7 +24,6 @@
*/
#include "precompiled.hpp"
-#include "asm/assembler.hpp"
#include "asm/macroAssembler.inline.hpp"
#include "interpreter/interpreter.hpp"
#include "nativeInst_ppc.hpp"
@@ -39,9 +38,6 @@
#include "runtime/stubCodeGenerator.hpp"
#include "runtime/stubRoutines.hpp"
#include "utilities/top.hpp"
-#ifdef COMPILER2
-#include "opto/runtime.hpp"
-#endif
#include "runtime/thread.inline.hpp"
#define __ _masm->
@@ -216,7 +212,7 @@
{
BLOCK_COMMENT("Call frame manager or native entry.");
// Call frame manager or native entry.
- Register r_new_arg_entry = R14; // PPC_state;
+ Register r_new_arg_entry = R14;
assert_different_registers(r_new_arg_entry, r_top_of_arguments_addr,
r_arg_method, r_arg_thread);
--- a/hotspot/src/cpu/ppc/vm/templateTable_ppc_64.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/cpu/ppc/vm/templateTable_ppc_64.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -353,7 +353,6 @@
__ sldi(Rscratch1, Rscratch1, LogBytesPerWord);
__ cmpdi(CCR0, Rscratch2, JVM_CONSTANT_Integer);
__ bne(CCR0, notInt);
- __ isync(); // Order load of constant wrt. tags.
__ lwax(R17_tos, Rcpool, Rscratch1);
__ push(itos);
__ b(exit);
@@ -365,7 +364,6 @@
__ cmpdi(CCR0, Rscratch2, JVM_CONSTANT_Float);
__ asm_assert_eq("unexpected type", 0x8765);
#endif
- __ isync(); // Order load of constant wrt. tags.
__ lfsx(F15_ftos, Rcpool, Rscratch1);
__ push(ftos);
@@ -424,13 +422,11 @@
// Check out Conversions.java for an example.
// Also ConstantPool::header_size() is 20, which makes it very difficult
// to double-align double on the constant pool. SG, 11/7/97
- __ isync(); // Order load of constant wrt. tags.
__ lfdx(F15_ftos, Rcpool, Rindex);
__ push(dtos);
__ b(Lexit);
__ bind(Llong);
- __ isync(); // Order load of constant wrt. tags.
__ ldx(R17_tos, Rcpool, Rindex);
__ push(ltos);
--- a/hotspot/src/os/aix/vm/perfMemory_aix.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/os/aix/vm/perfMemory_aix.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -1020,7 +1020,3 @@
unmap_shared(addr, bytes);
}
-
-char* PerfMemory::backing_store_filename() {
- return backing_store_file_name;
-}
--- a/hotspot/src/os/bsd/vm/perfMemory_bsd.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/os/bsd/vm/perfMemory_bsd.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -1043,7 +1043,3 @@
unmap_shared(addr, bytes);
}
-
-char* PerfMemory::backing_store_filename() {
- return backing_store_file_name;
-}
--- a/hotspot/src/os/linux/vm/perfMemory_linux.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/os/linux/vm/perfMemory_linux.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -1049,7 +1049,3 @@
unmap_shared(addr, bytes);
}
-
-char* PerfMemory::backing_store_filename() {
- return backing_store_file_name;
-}
--- a/hotspot/src/os/solaris/vm/perfMemory_solaris.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/os/solaris/vm/perfMemory_solaris.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -1068,7 +1068,3 @@
unmap_shared(addr, bytes);
}
-
-char* PerfMemory::backing_store_filename() {
- return backing_store_file_name;
-}
--- a/hotspot/src/os/windows/vm/perfMemory_windows.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/os/windows/vm/perfMemory_windows.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -1846,7 +1846,3 @@
remove_file_mapping(addr);
}
}
-
-char* PerfMemory::backing_store_filename() {
- return sharedmem_fileName;
-}
--- a/hotspot/src/os_cpu/linux_ppc/vm/prefetch_linux_ppc.inline.hpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/os_cpu/linux_ppc/vm/prefetch_linux_ppc.inline.hpp Wed Jul 05 20:04:29 2017 +0200
@@ -47,4 +47,4 @@
);
}
-#endif // OS_CPU_LINUX_PPC_VM_PREFETCH_LINUX_OJDKPPC_HPP
+#endif // OS_CPU_LINUX_PPC_VM_PREFETCH_LINUX_PPC_INLINE_HPP
--- a/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -2069,14 +2069,14 @@
LIR_Opr base_op = base.result();
LIR_Opr index_op = idx.result();
#ifndef _LP64
- if (x->base()->type()->tag() == longTag) {
+ if (base_op->type() == T_LONG) {
base_op = new_register(T_INT);
__ convert(Bytecodes::_l2i, base.result(), base_op);
}
if (x->has_index()) {
- if (x->index()->type()->tag() == longTag) {
+ if (index_op->type() == T_LONG) {
LIR_Opr long_index_op = index_op;
- if (x->index()->type()->is_constant()) {
+ if (index_op->is_constant()) {
long_index_op = new_register(T_LONG);
__ move(index_op, long_index_op);
}
@@ -2091,14 +2091,14 @@
assert(!x->has_index() || index_op->type() == T_INT, "index should be an int");
#else
if (x->has_index()) {
- if (x->index()->type()->tag() == intTag) {
- if (!x->index()->type()->is_constant()) {
+ if (index_op->type() == T_INT) {
+ if (!index_op->is_constant()) {
index_op = new_register(T_LONG);
__ convert(Bytecodes::_i2l, idx.result(), index_op);
}
} else {
- assert(x->index()->type()->tag() == longTag, "must be");
- if (x->index()->type()->is_constant()) {
+ assert(index_op->type() == T_LONG, "must be");
+ if (index_op->is_constant()) {
index_op = new_register(T_LONG);
__ move(idx.result(), index_op);
}
@@ -2179,12 +2179,12 @@
LIR_Opr index_op = idx.result();
#ifndef _LP64
- if (x->base()->type()->tag() == longTag) {
+ if (base_op->type() == T_LONG) {
base_op = new_register(T_INT);
__ convert(Bytecodes::_l2i, base.result(), base_op);
}
if (x->has_index()) {
- if (x->index()->type()->tag() == longTag) {
+ if (index_op->type() == T_LONG) {
index_op = new_register(T_INT);
__ convert(Bytecodes::_l2i, idx.result(), index_op);
}
@@ -2194,7 +2194,7 @@
assert(!x->has_index() || (index_op->type() == T_INT && !index_op->is_constant()), "index should be an non-constant int");
#else
if (x->has_index()) {
- if (x->index()->type()->tag() == intTag) {
+ if (index_op->type() == T_INT) {
index_op = new_register(T_LONG);
__ convert(Bytecodes::_i2l, idx.result(), index_op);
}
--- a/hotspot/src/share/vm/classfile/classFileParser.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/classfile/classFileParser.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -2859,6 +2859,11 @@
"bootstrap_method_index %u has bad constant type in class file %s",
bootstrap_method_index,
CHECK);
+
+ guarantee_property((operand_fill_index + 1 + argument_count) < operands->length(),
+ "Invalid BootstrapMethods num_bootstrap_methods or num_bootstrap_arguments value in class file %s",
+ CHECK);
+
operands->at_put(operand_fill_index++, bootstrap_method_index);
operands->at_put(operand_fill_index++, argument_count);
@@ -2875,8 +2880,6 @@
}
}
- assert(ConstantPool::operand_array_length(operands) == attribute_array_length, "correct decode");
-
u1* current_end = cfs->current();
guarantee_property(current_end == current_start + attribute_byte_length,
"Bad length on BootstrapMethods in class file %s",
--- a/hotspot/src/share/vm/classfile/classLoader.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/classfile/classLoader.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -75,6 +75,7 @@
typedef jboolean (JNICALL *ReadEntry_t)(jzfile *zip, jzentry *entry, unsigned char *buf, char *namebuf);
typedef jboolean (JNICALL *ReadMappedEntry_t)(jzfile *zip, jzentry *entry, unsigned char **buf, char *namebuf);
typedef jzentry* (JNICALL *GetNextEntry_t)(jzfile *zip, jint n);
+typedef jint (JNICALL *Crc32_t)(jint crc, const jbyte *buf, jint len);
static ZipOpen_t ZipOpen = NULL;
static ZipClose_t ZipClose = NULL;
@@ -83,6 +84,7 @@
static ReadMappedEntry_t ReadMappedEntry = NULL;
static GetNextEntry_t GetNextEntry = NULL;
static canonicalize_fn_t CanonicalizeEntry = NULL;
+static Crc32_t Crc32 = NULL;
// Globals
@@ -799,9 +801,11 @@
ReadEntry = CAST_TO_FN_PTR(ReadEntry_t, os::dll_lookup(handle, "ZIP_ReadEntry"));
ReadMappedEntry = CAST_TO_FN_PTR(ReadMappedEntry_t, os::dll_lookup(handle, "ZIP_ReadMappedEntry"));
GetNextEntry = CAST_TO_FN_PTR(GetNextEntry_t, os::dll_lookup(handle, "ZIP_GetNextEntry"));
+ Crc32 = CAST_TO_FN_PTR(Crc32_t, os::dll_lookup(handle, "ZIP_CRC32"));
// ZIP_Close is not exported on Windows in JDK5.0 so don't abort if ZIP_Close is NULL
- if (ZipOpen == NULL || FindEntry == NULL || ReadEntry == NULL || GetNextEntry == NULL) {
+ if (ZipOpen == NULL || FindEntry == NULL || ReadEntry == NULL ||
+ GetNextEntry == NULL || Crc32 == NULL) {
vm_exit_during_initialization("Corrupted ZIP library", path);
}
@@ -811,6 +815,11 @@
// This lookup only works on 1.3. Do not check for non-null here
}
+int ClassLoader::crc32(int crc, const char* buf, int len) {
+ assert(Crc32 != NULL, "ZIP_CRC32 is not found");
+ return (*Crc32)(crc, (const jbyte*)buf, len);
+}
+
// PackageInfo data exists in order to support the java.lang.Package
// class. A Package object provides information about a java package
// (version, vendor, etc.) which originates in the manifest of the jar
--- a/hotspot/src/share/vm/classfile/classLoader.hpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/classfile/classLoader.hpp Wed Jul 05 20:04:29 2017 +0200
@@ -226,6 +226,7 @@
// to avoid confusing the zip library
static bool get_canonical_path(const char* orig, char* out, int len);
public:
+ static int crc32(int crc, const char* buf, int len);
static bool update_class_path_entry_list(const char *path,
bool check_for_duplicates,
bool throw_exception=true);
--- a/hotspot/src/share/vm/classfile/stackMapFrame.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/classfile/stackMapFrame.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -148,7 +148,7 @@
VerificationType* from, VerificationType* to, int32_t len, TRAPS) const {
int32_t i = 0;
for (i = 0; i < len; i++) {
- if (!to[i].is_assignable_from(from[i], verifier(), THREAD)) {
+ if (!to[i].is_assignable_from(from[i], verifier(), false, THREAD)) {
break;
}
}
@@ -245,7 +245,7 @@
}
VerificationType top = _stack[--_stack_size];
bool subtype = type.is_assignable_from(
- top, verifier(), CHECK_(VerificationType::bogus_type()));
+ top, verifier(), false, CHECK_(VerificationType::bogus_type()));
if (!subtype) {
verifier()->verify_error(
ErrorContext::bad_type(_offset, stack_top_ctx(),
@@ -265,7 +265,7 @@
return VerificationType::bogus_type();
}
bool subtype = type.is_assignable_from(_locals[index],
- verifier(), CHECK_(VerificationType::bogus_type()));
+ verifier(), false, CHECK_(VerificationType::bogus_type()));
if (!subtype) {
verifier()->verify_error(
ErrorContext::bad_type(_offset,
@@ -288,14 +288,14 @@
"get long/double overflows locals");
return;
}
- bool subtype = type1.is_assignable_from(_locals[index], verifier(), CHECK);
+ bool subtype = type1.is_assignable_from(_locals[index], verifier(), false, CHECK);
if (!subtype) {
verifier()->verify_error(
ErrorContext::bad_type(_offset,
TypeOrigin::local(index, this), TypeOrigin::implicit(type1)),
"Bad local variable type");
} else {
- subtype = type2.is_assignable_from(_locals[index + 1], verifier(), CHECK);
+ subtype = type2.is_assignable_from(_locals[index + 1], verifier(), false, CHECK);
if (!subtype) {
/* Unreachable? All local store routines convert a split long or double
* into a TOP during the store. So we should never end up seeing an
--- a/hotspot/src/share/vm/classfile/stackMapFrame.hpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/classfile/stackMapFrame.hpp Wed Jul 05 20:04:29 2017 +0200
@@ -234,7 +234,7 @@
if (_stack_size != 0) {
VerificationType top = _stack[_stack_size - 1];
bool subtype = type.is_assignable_from(
- top, verifier(), CHECK_(VerificationType::bogus_type()));
+ top, verifier(), false, CHECK_(VerificationType::bogus_type()));
if (subtype) {
--_stack_size;
return top;
@@ -249,9 +249,9 @@
assert(type2.is_long() || type2.is_double(), "must be long/double_2");
if (_stack_size >= 2) {
VerificationType top1 = _stack[_stack_size - 1];
- bool subtype1 = type1.is_assignable_from(top1, verifier(), CHECK);
+ bool subtype1 = type1.is_assignable_from(top1, verifier(), false, CHECK);
VerificationType top2 = _stack[_stack_size - 2];
- bool subtype2 = type2.is_assignable_from(top2, verifier(), CHECK);
+ bool subtype2 = type2.is_assignable_from(top2, verifier(), false, CHECK);
if (subtype1 && subtype2) {
_stack_size -= 2;
return;
--- a/hotspot/src/share/vm/classfile/verificationType.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/classfile/verificationType.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -42,7 +42,8 @@
}
bool VerificationType::is_reference_assignable_from(
- const VerificationType& from, ClassVerifier* context, TRAPS) const {
+ const VerificationType& from, ClassVerifier* context,
+ bool from_field_is_protected, TRAPS) const {
instanceKlassHandle klass = context->current_class();
if (from.is_null()) {
// null is assignable to any reference
@@ -62,9 +63,11 @@
Handle(THREAD, klass->protection_domain()), true, CHECK_false);
KlassHandle this_class(THREAD, obj);
- if (this_class->is_interface()) {
- // We treat interfaces as java.lang.Object, including
- // java.lang.Cloneable and java.io.Serializable
+ if (this_class->is_interface() && (!from_field_is_protected ||
+ from.name() != vmSymbols::java_lang_Object())) {
+ // If we are not trying to access a protected field or method in
+ // java.lang.Object then we treat interfaces as java.lang.Object,
+ // including java.lang.Cloneable and java.io.Serializable.
return true;
} else if (from.is_object()) {
Klass* from_class = SystemDictionary::resolve_or_fail(
@@ -76,7 +79,8 @@
VerificationType comp_this = get_component(context, CHECK_false);
VerificationType comp_from = from.get_component(context, CHECK_false);
if (!comp_this.is_bogus() && !comp_from.is_bogus()) {
- return comp_this.is_assignable_from(comp_from, context, CHECK_false);
+ return comp_this.is_assignable_from(comp_from, context,
+ from_field_is_protected, CHECK_false);
}
}
return false;
--- a/hotspot/src/share/vm/classfile/verificationType.hpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/classfile/verificationType.hpp Wed Jul 05 20:04:29 2017 +0200
@@ -265,7 +265,8 @@
// is assignable to another. Returns true if one can assign 'from' to
// this.
bool is_assignable_from(
- const VerificationType& from, ClassVerifier* context, TRAPS) const {
+ const VerificationType& from, ClassVerifier* context,
+ bool from_field_is_protected, TRAPS) const {
if (equals(from) || is_bogus()) {
return true;
} else {
@@ -286,7 +287,9 @@
return from.is_integer();
default:
if (is_reference() && from.is_reference()) {
- return is_reference_assignable_from(from, context, CHECK_false);
+ return is_reference_assignable_from(from, context,
+ from_field_is_protected,
+ CHECK_false);
} else {
return false;
}
@@ -308,7 +311,8 @@
private:
bool is_reference_assignable_from(
- const VerificationType&, ClassVerifier*, TRAPS) const;
+ const VerificationType&, ClassVerifier*, bool from_field_is_protected,
+ TRAPS) const;
};
#endif // SHARE_VM_CLASSFILE_VERIFICATIONTYPE_HPP
--- a/hotspot/src/share/vm/classfile/verifier.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/classfile/verifier.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -98,6 +98,14 @@
HandleMark hm;
ResourceMark rm(THREAD);
+ if (!is_eligible_for_verification(klass, should_verify_class)) {
+ return true;
+ }
+
+ // If the class should be verified, first see if we can use the split
+ // verifier. If not, or if verification fails and FailOverToOldVerifier
+ // is set, then call the inference verifier.
+
Symbol* exception_name = NULL;
const size_t message_buffer_len = klass->name()->utf8_length() + 1024;
char* message_buffer = NEW_RESOURCE_ARRAY(char, message_buffer_len);
@@ -105,47 +113,42 @@
const char* klassName = klass->external_name();
bool can_failover = FailOverToOldVerifier &&
- klass->major_version() < NOFAILOVER_MAJOR_VERSION;
+ klass->major_version() < NOFAILOVER_MAJOR_VERSION;
- // If the class should be verified, first see if we can use the split
- // verifier. If not, or if verification fails and FailOverToOldVerifier
- // is set, then call the inference verifier.
- if (is_eligible_for_verification(klass, should_verify_class)) {
- if (TraceClassInitialization) {
- tty->print_cr("Start class verification for: %s", klassName);
+ if (TraceClassInitialization) {
+ tty->print_cr("Start class verification for: %s", klassName);
+ }
+ if (klass->major_version() >= STACKMAP_ATTRIBUTE_MAJOR_VERSION) {
+ ClassVerifier split_verifier(klass, THREAD);
+ split_verifier.verify_class(THREAD);
+ exception_name = split_verifier.result();
+ if (can_failover && !HAS_PENDING_EXCEPTION &&
+ (exception_name == vmSymbols::java_lang_VerifyError() ||
+ exception_name == vmSymbols::java_lang_ClassFormatError())) {
+ if (TraceClassInitialization || VerboseVerification) {
+ tty->print_cr(
+ "Fail over class verification to old verifier for: %s", klassName);
+ }
+ exception_name = inference_verify(
+ klass, message_buffer, message_buffer_len, THREAD);
}
- if (klass->major_version() >= STACKMAP_ATTRIBUTE_MAJOR_VERSION) {
- ClassVerifier split_verifier(klass, THREAD);
- split_verifier.verify_class(THREAD);
- exception_name = split_verifier.result();
- if (can_failover && !HAS_PENDING_EXCEPTION &&
- (exception_name == vmSymbols::java_lang_VerifyError() ||
- exception_name == vmSymbols::java_lang_ClassFormatError())) {
- if (TraceClassInitialization || VerboseVerification) {
- tty->print_cr(
- "Fail over class verification to old verifier for: %s", klassName);
- }
- exception_name = inference_verify(
- klass, message_buffer, message_buffer_len, THREAD);
- }
- if (exception_name != NULL) {
- exception_message = split_verifier.exception_message();
- }
- } else {
- exception_name = inference_verify(
- klass, message_buffer, message_buffer_len, THREAD);
+ if (exception_name != NULL) {
+ exception_message = split_verifier.exception_message();
}
+ } else {
+ exception_name = inference_verify(
+ klass, message_buffer, message_buffer_len, THREAD);
+ }
- if (TraceClassInitialization || VerboseVerification) {
- if (HAS_PENDING_EXCEPTION) {
- tty->print("Verification for %s has", klassName);
- tty->print_cr(" exception pending %s ",
- InstanceKlass::cast(PENDING_EXCEPTION->klass())->external_name());
- } else if (exception_name != NULL) {
- tty->print_cr("Verification for %s failed", klassName);
- }
- tty->print_cr("End class verification for: %s", klassName);
+ if (TraceClassInitialization || VerboseVerification) {
+ if (HAS_PENDING_EXCEPTION) {
+ tty->print("Verification for %s has", klassName);
+ tty->print_cr(" exception pending %s ",
+ InstanceKlass::cast(PENDING_EXCEPTION->klass())->external_name());
+ } else if (exception_name != NULL) {
+ tty->print_cr("Verification for %s failed", klassName);
}
+ tty->print_cr("End class verification for: %s", klassName);
}
if (HAS_PENDING_EXCEPTION) {
@@ -1718,7 +1721,7 @@
VerificationType throwable =
VerificationType::reference_type(vmSymbols::java_lang_Throwable());
bool is_subclass = throwable.is_assignable_from(
- catch_type, this, CHECK_VERIFY(this));
+ catch_type, this, false, CHECK_VERIFY(this));
if (!is_subclass) {
// 4286534: should throw VerifyError according to recent spec change
verify_error(ErrorContext::bad_type(handler_pc,
@@ -2171,7 +2174,7 @@
stack_object_type = current_type();
}
is_assignable = target_class_type.is_assignable_from(
- stack_object_type, this, CHECK_VERIFY(this));
+ stack_object_type, this, false, CHECK_VERIFY(this));
if (!is_assignable) {
verify_error(ErrorContext::bad_type(bci,
current_frame->stack_top_ctx(),
@@ -2198,7 +2201,7 @@
// It's protected access, check if stack object is assignable to
// current class.
is_assignable = current_type().is_assignable_from(
- stack_object_type, this, CHECK_VERIFY(this));
+ stack_object_type, this, true, CHECK_VERIFY(this));
if (!is_assignable) {
verify_error(ErrorContext::bad_type(bci,
current_frame->stack_top_ctx(),
@@ -2472,7 +2475,7 @@
instanceKlassHandle mh(THREAD, m->method_holder());
if (m->is_protected() && !mh->is_same_class_package(_klass())) {
bool assignable = current_type().is_assignable_from(
- objectref_type, this, CHECK_VERIFY(this));
+ objectref_type, this, true, CHECK_VERIFY(this));
if (!assignable) {
verify_error(ErrorContext::bad_type(bci,
TypeOrigin::cp(new_class_index, objectref_type),
@@ -2643,11 +2646,11 @@
bool have_imr_indirect = cp->tag_at(index).value() == JVM_CONSTANT_InterfaceMethodref;
if (!current_class()->is_anonymous()) {
subtype = ref_class_type.is_assignable_from(
- current_type(), this, CHECK_VERIFY(this));
+ current_type(), this, false, CHECK_VERIFY(this));
} else {
VerificationType host_klass_type =
VerificationType::reference_type(current_class()->host_klass()->name());
- subtype = ref_class_type.is_assignable_from(host_klass_type, this, CHECK_VERIFY(this));
+ subtype = ref_class_type.is_assignable_from(host_klass_type, this, false, CHECK_VERIFY(this));
// If invokespecial of IMR, need to recheck for same or
// direct interface relative to the host class
@@ -2691,7 +2694,7 @@
VerificationType top = current_frame->pop_stack(CHECK_VERIFY(this));
VerificationType hosttype =
VerificationType::reference_type(current_class()->host_klass()->name());
- bool subtype = hosttype.is_assignable_from(top, this, CHECK_VERIFY(this));
+ bool subtype = hosttype.is_assignable_from(top, this, false, CHECK_VERIFY(this));
if (!subtype) {
verify_error( ErrorContext::bad_type(current_frame->offset(),
current_frame->stack_top_ctx(),
@@ -2716,7 +2719,7 @@
// It's protected access, check if stack object is
// assignable to current class.
bool is_assignable = current_type().is_assignable_from(
- stack_object_type, this, CHECK_VERIFY(this));
+ stack_object_type, this, true, CHECK_VERIFY(this));
if (!is_assignable) {
if (ref_class_type.name() == vmSymbols::java_lang_Object()
&& stack_object_type.is_array()
@@ -2899,7 +2902,7 @@
"Method expects a return value");
return;
}
- bool match = return_type.is_assignable_from(type, this, CHECK_VERIFY(this));
+ bool match = return_type.is_assignable_from(type, this, false, CHECK_VERIFY(this));
if (!match) {
verify_error(ErrorContext::bad_type(bci,
current_frame->stack_top_ctx(), TypeOrigin::signature(return_type)),
--- a/hotspot/src/share/vm/code/codeCache.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/code/codeCache.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -254,8 +254,7 @@
if (!SegmentedCodeCache) {
// No segmentation: use a single code heap
return (code_blob_type == CodeBlobType::All);
- } else if ((Arguments::mode() == Arguments::_int) ||
- (TieredStopAtLevel == CompLevel_none)) {
+ } else if (Arguments::mode() == Arguments::_int) {
// Interpreter only: we don't need any method code heaps
return (code_blob_type == CodeBlobType::NonNMethod);
} else if (TieredCompilation && (TieredStopAtLevel > CompLevel_simple)) {
--- a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -1683,6 +1683,8 @@
int _failures;
bool _verbose;
+ HeapRegionClaimer _hrclaimer;
+
public:
G1ParVerifyFinalCountTask(G1CollectedHeap* g1h,
BitMap* region_bm, BitMap* card_bm,
@@ -1692,19 +1694,8 @@
_actual_region_bm(region_bm), _actual_card_bm(card_bm),
_expected_region_bm(expected_region_bm), _expected_card_bm(expected_card_bm),
_failures(0), _verbose(false),
- _n_workers(0) {
+ _n_workers(_g1h->workers()->active_workers()), _hrclaimer(_n_workers) {
assert(VerifyDuringGC, "don't call this otherwise");
-
- // Use the value already set as the number of active threads
- // in the call to run_task().
- if (G1CollectedHeap::use_parallel_gc_threads()) {
- assert( _g1h->workers()->active_workers() > 0,
- "Should have been previously set");
- _n_workers = _g1h->workers()->active_workers();
- } else {
- _n_workers = 1;
- }
-
assert(_expected_card_bm->size() == _actual_card_bm->size(), "sanity");
assert(_expected_region_bm->size() == _actual_region_bm->size(), "sanity");
@@ -1721,10 +1712,7 @@
_verbose);
if (G1CollectedHeap::use_parallel_gc_threads()) {
- _g1h->heap_region_par_iterate_chunked(&verify_cl,
- worker_id,
- _n_workers,
- HeapRegion::VerifyCountClaimValue);
+ _g1h->heap_region_par_iterate(&verify_cl, worker_id, &_hrclaimer);
} else {
_g1h->heap_region_iterate(&verify_cl);
}
@@ -1813,22 +1801,14 @@
BitMap* _actual_card_bm;
uint _n_workers;
+ HeapRegionClaimer _hrclaimer;
public:
G1ParFinalCountTask(G1CollectedHeap* g1h, BitMap* region_bm, BitMap* card_bm)
: AbstractGangTask("G1 final counting"),
_g1h(g1h), _cm(_g1h->concurrent_mark()),
_actual_region_bm(region_bm), _actual_card_bm(card_bm),
- _n_workers(0) {
- // Use the value already set as the number of active threads
- // in the call to run_task().
- if (G1CollectedHeap::use_parallel_gc_threads()) {
- assert( _g1h->workers()->active_workers() > 0,
- "Should have been previously set");
- _n_workers = _g1h->workers()->active_workers();
- } else {
- _n_workers = 1;
- }
+ _n_workers(_g1h->workers()->active_workers()), _hrclaimer(_n_workers) {
}
void work(uint worker_id) {
@@ -1839,10 +1819,7 @@
_actual_card_bm);
if (G1CollectedHeap::use_parallel_gc_threads()) {
- _g1h->heap_region_par_iterate_chunked(&final_update_cl,
- worker_id,
- _n_workers,
- HeapRegion::FinalCountClaimValue);
+ _g1h->heap_region_par_iterate(&final_update_cl, worker_id, &_hrclaimer);
} else {
_g1h->heap_region_iterate(&final_update_cl);
}
@@ -1929,12 +1906,12 @@
size_t _max_live_bytes;
size_t _freed_bytes;
FreeRegionList* _cleanup_list;
+ HeapRegionClaimer _hrclaimer;
public:
- G1ParNoteEndTask(G1CollectedHeap* g1h,
- FreeRegionList* cleanup_list) :
- AbstractGangTask("G1 note end"), _g1h(g1h),
- _max_live_bytes(0), _freed_bytes(0), _cleanup_list(cleanup_list) { }
+ G1ParNoteEndTask(G1CollectedHeap* g1h, FreeRegionList* cleanup_list, uint n_workers) :
+ AbstractGangTask("G1 note end"), _g1h(g1h), _max_live_bytes(0), _freed_bytes(0), _cleanup_list(cleanup_list), _hrclaimer(n_workers) {
+ }
void work(uint worker_id) {
double start = os::elapsedTime();
@@ -1943,9 +1920,7 @@
G1NoteEndOfConcMarkClosure g1_note_end(_g1h, &local_cleanup_list,
&hrrs_cleanup_task);
if (G1CollectedHeap::use_parallel_gc_threads()) {
- _g1h->heap_region_par_iterate_chunked(&g1_note_end, worker_id,
- _g1h->workers()->active_workers(),
- HeapRegion::NoteEndClaimValue);
+ _g1h->heap_region_par_iterate(&g1_note_end, worker_id, &_hrclaimer);
} else {
_g1h->heap_region_iterate(&g1_note_end);
}
@@ -1991,16 +1966,16 @@
G1RemSet* _g1rs;
BitMap* _region_bm;
BitMap* _card_bm;
+ HeapRegionClaimer _hrclaimer;
+
public:
- G1ParScrubRemSetTask(G1CollectedHeap* g1h,
- BitMap* region_bm, BitMap* card_bm) :
- AbstractGangTask("G1 ScrubRS"), _g1rs(g1h->g1_rem_set()),
- _region_bm(region_bm), _card_bm(card_bm) { }
+ G1ParScrubRemSetTask(G1CollectedHeap* g1h, BitMap* region_bm, BitMap* card_bm, uint n_workers) :
+ AbstractGangTask("G1 ScrubRS"), _g1rs(g1h->g1_rem_set()), _region_bm(region_bm), _card_bm(card_bm), _hrclaimer(n_workers) {
+ }
void work(uint worker_id) {
if (G1CollectedHeap::use_parallel_gc_threads()) {
- _g1rs->scrub_par(_region_bm, _card_bm, worker_id,
- HeapRegion::ScrubRemSetClaimValue);
+ _g1rs->scrub_par(_region_bm, _card_bm, worker_id, &_hrclaimer);
} else {
_g1rs->scrub(_region_bm, _card_bm);
}
@@ -2043,9 +2018,6 @@
G1ParFinalCountTask g1_par_count_task(g1h, &_region_bm, &_card_bm);
if (G1CollectedHeap::use_parallel_gc_threads()) {
- assert(g1h->check_heap_region_claim_values(HeapRegion::InitialClaimValue),
- "sanity check");
-
g1h->set_par_threads();
n_workers = g1h->n_par_threads();
assert(g1h->n_par_threads() == n_workers,
@@ -2053,9 +2025,6 @@
g1h->workers()->run_task(&g1_par_count_task);
// Done with the parallel phase so reset to 0.
g1h->set_par_threads(0);
-
- assert(g1h->check_heap_region_claim_values(HeapRegion::FinalCountClaimValue),
- "sanity check");
} else {
n_workers = 1;
g1_par_count_task.work(0);
@@ -2080,9 +2049,6 @@
g1h->workers()->run_task(&g1_par_verify_task);
// Done with the parallel phase so reset to 0.
g1h->set_par_threads(0);
-
- assert(g1h->check_heap_region_claim_values(HeapRegion::VerifyCountClaimValue),
- "sanity check");
} else {
g1_par_verify_task.work(0);
}
@@ -2108,14 +2074,11 @@
g1h->reset_gc_time_stamp();
// Note end of marking in all heap regions.
- G1ParNoteEndTask g1_par_note_end_task(g1h, &_cleanup_list);
+ G1ParNoteEndTask g1_par_note_end_task(g1h, &_cleanup_list, n_workers);
if (G1CollectedHeap::use_parallel_gc_threads()) {
g1h->set_par_threads((int)n_workers);
g1h->workers()->run_task(&g1_par_note_end_task);
g1h->set_par_threads(0);
-
- assert(g1h->check_heap_region_claim_values(HeapRegion::NoteEndClaimValue),
- "sanity check");
} else {
g1_par_note_end_task.work(0);
}
@@ -2132,15 +2095,11 @@
// regions.
if (G1ScrubRemSets) {
double rs_scrub_start = os::elapsedTime();
- G1ParScrubRemSetTask g1_par_scrub_rs_task(g1h, &_region_bm, &_card_bm);
+ G1ParScrubRemSetTask g1_par_scrub_rs_task(g1h, &_region_bm, &_card_bm, n_workers);
if (G1CollectedHeap::use_parallel_gc_threads()) {
g1h->set_par_threads((int)n_workers);
g1h->workers()->run_task(&g1_par_scrub_rs_task);
g1h->set_par_threads(0);
-
- assert(g1h->check_heap_region_claim_values(
- HeapRegion::ScrubRemSetClaimValue),
- "sanity check");
} else {
g1_par_scrub_rs_task.work(0);
}
@@ -3288,6 +3247,7 @@
BitMap* _cm_card_bm;
uint _max_worker_id;
int _active_workers;
+ HeapRegionClaimer _hrclaimer;
public:
G1AggregateCountDataTask(G1CollectedHeap* g1h,
@@ -3295,18 +3255,18 @@
BitMap* cm_card_bm,
uint max_worker_id,
int n_workers) :
- AbstractGangTask("Count Aggregation"),
- _g1h(g1h), _cm(cm), _cm_card_bm(cm_card_bm),
- _max_worker_id(max_worker_id),
- _active_workers(n_workers) { }
+ AbstractGangTask("Count Aggregation"),
+ _g1h(g1h), _cm(cm), _cm_card_bm(cm_card_bm),
+ _max_worker_id(max_worker_id),
+ _active_workers(n_workers),
+ _hrclaimer(_active_workers) {
+ }
void work(uint worker_id) {
AggregateCountDataHRClosure cl(_g1h, _cm_card_bm, _max_worker_id);
if (G1CollectedHeap::use_parallel_gc_threads()) {
- _g1h->heap_region_par_iterate_chunked(&cl, worker_id,
- _active_workers,
- HeapRegion::AggregateCountClaimValue);
+ _g1h->heap_region_par_iterate(&cl, worker_id, &_hrclaimer);
} else {
_g1h->heap_region_iterate(&cl);
}
@@ -3323,15 +3283,9 @@
_max_worker_id, n_workers);
if (G1CollectedHeap::use_parallel_gc_threads()) {
- assert(_g1h->check_heap_region_claim_values(HeapRegion::InitialClaimValue),
- "sanity check");
_g1h->set_par_threads(n_workers);
_g1h->workers()->run_task(&g1_par_agg_task);
_g1h->set_par_threads(0);
-
- assert(_g1h->check_heap_region_claim_values(HeapRegion::AggregateCountClaimValue),
- "sanity check");
- _g1h->reset_heap_region_claim_values();
} else {
g1_par_agg_task.work(0);
}
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -90,8 +90,8 @@
// Notes on implementation of parallelism in different tasks.
//
-// G1ParVerifyTask uses heap_region_par_iterate_chunked() for parallelism.
-// The number of GC workers is passed to heap_region_par_iterate_chunked().
+// G1ParVerifyTask uses heap_region_par_iterate() for parallelism.
+// The number of GC workers is passed to heap_region_par_iterate().
// It does use run_task() which sets _n_workers in the task.
// G1ParTask executes g1_process_roots() ->
// SharedHeap::process_roots() which calls eventually to
@@ -1215,17 +1215,15 @@
class ParRebuildRSTask: public AbstractGangTask {
G1CollectedHeap* _g1;
+ HeapRegionClaimer _hrclaimer;
+
public:
- ParRebuildRSTask(G1CollectedHeap* g1)
- : AbstractGangTask("ParRebuildRSTask"),
- _g1(g1)
- { }
+ ParRebuildRSTask(G1CollectedHeap* g1) :
+ AbstractGangTask("ParRebuildRSTask"), _g1(g1), _hrclaimer(g1->workers()->active_workers()) {}
void work(uint worker_id) {
RebuildRSOutOfRegionClosure rebuild_rs(_g1, worker_id);
- _g1->heap_region_par_iterate_chunked(&rebuild_rs, worker_id,
- _g1->workers()->active_workers(),
- HeapRegion::RebuildRSClaimValue);
+ _g1->heap_region_par_iterate(&rebuild_rs, worker_id, &_hrclaimer);
}
};
@@ -1455,8 +1453,6 @@
set_par_threads(n_workers);
ParRebuildRSTask rebuild_rs_task(this);
- assert(check_heap_region_claim_values(
- HeapRegion::InitialClaimValue), "sanity check");
assert(UseDynamicNumberOfGCThreads ||
workers()->active_workers() == workers()->total_workers(),
"Unless dynamic should use total workers");
@@ -1466,9 +1462,6 @@
set_par_threads(workers()->active_workers());
workers()->run_task(&rebuild_rs_task);
set_par_threads(0);
- assert(check_heap_region_claim_values(
- HeapRegion::RebuildRSClaimValue), "sanity check");
- reset_heap_region_claim_values();
} else {
RebuildRSOutOfRegionClosure rebuild_rs(this);
heap_region_iterate(&rebuild_rs);
@@ -2343,6 +2336,7 @@
case GCCause::_gc_locker: return GCLockerInvokesConcurrent;
case GCCause::_java_lang_system_gc: return ExplicitGCInvokesConcurrent;
case GCCause::_g1_humongous_allocation: return true;
+ case GCCause::_update_allocation_context_stats_inc: return true;
default: return false;
}
}
@@ -2633,110 +2627,11 @@
}
void
-G1CollectedHeap::heap_region_par_iterate_chunked(HeapRegionClosure* cl,
- uint worker_id,
- uint num_workers,
- jint claim_value) const {
- _hrm.par_iterate(cl, worker_id, num_workers, claim_value);
-}
-
-class ResetClaimValuesClosure: public HeapRegionClosure {
-public:
- bool doHeapRegion(HeapRegion* r) {
- r->set_claim_value(HeapRegion::InitialClaimValue);
- return false;
- }
-};
-
-void G1CollectedHeap::reset_heap_region_claim_values() {
- ResetClaimValuesClosure blk;
- heap_region_iterate(&blk);
-}
-
-void G1CollectedHeap::reset_cset_heap_region_claim_values() {
- ResetClaimValuesClosure blk;
- collection_set_iterate(&blk);
-}
-
-#ifdef ASSERT
-// This checks whether all regions in the heap have the correct claim
-// value. I also piggy-backed on this a check to ensure that the
-// humongous_start_region() information on "continues humongous"
-// regions is correct.
-
-class CheckClaimValuesClosure : public HeapRegionClosure {
-private:
- jint _claim_value;
- uint _failures;
- HeapRegion* _sh_region;
-
-public:
- CheckClaimValuesClosure(jint claim_value) :
- _claim_value(claim_value), _failures(0), _sh_region(NULL) { }
- bool doHeapRegion(HeapRegion* r) {
- if (r->claim_value() != _claim_value) {
- gclog_or_tty->print_cr("Region " HR_FORMAT ", "
- "claim value = %d, should be %d",
- HR_FORMAT_PARAMS(r),
- r->claim_value(), _claim_value);
- ++_failures;
- }
- if (!r->is_humongous()) {
- _sh_region = NULL;
- } else if (r->is_starts_humongous()) {
- _sh_region = r;
- } else if (r->is_continues_humongous()) {
- if (r->humongous_start_region() != _sh_region) {
- gclog_or_tty->print_cr("Region " HR_FORMAT ", "
- "HS = "PTR_FORMAT", should be "PTR_FORMAT,
- HR_FORMAT_PARAMS(r),
- r->humongous_start_region(),
- _sh_region);
- ++_failures;
- }
- }
- return false;
- }
- uint failures() { return _failures; }
-};
-
-bool G1CollectedHeap::check_heap_region_claim_values(jint claim_value) {
- CheckClaimValuesClosure cl(claim_value);
- heap_region_iterate(&cl);
- return cl.failures() == 0;
-}
-
-class CheckClaimValuesInCSetHRClosure: public HeapRegionClosure {
-private:
- jint _claim_value;
- uint _failures;
-
-public:
- CheckClaimValuesInCSetHRClosure(jint claim_value) :
- _claim_value(claim_value), _failures(0) { }
-
- uint failures() { return _failures; }
-
- bool doHeapRegion(HeapRegion* hr) {
- assert(hr->in_collection_set(), "how?");
- assert(!hr->is_humongous(), "H-region in CSet");
- if (hr->claim_value() != _claim_value) {
- gclog_or_tty->print_cr("CSet Region " HR_FORMAT ", "
- "claim value = %d, should be %d",
- HR_FORMAT_PARAMS(hr),
- hr->claim_value(), _claim_value);
- _failures += 1;
- }
- return false;
- }
-};
-
-bool G1CollectedHeap::check_cset_heap_region_claim_values(jint claim_value) {
- CheckClaimValuesInCSetHRClosure cl(claim_value);
- collection_set_iterate(&cl);
- return cl.failures() == 0;
-}
-#endif // ASSERT
+G1CollectedHeap::heap_region_par_iterate(HeapRegionClosure* cl,
+ uint worker_id,
+ HeapRegionClaimer *hrclaimer) const {
+ _hrm.par_iterate(cl, worker_id, hrclaimer);
+}
// Clear the cached CSet starting regions and (more importantly)
// the time stamps. Called when we reset the GC time stamp.
@@ -3251,19 +3146,21 @@
class G1ParVerifyTask: public AbstractGangTask {
private:
- G1CollectedHeap* _g1h;
- VerifyOption _vo;
- bool _failures;
+ G1CollectedHeap* _g1h;
+ VerifyOption _vo;
+ bool _failures;
+ HeapRegionClaimer _hrclaimer;
public:
// _vo == UsePrevMarking -> use "prev" marking information,
// _vo == UseNextMarking -> use "next" marking information,
// _vo == UseMarkWord -> use mark word from object header.
G1ParVerifyTask(G1CollectedHeap* g1h, VerifyOption vo) :
- AbstractGangTask("Parallel verify task"),
- _g1h(g1h),
- _vo(vo),
- _failures(false) { }
+ AbstractGangTask("Parallel verify task"),
+ _g1h(g1h),
+ _vo(vo),
+ _failures(false),
+ _hrclaimer(g1h->workers()->active_workers()) {}
bool failures() {
return _failures;
@@ -3272,9 +3169,7 @@
void work(uint worker_id) {
HandleMark hm;
VerifyRegionClosure blk(true, _vo);
- _g1h->heap_region_par_iterate_chunked(&blk, worker_id,
- _g1h->workers()->active_workers(),
- HeapRegion::ParVerifyClaimValue);
+ _g1h->heap_region_par_iterate(&blk, worker_id, &_hrclaimer);
if (blk.failures()) {
_failures = true;
}
@@ -3316,8 +3211,6 @@
if (!silent) { gclog_or_tty->print("HeapRegions "); }
if (GCParallelVerificationEnabled && ParallelGCThreads > 1) {
- assert(check_heap_region_claim_values(HeapRegion::InitialClaimValue),
- "sanity check");
G1ParVerifyTask task(this, vo);
assert(UseDynamicNumberOfGCThreads ||
@@ -3331,15 +3224,6 @@
failures = true;
}
- // Checks that the expected amount of parallel work was done.
- // The implication is that n_workers is > 0.
- assert(check_heap_region_claim_values(HeapRegion::ParVerifyClaimValue),
- "sanity check");
-
- reset_heap_region_claim_values();
-
- assert(check_heap_region_claim_values(HeapRegion::InitialClaimValue),
- "sanity check");
} else {
VerifyRegionClosure blk(false, vo);
heap_region_iterate(&blk);
@@ -3926,8 +3810,6 @@
}
assert(check_young_list_well_formed(), "young list should be well formed");
- assert(check_heap_region_claim_values(HeapRegion::InitialClaimValue),
- "sanity check");
// Don't dynamically change the number of GC threads this early. A value of
// 0 is used to indicate serial work. When parallel work is done,
@@ -4288,26 +4170,12 @@
}
void G1CollectedHeap::remove_self_forwarding_pointers() {
- assert(check_cset_heap_region_claim_values(HeapRegion::InitialClaimValue), "sanity");
-
double remove_self_forwards_start = os::elapsedTime();
+ set_par_threads();
G1ParRemoveSelfForwardPtrsTask rsfp_task(this);
-
- if (G1CollectedHeap::use_parallel_gc_threads()) {
- set_par_threads();
- workers()->run_task(&rsfp_task);
- set_par_threads(0);
- } else {
- rsfp_task.work(0);
- }
-
- assert(check_cset_heap_region_claim_values(HeapRegion::ParEvacFailureClaimValue), "sanity");
-
- // Reset the claim values in the regions in the collection set.
- reset_cset_heap_region_claim_values();
-
- assert(check_cset_heap_region_claim_values(HeapRegion::InitialClaimValue), "sanity");
+ workers()->run_task(&rsfp_task);
+ set_par_threads(0);
// Now restore saved marks, if any.
assert(_objs_with_preserved_marks.size() ==
@@ -5948,11 +5816,6 @@
purge_code_root_memory();
- if (g1_policy()->during_initial_mark_pause()) {
- // Reset the claim values set during marking the strong code roots
- reset_heap_region_claim_values();
- }
-
finalize_for_evac_failure();
if (evacuation_failed()) {
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp Wed Jul 05 20:04:29 2017 +0200
@@ -211,6 +211,7 @@
friend class G1FreeHumongousRegionClosure;
// Other related classes.
friend class G1MarkSweep;
+ friend class HeapRegionClaimer;
private:
// The one and only G1CollectedHeap, so static functions can find it.
@@ -1377,38 +1378,15 @@
inline HeapWord* bottom_addr_for_region(uint index) const;
- // Divide the heap region sequence into "chunks" of some size (the number
- // of regions divided by the number of parallel threads times some
- // overpartition factor, currently 4). Assumes that this will be called
- // in parallel by ParallelGCThreads worker threads with distinct worker
- // ids in the range [0..max(ParallelGCThreads-1, 1)], that all parallel
- // calls will use the same "claim_value", and that that claim value is
- // different from the claim_value of any heap region before the start of
- // the iteration. Applies "blk->doHeapRegion" to each of the regions, by
- // attempting to claim the first region in each chunk, and, if
- // successful, applying the closure to each region in the chunk (and
- // setting the claim value of the second and subsequent regions of the
- // chunk.) For now requires that "doHeapRegion" always returns "false",
- // i.e., that a closure never attempt to abort a traversal.
- void heap_region_par_iterate_chunked(HeapRegionClosure* cl,
- uint worker_id,
- uint num_workers,
- jint claim_value) const;
-
- // It resets all the region claim values to the default.
- void reset_heap_region_claim_values();
-
- // Resets the claim values of regions in the current
- // collection set to the default.
- void reset_cset_heap_region_claim_values();
-
-#ifdef ASSERT
- bool check_heap_region_claim_values(jint claim_value);
-
- // Same as the routine above but only checks regions in the
- // current collection set.
- bool check_cset_heap_region_claim_values(jint claim_value);
-#endif // ASSERT
+ // Iterate over the heap regions in parallel. Assumes that this will be called
+ // in parallel by ParallelGCThreads worker threads with distinct worker ids
+ // in the range [0..max(ParallelGCThreads-1, 1)]. Applies "blk->doHeapRegion"
+ // to each of the regions, by attempting to claim the region using the
+ // HeapRegionClaimer and, if successful, applying the closure to the claimed
+ // region.
+ void heap_region_par_iterate(HeapRegionClosure* cl,
+ uint worker_id,
+ HeapRegionClaimer* hrclaimer) const;
// Clear the cached cset start regions and (more importantly)
// the time stamps. Called when we reset the GC time stamp.
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -1598,19 +1598,17 @@
CollectionSetChooser* _hrSorted;
uint _chunk_size;
G1CollectedHeap* _g1;
+ HeapRegionClaimer _hrclaimer;
+
public:
- ParKnownGarbageTask(CollectionSetChooser* hrSorted, uint chunk_size) :
- AbstractGangTask("ParKnownGarbageTask"),
- _hrSorted(hrSorted), _chunk_size(chunk_size),
- _g1(G1CollectedHeap::heap()) { }
+ ParKnownGarbageTask(CollectionSetChooser* hrSorted, uint chunk_size, uint n_workers) :
+ AbstractGangTask("ParKnownGarbageTask"),
+ _hrSorted(hrSorted), _chunk_size(chunk_size),
+ _g1(G1CollectedHeap::heap()), _hrclaimer(n_workers) {}
void work(uint worker_id) {
ParKnownGarbageHRClosure parKnownGarbageCl(_hrSorted, _chunk_size);
-
- // Back to zero for the claim value.
- _g1->heap_region_par_iterate_chunked(&parKnownGarbageCl, worker_id,
- _g1->workers()->active_workers(),
- HeapRegion::InitialClaimValue);
+ _g1->heap_region_par_iterate(&parKnownGarbageCl, worker_id, &_hrclaimer);
}
};
@@ -1641,12 +1639,8 @@
}
_collectionSetChooser->prepare_for_par_region_addition(_g1->num_regions(),
WorkUnit);
- ParKnownGarbageTask parKnownGarbageTask(_collectionSetChooser,
- (int) WorkUnit);
+ ParKnownGarbageTask parKnownGarbageTask(_collectionSetChooser, WorkUnit, (uint) no_of_gc_threads);
_g1->workers()->run_task(&parKnownGarbageTask);
-
- assert(_g1->check_heap_region_claim_values(HeapRegion::InitialClaimValue),
- "sanity check");
} else {
KnownGarbageClosure knownGarbagecl(_collectionSetChooser);
_g1->heap_region_iterate(&knownGarbagecl);
--- a/hotspot/src/share/vm/gc_implementation/g1/g1EvacFailure.hpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1EvacFailure.hpp Wed Jul 05 20:04:29 2017 +0200
@@ -177,16 +177,18 @@
G1CollectedHeap* _g1h;
ConcurrentMark* _cm;
uint _worker_id;
+ HeapRegionClaimer* _hrclaimer;
DirtyCardQueue _dcq;
UpdateRSetDeferred _update_rset_cl;
public:
RemoveSelfForwardPtrHRClosure(G1CollectedHeap* g1h,
- uint worker_id) :
- _g1h(g1h), _dcq(&g1h->dirty_card_queue_set()), _update_rset_cl(g1h, &_dcq),
- _worker_id(worker_id), _cm(_g1h->concurrent_mark()) {
- }
+ uint worker_id,
+ HeapRegionClaimer* hrclaimer) :
+ _g1h(g1h), _dcq(&g1h->dirty_card_queue_set()), _update_rset_cl(g1h, &_dcq),
+ _worker_id(worker_id), _cm(_g1h->concurrent_mark()), _hrclaimer(hrclaimer) {
+ }
bool doHeapRegion(HeapRegion *hr) {
bool during_initial_mark = _g1h->g1_policy()->during_initial_mark_pause();
@@ -195,7 +197,7 @@
assert(!hr->is_humongous(), "sanity");
assert(hr->in_collection_set(), "bad CS");
- if (hr->claimHeapRegion(HeapRegion::ParEvacFailureClaimValue)) {
+ if (_hrclaimer->claim_region(hr->hrm_index())) {
if (hr->evacuation_failed()) {
RemoveSelfForwardPtrObjClosure rspc(_g1h, _cm, hr, &_update_rset_cl,
during_initial_mark,
@@ -233,14 +235,15 @@
class G1ParRemoveSelfForwardPtrsTask: public AbstractGangTask {
protected:
G1CollectedHeap* _g1h;
+ HeapRegionClaimer _hrclaimer;
public:
G1ParRemoveSelfForwardPtrsTask(G1CollectedHeap* g1h) :
- AbstractGangTask("G1 Remove Self-forwarding Pointers"),
- _g1h(g1h) { }
+ AbstractGangTask("G1 Remove Self-forwarding Pointers"), _g1h(g1h),
+ _hrclaimer(g1h->workers()->active_workers()) {}
void work(uint worker_id) {
- RemoveSelfForwardPtrHRClosure rsfp_cl(_g1h, worker_id);
+ RemoveSelfForwardPtrHRClosure rsfp_cl(_g1h, worker_id, &_hrclaimer);
HeapRegion* hr = _g1h->start_cset_region_for_worker(worker_id);
_g1h->collection_set_iterate_from(hr, &rsfp_cl);
--- a/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -425,13 +425,9 @@
_g1->heap_region_iterate(&scrub_cl);
}
-void G1RemSet::scrub_par(BitMap* region_bm, BitMap* card_bm,
- uint worker_num, int claim_val) {
+void G1RemSet::scrub_par(BitMap* region_bm, BitMap* card_bm, uint worker_num, HeapRegionClaimer *hrclaimer) {
ScrubRSClosure scrub_cl(region_bm, card_bm);
- _g1->heap_region_par_iterate_chunked(&scrub_cl,
- worker_num,
- n_workers(),
- claim_val);
+ _g1->heap_region_par_iterate(&scrub_cl, worker_num, hrclaimer);
}
G1TriggerClosure::G1TriggerClosure() :
--- a/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.hpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.hpp Wed Jul 05 20:04:29 2017 +0200
@@ -128,10 +128,10 @@
void scrub(BitMap* region_bm, BitMap* card_bm);
// Like the above, but assumes is called in parallel: "worker_num" is the
- // parallel thread id of the current thread, and "claim_val" is the
- // value that should be used to claim heap regions.
+ // parallel thread id of the current thread, and "hrclaimer" is the shared
+ // HeapRegionClaimer that should be used to claim heap regions.
void scrub_par(BitMap* region_bm, BitMap* card_bm,
- uint worker_num, int claim_val);
+ uint worker_num, HeapRegionClaimer* hrclaimer);
// Refine the card corresponding to "card_ptr".
// If check_for_refs_into_cset is true, a true result is returned
--- a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -217,7 +217,6 @@
} else {
hrrs->clear();
}
- _claimed = InitialClaimValue;
}
zero_marked_bytes();
@@ -294,17 +293,6 @@
_humongous_start_region = NULL;
}
-bool HeapRegion::claimHeapRegion(jint claimValue) {
- jint current = _claimed;
- if (current != claimValue) {
- jint res = Atomic::cmpxchg(claimValue, &_claimed, current);
- if (res == current) {
- return true;
- }
- }
- return false;
-}
-
HeapRegion::HeapRegion(uint hrm_index,
G1BlockOffsetSharedArray* sharedOffsetArray,
MemRegion mr) :
@@ -314,7 +302,7 @@
_humongous_start_region(NULL),
_in_collection_set(false),
_next_in_special_set(NULL),
- _claimed(InitialClaimValue), _evacuation_failed(false),
+ _evacuation_failed(false),
_prev_marked_bytes(0), _next_marked_bytes(0), _gc_efficiency(0.0),
_next_young_region(NULL),
_next_dirty_cards_region(NULL), _next(NULL), _prev(NULL),
--- a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.hpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.hpp Wed Jul 05 20:04:29 2017 +0200
@@ -254,9 +254,6 @@
HeapRegionSetBase* _containing_set;
#endif // ASSERT
- // For parallel heapRegion traversal.
- jint _claimed;
-
// We use concurrent marking to determine the amount of live data
// in each heap region.
size_t _prev_marked_bytes; // Bytes known to be live via last completed marking.
@@ -336,19 +333,6 @@
// up once during initialization time.
static void setup_heap_region_size(size_t initial_heap_size, size_t max_heap_size);
- enum ClaimValues {
- InitialClaimValue = 0,
- FinalCountClaimValue = 1,
- NoteEndClaimValue = 2,
- ScrubRemSetClaimValue = 3,
- ParVerifyClaimValue = 4,
- RebuildRSClaimValue = 5,
- ParEvacFailureClaimValue = 6,
- AggregateCountClaimValue = 7,
- VerifyCountClaimValue = 8,
- ParMarkRootClaimValue = 9
- };
-
// All allocated blocks are occupied by objects in a HeapRegion
bool block_is_obj(const HeapWord* p) const;
@@ -691,12 +675,6 @@
return (HeapWord *) obj >= next_top_at_mark_start();
}
- // For parallel heapRegion traversal.
- bool claimHeapRegion(int claimValue);
- jint claim_value() { return _claimed; }
- // Use this carefully: only when you're sure no one is claiming...
- void set_claim_value(int claimValue) { _claimed = claimValue; }
-
// Returns the "evacuation_failed" property of the region.
bool evacuation_failed() { return _evacuation_failed; }
--- a/hotspot/src/share/vm/gc_implementation/g1/heapRegionManager.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegionManager.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -260,20 +260,17 @@
return num_regions;
}
-uint HeapRegionManager::start_region_for_worker(uint worker_i, uint num_workers, uint num_regions) const {
- return num_regions * worker_i / num_workers;
-}
-
-void HeapRegionManager::par_iterate(HeapRegionClosure* blk, uint worker_id, uint num_workers, jint claim_value) const {
- const uint start_index = start_region_for_worker(worker_id, num_workers, _allocated_heapregions_length);
+void HeapRegionManager::par_iterate(HeapRegionClosure* blk, uint worker_id, HeapRegionClaimer* hrclaimer) const {
+ const uint start_index = hrclaimer->start_region_for_worker(worker_id);
// Every worker will actually look at all regions, skipping over regions that
// are currently not committed.
// This also (potentially) iterates over regions newly allocated during GC. This
// is no problem except for some extra work.
- for (uint count = 0; count < _allocated_heapregions_length; count++) {
- const uint index = (start_index + count) % _allocated_heapregions_length;
- assert(0 <= index && index < _allocated_heapregions_length, "sanity");
+ const uint n_regions = hrclaimer->n_regions();
+ for (uint count = 0; count < n_regions; count++) {
+ const uint index = (start_index + count) % n_regions;
+ assert(0 <= index && index < n_regions, "sanity");
// Skip over unavailable regions
if (!is_available(index)) {
continue;
@@ -282,11 +279,11 @@
// We'll ignore "continues humongous" regions (we'll process them
// when we come across their corresponding "start humongous"
// region) and regions already claimed.
- if (r->claim_value() == claim_value || r->is_continues_humongous()) {
+ if (hrclaimer->is_region_claimed(index) || r->is_continues_humongous()) {
continue;
}
// OK, try to claim it
- if (!r->claimHeapRegion(claim_value)) {
+ if (!hrclaimer->claim_region(index)) {
continue;
}
// Success!
@@ -306,13 +303,11 @@
assert(chr->humongous_start_region() == r,
err_msg("Must work on humongous continuation of the original start region "
PTR_FORMAT ", but is " PTR_FORMAT, p2i(r), p2i(chr)));
- assert(chr->claim_value() != claim_value,
+ assert(!hrclaimer->is_region_claimed(ch_index),
"Must not have been claimed yet because claiming of humongous continuation first claims the start region");
- bool claim_result = chr->claimHeapRegion(claim_value);
- // We should always be able to claim it; no one else should
- // be trying to claim this region.
- guarantee(claim_result, "We should always be able to claim the is_continues_humongous part of the humongous object");
+ // There's no need to actually claim the continues humongous region, but we can do it in an assert as an extra precaution.
+ assert(hrclaimer->claim_region(ch_index), "We should always be able to claim the continuesHumongous part of the humongous object");
bool res2 = blk->doHeapRegion(chr);
if (res2) {
@@ -445,3 +440,31 @@
}
#endif // PRODUCT
+HeapRegionClaimer::HeapRegionClaimer(uint n_workers) :
+ _n_workers(n_workers), _n_regions(G1CollectedHeap::heap()->_hrm._allocated_heapregions_length), _claims(NULL) {
+ assert(n_workers > 0, "Need at least one worker.");
+ _claims = NEW_C_HEAP_ARRAY(uint, _n_regions, mtGC);
+ memset(_claims, Unclaimed, sizeof(*_claims) * _n_regions);
+}
+
+HeapRegionClaimer::~HeapRegionClaimer() {
+ if (_claims != NULL) {
+ FREE_C_HEAP_ARRAY(uint, _claims, mtGC);
+ }
+}
+
+uint HeapRegionClaimer::start_region_for_worker(uint worker_id) const {
+ assert(worker_id < _n_workers, "Invalid worker_id.");
+ return _n_regions * worker_id / _n_workers;
+}
+
+bool HeapRegionClaimer::is_region_claimed(uint region_index) const {
+ assert(region_index < _n_regions, "Invalid index.");
+ return _claims[region_index] == Claimed;
+}
+
+bool HeapRegionClaimer::claim_region(uint region_index) {
+ assert(region_index < _n_regions, "Invalid index.");
+ uint old_val = Atomic::cmpxchg(Claimed, &_claims[region_index], Unclaimed);
+ return old_val == Unclaimed;
+}
--- a/hotspot/src/share/vm/gc_implementation/g1/heapRegionManager.hpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegionManager.hpp Wed Jul 05 20:04:29 2017 +0200
@@ -31,6 +31,7 @@
class HeapRegion;
class HeapRegionClosure;
+class HeapRegionClaimer;
class FreeRegionList;
class G1HeapRegionTable : public G1BiasedMappedArray<HeapRegion*> {
@@ -66,6 +67,7 @@
class HeapRegionManager: public CHeapObj<mtGC> {
friend class VMStructs;
+ friend class HeapRegionClaimer;
G1HeapRegionTable _regions;
@@ -99,9 +101,6 @@
// Notify other data structures about change in the heap layout.
void update_committed_space(HeapWord* old_end, HeapWord* new_end);
- // Calculate the starting region for each worker during parallel iteration so
- // that they do not all start from the same region.
- uint start_region_for_worker(uint worker_i, uint num_workers, uint num_regions) const;
// Find a contiguous set of empty or uncommitted regions of length num and return
// the index of the first region or G1_NO_HRM_INDEX if the search was unsuccessful.
@@ -223,7 +222,7 @@
// terminating the iteration early if doHeapRegion() returns true.
void iterate(HeapRegionClosure* blk) const;
- void par_iterate(HeapRegionClosure* blk, uint worker_id, uint no_of_par_workers, jint claim_value) const;
+ void par_iterate(HeapRegionClosure* blk, uint worker_id, HeapRegionClaimer* hrclaimer) const;
// Uncommit up to num_regions_to_remove regions that are completely free.
// Return the actual number of uncommitted regions.
@@ -235,5 +234,33 @@
void verify_optional() PRODUCT_RETURN;
};
+// The HeapRegionClaimer is used during parallel iteration over heap regions,
+// allowing workers to claim heap regions, gaining exclusive rights to these regions.
+class HeapRegionClaimer : public StackObj {
+ uint _n_workers;
+ uint _n_regions;
+ uint* _claims;
+
+ static const uint Unclaimed = 0;
+ static const uint Claimed = 1;
+
+ public:
+ HeapRegionClaimer(uint n_workers);
+ ~HeapRegionClaimer();
+
+ inline uint n_regions() const {
+ return _n_regions;
+ }
+
+ // Calculate the starting region for given worker so
+ // that they do not all start from the same region.
+ uint start_region_for_worker(uint worker_id) const;
+
+ // Check if region has been claimed with this HRClaimer.
+ bool is_region_claimed(uint region_index) const;
+
+ // Claim the given region, returns true if successfully claimed.
+ bool claim_region(uint region_index);
+};
#endif // SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONMANAGER_HPP
--- a/hotspot/src/share/vm/gc_implementation/g1/vm_operations_g1.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/vm_operations_g1.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -95,8 +95,9 @@
assert(!_should_initiate_conc_mark ||
((_gc_cause == GCCause::_gc_locker && GCLockerInvokesConcurrent) ||
(_gc_cause == GCCause::_java_lang_system_gc && ExplicitGCInvokesConcurrent) ||
- _gc_cause == GCCause::_g1_humongous_allocation),
- "only a GC locker, a System.gc() or a hum allocation induced GC should start a cycle");
+ _gc_cause == GCCause::_g1_humongous_allocation ||
+ _gc_cause == GCCause::_update_allocation_context_stats_inc),
+ "only a GC locker, a System.gc(), stats update or a hum allocation induced GC should start a cycle");
if (_word_size > 0) {
// An allocation has been requested. So, try to do that first.
--- a/hotspot/src/share/vm/gc_interface/gcCause.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/gc_interface/gcCause.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -54,7 +54,8 @@
case _wb_young_gc:
return "WhiteBox Initiated Young GC";
- case _update_allocation_context_stats:
+ case _update_allocation_context_stats_inc:
+ case _update_allocation_context_stats_full:
return "Update Allocation Context Stats";
case _no_gc:
--- a/hotspot/src/share/vm/gc_interface/gcCause.hpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/gc_interface/gcCause.hpp Wed Jul 05 20:04:29 2017 +0200
@@ -47,7 +47,8 @@
_heap_inspection,
_heap_dump,
_wb_young_gc,
- _update_allocation_context_stats,
+ _update_allocation_context_stats_inc,
+ _update_allocation_context_stats_full,
/* implementation independent, but reserved for GC use */
_no_gc,
--- a/hotspot/src/share/vm/interpreter/linkResolver.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/interpreter/linkResolver.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -246,6 +246,12 @@
// Ignore overpasses so statics can be found during resolution
Method* result_oop = klass->uncached_lookup_method(name, signature, Klass::skip_overpass);
+ if (klass->oop_is_array()) {
+ // Only consider klass and super klass for arrays
+ result = methodHandle(THREAD, result_oop);
+ return;
+ }
+
// JDK 8, JVMS 5.4.3.4: Interface method resolution should
// ignore static and non-public methods of java.lang.Object,
// like clone, finalize, registerNatives.
@@ -290,6 +296,11 @@
result = methodHandle(THREAD, super_klass->uncached_lookup_method(name, signature, Klass::normal));
}
+ if (klass->oop_is_array()) {
+ // Only consider klass and super klass for arrays
+ return;
+ }
+
if (result.is_null()) {
Array<Method*>* default_methods = InstanceKlass::cast(klass())->default_methods();
if (default_methods != NULL) {
@@ -545,7 +556,7 @@
// 2. lookup method in resolved klass and its super klasses
lookup_method_in_klasses(resolved_method, resolved_klass, method_name, method_signature, true, false, CHECK);
- if (resolved_method.is_null()) { // not found in the class hierarchy
+ if (resolved_method.is_null() && !resolved_klass->oop_is_array()) { // not found in the class hierarchy
// 3. lookup method in all the interfaces implemented by the resolved klass
lookup_method_in_interfaces(resolved_method, resolved_klass, method_name, method_signature, CHECK);
@@ -558,16 +569,16 @@
CLEAR_PENDING_EXCEPTION;
}
}
+ }
- if (resolved_method.is_null()) {
- // 4. method lookup failed
- ResourceMark rm(THREAD);
- THROW_MSG_CAUSE(vmSymbols::java_lang_NoSuchMethodError(),
- Method::name_and_sig_as_C_string(resolved_klass(),
- method_name,
- method_signature),
- nested_exception);
- }
+ if (resolved_method.is_null()) {
+ // 4. method lookup failed
+ ResourceMark rm(THREAD);
+ THROW_MSG_CAUSE(vmSymbols::java_lang_NoSuchMethodError(),
+ Method::name_and_sig_as_C_string(resolved_klass(),
+ method_name,
+ method_signature),
+ nested_exception);
}
// 5. access checks, access checking may be turned off when calling from within the VM.
@@ -633,17 +644,18 @@
// JDK8: also look for static methods
lookup_method_in_klasses(resolved_method, resolved_klass, method_name, method_signature, false, true, CHECK);
- if (resolved_method.is_null()) {
+ if (resolved_method.is_null() && !resolved_klass->oop_is_array()) {
// lookup method in all the super-interfaces
lookup_method_in_interfaces(resolved_method, resolved_klass, method_name, method_signature, CHECK);
- if (resolved_method.is_null()) {
- // no method found
- ResourceMark rm(THREAD);
- THROW_MSG(vmSymbols::java_lang_NoSuchMethodError(),
- Method::name_and_sig_as_C_string(resolved_klass(),
- method_name,
- method_signature));
- }
+ }
+
+ if (resolved_method.is_null()) {
+ // no method found
+ ResourceMark rm(THREAD);
+ THROW_MSG(vmSymbols::java_lang_NoSuchMethodError(),
+ Method::name_and_sig_as_C_string(resolved_klass(),
+ method_name,
+ method_signature));
}
if (check_access) {
@@ -775,7 +787,7 @@
}
// Resolve instance field
- KlassHandle sel_klass(THREAD, InstanceKlass::cast(resolved_klass())->find_field(field, sig, &fd));
+ KlassHandle sel_klass(THREAD, resolved_klass->find_field(field, sig, &fd));
// check if field exists; i.e., if a klass containing the field def has been selected
if (sel_klass.is_null()) {
ResourceMark rm(THREAD);
--- a/hotspot/src/share/vm/memory/filemap.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/memory/filemap.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -331,6 +331,14 @@
return false;
}
+ size_t len = lseek(fd, 0, SEEK_END);
+ struct FileMapInfo::FileMapHeader::space_info* si =
+ &_header->_space[MetaspaceShared::mc];
+ if (si->_file_offset >= len || len - si->_file_offset < si->_used) {
+ fail_continue("The shared archive file has been truncated.");
+ return false;
+ }
+
_file_offset += (long)n;
return true;
}
@@ -431,6 +439,7 @@
si->_capacity = capacity;
si->_read_only = read_only;
si->_allow_exec = allow_exec;
+ si->_crc = ClassLoader::crc32(0, base, (jint)size);
write_bytes_aligned(base, (int)size);
}
@@ -455,14 +464,15 @@
// Align file position to an allocation unit boundary.
void FileMapInfo::align_file_position() {
- long new_file_offset = align_size_up(_file_offset, os::vm_allocation_granularity());
+ size_t new_file_offset = align_size_up(_file_offset,
+ os::vm_allocation_granularity());
if (new_file_offset != _file_offset) {
_file_offset = new_file_offset;
if (_file_open) {
// Seek one byte back from the target and write a byte to insure
// that the written file is the correct length.
_file_offset -= 1;
- if (lseek(_fd, _file_offset, SEEK_SET) < 0) {
+ if (lseek(_fd, (long)_file_offset, SEEK_SET) < 0) {
fail_stop("Unable to seek.");
}
char zero = 0;
@@ -569,6 +579,19 @@
return base;
}
+bool FileMapInfo::verify_region_checksum(int i) {
+ if (!VerifySharedSpaces) {
+ return true;
+ }
+ const char* buf = _header->_space[i]._base;
+ size_t sz = _header->_space[i]._used;
+ int crc = ClassLoader::crc32(0, buf, (jint)sz);
+ if (crc != _header->_space[i]._crc) {
+ fail_continue("Checksum verification failed.");
+ return false;
+ }
+ return true;
+}
// Unmap a memory region in the address space.
@@ -629,7 +652,21 @@
return true;
}
+int FileMapInfo::FileMapHeader::compute_crc() {
+ char* header = data();
+ // start computing from the field after _crc
+ char* buf = (char*)&_crc + sizeof(int);
+ size_t sz = data_size() - (buf - header);
+ int crc = ClassLoader::crc32(0, buf, (jint)sz);
+ return crc;
+}
+
bool FileMapInfo::FileMapHeader::validate() {
+ if (VerifySharedSpaces && compute_crc() != _crc) {
+ fail_continue("Header checksum verification failed.");
+ return false;
+ }
+
if (_version != current_version()) {
FileMapInfo::fail_continue("The shared archive file is the wrong version.");
return false;
--- a/hotspot/src/share/vm/memory/filemap.hpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/memory/filemap.hpp Wed Jul 05 20:04:29 2017 +0200
@@ -61,7 +61,7 @@
bool _file_open;
int _fd;
- long _file_offset;
+ size_t _file_offset;
private:
static SharedClassPathEntry* _classpath_entry_table;
@@ -87,12 +87,14 @@
}
int _magic; // identify file type.
+ int _crc; // header crc checksum.
int _version; // (from enum, above.)
size_t _alignment; // how shared archive should be aligned
int _obj_alignment; // value of ObjectAlignmentInBytes
struct space_info {
- int _file_offset; // sizeof(this) rounded to vm page size
+ int _crc; // crc checksum of the current space
+ size_t _file_offset; // sizeof(this) rounded to vm page size
char* _base; // copy-on-write base address
size_t _capacity; // for validity checking
size_t _used; // for setting space top on read
@@ -135,6 +137,7 @@
virtual bool validate();
virtual void populate(FileMapInfo* info, size_t alignment);
+ int compute_crc();
};
FileMapHeader * _header;
@@ -153,6 +156,8 @@
~FileMapInfo();
static int current_version() { return _current_version; }
+ int compute_header_crc() { return _header->compute_crc(); }
+ void set_header_crc(int crc) { _header->_crc = crc; }
void populate_header(size_t alignment);
bool validate_header();
void invalidate();
@@ -181,6 +186,7 @@
void write_bytes_aligned(const void* buffer, int count);
char* map_region(int i);
void unmap_region(int i);
+ bool verify_region_checksum(int i);
void close();
bool is_open() { return _file_open; }
ReservedSpace reserve_shared_memory();
--- a/hotspot/src/share/vm/memory/metaspaceShared.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/memory/metaspaceShared.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -608,6 +608,7 @@
// Pass 2 - write data.
mapinfo->open_for_write();
+ mapinfo->set_header_crc(mapinfo->compute_header_crc());
mapinfo->write_header();
mapinfo->write_space(MetaspaceShared::ro, _loader_data->ro_metaspace(), true);
mapinfo->write_space(MetaspaceShared::rw, _loader_data->rw_metaspace(), false);
@@ -937,9 +938,13 @@
// Map each shared region
if ((_ro_base = mapinfo->map_region(ro)) != NULL &&
+ mapinfo->verify_region_checksum(ro) &&
(_rw_base = mapinfo->map_region(rw)) != NULL &&
+ mapinfo->verify_region_checksum(rw) &&
(_md_base = mapinfo->map_region(md)) != NULL &&
+ mapinfo->verify_region_checksum(md) &&
(_mc_base = mapinfo->map_region(mc)) != NULL &&
+ mapinfo->verify_region_checksum(mc) &&
(image_alignment == (size_t)max_alignment()) &&
mapinfo->validate_classpath_entry_table()) {
// Success (no need to do anything)
--- a/hotspot/src/share/vm/oops/arrayKlass.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/oops/arrayKlass.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -64,6 +64,13 @@
return NULL;
}
+// find field according to JVM spec 5.4.3.2, returns the klass in which the field is defined
+Klass* ArrayKlass::find_field(Symbol* name, Symbol* sig, fieldDescriptor* fd) const {
+ // There are no fields in an array klass but look to the super class (Object)
+ assert(super(), "super klass must be present");
+ return super()->find_field(name, sig, fd);
+}
+
Method* ArrayKlass::uncached_lookup_method(Symbol* name, Symbol* signature, MethodLookupMode mode) const {
// There are no methods in an array klass but the super class (Object) has some
assert(super(), "super klass must be present");
--- a/hotspot/src/share/vm/oops/arrayKlass.hpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/oops/arrayKlass.hpp Wed Jul 05 20:04:29 2017 +0200
@@ -28,6 +28,7 @@
#include "memory/universe.hpp"
#include "oops/klass.hpp"
+class fieldDescriptor;
class klassVtable;
// ArrayKlass is the abstract baseclass for all array classes
@@ -77,6 +78,9 @@
virtual oop multi_allocate(int rank, jint* sizes, TRAPS);
objArrayOop allocate_arrayArray(int n, int length, TRAPS);
+ // find field according to JVM spec 5.4.3.2, returns the klass in which the field is defined
+ Klass* find_field(Symbol* name, Symbol* sig, fieldDescriptor* fd) const;
+
// Lookup operations
Method* uncached_lookup_method(Symbol* name, Symbol* signature, MethodLookupMode mode) const;
--- a/hotspot/src/share/vm/oops/klass.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/oops/klass.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -130,6 +130,15 @@
return is_subclass_of(k);
}
+Klass* Klass::find_field(Symbol* name, Symbol* sig, fieldDescriptor* fd) const {
+#ifdef ASSERT
+ tty->print_cr("Error: find_field called on a klass oop."
+ " Likely error: reflection method does not correctly"
+ " wrap return value in a mirror object.");
+#endif
+ ShouldNotReachHere();
+ return NULL;
+}
Method* Klass::uncached_lookup_method(Symbol* name, Symbol* signature, MethodLookupMode mode) const {
#ifdef ASSERT
--- a/hotspot/src/share/vm/oops/klass.hpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/oops/klass.hpp Wed Jul 05 20:04:29 2017 +0200
@@ -62,6 +62,7 @@
class klassVtable;
class ParCompactionManager;
class KlassSizeStats;
+class fieldDescriptor;
class Klass : public Metadata {
friend class VMStructs;
@@ -411,6 +412,7 @@
virtual void initialize(TRAPS);
// lookup operation for MethodLookupCache
friend class MethodLookupCache;
+ virtual Klass* find_field(Symbol* name, Symbol* signature, fieldDescriptor* fd) const;
virtual Method* uncached_lookup_method(Symbol* name, Symbol* signature, MethodLookupMode mode) const;
public:
Method* lookup_method(Symbol* name, Symbol* signature) const {
--- a/hotspot/src/share/vm/opto/compile.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/opto/compile.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -1153,12 +1153,18 @@
assert(s == start(), "");
}
+/**
+ * Return the 'StartNode'. We must not have a pending failure, since the ideal graph
+ * can be in an inconsistent state, i.e., we can get segmentation faults when traversing
+ * the ideal graph.
+ */
StartNode* Compile::start() const {
- assert(!failing(), "");
+ assert (!failing(), err_msg_res("Must not have pending failure. Reason is: %s", failure_reason()));
for (DUIterator_Fast imax, i = root()->fast_outs(imax); i < imax; i++) {
Node* start = root()->fast_out(i);
- if( start->is_Start() )
+ if (start->is_Start()) {
return start->as_Start();
+ }
}
fatal("Did not find Start node!");
return NULL;
--- a/hotspot/src/share/vm/opto/compile.hpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/opto/compile.hpp Wed Jul 05 20:04:29 2017 +0200
@@ -707,12 +707,15 @@
void sort_expensive_nodes();
// Compilation environment.
- Arena* comp_arena() { return &_comp_arena; }
- ciEnv* env() const { return _env; }
- CompileLog* log() const { return _log; }
- bool failing() const { return _env->failing() || _failure_reason != NULL; }
- const char* failure_reason() { return _failure_reason; }
- bool failure_reason_is(const char* r) { return (r==_failure_reason) || (r!=NULL && _failure_reason!=NULL && strcmp(r, _failure_reason)==0); }
+ Arena* comp_arena() { return &_comp_arena; }
+ ciEnv* env() const { return _env; }
+ CompileLog* log() const { return _log; }
+ bool failing() const { return _env->failing() || _failure_reason != NULL; }
+ const char* failure_reason() const { return (_env->failing()) ? _env->failure_reason() : _failure_reason; }
+
+ bool failure_reason_is(const char* r) const {
+ return (r == _failure_reason) || (r != NULL && _failure_reason != NULL && strcmp(r, _failure_reason) == 0);
+ }
void record_failure(const char* reason);
void record_method_not_compilable(const char* reason, bool all_tiers = false) {
--- a/hotspot/src/share/vm/opto/doCall.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/opto/doCall.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -802,10 +802,16 @@
// each arm of the Phi. If I know something clever about the exceptions
// I'm loading the class from, I can replace the LoadKlass with the
// klass constant for the exception oop.
- if( ex_node->is_Phi() ) {
- ex_klass_node = new PhiNode( ex_node->in(0), TypeKlassPtr::OBJECT );
- for( uint i = 1; i < ex_node->req(); i++ ) {
- Node* p = basic_plus_adr( ex_node->in(i), ex_node->in(i), oopDesc::klass_offset_in_bytes() );
+ if (ex_node->is_Phi()) {
+ ex_klass_node = new PhiNode(ex_node->in(0), TypeKlassPtr::OBJECT);
+ for (uint i = 1; i < ex_node->req(); i++) {
+ Node* ex_in = ex_node->in(i);
+ if (ex_in == top() || ex_in == NULL) {
+ // This path was not taken.
+ ex_klass_node->init_req(i, top());
+ continue;
+ }
+ Node* p = basic_plus_adr(ex_in, ex_in, oopDesc::klass_offset_in_bytes());
Node* k = _gvn.transform( LoadKlassNode::make(_gvn, immutable_memory(), p, TypeInstPtr::KLASS, TypeKlassPtr::OBJECT) );
ex_klass_node->init_req( i, k );
}
--- a/hotspot/src/share/vm/prims/jvm.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/prims/jvm.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -805,6 +805,7 @@
return (jclass) JNIHandles::make_local(env, k->java_mirror());
JVM_END
+// Not used; JVM_FindClassFromCaller replaces this.
JVM_ENTRY(jclass, JVM_FindClassFromClassLoader(JNIEnv* env, const char* name,
jboolean init, jobject loader,
jboolean throwError))
@@ -831,6 +832,42 @@
return result;
JVM_END
+// Find a class with this name in this loader, using the caller's protection domain.
+JVM_ENTRY(jclass, JVM_FindClassFromCaller(JNIEnv* env, const char* name,
+ jboolean init, jobject loader,
+ jclass caller))
+ JVMWrapper2("JVM_FindClassFromCaller %s throws ClassNotFoundException", name);
+ // Java libraries should ensure that name is never null...
+ if (name == NULL || (int)strlen(name) > Symbol::max_length()) {
+ // It's impossible to create this class; the name cannot fit
+ // into the constant pool.
+ THROW_MSG_0(vmSymbols::java_lang_ClassNotFoundException(), name);
+ }
+
+ TempNewSymbol h_name = SymbolTable::new_symbol(name, CHECK_NULL);
+
+ oop loader_oop = JNIHandles::resolve(loader);
+ oop from_class = JNIHandles::resolve(caller);
+ oop protection_domain = NULL;
+ // If loader is null, shouldn't call ClassLoader.checkPackageAccess; otherwise get
+ // NPE. Put it in another way, the bootstrap class loader has all permission and
+ // thus no checkPackageAccess equivalence in the VM class loader.
+ // The caller is also passed as NULL by the java code if there is no security
+ // manager to avoid the performance cost of getting the calling class.
+ if (from_class != NULL && loader_oop != NULL) {
+ protection_domain = java_lang_Class::as_Klass(from_class)->protection_domain();
+ }
+
+ Handle h_loader(THREAD, loader_oop);
+ Handle h_prot(THREAD, protection_domain);
+ jclass result = find_class_from_class_loader(env, h_name, init, h_loader,
+ h_prot, false, THREAD);
+
+ if (TraceClassResolution && result != NULL) {
+ trace_class_resolution(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(result)));
+ }
+ return result;
+JVM_END
JVM_ENTRY(jclass, JVM_FindClassFromClass(JNIEnv *env, const char *name,
jboolean init, jclass from))
@@ -1073,17 +1110,6 @@
JVM_END
-JVM_ENTRY(jobject, JVM_GetClassLoader(JNIEnv *env, jclass cls))
- JVMWrapper("JVM_GetClassLoader");
- if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
- return NULL;
- }
- Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
- oop loader = k->class_loader();
- return JNIHandles::make_local(env, loader);
-JVM_END
-
-
JVM_QUICK_ENTRY(jboolean, JVM_IsInterface(JNIEnv *env, jclass cls))
JVMWrapper("JVM_IsInterface");
oop mirror = JNIHandles::resolve_non_null(cls);
@@ -3932,10 +3958,15 @@
// Shared JNI/JVM entry points //////////////////////////////////////////////////////////////
-jclass find_class_from_class_loader(JNIEnv* env, Symbol* name, jboolean init, Handle loader, Handle protection_domain, jboolean throwError, TRAPS) {
+jclass find_class_from_class_loader(JNIEnv* env, Symbol* name, jboolean init,
+ Handle loader, Handle protection_domain,
+ jboolean throwError, TRAPS) {
// Security Note:
// The Java level wrapper will perform the necessary security check allowing
- // us to pass the NULL as the initiating class loader.
+ // us to pass the NULL as the initiating class loader. The VM is responsible for
+ // the checkPackageAccess relative to the initiating class loader via the
+ // protection_domain. The protection_domain is passed as NULL by the java code
+ // if there is no security manager in 3-arg Class.forName().
Klass* klass = SystemDictionary::resolve_or_fail(name, loader, protection_domain, throwError != 0, CHECK_NULL);
KlassHandle klass_handle(THREAD, klass);
--- a/hotspot/src/share/vm/prims/jvm.h Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/prims/jvm.h Wed Jul 05 20:04:29 2017 +0200
@@ -420,6 +420,19 @@
JVM_FindClassFromBootLoader(JNIEnv *env, const char *name);
/*
+ * Find a class from a given class loader. Throws ClassNotFoundException.
+ * name: name of class
+ * init: whether initialization is done
+ * loader: class loader to look up the class. This may not be the same as the caller's
+ * class loader.
+ * caller: initiating class. The initiating class may be null when a security
+ * manager is not installed.
+ */
+JNIEXPORT jclass JNICALL
+JVM_FindClassFromCaller(JNIEnv *env, const char *name, jboolean init,
+ jobject loader, jclass caller);
+
+/*
* Find a class from a given class.
*/
JNIEXPORT jclass JNICALL
@@ -462,9 +475,6 @@
JNIEXPORT jobjectArray JNICALL
JVM_GetClassInterfaces(JNIEnv *env, jclass cls);
-JNIEXPORT jobject JNICALL
-JVM_GetClassLoader(JNIEnv *env, jclass cls);
-
JNIEXPORT jboolean JNICALL
JVM_IsInterface(JNIEnv *env, jclass cls);
--- a/hotspot/src/share/vm/runtime/arguments.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/runtime/arguments.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -3836,6 +3836,11 @@
return JNI_ENOMEM;
}
+ // Set up VerifySharedSpaces
+ if (FLAG_IS_DEFAULT(VerifySharedSpaces) && SharedArchiveFile != NULL) {
+ VerifySharedSpaces = true;
+ }
+
// Delay warning until here so that we've had a chance to process
// the -XX:-PrintWarnings flag
if (needs_hotspotrc_warning) {
--- a/hotspot/src/share/vm/runtime/globals.hpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/runtime/globals.hpp Wed Jul 05 20:04:29 2017 +0200
@@ -1177,11 +1177,11 @@
"When true prevents OS-level spurious, or premature, wakeups " \
"from Object.wait (Ignored for Windows)") \
\
- product(intx, NativeMonitorTimeout, -1, "(Unstable)") \
- \
- product(intx, NativeMonitorFlags, 0, "(Unstable)") \
- \
- product(intx, NativeMonitorSpinLimit, 20, "(Unstable)") \
+ experimental(intx, NativeMonitorTimeout, -1, "(Unstable)") \
+ \
+ experimental(intx, NativeMonitorFlags, 0, "(Unstable)") \
+ \
+ experimental(intx, NativeMonitorSpinLimit, 20, "(Unstable)") \
\
develop(bool, UsePthreads, false, \
"Use pthread-based instead of libthread-based synchronization " \
@@ -3790,6 +3790,10 @@
product(bool, UseSharedSpaces, true, \
"Use shared spaces for metadata") \
\
+ product(bool, VerifySharedSpaces, false, \
+ "Verify shared spaces (false for default archive, true for " \
+ "archive specified by -XX:SharedArchiveFile)") \
+ \
product(bool, RequireSharedSpaces, false, \
"Require shared spaces for metadata") \
\
--- a/hotspot/src/share/vm/runtime/perfMemory.hpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/runtime/perfMemory.hpp Wed Jul 05 20:04:29 2017 +0200
@@ -155,9 +155,6 @@
}
}
- // filename of backing store or NULL if none.
- static char* backing_store_filename();
-
// returns the complete file path of hsperfdata.
// the caller is expected to free the allocated memory.
static char* get_perfdata_file_path();
--- a/hotspot/src/share/vm/runtime/reflection.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/runtime/reflection.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -507,7 +507,8 @@
if (access.is_protected()) {
if (!protected_restriction) {
// See if current_class (or outermost host class) is a subclass of field_class
- if (host_class->is_subclass_of(field_class)) {
+ // An interface may not access protected members of j.l.Object
+ if (!host_class->is_interface() && host_class->is_subclass_of(field_class)) {
if (access.is_static() || // static fields are ok, see 6622385
current_class == resolved_class ||
field_class == resolved_class ||
--- a/hotspot/src/share/vm/runtime/sweeper.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/src/share/vm/runtime/sweeper.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -540,17 +540,25 @@
// If there are no current activations of this method on the
// stack we can safely convert it to a zombie method
if (nm->can_not_entrant_be_converted()) {
- if (PrintMethodFlushing && Verbose) {
- tty->print_cr("### Nmethod %3d/" PTR_FORMAT " (not entrant) being made zombie", nm->compile_id(), nm);
- }
// Clear ICStubs to prevent back patching stubs of zombie or unloaded
// nmethods during the next safepoint (see ICStub::finalize).
- MutexLocker cl(CompiledIC_lock);
- nm->clear_ic_stubs();
- // Code cache state change is tracked in make_zombie()
- nm->make_zombie();
- _zombified_count++;
- SWEEP(nm);
+ {
+ MutexLocker cl(CompiledIC_lock);
+ nm->clear_ic_stubs();
+ }
+ // Acquiring the CompiledIC_lock may block for a safepoint and set the
+ // nmethod to zombie (see 'CodeCache::make_marked_nmethods_zombies').
+ // Check if nmethod is still non-entrant at this point.
+ if (nm->is_not_entrant()) {
+ if (PrintMethodFlushing && Verbose) {
+ tty->print_cr("### Nmethod %3d/" PTR_FORMAT " (not entrant) being made zombie", nm->compile_id(), nm);
+ }
+ // Code cache state change is tracked in make_zombie()
+ nm->make_zombie();
+ _zombified_count++;
+ SWEEP(nm);
+ }
+ assert(nm->is_zombie(), "nmethod must be zombie");
} else {
// Still alive, clean up its inline caches
MutexLocker cl(CompiledIC_lock);
--- a/hotspot/test/TEST.groups Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/test/TEST.groups Wed Jul 05 20:04:29 2017 +0200
@@ -447,7 +447,7 @@
compiler/codegen/ \
compiler/cpuflags/RestoreMXCSR.java \
compiler/EscapeAnalysis/ \
- compiler/exceptions/TestRecursiveReplacedException.java \
+ compiler/exceptions/ \
compiler/floatingpoint/ModNaN.java \
compiler/gcbarriers/G1CrashTest.java \
compiler/inlining/ \
--- a/hotspot/test/compiler/codecache/CheckSegmentedCodeCache.java Thu Oct 16 12:01:56 2014 -0700
+++ b/hotspot/test/compiler/codecache/CheckSegmentedCodeCache.java Wed Jul 05 20:04:29 2017 +0200
@@ -38,22 +38,26 @@
private static void verifySegmentedCodeCache(ProcessBuilder pb, boolean enabled) throws Exception {
OutputAnalyzer out = new OutputAnalyzer(pb.start());
+ out.shouldHaveExitValue(0);
if (enabled) {
try {
// Non-nmethod code heap should be always available with the segmented code cache
out.shouldContain(NON_METHOD);
} catch (RuntimeException e) {
- // TieredCompilation is disabled in a client VM
- out.shouldContain("TieredCompilation is disabled in this release.");
+ // Check if TieredCompilation is disabled (in a client VM)
+ if(!out.getOutput().contains("TieredCompilation is disabled in this release.")) {
+ // Code cache is not segmented
+ throw new RuntimeException("No code cache segmentation.");
+ }
}
} else {
out.shouldNotContain(NON_METHOD);
}
- out.shouldHaveExitValue(0);
}
private static void verifyCodeHeapNotExists(ProcessBuilder pb, String... heapNames) throws Exception {
OutputAnalyzer out = new OutputAnalyzer(pb.start());
+ out.shouldHaveExitValue(0);
for (String name : heapNames) {
out.shouldNotContain(name);
}
@@ -86,6 +90,10 @@
"-XX:ReservedCodeCacheSize=240m",
"-XX:+PrintCodeCache", "-version");
verifySegmentedCodeCache(pb, true);
+ pb = ProcessTools.createJavaProcessBuilder("-XX:+TieredCompilation",
+ "-XX:ReservedCodeCacheSize=400m",
+ "-XX:+PrintCodeCache", "-version");
+ verifySegmentedCodeCache(pb, true);
// Always enabled if SegmentedCodeCache is set
pb = ProcessTools.createJavaProcessBuilder("-XX:+SegmentedCodeCache",
@@ -100,12 +108,13 @@
"-Xint",
"-XX:+PrintCodeCache", "-version");
verifyCodeHeapNotExists(pb, PROFILED, NON_PROFILED);
+
+ // If we stop compilation at CompLevel_none or CompLevel_simple we
+ // don't need a profiled code heap.
pb = ProcessTools.createJavaProcessBuilder("-XX:+SegmentedCodeCache",
"-XX:TieredStopAtLevel=0",
"-XX:+PrintCodeCache", "-version");
- verifyCodeHeapNotExists(pb, PROFILED, NON_PROFILED);
-
- // If we stop compilation at CompLevel_simple
+ verifyCodeHeapNotExists(pb, PROFILED);
pb = ProcessTools.createJavaProcessBuilder("-XX:+SegmentedCodeCache",
"-XX:TieredStopAtLevel=1",
"-XX:+PrintCodeCache", "-version");
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/exceptions/CatchInlineExceptions.java Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * 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 8059299
+ * @summary assert(adr_type != NULL) failed: expecting TypeKlassPtr
+ * @run main/othervm -Xbatch CatchInlineExceptions
+ */
+
+class Exception1 extends Exception {};
+class Exception2 extends Exception {};
+
+public class CatchInlineExceptions {
+ private static int counter0;
+ private static int counter1;
+ private static int counter2;
+ private static int counter;
+
+ static void foo(int i) throws Exception {
+ if ((i & 1023) == 2) {
+ counter0++;
+ throw new Exception2();
+ }
+ }
+
+ static void test(int i) throws Exception {
+ try {
+ foo(i);
+ }
+ catch (Exception e) {
+ if (e instanceof Exception1) {
+ counter1++;
+ } else if (e instanceof Exception2) {
+ counter2++;
+ }
+ counter++;
+ throw e;
+ }
+ }
+
+ public static void main(String[] args) throws Throwable {
+ for (int i = 0; i < 15000; i++) {
+ try {
+ test(i);
+ } catch (Exception e) {
+ // expected
+ }
+ }
+ if (counter1 != 0) {
+ throw new RuntimeException("Failed: counter1(" + counter1 + ") != 0");
+ }
+ if (counter2 != counter) {
+ throw new RuntimeException("Failed: counter2(" + counter2 + ") != counter0(" + counter0 + ")");
+ }
+ if (counter2 != counter) {
+ throw new RuntimeException("Failed: counter2(" + counter2 + ") != counter(" + counter + ")");
+ }
+ System.out.println("TEST PASSED");
+ }
+}
--- a/jdk/.hgtags Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/.hgtags Wed Jul 05 20:04:29 2017 +0200
@@ -277,3 +277,4 @@
8bdf7083b5bd02aa330ba622895e586dd3378d37 jdk9-b32
60fe681c30bc3821545a2506d4d3c2e04073f67c jdk9-b33
21568031434d7a9dbb0cc6516cc3183d349c2253 jdk9-b34
+e549291a0227031310fa91c574891f892d27f959 jdk9-b35
--- a/jdk/make/gensrc/Gensrc-java.base.gmk Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/make/gensrc/Gensrc-java.base.gmk Wed Jul 05 20:04:29 2017 +0200
@@ -25,10 +25,6 @@
include GensrcCommon.gmk
-# TODO: maybe split into separate modules?
-include GensrcProperties.gmk
-GENSRC_JAVA_BASE += $(GENSRC_PROPERTIES)
-
include GensrcLocaleData.gmk
include GensrcCharacterData.gmk
include GensrcMisc.gmk
@@ -37,6 +33,34 @@
include GensrcBuffer.gmk
include GensrcExceptions.gmk
+################################################################################
+
+include GensrcProperties.gmk
+
+$(eval $(call SetupCompileProperties,LIST_RESOURCE_BUNDLE, \
+ $(filter %.properties, \
+ $(call CacheFind, $(JDK_TOPDIR)/src/java.base/share/classes/sun/launcher/resources)), \
+ ListResourceBundle))
+
+$(eval $(call SetupCompileProperties,SUN_UTIL, \
+ $(filter %.properties, \
+ $(call CacheFind, $(JDK_TOPDIR)/src/java.base/share/classes/sun/util/resources)), \
+ sun.util.resources.LocaleNamesBundle))
+
+GENSRC_JAVA_BASE += $(LIST_RESOURCE_BUNDLE) $(SUN_UTIL)
+
+# Some resources bundles are already present as java files but still need to be
+# copied to zh_HK locale.
+$(eval $(call SetupCopy-zh_HK,COPY_ZH_HK, \
+ $(addprefix $(JDK_TOPDIR)/src/java.base/share/classes/, \
+ sun/misc/resources/Messages_zh_TW.java \
+ sun/security/util/AuthResources_zh_TW.java \
+ sun/security/util/Resources_zh_TW.java)))
+
+GENSRC_JAVA_BASE += $(COPY_ZH_HK)
+
+################################################################################
+
java.base: $(GENSRC_JAVA_BASE)
all: java.base
--- a/jdk/make/gensrc/Gensrc-java.desktop.gmk Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/make/gensrc/Gensrc-java.desktop.gmk Wed Jul 05 20:04:29 2017 +0200
@@ -38,6 +38,48 @@
include GensrcSwing.gmk
+################################################################################
+
+include GensrcProperties.gmk
+
+PROP_SRC_DIRS := \
+ $(JDK_TOPDIR)/src/java.desktop/share/classes/sun/awt/resources \
+ $(JDK_TOPDIR)/src/java.desktop/share/classes/com/sun/accessibility/internal/resources \
+ $(JDK_TOPDIR)/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/resources \
+ $(JDK_TOPDIR)/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/resources \
+ $(JDK_TOPDIR)/src/java.desktop/share/classes/com/sun/swing/internal/plaf/basic/resources \
+ $(JDK_TOPDIR)/src/java.desktop/share/classes/com/sun/swing/internal/plaf/metal/resources \
+ $(JDK_TOPDIR)/src/java.desktop/share/classes/com/sun/swing/internal/plaf/synth/resources \
+ $(JDK_TOPDIR)/src/java.desktop/share/classes/sun/print/resources \
+ #
+
+ifeq ($(OPENJDK_TARGET_OS), macosx)
+ PROP_SRC_DIRS += \
+ $(JDK_TOPDIR)/src/java.desktop/macosx/classes/com/apple/laf/resources \
+ $(JDK_TOPDIR)/src/java.desktop/macosx/classes/sun/awt/resources \
+ #
+endif
+
+ifeq ($(OPENJDK_TARGET_OS), windows)
+ PROP_SRC_DIRS += $(JDK_TOPDIR)/src/java.desktop/windows/classes/sun/awt/windows
+else
+ PROP_SRC_DIRS += $(JDK_TOPDIR)/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/resources
+endif
+
+$(eval $(call SetupCompileProperties,COMPILE_PROPERTIES, \
+ $(filter %.properties, $(call CacheFind, $(PROP_SRC_DIRS))), ListResourceBundle))
+
+GENSRC_JAVA_DESKTOP += $(COMPILE_PROPERTIES)
+
+# Some resources bundles are already present as java files but still need to be
+# copied to zh_HK locale.
+$(eval $(call SetupCopy-zh_HK,COPY_ZH_HK, \
+ $(JDK_TOPDIR)/src/java.desktop/share/classes/sun/applet/resources/MsgAppletViewer_zh_TW.java))
+
+GENSRC_JAVA_DESKTOP += $(COPY_ZH_HK)
+
+################################################################################
+
java.desktop: $(GENSRC_JAVA_DESKTOP)
all: java.desktop
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/make/gensrc/Gensrc-java.logging.gmk Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,43 @@
+#
+# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation. Oracle designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Oracle in the LICENSE file that accompanied this code.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+#
+
+include GensrcCommon.gmk
+
+################################################################################
+
+include GensrcProperties.gmk
+
+$(eval $(call SetupCompileProperties,COMPILE_PROPERTIES, \
+ $(filter %.properties, \
+ $(call CacheFind, $(JDK_TOPDIR)/src/java.logging/share/classes/sun/util/logging/resources)), \
+ ListResourceBundle))
+
+TARGETS += $(COMPILE_PROPERTIES)
+
+################################################################################
+
+all: $(TARGETS)
+
+.PHONY: all
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/make/gensrc/Gensrc-java.management.gmk Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,43 @@
+#
+# Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation. Oracle designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Oracle in the LICENSE file that accompanied this code.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+#
+
+include GensrcCommon.gmk
+
+################################################################################
+
+include GensrcProperties.gmk
+
+$(eval $(call SetupCompileProperties,COMPILE_PROPERTIES, \
+ $(filter %.properties, \
+ $(call CacheFind, $(JDK_TOPDIR)/src/java.management/share/classes/sun/management/resources)), \
+ ListResourceBundle))
+
+TARGETS += $(COMPILE_PROPERTIES)
+
+################################################################################
+
+all: $(TARGETS)
+
+.PHONY: all
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/make/gensrc/Gensrc-jdk.dev.gmk Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,43 @@
+#
+# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation. Oracle designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Oracle in the LICENSE file that accompanied this code.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+#
+
+include GensrcCommon.gmk
+
+################################################################################
+
+include GensrcProperties.gmk
+
+$(eval $(call SetupCompileProperties,COMPILE_PROPERTIES, \
+ $(filter %.properties, \
+ $(call CacheFind, $(JDK_TOPDIR)/src/jdk.dev/share/classes/sun/tools/jar/resources)), \
+ ListResourceBundle))
+
+TARGETS += $(COMPILE_PROPERTIES)
+
+################################################################################
+
+all: $(TARGETS)
+
+.PHONY: all
--- a/jdk/make/gensrc/Gensrc-jdk.jdi.gmk Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/make/gensrc/Gensrc-jdk.jdi.gmk Wed Jul 05 20:04:29 2017 +0200
@@ -69,6 +69,17 @@
################################################################################
+include GensrcProperties.gmk
+
+$(eval $(call SetupCompileProperties,COMPILE_PROPERTIES, \
+ $(filter %.properties, \
+ $(call CacheFind, $(JDK_TOPDIR)/src/jdk.jdi/share/classes/com/sun/tools/jdi/resources)), \
+ ListResourceBundle))
+
+GENSRC_JDK_JDI += $(COMPILE_PROPERTIES)
+
+################################################################################
+
jdk.jdi: $(GENSRC_JDK_JDI)
all: jdk.jdi
--- a/jdk/make/gensrc/Gensrc-jdk.localedata.gmk Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/make/gensrc/Gensrc-jdk.localedata.gmk Wed Jul 05 20:04:29 2017 +0200
@@ -31,6 +31,20 @@
include GensrcLocaleData.gmk
include GensrcCLDR.gmk
+################################################################################
+
+include GensrcProperties.gmk
+
+$(eval $(call SetupCompileProperties,COMPILE_PROPERTIES, \
+ $(filter %.properties, \
+ $(call CacheFind, $(JDK_TOPDIR)/src/jdk.localedata/share/classes/sun/util/resources)), \
+ sun.util.resources.LocaleNamesBundle))
+
+# Skip generating zh_HK from zh_TW for this module.
+GENSRC_JDK_LOCALEDATA += $(filter-out %_zh_HK.java, $(COMPILE_PROPERTIES))
+
+################################################################################
+
jdk.localedata: $(GENSRC_JDK_LOCALEDATA)
all: jdk.localedata
--- a/jdk/make/gensrc/GensrcProperties.gmk Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/make/gensrc/GensrcProperties.gmk Wed Jul 05 20:04:29 2017 +0200
@@ -23,132 +23,81 @@
# questions.
#
-# All .properties files to be compiled are appended to this variable.
-ALL_COMPILED_PROPSOURCES :=
-# All generated .java files from compilation are appended to this variable.
-ALL_COMPILED_PROPJAVAS :=
-# The (very long) command line for compilation, stored in a file, prior to use.
-COMPILE_PROPCMDLINE :=
+# This file defines macros that sets up rules for generating java classes
+# from resource bundle properties files.
-define add_properties_to_compile
- # $1 is the name of the properties group
- # $2 is the files belonging to this group
- # $3 is the super class for the generated java file.
+################################################################################
+# Helper macro for SetupCopy-zh_HK.
+define SetupOneCopy-zh_HK
+ $1_$2_TARGET := $$(patsubst $(JDK_TOPDIR)/src/$(MODULE)/share/classes/%, \
+ $(JDK_OUTPUTDIR)/gensrc/$(MODULE)/%, \
+ $$(subst _zh_TW,_zh_HK, $2))
- # Convert <root>/jdk/src/<module>/share/classes/sun/util/resources/CurrencyNames_sv.properties
- # to <build>/jdk/gensrc/<module/sun/util/resources/CurrencyNames_sv.java
- $1_PROPJAVAS := $$(patsubst $(JDK_TOPDIR)/src/%.properties, \
- $(JDK_OUTPUTDIR)/gensrc/%.java, \
- $$(subst /share/classes,, \
- $$(subst /$(OPENJDK_TARGET_OS_API_DIR)/classes,, \
- $$(subst /$(OPENJDK_TARGET_OS)/classes,, $2))))
+ $$($1_$2_TARGET): $2
+ $(MKDIR) -p $$(@D)
+ $(CAT) $$< | $(SED) -e '/class/s/_zh_TW/_zh_HK/' > $$@
+
+ $1 += $$($1_$2_TARGET)
+endef
- # Accumulate all found properties files.
- ALL_COMPILED_PROPSOURCES += $2
-
- # Generate the list of to be created java files.
- ALL_COMPILED_PROPJAVAS += $$($1_PROPJAVAS)
-
- # Now generate a sequence of
- # "-compile ...CurrencyNames_sv.properties ...CurrencyNames_sv.java ListResourceBundle"
- # suitable to be fed into the CompileProperties command.
- COMPILE_PROPCMDLINE += $$(subst _SPACE_,$(SPACE),$$(join $$(addprefix -compile_SPACE_, $2), \
- $$(addsuffix _SPACE_$(strip $3), \
- $$(addprefix _SPACE_, $$($1_PROPJAVAS)))))
+################################################################################
+# Creates rules for copying zh_TW resources to zh_HK.
+# Param 1 - Variable to add targets to
+# Param 2 - Files to copy from
+define SetupCopy-zh_HK
+ $$(foreach f, $2, $$(eval $$(call SetupOneCopy-zh_HK,$1,$$f)))
endef
################################################################################
-# Some packages have properties that need to be converted to java source files.
-COMPILE_PROP_SRC_FILES := \
- $(filter %.properties, $(call CacheFind, \
- $(JDK_TOPDIR)/src/java.desktop/share/classes/com/sun/accessibility/internal/resources \
- $(JDK_TOPDIR)/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/resources \
- $(JDK_TOPDIR)/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/resources \
- $(JDK_TOPDIR)/src/java.desktop/share/classes/com/sun/swing/internal/plaf/basic/resources \
- $(JDK_TOPDIR)/src/java.desktop/share/classes/com/sun/swing/internal/plaf/metal/resources \
- $(JDK_TOPDIR)/src/java.desktop/share/classes/com/sun/swing/internal/plaf/synth/resources \
- $(JDK_TOPDIR)/src/jdk.jdi/share/classes/com/sun/tools/jdi/resources \
- $(JDK_TOPDIR)/src/java.desktop/share/classes/sun/awt/resources \
- $(JDK_TOPDIR)/src/java.base/share/classes/sun/launcher/resources \
- $(JDK_TOPDIR)/src/java.management/share/classes/sun/management/resources \
- $(JDK_TOPDIR)/src/java.desktop/share/classes/sun/print/resources \
- $(JDK_TOPDIR)/src/jdk.dev/share/classes/sun/tools/jar/resources \
- $(JDK_TOPDIR)/src/java.logging/share/classes/sun/util/logging/resources)) \
- #
+# Creates a rule that runs CompileProperties on a set of properties files.
+# 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
+define SetupCompileProperties
+ $1_SRCS := $2
+ $1_CLASS := $3
+
+ # Convert .../src/<module>/share/classes/com/sun/tools/javac/resources/javac_zh_CN.properties
+ # to .../langtools/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/%, \
+ $(JDK_OUTPUTDIR)/gensrc/%, \
+ $$(patsubst %.properties, %.java, \
+ $$(subst /share/classes,, $$($1_SRCS))))
+
+ # Generate the package dirs for the to be generated java files. Sort to remove
+ # duplicates.
+ $1_DIRS := $$(sort $$(dir $$($1_JAVAS)))
-ifeq ($(OPENJDK_TARGET_OS), macosx)
- COMPILE_PROP_SRC_FILES += \
- $(filter %.properties, $(call CacheFind, \
- $(JDK_TOPDIR)/src/java.desktop/macosx/classes/com/apple/laf/resources \
- $(JDK_TOPDIR)/src/java.desktop/macosx/classes/sun/awt/resources)) \
- #
-endif
+ # Now generate a sequence of:
+ # "-compile ...javac_zh_CN.properties ...javac_zh_CN.java java.util.ListResourceBundle"
+ # suitable to be fed into the CompileProperties command.
+ $1_CMDLINE := $$(subst _SPACE_, $(SPACE), \
+ $$(join $$(addprefix -compile_SPACE_, $$($1_SRCS)), \
+ $$(addsuffix _SPACE_$$($1_CLASS), \
+ $$(addprefix _SPACE_, $$($1_JAVAS)))))
+
+ $1_TARGET := $(JDK_OUTPUTDIR)/gensrc/$(MODULE)/_the.$1.done
+ $1_CMDLINE_FILE := $(JDK_OUTPUTDIR)/gensrc/$(MODULE)/_the.$1.cmdline
-ifeq ($(OPENJDK_TARGET_OS), windows)
- COMPILE_PROP_SRC_FILES += \
- $(filter %.properties, $(call CacheFind, \
- $(JDK_TOPDIR)/src/java.desktop/windows/classes/sun/awt/windows)) \
- #
-else # ! windows
- COMPILE_PROP_SRC_FILES += \
- $(filter %.properties, $(call CacheFind, \
- $(JDK_TOPDIR)/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/resources)) \
- #
-endif
+ # Now setup the rule for the generation of the resource bundles.
+ $$($1_TARGET): $$($1_SRCS) $$($1_JAVAS) $(BUILD_TOOLS_JDK)
+ $(MKDIR) -p $$(@D) $$($1_DIRS)
+ $(ECHO) Compiling $$(words $$($1_SRCS)) properties into resource bundles for $(MODULE)
+ $(RM) $$($1_CMDLINE_FILE)
+ $$(call ListPathsSafely,$1_CMDLINE,\n, >> $$($1_CMDLINE_FILE))
+ $(TOOL_COMPILEPROPERTIES) -quiet @$$($1_CMDLINE_FILE)
+ $(TOUCH) $$@
-$(eval $(call add_properties_to_compile,LIST_RESOURCE_BUNDLE, \
- $(COMPILE_PROP_SRC_FILES), ListResourceBundle))
+ $$($1_JAVAS): $$($1_SRCS)
-# sun/util/resources
-$(eval $(call add_properties_to_compile,SUN_UTIL, \
- $(filter %.properties, \
- $(call CacheFind, $(JDK_TOPDIR)/src/java.base/share/classes/sun/util/resources) \
- $(call CacheFind, $(JDK_TOPDIR)/src/jdk.localedata/share/classes/sun/util/resources)), \
- sun.util.resources.LocaleNamesBundle))
+ # Create zh_HK versions of all zh_TW files created above
+ $$(eval $$(call SetupCopy-zh_HK,$1_HK,$$(filter %_zh_TW.java, $$($1_JAVAS))))
+ # The zh_HK copy must wait for the compile properties tool to run
+ $$($1_HK): $$($1_TARGET)
+
+ $1 += $$($1_JAVAS) $$($1_TARGET) $$($1_HK)
+endef
################################################################################
-# Now setup the rule for the generation of the resource bundles.
-$(JDK_OUTPUTDIR)/gensrc/_the.compiled_properties: $(ALL_COMPILED_PROPSOURCES) $(BUILD_TOOLS_JDK)
- # Generate all output directories in advance since the build tool does not do that...
- $(MKDIR) -p $(sort $(dir $(ALL_COMPILED_PROPJAVAS)))
- $(ECHO) Compiling $(words $(ALL_COMPILED_PROPSOURCES)) properties into resource bundles
- $(call ListPathsSafely,COMPILE_PROPCMDLINE,\n, >> $(JDK_OUTPUTDIR)/gensrc/_the.cmdline)
- $(TOOL_COMPILEPROPERTIES) -quiet @$(JDK_OUTPUTDIR)/gensrc/_the.cmdline
- $(TOUCH) $@
-
-$(ALL_COMPILED_PROPJAVAS): $(JDK_OUTPUTDIR)/gensrc/_the.compiled_properties
-
-################################################################################
-# Some zh_HK resources are just copies of zh_TW
-
-define convert_tw_to_hk
- $(MKDIR) -p $(@D)
- $(CAT) $< | $(SED) -e '/class/s/_zh_TW/_zh_HK/' > $@
-endef
-
-# Some are copies of existing sources
-$(JDK_OUTPUTDIR)/gensrc/java.desktop/%_zh_HK.java: \
- $(JDK_TOPDIR)/src/java.desktop/share/classes/%_zh_TW.java
- $(call convert_tw_to_hk)
-
-$(JDK_OUTPUTDIR)/gensrc/java.base/%_zh_HK.java: \
- $(JDK_TOPDIR)/src/java.base/share/classes/%_zh_TW.java
- $(call convert_tw_to_hk)
-
-# Others are copies of sources generated by this makefile
-$(JDK_OUTPUTDIR)/gensrc/%_zh_HK.java: $(JDK_OUTPUTDIR)/gensrc/%_zh_TW.java
- $(call convert_tw_to_hk)
-
-# The existing sources
-ZH_HK_JAVA := java.desktop/sun/applet/resources/MsgAppletViewer_zh_HK.java \
- java.base/sun/misc/resources/Messages_zh_HK.java \
- java.base/sun/security/util/AuthResources_zh_HK.java \
- java.base/sun/security/util/Resources_zh_HK.java
-
-ZH_HK_JAVA_FILES := $(addprefix $(JDK_OUTPUTDIR)/gensrc/, $(ZH_HK_JAVA)) \
- $(filter-out $(JDK_OUTPUTDIR)/gensrc/jdk.localedata/sun/util/resources/zh/%, \
- $(subst _zh_TW,_zh_HK,$(filter %_zh_TW.java, $(ALL_COMPILED_PROPJAVAS))))
-
-################################################################################
-
-GENSRC_PROPERTIES := $(ALL_COMPILED_PROPJAVAS) $(ZH_HK_JAVA_FILES)
--- a/jdk/make/lib/CoreLibraries.gmk Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/make/lib/CoreLibraries.gmk Wed Jul 05 20:04:29 2017 +0200
@@ -224,7 +224,7 @@
$(call SET_SHARED_LIBRARY_ORIGIN) \
$(EXPORT_ZIP_FUNCS), \
LDFLAGS_windows := -export:ZIP_Open -export:ZIP_Close -export:ZIP_FindEntry \
- -export:ZIP_ReadEntry -export:ZIP_GetNextEntry jvm.lib \
+ -export:ZIP_ReadEntry -export:ZIP_GetNextEntry -export:ZIP_CRC32 jvm.lib \
$(WIN_JAVA_LIB), \
LDFLAGS_SUFFIX_linux := -ljvm -ljava $(LIBZ), \
LDFLAGS_SUFFIX_solaris := -ljvm -ljava $(LIBZ) -lc, \
--- a/jdk/make/mapfiles/libjfr/mapfile-vers Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/make/mapfiles/libjfr/mapfile-vers Wed Jul 05 20:04:29 2017 +0200
@@ -10,8 +10,13 @@
Java_oracle_jrockit_jfr_Process_getpid;
Java_oracle_jrockit_jfr_Timing_counterTime;
Java_oracle_jrockit_jfr_Timing_init;
- Java_oracle_jrockit_jfr_NativeLogger_output0;
- Java_oracle_jrockit_jfr_VMJFR_isEnabled;
+ Java_oracle_jrockit_jfr_Logger_output0;
+ Java_oracle_jrockit_jfr_JFR_isCommercialFeaturesUnlocked;
+ Java_oracle_jrockit_jfr_JFR_isStarted;
+ Java_oracle_jrockit_jfr_JFR_isSupportedInVM;
+ Java_oracle_jrockit_jfr_JFR_startFlightRecorder;
+ Java_oracle_jrockit_jfr_JFR_isDisabledOnCommandLine;
+ Java_oracle_jrockit_jfr_JFR_isEnabled;
Java_oracle_jrockit_jfr_VMJFR_options;
Java_oracle_jrockit_jfr_VMJFR_init;
Java_oracle_jrockit_jfr_VMJFR_addConstPool;
@@ -33,7 +38,6 @@
Java_oracle_jrockit_jfr_VMJFR_setPeriod;
Java_oracle_jrockit_jfr_VMJFR_getPeriod;
Java_oracle_jrockit_jfr_VMJFR_descriptors;
- Java_oracle_jrockit_jfr_VMJFR_redefineClass0;
Java_oracle_jrockit_jfr_VMJFR_retransformClasses0;
JNI_OnLoad;
local:
--- a/jdk/make/mapfiles/libnet/mapfile-vers Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/make/mapfiles/libnet/mapfile-vers Wed Jul 05 20:04:29 2017 +0200
@@ -28,6 +28,8 @@
SUNWprivate_1.1 {
global:
JNI_OnLoad;
+ Java_java_net_AbstractPlainDatagramSocketImpl_init;
+ Java_java_net_AbstractPlainDatagramSocketImpl_dataAvailable;
Java_java_net_PlainSocketImpl_socketListen;
Java_java_net_PlainDatagramSocketImpl_getTTL;
Java_java_net_PlainDatagramSocketImpl_init;
--- a/jdk/make/src/classes/build/tools/module/GenModulesList.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/make/src/classes/build/tools/module/GenModulesList.java Wed Jul 05 20:04:29 2017 +0200
@@ -112,8 +112,7 @@
}
static final List<String> AGGREGATORS = Arrays.asList(new String[] {
- "java.se", "java.compact1", "java.compact2",
- "java.compact3", "jdk.compact3"});
+ "java.se", "java.compact1", "java.compact2", "java.compact3"});
class TopoSorter {
final Deque<Module> result = new LinkedList<>();
--- a/jdk/src/java.base/share/classes/java/lang/Class.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/Class.java Wed Jul 05 20:04:29 2017 +0200
@@ -262,8 +262,8 @@
@CallerSensitive
public static Class<?> forName(String className)
throws ClassNotFoundException {
- return forName0(className, true,
- ClassLoader.getClassLoader(Reflection.getCallerClass()));
+ Class<?> caller = Reflection.getCallerClass();
+ return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
}
@@ -333,22 +333,27 @@
ClassLoader loader)
throws ClassNotFoundException
{
- if (sun.misc.VM.isSystemDomainLoader(loader)) {
- SecurityManager sm = System.getSecurityManager();
- if (sm != null) {
- ClassLoader ccl = ClassLoader.getClassLoader(Reflection.getCallerClass());
+ Class<?> caller = null;
+ SecurityManager sm = System.getSecurityManager();
+ if (sm != null) {
+ // Reflective call to get caller class is only needed if a security manager
+ // is present. Avoid the overhead of making this call otherwise.
+ caller = Reflection.getCallerClass();
+ if (sun.misc.VM.isSystemDomainLoader(loader)) {
+ ClassLoader ccl = ClassLoader.getClassLoader(caller);
if (!sun.misc.VM.isSystemDomainLoader(ccl)) {
sm.checkPermission(
SecurityConstants.GET_CLASSLOADER_PERMISSION);
}
}
}
- return forName0(name, initialize, loader);
+ return forName0(name, initialize, loader, caller);
}
- /** Called after security checks have been made. */
+ /** Called after security check for system loader access checks have been made. */
private static native Class<?> forName0(String name, boolean initialize,
- ClassLoader loader)
+ ClassLoader loader,
+ Class<?> caller)
throws ClassNotFoundException;
/**
--- a/jdk/src/java.base/share/classes/java/lang/String.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/String.java Wed Jul 05 20:04:29 2017 +0200
@@ -1045,8 +1045,9 @@
}
}
// Argument is a String
- if (cs.equals(this))
- return true;
+ if (cs instanceof String) {
+ return equals(cs);
+ }
// Argument is a generic CharSequence
char v1[] = value;
int n = v1.length;
--- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java Wed Jul 05 20:04:29 2017 +0200
@@ -594,6 +594,9 @@
static class Lazy {
private static final Class<?> MHI = MethodHandleImpl.class;
+ private static final MethodHandle[] ARRAYS;
+ private static final MethodHandle[] FILL_ARRAYS;
+
static final NamedFunction NF_checkSpreadArgument;
static final NamedFunction NF_guardWithCatch;
static final NamedFunction NF_throwException;
@@ -606,6 +609,9 @@
static final MethodHandle MH_arrayIdentity;
static {
+ ARRAYS = makeArrays();
+ FILL_ARRAYS = makeFillArrays();
+
try {
NF_checkSpreadArgument = new NamedFunction(MHI.getDeclaredMethod("checkSpreadArgument", Object.class, int.class));
NF_guardWithCatch = new NamedFunction(MHI.getDeclaredMethod("guardWithCatch", MethodHandle.class, Class.class,
@@ -1268,7 +1274,6 @@
assert(mhs.size() == 11); // current number of methods
return mhs.toArray(new MethodHandle[MAX_ARITY+1]);
}
- private static final MethodHandle[] ARRAYS = makeArrays();
// filling versions of the above:
// using Integer len instead of int len and no varargs to avoid bootstrapping problems
@@ -1315,6 +1320,9 @@
Object a4, Object a5, Object a6, Object a7,
Object a8, Object a9)
{ fillWithArguments(a, pos, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); return a; }
+
+ private static final int FILL_ARRAYS_COUNT = 11; // current number of fillArray methods
+
private static MethodHandle[] makeFillArrays() {
ArrayList<MethodHandle> mhs = new ArrayList<>();
mhs.add(null); // there is no empty fill; at least a0 is required
@@ -1323,10 +1331,9 @@
if (mh == null) break;
mhs.add(mh);
}
- assert(mhs.size() == 11); // current number of methods
+ assert(mhs.size() == FILL_ARRAYS_COUNT);
return mhs.toArray(new MethodHandle[0]);
}
- private static final MethodHandle[] FILL_ARRAYS = makeFillArrays();
private static Object copyAsPrimitiveArray(Wrapper w, Object... boxes) {
Object a = w.makeArray(boxes.length);
@@ -1338,15 +1345,15 @@
* arguments and returns an Object array of them, as if for varargs.
*/
static MethodHandle varargsArray(int nargs) {
- MethodHandle mh = ARRAYS[nargs];
+ MethodHandle mh = Lazy.ARRAYS[nargs];
if (mh != null) return mh;
mh = findCollector("array", nargs, Object[].class);
if (mh != null) mh = makeIntrinsic(mh, Intrinsic.NEW_ARRAY);
- if (mh != null) return ARRAYS[nargs] = mh;
+ if (mh != null) return Lazy.ARRAYS[nargs] = mh;
mh = buildVarargsArray(Lazy.MH_fillNewArray, Lazy.MH_arrayIdentity, nargs);
assert(assertCorrectArity(mh, nargs));
mh = makeIntrinsic(mh, Intrinsic.NEW_ARRAY);
- return ARRAYS[nargs] = mh;
+ return Lazy.ARRAYS[nargs] = mh;
}
private static boolean assertCorrectArity(MethodHandle mh, int arity) {
@@ -1382,7 +1389,7 @@
return mh;
}
- private static final int LEFT_ARGS = (FILL_ARRAYS.length - 1);
+ private static final int LEFT_ARGS = FILL_ARRAYS_COUNT - 1;
private static final MethodHandle[] FILL_ARRAY_TO_RIGHT = new MethodHandle[MAX_ARITY+1];
/** fill_array_to_right(N).invoke(a, argL..arg[N-1])
* fills a[L]..a[N-1] with corresponding arguments,
@@ -1413,7 +1420,7 @@
if (midLen < LEFT_ARGS) rightLen = nargs - (midLen = LEFT_ARGS);
assert(rightLen > 0);
MethodHandle midFill = fillToRight(midLen); // recursive fill
- MethodHandle rightFill = FILL_ARRAYS[rightLen].bindTo(midLen); // [midLen..nargs-1]
+ MethodHandle rightFill = Lazy.FILL_ARRAYS[rightLen].bindTo(midLen); // [midLen..nargs-1]
assert(midFill.type().parameterCount() == 1 + midLen - LEFT_ARGS);
assert(rightFill.type().parameterCount() == 1 + rightLen);
--- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodType.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodType.java Wed Jul 05 20:04:29 2017 +0200
@@ -727,7 +727,7 @@
* @return the parameter types (as an immutable list)
*/
public List<Class<?>> parameterList() {
- return Collections.unmodifiableList(Arrays.asList(ptypes));
+ return Collections.unmodifiableList(Arrays.asList(ptypes.clone()));
}
/*non-public*/ Class<?> lastParameterType() {
--- a/jdk/src/java.base/share/classes/java/net/AbstractPlainDatagramSocketImpl.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.base/share/classes/java/net/AbstractPlainDatagramSocketImpl.java Wed Jul 05 20:04:29 2017 +0200
@@ -68,6 +68,7 @@
return null;
}
});
+ init();
}
/**
@@ -362,4 +363,7 @@
protected boolean nativeConnectDisabled() {
return connectDisabled;
}
+
+ native int dataAvailable();
+ private static native void init();
}
--- a/jdk/src/java.base/share/classes/java/net/DatagramSocket.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.base/share/classes/java/net/DatagramSocket.java Wed Jul 05 20:04:29 2017 +0200
@@ -85,6 +85,17 @@
*/
boolean oldImpl = false;
+ /**
+ * Set when a socket is ST_CONNECTED until we are certain
+ * that any packets which might have been received prior
+ * to calling connect() but not read by the application
+ * have been read. During this time we check the source
+ * address of all packets received to be sure they are from
+ * the connected destination. Other packets are read but
+ * silently dropped.
+ */
+ private boolean explicitFilter = false;
+ private int bytesLeftToFilter;
/*
* Connection state:
* ST_NOT_CONNECTED = socket not connected
@@ -144,6 +155,15 @@
// socket is now connected by the impl
connectState = ST_CONNECTED;
+ // Do we need to filter some packets?
+ int avail = getImpl().dataAvailable();
+ if (avail == -1) {
+ throw new SocketException();
+ }
+ explicitFilter = avail > 0;
+ if (explicitFilter) {
+ bytesLeftToFilter = getReceiveBufferSize();
+ }
} catch (SocketException se) {
// connection will be emulated by DatagramSocket
@@ -492,6 +512,7 @@
connectedAddress = null;
connectedPort = -1;
connectState = ST_NOT_CONNECTED;
+ explicitFilter = false;
}
}
@@ -750,10 +771,12 @@
} // end of while
}
}
- if (connectState == ST_CONNECTED_NO_IMPL) {
+ if ((connectState == ST_CONNECTED_NO_IMPL) || explicitFilter) {
// We have to do the filtering the old fashioned way since
// the native impl doesn't support connect or the connect
- // via the impl failed.
+ // via the impl failed, or .. "explicitFilter" may be set when
+ // a socket is connected via the impl, for a period of time
+ // when packets from other sources might be queued on socket.
boolean stop = false;
while (!stop) {
InetAddress peekAddress = null;
@@ -772,8 +795,12 @@
if ((!connectedAddress.equals(peekAddress)) ||
(connectedPort != peekPort)) {
// throw the packet away and silently continue
- DatagramPacket tmp = new DatagramPacket(new byte[1], 1);
+ DatagramPacket tmp = new DatagramPacket(
+ new byte[1024], 1024);
getImpl().receive(tmp);
+ if (explicitFilter) {
+ bytesLeftToFilter -= tmp.getLength();
+ }
} else {
stop = true;
}
@@ -782,6 +809,15 @@
// If the security check succeeds, or the datagram is
// connected then receive the packet
getImpl().receive(p);
+ if (explicitFilter) {
+ bytesLeftToFilter -= p.getLength();
+ if (bytesLeftToFilter <= 0) {
+ explicitFilter = false;
+ } else {
+ // break out of filter, if there is no more data queued
+ explicitFilter = getImpl().dataAvailable() > 0;
+ }
+ }
}
}
--- a/jdk/src/java.base/share/classes/java/net/DatagramSocketImpl.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.base/share/classes/java/net/DatagramSocketImpl.java Wed Jul 05 20:04:29 2017 +0200
@@ -63,6 +63,12 @@
return socket;
}
+ int dataAvailable() {
+ // default impl returns zero, which disables the calling
+ // functionality
+ return 0;
+ }
+
/**
* Creates a datagram socket.
* @exception SocketException if there is an error in the
--- a/jdk/src/java.base/share/classes/java/security/Signature.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.base/share/classes/java/security/Signature.java Wed Jul 05 20:04:29 2017 +0200
@@ -604,9 +604,13 @@
* @return the number of bytes placed into {@code outbuf}.
*
* @exception SignatureException if this signature object is not
- * initialized properly, if this signature algorithm is unable to
- * process the input data provided, or if {@code len} is less
- * than the actual signature length.
+ * initialized properly, if this signature algorithm is unable to
+ * process the input data provided, or if {@code len} is less
+ * than the actual signature length.
+ * @exception IllegalArgumentException if {@code outbuf} is {@code null},
+ * or {@code offset} or {@code len} is less than 0, or the sum of
+ * {@code offset} and {@code len} is greater than the length of
+ * {@code outbuf}.
*
* @since 1.2
*/
@@ -615,6 +619,9 @@
if (outbuf == null) {
throw new IllegalArgumentException("No output buffer given");
}
+ if (offset < 0 || len < 0) {
+ throw new IllegalArgumentException("offset or len is less than 0");
+ }
if (outbuf.length - offset < len) {
throw new IllegalArgumentException
("Output buffer too small for specified offset and length");
@@ -683,9 +690,16 @@
public final boolean verify(byte[] signature, int offset, int length)
throws SignatureException {
if (state == VERIFY) {
- if ((signature == null) || (offset < 0) || (length < 0) ||
- (length > signature.length - offset)) {
- throw new IllegalArgumentException("Bad arguments");
+ if (signature == null) {
+ throw new IllegalArgumentException("signature is null");
+ }
+ if (offset < 0 || length < 0) {
+ throw new IllegalArgumentException
+ ("offset or length is less than 0");
+ }
+ if (signature.length - offset < length) {
+ throw new IllegalArgumentException
+ ("signature too small for specified offset and length");
}
return engineVerify(signature, offset, length);
@@ -733,11 +747,25 @@
* @param len the number of bytes to use, starting at offset.
*
* @exception SignatureException if this signature object is not
- * initialized properly.
+ * initialized properly.
+ * @exception IllegalArgumentException if {@code data} is {@code null},
+ * or {@code off} or {@code len} is less than 0, or the sum of
+ * {@code off} and {@code len} is greater than the length of
+ * {@code data}.
*/
public final void update(byte[] data, int off, int len)
throws SignatureException {
if (state == SIGN || state == VERIFY) {
+ if (data == null) {
+ throw new IllegalArgumentException("data is null");
+ }
+ if (off < 0 || len < 0) {
+ throw new IllegalArgumentException("off or len is less than 0");
+ }
+ if (data.length - off < len) {
+ throw new IllegalArgumentException
+ ("data too small for specified offset and length");
+ }
engineUpdate(data, off, len);
} else {
throw new SignatureException("object not initialized for "
--- a/jdk/src/java.base/share/classes/java/security/cert/CertificateRevokedException.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.base/share/classes/java/security/cert/CertificateRevokedException.java Wed Jul 05 20:04:29 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -84,6 +84,8 @@
* @throws NullPointerException if {@code revocationDate},
* {@code reason}, {@code authority}, or
* {@code extensions} is {@code null}
+ * @throws ClassCastException if {@code extensions} contains an incorrectly
+ * typed key or value
*/
public CertificateRevokedException(Date revocationDate, CRLReason reason,
X500Principal authority, Map<String, Extension> extensions) {
@@ -94,7 +96,10 @@
this.revocationDate = new Date(revocationDate.getTime());
this.reason = reason;
this.authority = authority;
- this.extensions = new HashMap<String, Extension>(extensions);
+ // make sure Map only contains correct types
+ this.extensions = Collections.checkedMap(new HashMap<>(),
+ String.class, Extension.class);
+ this.extensions.putAll(extensions);
}
/**
@@ -172,7 +177,8 @@
public String getMessage() {
return "Certificate has been revoked, reason: "
+ reason + ", revocation date: " + revocationDate
- + ", authority: " + authority + ", extensions: " + extensions;
+ + ", authority: " + authority + ", extension OIDs: "
+ + extensions.keySet();
}
/**
--- a/jdk/src/java.base/share/classes/java/text/DigitList.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.base/share/classes/java/text/DigitList.java Wed Jul 05 20:04:29 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -290,25 +290,26 @@
FloatingDecimal.BinaryToASCIIConverter fdConverter = FloatingDecimal.getBinaryToASCIIConverter(source);
boolean hasBeenRoundedUp = fdConverter.digitsRoundedUp();
- boolean allDecimalDigits = fdConverter.decimalDigitsExact();
+ boolean valueExactAsDecimal = fdConverter.decimalDigitsExact();
assert !fdConverter.isExceptional();
String digitsString = fdConverter.toJavaFormatString();
set(isNegative, digitsString,
- hasBeenRoundedUp, allDecimalDigits,
+ hasBeenRoundedUp, valueExactAsDecimal,
maximumDigits, fixedPoint);
}
/**
* Generate a representation of the form DDDDD, DDDDD.DDDDD, or
* DDDDDE+/-DDDDD.
- * @param roundedUp Boolean value indicating if the s digits were rounded-up.
- * @param allDecimalDigits Boolean value indicating if the digits in s are
- * an exact decimal representation of the double that was passed.
+ * @param roundedUp whether or not rounding up has already happened.
+ * @param valueExactAsDecimal whether or not collected digits provide
+ * an exact decimal representation of the value.
*/
private void set(boolean isNegative, String s,
- boolean roundedUp, boolean allDecimalDigits,
+ boolean roundedUp, boolean valueExactAsDecimal,
int maximumDigits, boolean fixedPoint) {
+
this.isNegative = isNegative;
int len = s.length();
char[] source = getDataChars(len);
@@ -361,7 +362,7 @@
} else if (-decimalAt == maximumDigits) {
// If we round 0.0009 to 3 fractional digits, then we have to
// create a new one digit in the least significant location.
- if (shouldRoundUp(0, roundedUp, allDecimalDigits)) {
+ if (shouldRoundUp(0, roundedUp, valueExactAsDecimal)) {
count = 1;
++decimalAt;
digits[0] = '1';
@@ -381,25 +382,26 @@
// Eliminate digits beyond maximum digits to be displayed.
// Round up if appropriate.
round(fixedPoint ? (maximumDigits + decimalAt) : maximumDigits,
- roundedUp, allDecimalDigits);
- }
+ roundedUp, valueExactAsDecimal);
+
+ }
/**
* Round the representation to the given number of digits.
* @param maximumDigits The maximum number of digits to be shown.
- * @param alreadyRounded Boolean indicating if rounding up already happened.
- * @param allDecimalDigits Boolean indicating if the digits provide an exact
- * representation of the value.
+ * @param alreadyRounded whether or not rounding up has already happened.
+ * @param valueExactAsDecimal whether or not collected digits provide
+ * an exact decimal representation of the value.
*
* Upon return, count will be less than or equal to maximumDigits.
*/
private final void round(int maximumDigits,
boolean alreadyRounded,
- boolean allDecimalDigits) {
+ boolean valueExactAsDecimal) {
// Eliminate digits beyond maximum digits to be displayed.
// Round up if appropriate.
if (maximumDigits >= 0 && maximumDigits < count) {
- if (shouldRoundUp(maximumDigits, alreadyRounded, allDecimalDigits)) {
+ if (shouldRoundUp(maximumDigits, alreadyRounded, valueExactAsDecimal)) {
// Rounding up involved incrementing digits from LSD to MSD.
// In most cases this is simple, but in a worst case situation
// (9999..99) we have to adjust the decimalAt value.
@@ -440,6 +442,9 @@
* <code>count-1</code>. If 0, then all digits are rounded away, and
* this method returns true if a one should be generated (e.g., formatting
* 0.09 with "#.#").
+ * @param alreadyRounded whether or not rounding up has already happened.
+ * @param valueExactAsDecimal whether or not collected digits provide
+ * an exact decimal representation of the value.
* @exception ArithmeticException if rounding is needed with rounding
* mode being set to RoundingMode.UNNECESSARY
* @return true if digit <code>maximumDigits-1</code> should be
@@ -447,7 +452,7 @@
*/
private boolean shouldRoundUp(int maximumDigits,
boolean alreadyRounded,
- boolean allDecimalDigits) {
+ boolean valueExactAsDecimal) {
if (maximumDigits < count) {
/*
* To avoid erroneous double-rounding or truncation when converting
@@ -460,7 +465,7 @@
* account what FloatingDecimal has done in the binary to decimal
* conversion.
*
- * Considering the tie cases, FloatingDecimal may round-up the
+ * Considering the tie cases, FloatingDecimal may round up the
* value (returning decimal digits equal to tie when it is below),
* or "truncate" the value to the tie while value is above it,
* or provide the exact decimal digits when the binary value can be
@@ -490,7 +495,7 @@
*
* - For other numbers that are always converted to exact digits
* (like BigInteger, Long, ...), the passed alreadyRounded boolean
- * have to be set to false, and allDecimalDigits has to be set to
+ * have to be set to false, and valueExactAsDecimal has to be set to
* true in the upper DigitList call stack, providing the right state
* for those situations..
*/
@@ -520,42 +525,31 @@
}
break;
case HALF_UP:
- if (digits[maximumDigits] >= '5') {
- // We should not round up if the rounding digits position is
- // exactly the last index and if digits were already rounded.
- if ((maximumDigits == (count - 1)) &&
- (alreadyRounded))
- return false;
-
- // Value was exactly at or was above tie. We must round up.
- return true;
- }
- break;
case HALF_DOWN:
if (digits[maximumDigits] > '5') {
+ // Value is above tie ==> must round up
return true;
- } else if (digits[maximumDigits] == '5' ) {
- if (maximumDigits == (count - 1)) {
- // The rounding position is exactly the last index.
- if (allDecimalDigits || alreadyRounded)
- /* FloatingDecimal rounded up (value was below tie),
- * or provided the exact list of digits (value was
- * an exact tie). We should not round up, following
- * the HALF_DOWN rounding rule.
- */
- return false;
- else
- // Value was above the tie, we must round up.
- return true;
- }
-
- // We must round up if it gives a non null digit after '5'.
- for (int i=maximumDigits+1; i<count; ++i) {
- if (digits[i] != '0') {
- return true;
+ } else if (digits[maximumDigits] == '5') {
+ // Digit at rounding position is a '5'. Tie cases.
+ if (maximumDigits != (count - 1)) {
+ // There are remaining digits. Above tie => must round up
+ return true;
+ } else {
+ // Digit at rounding position is the last one !
+ if (valueExactAsDecimal) {
+ // Exact binary representation. On the tie.
+ // Apply rounding given by roundingMode.
+ return roundingMode == RoundingMode.HALF_UP;
+ } else {
+ // Not an exact binary representation.
+ // Digit sequence either rounded up or truncated.
+ // Round up only if it was truncated.
+ return !alreadyRounded;
}
}
}
+ // Digit at rounding position is < '5' ==> no round up.
+ // Just let do the default, which is no round up (thus break).
break;
case HALF_EVEN:
// Implement IEEE half-even rounding
@@ -569,7 +563,7 @@
// then we should not round up again.
return false;
- if (!allDecimalDigits)
+ if (!valueExactAsDecimal)
// Otherwise if the digits don't represent exact value,
// value was above tie and FloatingDecimal truncated
// digits to tie. We must round up.
--- a/jdk/src/java.base/share/classes/java/util/ResourceBundle.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.base/share/classes/java/util/ResourceBundle.java Wed Jul 05 20:04:29 2017 +0200
@@ -2646,7 +2646,10 @@
} catch (ClassNotFoundException e) {
}
} else if (format.equals("java.properties")) {
- final String resourceName = toResourceName(bundleName, "properties");
+ final String resourceName = toResourceName0(bundleName, "properties");
+ if (resourceName == null) {
+ return bundle;
+ }
final ClassLoader classLoader = loader;
final boolean reloadFlag = reload;
InputStream stream = null;
@@ -2800,7 +2803,10 @@
}
boolean result = false;
try {
- String resourceName = toResourceName(toBundleName(baseName, locale), format);
+ String resourceName = toResourceName0(toBundleName(baseName, locale), format);
+ if (resourceName == null) {
+ return result;
+ }
URL url = loader.getResource(resourceName);
if (url != null) {
long lastModified = 0;
@@ -2934,6 +2940,15 @@
sb.append(bundleName.replace('.', '/')).append('.').append(suffix);
return sb.toString();
}
+
+ private String toResourceName0(String bundleName, String suffix) {
+ // application protocol check
+ if (bundleName.contains("://")) {
+ return null;
+ } else {
+ return toResourceName(bundleName, suffix);
+ }
+ }
}
private static class SingleFormatControl extends Control {
--- a/jdk/src/java.base/share/classes/java/util/concurrent/FutureTask.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.base/share/classes/java/util/concurrent/FutureTask.java Wed Jul 05 20:04:29 2017 +0200
@@ -163,7 +163,7 @@
public boolean cancel(boolean mayInterruptIfRunning) {
if (!(state == NEW &&
- UNSAFE.compareAndSwapInt(this, stateOffset, NEW,
+ U.compareAndSwapInt(this, STATE, NEW,
mayInterruptIfRunning ? INTERRUPTING : CANCELLED)))
return false;
try { // in case call to interrupt throws exception
@@ -173,7 +173,7 @@
if (t != null)
t.interrupt();
} finally { // final state
- UNSAFE.putOrderedInt(this, stateOffset, INTERRUPTED);
+ U.putOrderedInt(this, STATE, INTERRUPTED);
}
}
} finally {
@@ -227,9 +227,9 @@
* @param v the value
*/
protected void set(V v) {
- if (UNSAFE.compareAndSwapInt(this, stateOffset, NEW, COMPLETING)) {
+ if (U.compareAndSwapInt(this, STATE, NEW, COMPLETING)) {
outcome = v;
- UNSAFE.putOrderedInt(this, stateOffset, NORMAL); // final state
+ U.putOrderedInt(this, STATE, NORMAL); // final state
finishCompletion();
}
}
@@ -245,17 +245,16 @@
* @param t the cause of failure
*/
protected void setException(Throwable t) {
- if (UNSAFE.compareAndSwapInt(this, stateOffset, NEW, COMPLETING)) {
+ if (U.compareAndSwapInt(this, STATE, NEW, COMPLETING)) {
outcome = t;
- UNSAFE.putOrderedInt(this, stateOffset, EXCEPTIONAL); // final state
+ U.putOrderedInt(this, STATE, EXCEPTIONAL); // final state
finishCompletion();
}
}
public void run() {
if (state != NEW ||
- !UNSAFE.compareAndSwapObject(this, runnerOffset,
- null, Thread.currentThread()))
+ !U.compareAndSwapObject(this, RUNNER, null, Thread.currentThread()))
return;
try {
Callable<V> c = callable;
@@ -296,8 +295,7 @@
*/
protected boolean runAndReset() {
if (state != NEW ||
- !UNSAFE.compareAndSwapObject(this, runnerOffset,
- null, Thread.currentThread()))
+ !U.compareAndSwapObject(this, RUNNER, null, Thread.currentThread()))
return false;
boolean ran = false;
int s = state;
@@ -364,7 +362,7 @@
private void finishCompletion() {
// assert state > COMPLETING;
for (WaitNode q; (q = waiters) != null;) {
- if (UNSAFE.compareAndSwapObject(this, waitersOffset, q, null)) {
+ if (U.compareAndSwapObject(this, WAITERS, q, null)) {
for (;;) {
Thread t = q.thread;
if (t != null) {
@@ -391,11 +389,18 @@
*
* @param timed true if use timed waits
* @param nanos time to wait, if timed
- * @return state upon completion
+ * @return state upon completion or at timeout
*/
private int awaitDone(boolean timed, long nanos)
throws InterruptedException {
- final long deadline = timed ? System.nanoTime() + nanos : 0L;
+ // The code below is very delicate, to achieve these goals:
+ // - call nanoTime exactly once for each call to park
+ // - if nanos <= 0, return promptly without allocation or nanoTime
+ // - if nanos == Long.MIN_VALUE, don't underflow
+ // - if nanos == Long.MAX_VALUE, and nanoTime is non-monotonic
+ // and we suffer a spurious wakeup, we will do no worse than
+ // to park-spin for a while
+ long startTime = 0L; // Special value 0L means not yet parked
WaitNode q = null;
boolean queued = false;
for (;;) {
@@ -412,18 +417,30 @@
}
else if (s == COMPLETING) // cannot time out yet
Thread.yield();
- else if (q == null)
+ else if (q == null) {
+ if (timed && nanos <= 0L)
+ return s;
q = new WaitNode();
+ }
else if (!queued)
- queued = UNSAFE.compareAndSwapObject(this, waitersOffset,
- q.next = waiters, q);
+ queued = U.compareAndSwapObject(this, WAITERS,
+ q.next = waiters, q);
else if (timed) {
- nanos = deadline - System.nanoTime();
- if (nanos <= 0L) {
- removeWaiter(q);
- return state;
+ final long parkNanos;
+ if (startTime == 0L) { // first time
+ startTime = System.nanoTime();
+ if (startTime == 0L)
+ startTime = 1L;
+ parkNanos = nanos;
+ } else {
+ long elapsed = System.nanoTime() - startTime;
+ if (elapsed >= nanos) {
+ removeWaiter(q);
+ return state;
+ }
+ parkNanos = nanos - elapsed;
}
- LockSupport.parkNanos(this, nanos);
+ LockSupport.parkNanos(this, parkNanos);
}
else
LockSupport.park(this);
@@ -454,8 +471,7 @@
if (pred.thread == null) // check for race
continue retry;
}
- else if (!UNSAFE.compareAndSwapObject(this, waitersOffset,
- q, s))
+ else if (!U.compareAndSwapObject(this, WAITERS, q, s))
continue retry;
}
break;
@@ -464,20 +480,17 @@
}
// Unsafe mechanics
- private static final sun.misc.Unsafe UNSAFE;
- private static final long stateOffset;
- private static final long runnerOffset;
- private static final long waitersOffset;
+ private static final sun.misc.Unsafe U;
+ private static final long STATE;
+ private static final long RUNNER;
+ private static final long WAITERS;
static {
try {
- UNSAFE = sun.misc.Unsafe.getUnsafe();
+ U = sun.misc.Unsafe.getUnsafe();
Class<?> k = FutureTask.class;
- stateOffset = UNSAFE.objectFieldOffset
- (k.getDeclaredField("state"));
- runnerOffset = UNSAFE.objectFieldOffset
- (k.getDeclaredField("runner"));
- waitersOffset = UNSAFE.objectFieldOffset
- (k.getDeclaredField("waiters"));
+ STATE = U.objectFieldOffset(k.getDeclaredField("state"));
+ RUNNER = U.objectFieldOffset(k.getDeclaredField("runner"));
+ WAITERS = U.objectFieldOffset(k.getDeclaredField("waiters"));
} catch (Exception e) {
throw new Error(e);
}
--- a/jdk/src/java.base/share/classes/javax/crypto/CipherInputStream.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.base/share/classes/javax/crypto/CipherInputStream.java Wed Jul 05 20:04:29 2017 +0200
@@ -107,9 +107,10 @@
done = true;
try {
obuffer = cipher.doFinal();
+ } catch (IllegalBlockSizeException | BadPaddingException e) {
+ obuffer = null;
+ throw new IOException(e);
}
- catch (IllegalBlockSizeException e) {obuffer = null;}
- catch (BadPaddingException e) {obuffer = null;}
if (obuffer == null)
return -1;
else {
@@ -120,7 +121,10 @@
}
try {
obuffer = cipher.update(ibuffer, 0, readin);
- } catch (IllegalStateException e) {obuffer = null;};
+ } catch (IllegalStateException e) {
+ obuffer = null;
+ throw e;
+ }
ostart = 0;
if (obuffer == null)
ofinish = 0;
@@ -302,6 +306,7 @@
}
}
catch (BadPaddingException | IllegalBlockSizeException ex) {
+ throw new IOException(ex);
}
ostart = 0;
ofinish = 0;
--- a/jdk/src/java.base/share/classes/sun/invoke/util/VerifyAccess.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.base/share/classes/sun/invoke/util/VerifyAccess.java Wed Jul 05 20:04:29 2017 +0200
@@ -102,19 +102,24 @@
case PUBLIC:
return true; // already checked above
case PROTECTED:
+ assert !defc.isInterface(); // protected members aren't allowed in interfaces
if ((allowedModes & PROTECTED_OR_PACKAGE_ALLOWED) != 0 &&
isSamePackage(defc, lookupClass))
return true;
if ((allowedModes & PROTECTED) == 0)
return false;
+ // Protected members are accessible by subclasses, which does not include interfaces.
+ // Interfaces are types, not classes. They should not have access to
+ // protected members in j.l.Object, even though it is their superclass.
if ((mods & STATIC) != 0 &&
!isRelatedClass(refc, lookupClass))
return false;
if ((allowedModes & PROTECTED) != 0 &&
- isSuperClass(defc, lookupClass))
+ isSubClass(lookupClass, defc))
return true;
return false;
case PACKAGE_ONLY: // That is, zero. Unmarked member is package-only access.
+ assert !defc.isInterface(); // package-private members aren't allowed in interfaces
return ((allowedModes & PACKAGE_ALLOWED) != 0 &&
isSamePackage(defc, lookupClass));
case PRIVATE:
@@ -129,12 +134,13 @@
static boolean isRelatedClass(Class<?> refc, Class<?> lookupClass) {
return (refc == lookupClass ||
- refc.isAssignableFrom(lookupClass) ||
- lookupClass.isAssignableFrom(refc));
+ isSubClass(refc, lookupClass) ||
+ isSubClass(lookupClass, refc));
}
- static boolean isSuperClass(Class<?> defc, Class<?> lookupClass) {
- return defc.isAssignableFrom(lookupClass);
+ static boolean isSubClass(Class<?> lookupClass, Class<?> defc) {
+ return defc.isAssignableFrom(lookupClass) &&
+ !lookupClass.isInterface(); // interfaces are types, not classes.
}
static int getClassModifiers(Class<?> c) {
--- a/jdk/src/java.base/share/classes/sun/nio/ch/DatagramChannelImpl.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.base/share/classes/sun/nio/ch/DatagramChannelImpl.java Wed Jul 05 20:04:29 2017 +0200
@@ -740,6 +740,25 @@
// set or refresh local address
localAddress = Net.localAddress(fd);
+
+ // flush any packets already received.
+ boolean blocking = false;
+ synchronized (blockingLock()) {
+ try {
+ blocking = isBlocking();
+ ByteBuffer tmpBuf = ByteBuffer.allocate(100);
+ if (blocking) {
+ configureBlocking(false);
+ }
+ do {
+ tmpBuf.clear();
+ } while (read(tmpBuf) > 0);
+ } finally {
+ if (blocking) {
+ configureBlocking(true);
+ }
+ }
+ }
}
}
}
--- a/jdk/src/java.base/share/classes/sun/reflect/annotation/AnnotationInvocationHandler.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.base/share/classes/sun/reflect/annotation/AnnotationInvocationHandler.java Wed Jul 05 20:04:29 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -29,7 +29,6 @@
import java.lang.reflect.*;
import java.io.Serializable;
import java.util.*;
-import java.lang.annotation.*;
import java.security.AccessController;
import java.security.PrivilegedAction;
@@ -45,6 +44,11 @@
private final Map<String, Object> memberValues;
AnnotationInvocationHandler(Class<? extends Annotation> type, Map<String, Object> memberValues) {
+ Class<?>[] superInterfaces = type.getInterfaces();
+ if (!type.isAnnotation() ||
+ superInterfaces.length != 1 ||
+ superInterfaces[0] != java.lang.annotation.Annotation.class)
+ throw new AnnotationFormatError("Attempt to create proxy for a non-annotation type.");
this.type = type;
this.memberValues = memberValues;
}
@@ -57,13 +61,17 @@
if (member.equals("equals") && paramTypes.length == 1 &&
paramTypes[0] == Object.class)
return equalsImpl(args[0]);
- assert paramTypes.length == 0;
- if (member.equals("toString"))
+ if (paramTypes.length != 0)
+ throw new AssertionError("Too many parameters for an annotation method");
+
+ switch(member) {
+ case "toString":
return toStringImpl();
- if (member.equals("hashCode"))
+ case "hashCode":
return hashCodeImpl();
- if (member.equals("annotationType"))
+ case "annotationType":
return type;
+ }
// Handle annotation member accessors
Object result = memberValues.get(member);
@@ -129,7 +137,7 @@
* Implementation of dynamicProxy.toString()
*/
private String toStringImpl() {
- StringBuffer result = new StringBuffer(128);
+ StringBuilder result = new StringBuilder(128);
result.append('@');
result.append(type.getName());
result.append('(');
@@ -277,6 +285,7 @@
new PrivilegedAction<Method[]>() {
public Method[] run() {
final Method[] mm = type.getDeclaredMethods();
+ validateAnnotationMethods(mm);
AccessibleObject.setAccessible(mm, true);
return mm;
}
@@ -287,6 +296,94 @@
private transient volatile Method[] memberMethods = null;
/**
+ * Validates that a method is structurally appropriate for an
+ * annotation type. As of Java SE 8, annotation types cannot
+ * contain static methods and the declared methods of an
+ * annotation type must take zero arguments and there are
+ * restrictions on the return type.
+ */
+ private void validateAnnotationMethods(Method[] memberMethods) {
+ /*
+ * Specification citations below are from JLS
+ * 9.6.1. Annotation Type Elements
+ */
+ boolean valid = true;
+ for(Method method : memberMethods) {
+ /*
+ * "By virtue of the AnnotationTypeElementDeclaration
+ * production, a method declaration in an annotation type
+ * declaration cannot have formal parameters, type
+ * parameters, or a throws clause.
+ *
+ * "By virtue of the AnnotationTypeElementModifier
+ * production, a method declaration in an annotation type
+ * declaration cannot be default or static."
+ */
+ if (method.getModifiers() != (Modifier.PUBLIC | Modifier.ABSTRACT) ||
+ method.isDefault() ||
+ method.getParameterCount() != 0 ||
+ method.getExceptionTypes().length != 0) {
+ valid = false;
+ break;
+ }
+
+ /*
+ * "It is a compile-time error if the return type of a
+ * method declared in an annotation type is not one of the
+ * following: a primitive type, String, Class, any
+ * parameterized invocation of Class, an enum type
+ * (section 8.9), an annotation type, or an array type
+ * (chapter 10) whose element type is one of the preceding
+ * types."
+ */
+ Class<?> returnType = method.getReturnType();
+ if (returnType.isArray()) {
+ returnType = returnType.getComponentType();
+ if (returnType.isArray()) { // Only single dimensional arrays
+ valid = false;
+ break;
+ }
+ }
+
+ if (!((returnType.isPrimitive() && returnType != void.class) ||
+ returnType == java.lang.String.class ||
+ returnType == java.lang.Class.class ||
+ returnType.isEnum() ||
+ returnType.isAnnotation())) {
+ valid = false;
+ break;
+ }
+
+ /*
+ * "It is a compile-time error if any method declared in an
+ * annotation type has a signature that is
+ * override-equivalent to that of any public or protected
+ * method declared in class Object or in the interface
+ * java.lang.annotation.Annotation."
+ *
+ * The methods in Object or Annotation meeting the other
+ * criteria (no arguments, contrained return type, etc.)
+ * above are:
+ *
+ * String toString()
+ * int hashCode()
+ * Class<? extends Annotation> annotationType()
+ */
+ String methodName = method.getName();
+ if ((methodName.equals("toString") && returnType == java.lang.String.class) ||
+ (methodName.equals("hashCode") && returnType == int.class) ||
+ (methodName.equals("annotationType") && returnType == java.lang.Class.class)) {
+ valid = false;
+ break;
+ }
+ }
+ if (valid)
+ return;
+ else
+ throw new AnnotationFormatError("Malformed method on an annotation type");
+ }
+
+ /**
* Implementation of dynamicProxy.hashCode()
*/
private int hashCodeImpl() {
@@ -330,7 +427,6 @@
throws java.io.IOException, ClassNotFoundException {
s.defaultReadObject();
-
// Check to make sure that types have not evolved incompatibly
AnnotationType annotationType = null;
@@ -343,7 +439,6 @@
Map<String, Class<?>> memberTypes = annotationType.memberTypes();
-
// If there are annotation members without values, that
// situation is handled by the invoke method.
for (Map.Entry<String, Object> memberValue : memberValues.entrySet()) {
--- a/jdk/src/java.base/share/classes/sun/security/provider/X509Factory.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/provider/X509Factory.java Wed Jul 05 20:04:29 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -80,6 +80,7 @@
*
* @exception CertificateException on parsing errors.
*/
+ @Override
public Certificate engineGenerateCertificate(InputStream is)
throws CertificateException
{
@@ -103,8 +104,8 @@
throw new IOException("Empty input");
}
} catch (IOException ioe) {
- throw (CertificateException)new CertificateException
- ("Could not parse certificate: " + ioe.toString()).initCause(ioe);
+ throw new CertificateException("Could not parse certificate: " +
+ ioe.toString(), ioe);
}
}
@@ -140,6 +141,12 @@
* It is useful for certificates that cannot be created via
* generateCertificate() and for converting other X509Certificate
* implementations to an X509CertImpl.
+ *
+ * @param c The source X509Certificate
+ * @return An X509CertImpl object that is either a cached certificate or a
+ * newly built X509CertImpl from the provided X509Certificate
+ * @throws CertificateException if failures occur while obtaining the DER
+ * encoding for certificate data.
*/
public static synchronized X509CertImpl intern(X509Certificate c)
throws CertificateException {
@@ -170,6 +177,12 @@
/**
* Return an interned X509CRLImpl for the given certificate.
* For more information, see intern(X509Certificate).
+ *
+ * @param c The source X509CRL
+ * @return An X509CRLImpl object that is either a cached CRL or a
+ * newly built X509CRLImpl from the provided X509CRL
+ * @throws CRLException if failures occur while obtaining the DER
+ * encoding for CRL data.
*/
public static synchronized X509CRLImpl intern(X509CRL c)
throws CRLException {
@@ -229,6 +242,7 @@
* @exception CertificateException if an exception occurs while decoding
* @since 1.4
*/
+ @Override
public CertPath engineGenerateCertPath(InputStream inStream)
throws CertificateException
{
@@ -260,6 +274,7 @@
* the encoding requested is not supported
* @since 1.4
*/
+ @Override
public CertPath engineGenerateCertPath(InputStream inStream,
String encoding) throws CertificateException
{
@@ -292,6 +307,7 @@
* @exception CertificateException if an exception occurs
* @since 1.4
*/
+ @Override
public CertPath
engineGenerateCertPath(List<? extends Certificate> certificates)
throws CertificateException
@@ -311,6 +327,7 @@
* <code>CertPath</code> encodings (as <code>String</code>s)
* @since 1.4
*/
+ @Override
public Iterator<String> engineGetCertPathEncodings() {
return(X509CertPath.getEncodingsStatic());
}
@@ -326,6 +343,7 @@
*
* @exception CertificateException on parsing errors.
*/
+ @Override
public Collection<? extends java.security.cert.Certificate>
engineGenerateCertificates(InputStream is)
throws CertificateException {
@@ -351,6 +369,7 @@
*
* @exception CRLException on parsing errors.
*/
+ @Override
public CRL engineGenerateCRL(InputStream is)
throws CRLException
{
@@ -388,6 +407,7 @@
*
* @exception CRLException on parsing errors.
*/
+ @Override
public Collection<? extends java.security.cert.CRL> engineGenerateCRLs(
InputStream is) throws CRLException
{
@@ -410,11 +430,30 @@
parseX509orPKCS7Cert(InputStream is)
throws CertificateException, IOException
{
+ int peekByte;
+ byte[] data;
+ PushbackInputStream pbis = new PushbackInputStream(is);
Collection<X509CertImpl> coll = new ArrayList<>();
- byte[] data = readOneBlock(is);
+
+ // Test the InputStream for end-of-stream. If the stream's
+ // initial state is already at end-of-stream then return
+ // an empty collection. Otherwise, push the byte back into the
+ // stream and let readOneBlock look for the first certificate.
+ peekByte = pbis.read();
+ if (peekByte == -1) {
+ return new ArrayList<>(0);
+ } else {
+ pbis.unread(peekByte);
+ data = readOneBlock(pbis);
+ }
+
+ // If we end up with a null value after reading the first block
+ // then we know the end-of-stream has been reached and no certificate
+ // data has been found.
if (data == null) {
- return new ArrayList<>(0);
+ throw new CertificateException("No certificate data found");
}
+
try {
PKCS7 pkcs7 = new PKCS7(data);
X509Certificate[] certs = pkcs7.getCertificates();
@@ -422,13 +461,13 @@
if (certs != null) {
return Arrays.asList(certs);
} else {
- // no crls provided
+ // no certificates provided
return new ArrayList<>(0);
}
} catch (ParsingException e) {
while (data != null) {
coll.add(new X509CertImpl(data));
- data = readOneBlock(is);
+ data = readOneBlock(pbis);
}
}
return coll;
@@ -443,11 +482,30 @@
parseX509orPKCS7CRL(InputStream is)
throws CRLException, IOException
{
+ int peekByte;
+ byte[] data;
+ PushbackInputStream pbis = new PushbackInputStream(is);
Collection<X509CRLImpl> coll = new ArrayList<>();
- byte[] data = readOneBlock(is);
+
+ // Test the InputStream for end-of-stream. If the stream's
+ // initial state is already at end-of-stream then return
+ // an empty collection. Otherwise, push the byte back into the
+ // stream and let readOneBlock look for the first CRL.
+ peekByte = pbis.read();
+ if (peekByte == -1) {
+ return new ArrayList<>(0);
+ } else {
+ pbis.unread(peekByte);
+ data = readOneBlock(pbis);
+ }
+
+ // If we end up with a null value after reading the first block
+ // then we know the end-of-stream has been reached and no CRL
+ // data has been found.
if (data == null) {
- return new ArrayList<>(0);
+ throw new CRLException("No CRL data found");
}
+
try {
PKCS7 pkcs7 = new PKCS7(data);
X509CRL[] crls = pkcs7.getCRLs();
@@ -461,7 +519,7 @@
} catch (ParsingException e) {
while (data != null) {
coll.add(new X509CRLImpl(data));
- data = readOneBlock(is);
+ data = readOneBlock(pbis);
}
}
return coll;
@@ -623,7 +681,7 @@
int n = is.read();
if (n == -1) {
- throw new IOException("BER/DER length info ansent");
+ throw new IOException("BER/DER length info absent");
}
bout.write(n);
--- a/jdk/src/java.base/share/classes/sun/security/ssl/ClientHandshaker.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/ClientHandshaker.java Wed Jul 05 20:04:29 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -36,6 +36,8 @@
import java.security.cert.X509Certificate;
import java.security.cert.CertificateException;
+import java.security.cert.CertificateParsingException;
+import javax.security.auth.x500.X500Principal;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
@@ -89,12 +91,66 @@
private final static boolean enableSNIExtension =
Debug.getBooleanProperty("jsse.enableSNIExtension", true);
+ /*
+ * Allow unsafe server certificate change?
+ *
+ * Server certificate change during SSL/TLS renegotiation may be considered
+ * unsafe, as described in the Triple Handshake attacks:
+ *
+ * https://secure-resumption.com/tlsauth.pdf
+ *
+ * Endpoint identification (See
+ * SSLParameters.getEndpointIdentificationAlgorithm()) is a pretty nice
+ * guarantee that the server certificate change in renegotiation is legal.
+ * However, endpoing identification is only enabled for HTTPS and LDAP
+ * over SSL/TLS by default. It is not enough to protect SSL/TLS
+ * connections other than HTTPS and LDAP.
+ *
+ * The renegotiation indication extension (See RFC 5764) is a pretty
+ * strong guarantee that the endpoints on both client and server sides
+ * are identical on the same connection. However, the Triple Handshake
+ * attacks can bypass this guarantee if there is a session-resumption
+ * handshake between the initial full handshake and the renegotiation
+ * full handshake.
+ *
+ * Server certificate change may be unsafe and should be restricted if
+ * endpoint identification is not enabled and the previous handshake is
+ * a session-resumption abbreviated initial handshake, unless the
+ * identities represented by both certificates can be regraded as the
+ * same (See isIdentityEquivalent()).
+ *
+ * Considering the compatibility impact and the actual requirements to
+ * support server certificate change in practice, the system property,
+ * jdk.tls.allowUnsafeServerCertChange, is used to define whether unsafe
+ * server certificate change in renegotiation is allowed or not. The
+ * default value of the system property is "false". To mitigate the
+ * compactibility impact, applications may want to set the system
+ * property to "true" at their own risk.
+ *
+ * If the value of the system property is "false", server certificate
+ * change in renegotiation after a session-resumption abbreviated initial
+ * handshake is restricted (See isIdentityEquivalent()).
+ *
+ * If the system property is set to "true" explicitly, the restriction on
+ * server certificate change in renegotiation is disabled.
+ */
+ private final static boolean allowUnsafeServerCertChange =
+ Debug.getBooleanProperty("jdk.tls.allowUnsafeServerCertChange", false);
+
private List<SNIServerName> requestedServerNames =
Collections.<SNIServerName>emptyList();
private boolean serverNamesAccepted = false;
/*
+ * the reserved server certificate chain in previous handshaking
+ *
+ * The server certificate chain is only reserved if the previous
+ * handshake is a session-resumption abbreviated initial handshake.
+ */
+ private X509Certificate[] reservedServerCerts = null;
+
+ /*
* Constructors
*/
ClientHandshaker(SSLSocketImpl socket, SSLContextImpl context,
@@ -555,14 +611,19 @@
// we wanted to resume, but the server refused
session = null;
if (!enableNewSession) {
- throw new SSLException
- ("New session creation is disabled");
+ throw new SSLException("New session creation is disabled");
}
}
}
if (resumingSession && session != null) {
setHandshakeSessionSE(session);
+ // Reserve the handshake state if this is a session-resumption
+ // abbreviated initial handshake.
+ if (isInitialHandshake) {
+ session.setAsSessionResumption(true);
+ }
+
return;
}
@@ -1064,6 +1125,13 @@
}
/*
+ * Reset the handshake state if this is not an initial handshake.
+ */
+ if (!isInitialHandshake) {
+ session.setAsSessionResumption(false);
+ }
+
+ /*
* OK, it verified. If we're doing the fast handshake, add that
* "Finished" message to the hash of handshake messages, then send
* our own change_cipher_spec and Finished message for the server
@@ -1161,8 +1229,23 @@
System.out.println("%% No cached client session");
}
}
- if ((session != null) && (session.isRejoinable() == false)) {
- session = null;
+ if (session != null) {
+ // If unsafe server certificate change is not allowed, reserve
+ // current server certificates if the previous handshake is a
+ // session-resumption abbreviated initial handshake.
+ if (!allowUnsafeServerCertChange && session.isSessionResumption()) {
+ try {
+ // If existing, peer certificate chain cannot be null.
+ reservedServerCerts =
+ (X509Certificate[])session.getPeerCertificates();
+ } catch (SSLPeerUnverifiedException puve) {
+ // Maybe not certificate-based, ignore the exception.
+ }
+ }
+
+ if (!session.isRejoinable()) {
+ session = null;
+ }
}
if (session != null) {
@@ -1331,9 +1414,28 @@
}
X509Certificate[] peerCerts = mesg.getCertificateChain();
if (peerCerts.length == 0) {
- fatalSE(Alerts.alert_bad_certificate,
- "empty certificate chain");
+ fatalSE(Alerts.alert_bad_certificate, "empty certificate chain");
}
+
+ // Allow server certificate change in client side during renegotiation
+ // after a session-resumption abbreviated initial handshake?
+ //
+ // DO NOT need to check allowUnsafeServerCertChange here. We only
+ // reserve server certificates when allowUnsafeServerCertChange is
+ // flase.
+ if (reservedServerCerts != null) {
+ // It is not necessary to check the certificate update if endpoint
+ // identification is enabled.
+ String identityAlg = getEndpointIdentificationAlgorithmSE();
+ if ((identityAlg == null || identityAlg.length() == 0) &&
+ !isIdentityEquivalent(peerCerts[0], reservedServerCerts[0])) {
+
+ fatalSE(Alerts.alert_bad_certificate,
+ "server certificate change is restricted " +
+ "during renegotiation");
+ }
+ }
+
// ask the trust manager to verify the chain
X509TrustManager tm = sslContext.getX509TrustManager();
try {
@@ -1370,4 +1472,81 @@
}
session.setPeerCertificates(peerCerts);
}
+
+ /*
+ * Whether the certificates can represent the same identity?
+ *
+ * The certificates can be used to represent the same identity:
+ * 1. If the subject alternative names of IP address are present in
+ * both certificates, they should be identical; otherwise,
+ * 2. if the subject alternative names of DNS name are present in
+ * both certificates, they should be identical; otherwise,
+ * 3. if the subject fields are present in both certificates, the
+ * certificate subjects and issuers should be identical.
+ */
+ private static boolean isIdentityEquivalent(X509Certificate thisCert,
+ X509Certificate prevCert) {
+ if (thisCert.equals(prevCert)) {
+ return true;
+ }
+
+ // check the iPAddress field in subjectAltName extension
+ Object thisIPAddress = getSubjectAltName(thisCert, 7); // 7: iPAddress
+ Object prevIPAddress = getSubjectAltName(prevCert, 7);
+ if (thisIPAddress != null && prevIPAddress!= null) {
+ // only allow the exactly match
+ return Objects.equals(thisIPAddress, prevIPAddress);
+ }
+
+ // check the dNSName field in subjectAltName extension
+ Object thisDNSName = getSubjectAltName(thisCert, 2); // 2: dNSName
+ Object prevDNSName = getSubjectAltName(prevCert, 2);
+ if (thisDNSName != null && prevDNSName!= null) {
+ // only allow the exactly match
+ return Objects.equals(thisDNSName, prevDNSName);
+ }
+
+ // check the certificate subject and issuer
+ X500Principal thisSubject = thisCert.getSubjectX500Principal();
+ X500Principal prevSubject = prevCert.getSubjectX500Principal();
+ X500Principal thisIssuer = thisCert.getIssuerX500Principal();
+ X500Principal prevIssuer = prevCert.getIssuerX500Principal();
+ if (!thisSubject.getName().isEmpty() &&
+ !prevSubject.getName().isEmpty() &&
+ thisSubject.equals(prevSubject) &&
+ thisIssuer.equals(prevIssuer)) {
+ return true;
+ }
+
+ return false;
+ }
+
+ /*
+ * Returns the subject alternative name of the specified type in the
+ * subjectAltNames extension of a certificate.
+ */
+ private static Object getSubjectAltName(X509Certificate cert, int type) {
+ Collection<List<?>> subjectAltNames;
+
+ try {
+ subjectAltNames = cert.getSubjectAlternativeNames();
+ } catch (CertificateParsingException cpe) {
+ if (debug != null && Debug.isOn("handshake")) {
+ System.out.println(
+ "Attempt to obtain subjectAltNames extension failed!");
+ }
+ return null;
+ }
+
+ if (subjectAltNames != null) {
+ for (List<?> subjectAltName : subjectAltNames) {
+ int subjectAltNameType = (Integer)subjectAltName.get(0);
+ if (subjectAltNameType == type) {
+ return subjectAltName.get(1);
+ }
+ }
+ }
+
+ return null;
+ }
}
--- a/jdk/src/java.base/share/classes/sun/security/ssl/Handshaker.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/Handshaker.java Wed Jul 05 20:04:29 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -359,6 +359,17 @@
}
}
+ String getEndpointIdentificationAlgorithmSE() {
+ SSLParameters paras;
+ if (conn != null) {
+ paras = conn.getSSLParameters();
+ } else {
+ paras = engine.getSSLParameters();
+ }
+
+ return paras.getEndpointIdentificationAlgorithm();
+ }
+
private void setVersionSE(ProtocolVersion protocolVersion) {
if (conn != null) {
conn.setVersion(protocolVersion);
--- a/jdk/src/java.base/share/classes/sun/security/ssl/SSLSessionImpl.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/SSLSessionImpl.java Wed Jul 05 20:04:29 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -115,6 +115,14 @@
private Principal localPrincipal;
/*
+ * Is the session currently re-established with a session-resumption
+ * abbreviated initial handshake?
+ *
+ * Note that currently we only set this variable in client side.
+ */
+ private boolean isSessionResumption = false;
+
+ /*
* We count session creations, eventually for statistical data but
* also since counters make shorter debugging IDs than the big ones
* we use in the protocol for uniqueness-over-time.
@@ -325,6 +333,22 @@
}
/**
+ * Return true if the session is currently re-established with a
+ * session-resumption abbreviated initial handshake.
+ */
+ boolean isSessionResumption() {
+ return isSessionResumption;
+ }
+
+ /**
+ * Resets whether the session is re-established with a session-resumption
+ * abbreviated initial handshake.
+ */
+ void setAsSessionResumption(boolean flag) {
+ isSessionResumption = flag;
+ }
+
+ /**
* Returns the name of the cipher suite in use on this session
*/
@Override
--- a/jdk/src/java.base/share/classes/sun/security/tools/keytool/Main.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/tools/keytool/Main.java Wed Jul 05 20:04:29 2017 +0200
@@ -64,6 +64,7 @@
import javax.security.auth.x500.X500Principal;
import java.util.Base64;
+import sun.security.util.KeyUtil;
import sun.security.util.ObjectIdentifier;
import sun.security.pkcs10.PKCS10;
import sun.security.pkcs10.PKCS10Attribute;
@@ -1103,8 +1104,13 @@
doChangeKeyPasswd(alias);
kssave = true;
} else if (command == LIST) {
+ if (storePass == null
+ && !KeyStoreUtil.isWindowsKeyStore(storetype)) {
+ printWarning();
+ }
+
if (alias != null) {
- doPrintEntry(alias, out, true);
+ doPrintEntry(alias, out);
} else {
doPrintEntries(out);
}
@@ -1765,15 +1771,9 @@
/**
* Prints a single keystore entry.
*/
- private void doPrintEntry(String alias, PrintStream out,
- boolean printWarning)
+ private void doPrintEntry(String alias, PrintStream out)
throws Exception
{
- if (storePass == null && printWarning
- && !KeyStoreUtil.isWindowsKeyStore(storetype)) {
- printWarning();
- }
-
if (keyStore.containsAlias(alias) == false) {
MessageFormat form = new MessageFormat
(rb.getString("Alias.alias.does.not.exist"));
@@ -2090,13 +2090,6 @@
private void doPrintEntries(PrintStream out)
throws Exception
{
- if (storePass == null
- && !KeyStoreUtil.isWindowsKeyStore(storetype)) {
- printWarning();
- } else {
- out.println();
- }
-
out.println(rb.getString("Keystore.type.") + keyStore.getType());
out.println(rb.getString("Keystore.provider.") +
keyStore.getProvider().getName());
@@ -2115,7 +2108,7 @@
for (Enumeration<String> e = keyStore.aliases();
e.hasMoreElements(); ) {
String alias = e.nextElement();
- doPrintEntry(alias, out, false);
+ doPrintEntry(alias, out);
if (verbose || rfc) {
out.println(rb.getString("NEWLINE"));
out.println(rb.getString
@@ -2922,6 +2915,7 @@
MessageFormat form = new MessageFormat
(rb.getString(".PATTERN.printX509Cert"));
+ PublicKey pkey = cert.getPublicKey();
Object[] source = {cert.getSubjectDN().toString(),
cert.getIssuerDN().toString(),
cert.getSerialNumber().toString(16),
@@ -2931,7 +2925,9 @@
getCertFingerPrint("SHA1", cert),
getCertFingerPrint("SHA-256", cert),
cert.getSigAlgName(),
- cert.getVersion()
+ pkey.getAlgorithm(),
+ KeyUtil.getKeySize(pkey),
+ cert.getVersion(),
};
out.println(form.format(source));
--- a/jdk/src/java.base/share/classes/sun/security/tools/keytool/Resources.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/tools/keytool/Resources.java Wed Jul 05 20:04:29 2017 +0200
@@ -347,7 +347,7 @@
{".RETURN.if.same.as.for.otherAlias.",
"\t(RETURN if same as for <{0}>)"},
{".PATTERN.printX509Cert",
- "Owner: {0}\nIssuer: {1}\nSerial number: {2}\nValid from: {3} until: {4}\nCertificate fingerprints:\n\t MD5: {5}\n\t SHA1: {6}\n\t SHA256: {7}\n\t Signature algorithm name: {8}\n\t Version: {9}"},
+ "Owner: {0}\nIssuer: {1}\nSerial number: {2}\nValid from: {3} until: {4}\nCertificate fingerprints:\n\t MD5: {5}\n\t SHA1: {6}\n\t SHA256: {7}\nSignature algorithm name: {8}\nSubject Public Key Algorithm: {9} ({10,number,#})\nVersion: {11}"},
{"What.is.your.first.and.last.name.",
"What is your first and last name?"},
{"What.is.the.name.of.your.organizational.unit.",
--- a/jdk/src/java.base/share/classes/sun/util/locale/BaseLocale.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.base/share/classes/sun/util/locale/BaseLocale.java Wed Jul 05 20:04:29 2017 +0200
@@ -31,6 +31,7 @@
*/
package sun.util.locale;
+import java.lang.ref.SoftReference;
import java.util.StringJoiner;
@@ -151,11 +152,11 @@
return h;
}
- private static final class Key implements Comparable<Key> {
- private final String lang;
- private final String scrt;
- private final String regn;
- private final String vart;
+ private static final class Key {
+ private final SoftReference<String> lang;
+ private final SoftReference<String> scrt;
+ private final SoftReference<String> regn;
+ private final SoftReference<String> vart;
private final boolean normalized;
private final int hash;
@@ -167,10 +168,10 @@
assert language.intern() == language
&& region.intern() == region;
- lang = language;
- scrt = "";
- regn = region;
- vart = "";
+ lang = new SoftReference<>(language);
+ scrt = new SoftReference<>("");
+ regn = new SoftReference<>(region);
+ vart = new SoftReference<>("");
this.normalized = true;
int h = language.hashCode();
@@ -191,40 +192,40 @@
String variant, boolean normalized) {
int h = 0;
if (language != null) {
- lang = language;
+ lang = new SoftReference<>(language);
int len = language.length();
for (int i = 0; i < len; i++) {
h = 31*h + LocaleUtils.toLower(language.charAt(i));
}
} else {
- lang = "";
+ lang = new SoftReference<>("");
}
if (script != null) {
- scrt = script;
+ scrt = new SoftReference<>(script);
int len = script.length();
for (int i = 0; i < len; i++) {
h = 31*h + LocaleUtils.toLower(script.charAt(i));
}
} else {
- scrt = "";
+ scrt = new SoftReference<>("");
}
if (region != null) {
- regn = region;
+ regn = new SoftReference<>(region);
int len = region.length();
for (int i = 0; i < len; i++) {
h = 31*h + LocaleUtils.toLower(region.charAt(i));
}
} else {
- regn = "";
+ regn = new SoftReference<>("");
}
if (variant != null) {
- vart = variant;
+ vart = new SoftReference<>(variant);
int len = variant.length();
for (int i = 0; i < len; i++) {
h = 31*h + variant.charAt(i);
}
} else {
- vart = "";
+ vart = new SoftReference<>("");
}
hash = h;
this.normalized = normalized;
@@ -232,28 +233,31 @@
@Override
public boolean equals(Object obj) {
- return (this == obj) ||
- (obj instanceof Key)
- && this.hash == ((Key)obj).hash
- && LocaleUtils.caseIgnoreMatch(((Key)obj).lang, this.lang)
- && LocaleUtils.caseIgnoreMatch(((Key)obj).scrt, this.scrt)
- && LocaleUtils.caseIgnoreMatch(((Key)obj).regn, this.regn)
- && ((Key)obj).vart.equals(vart); // variant is case sensitive in JDK!
- }
+ if (this == obj) {
+ return true;
+ }
- @Override
- public int compareTo(Key other) {
- int res = LocaleUtils.caseIgnoreCompare(this.lang, other.lang);
- if (res == 0) {
- res = LocaleUtils.caseIgnoreCompare(this.scrt, other.scrt);
- if (res == 0) {
- res = LocaleUtils.caseIgnoreCompare(this.regn, other.regn);
- if (res == 0) {
- res = this.vart.compareTo(other.vart);
+ if (obj instanceof Key && this.hash == ((Key)obj).hash) {
+ String tl = this.lang.get();
+ String ol = ((Key)obj).lang.get();
+ if (tl != null && ol != null &&
+ LocaleUtils.caseIgnoreMatch(ol, tl)) {
+ String ts = this.scrt.get();
+ String os = ((Key)obj).scrt.get();
+ if (ts != null && os != null &&
+ LocaleUtils.caseIgnoreMatch(os, ts)) {
+ String tr = this.regn.get();
+ String or = ((Key)obj).regn.get();
+ if (tr != null && or != null &&
+ LocaleUtils.caseIgnoreMatch(or, tr)) {
+ String tv = this.vart.get();
+ String ov = ((Key)obj).vart.get();
+ return (ov != null && ov.equals(tv));
+ }
}
}
}
- return res;
+ return false;
}
@Override
@@ -266,10 +270,10 @@
return key;
}
- String lang = LocaleUtils.toLowerString(key.lang).intern();
- String scrt = LocaleUtils.toTitleString(key.scrt).intern();
- String regn = LocaleUtils.toUpperString(key.regn).intern();
- String vart = key.vart.intern(); // preserve upper/lower cases
+ String lang = LocaleUtils.toLowerString(key.lang.get()).intern();
+ String scrt = LocaleUtils.toTitleString(key.scrt.get()).intern();
+ String regn = LocaleUtils.toUpperString(key.regn.get()).intern();
+ String vart = key.vart.get().intern(); // preserve upper/lower cases
return new Key(lang, scrt, regn, vart, true);
}
@@ -282,12 +286,18 @@
@Override
protected Key normalizeKey(Key key) {
+ assert key.lang.get() != null &&
+ key.scrt.get() != null &&
+ key.regn.get() != null &&
+ key.vart.get() != null;
+
return Key.normalize(key);
}
@Override
protected BaseLocale createObject(Key key) {
- return new BaseLocale(key.lang, key.scrt, key.regn, key.vart);
+ return new BaseLocale(key.lang.get(), key.scrt.get(),
+ key.regn.get(), key.vart.get());
}
}
}
--- a/jdk/src/java.base/share/classes/sun/util/locale/LocaleObjectCache.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.base/share/classes/sun/util/locale/LocaleObjectCache.java Wed Jul 05 20:04:29 2017 +0200
@@ -57,8 +57,10 @@
value = entry.get();
}
if (value == null) {
+ V newVal = createObject(key);
+ // make sure key is normalized *after* the object creation
+ // so that newVal is assured to be created from a valid key.
key = normalizeKey(key);
- V newVal = createObject(key);
if (key == null || newVal == null) {
// subclass must return non-null key/value object
return null;
--- a/jdk/src/java.base/share/native/include/jvm.h Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.base/share/native/include/jvm.h Wed Jul 05 20:04:29 2017 +0200
@@ -386,6 +386,19 @@
JVM_FindClassFromBootLoader(JNIEnv *env, const char *name);
/*
+ * Find a class from a given class loader. Throws ClassNotFoundException.
+ * name: name of class
+ * init: whether initialization is done
+ * loader: class loader to look up the class. This may not be the same as the caller's
+ * class loader.
+ * caller: initiating class. The initiating class may be null when a security
+ * manager is not installed.
+ */
+JNIEXPORT jclass JNICALL
+JVM_FindClassFromCaller(JNIEnv *env, const char *name, jboolean init,
+ jobject loader, jclass caller);
+
+/*
* Find a class from a given class loader. Throw ClassNotFoundException
* or NoClassDefFoundError depending on the value of the last
* argument.
--- a/jdk/src/java.base/share/native/libjava/Class.c Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.base/share/native/libjava/Class.c Wed Jul 05 20:04:29 2017 +0200
@@ -93,7 +93,7 @@
JNIEXPORT jclass JNICALL
Java_java_lang_Class_forName0(JNIEnv *env, jclass this, jstring classname,
- jboolean initialize, jobject loader)
+ jboolean initialize, jobject loader, jclass caller)
{
char *clname;
jclass cls = 0;
@@ -131,8 +131,7 @@
goto done;
}
- cls = JVM_FindClassFromClassLoader(env, clname, initialize,
- loader, JNI_FALSE);
+ cls = JVM_FindClassFromCaller(env, clname, initialize, loader, caller);
done:
if (clname != buf) {
--- a/jdk/src/java.base/share/native/libzip/CRC32.c Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.base/share/native/libzip/CRC32.c Wed Jul 05 20:04:29 2017 +0200
@@ -54,7 +54,8 @@
return crc;
}
-JNIEXPORT jint ZIP_CRC32(jint crc, const jbyte *buf, jint len)
+JNIEXPORT jint JNICALL
+ZIP_CRC32(jint crc, const jbyte *buf, jint len)
{
return crc32(crc, (Bytef*)buf, len);
}
--- a/jdk/src/java.base/share/native/libzip/ZipFile.c Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.base/share/native/libzip/ZipFile.c Wed Jul 05 20:04:29 2017 +0200
@@ -174,11 +174,7 @@
}
(*env)->GetByteArrayRegion(env, name, 0, ulen, (jbyte *)path);
path[ulen] = '\0';
- if (addSlash == JNI_FALSE) {
- ze = ZIP_GetEntry(zip, path, 0);
- } else {
- ze = ZIP_GetEntry(zip, path, (jint)ulen);
- }
+ ze = ZIP_GetEntry2(zip, path, (jint)ulen, addSlash);
if (path != buf) {
free(path);
}
@@ -271,7 +267,7 @@
switch (type) {
case java_util_zip_ZipFile_JZENTRY_NAME:
if (ze->name != 0) {
- len = (int)strlen(ze->name);
+ len = (int)ze->nlen;
// Unlike for extra and comment, we never return null for
// an (extremely rarely seen) empty name
if ((jba = (*env)->NewByteArray(env, len)) == NULL)
--- a/jdk/src/java.base/share/native/libzip/zip_util.c Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.base/share/native/libzip/zip_util.c Wed Jul 05 20:04:29 2017 +0200
@@ -1021,6 +1021,7 @@
if ((ze->name = malloc(nlen + 1)) == NULL) goto Catch;
memcpy(ze->name, cen + CENHDR, nlen);
ze->name[nlen] = '\0';
+ ze->nlen = nlen;
if (elen > 0) {
char *extra = cen + CENHDR + nlen;
@@ -1118,7 +1119,34 @@
jzentry *
ZIP_GetEntry(jzfile *zip, char *name, jint ulen)
{
- unsigned int hsh = hash(name);
+ if (ulen == 0) {
+ return ZIP_GetEntry2(zip, name, strlen(name), JNI_FALSE);
+ }
+ return ZIP_GetEntry2(zip, name, ulen, JNI_TRUE);
+}
+
+jboolean equals(char* name1, int len1, char* name2, int len2) {
+ if (len1 != len2) {
+ return JNI_FALSE;
+ }
+ while (len1-- > 0) {
+ if (*name1++ != *name2++) {
+ return JNI_FALSE;
+ }
+ }
+ return JNI_TRUE;
+}
+
+/*
+ * Returns the zip entry corresponding to the specified name, or
+ * NULL if not found.
+ * This method supports embedded null character in "name", use ulen
+ * for the length of "name".
+ */
+jzentry *
+ZIP_GetEntry2(jzfile *zip, char *name, jint ulen, jboolean addSlash)
+{
+ unsigned int hsh = hashN(name, ulen);
jint idx;
jzentry *ze = 0;
@@ -1139,7 +1167,7 @@
/* Check the cached entry first */
ze = zip->cache;
- if (ze && strcmp(ze->name,name) == 0) {
+ if (ze && equals(ze->name, ze->nlen, name, ulen)) {
/* Cache hit! Remove and return the cached entry. */
zip->cache = 0;
ZIP_Unlock(zip);
@@ -1165,7 +1193,7 @@
* we keep searching.
*/
ze = newEntry(zip, zc, ACCESS_RANDOM);
- if (ze && strcmp(ze->name, name)==0) {
+ if (ze && equals(ze->name, ze->nlen, name, ulen)) {
break;
}
if (ze != 0) {
@@ -1184,8 +1212,8 @@
break;
}
- /* If no real length was passed in, we are done */
- if (ulen == 0) {
+ /* If no need to try appending slash, we are done */
+ if (!addSlash) {
break;
}
@@ -1195,11 +1223,11 @@
}
/* Add slash and try once more */
- name[ulen] = '/';
- name[ulen+1] = '\0';
+ name[ulen++] = '/';
+ name[ulen] = '\0';
hsh = hash_append(hsh, '/');
idx = zip->table[hsh % zip->tablelen];
- ulen = 0;
+ addSlash = JNI_FALSE;
}
Finally:
--- a/jdk/src/java.base/share/native/libzip/zip_util.h Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.base/share/native/libzip/zip_util.h Wed Jul 05 20:04:29 2017 +0200
@@ -154,6 +154,7 @@
* - If pos <= 0 then it is the position of entry LOC header.
* If pos > 0 then it is the position of entry data.
* pos should not be accessed directly, but only by ZIP_GetEntryDataOffset.
+ * - entry name may include embedded null character, use nlen for length
*/
typedef struct jzentry { /* Zip file entry */
@@ -166,6 +167,7 @@
jbyte *extra; /* optional extra data */
jlong pos; /* position of LOC header or entry data */
jint flag; /* general purpose flag */
+ jint nlen; /* length of the entry name */
} jzentry;
/*
@@ -269,5 +271,5 @@
jint ZIP_Read(jzfile *zip, jzentry *entry, jlong pos, void *buf, jint len);
void ZIP_FreeEntry(jzfile *zip, jzentry *ze);
jlong ZIP_GetEntryDataOffset(jzfile *zip, jzentry *entry);
-
+jzentry * ZIP_GetEntry2(jzfile *zip, char *name, jint ulen, jboolean addSlash);
#endif /* !_ZIP_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.base/unix/native/libnet/AbstractPlainDatagramSocketImpl.c Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#ifdef __solaris__
+#include <unistd.h>
+#include <stropts.h>
+
+#ifndef BSD_COMP
+#define BSD_COMP
+#endif
+
+#endif
+
+#include <sys/ioctl.h>
+
+#include "jvm.h"
+#include "jni_util.h"
+#include "net_util.h"
+
+#include "java_net_AbstractPlainDatagramSocketImpl.h"
+
+static jfieldID IO_fd_fdID;
+
+static jfieldID apdsi_fdID;
+
+
+/*
+ * Class: java_net_AbstractPlainDatagramSocketImpl
+ * Method: init
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL
+Java_java_net_AbstractPlainDatagramSocketImpl_init(JNIEnv *env, jclass cls) {
+
+ apdsi_fdID = (*env)->GetFieldID(env, cls, "fd",
+ "Ljava/io/FileDescriptor;");
+ CHECK_NULL(apdsi_fdID);
+
+ IO_fd_fdID = NET_GetFileDescriptorID(env);
+}
+
+/*
+ * Class: java_net_AbstractPlainDatagramSocketImpl
+ * Method: dataAvailable
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL Java_java_net_AbstractPlainDatagramSocketImpl_dataAvailable
+(JNIEnv *env, jobject this) {
+ int fd, retval;
+
+ jobject fdObj = (*env)->GetObjectField(env, this, apdsi_fdID);
+
+ if (IS_NULL(fdObj)) {
+ JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
+ "Socket closed");
+ return -1;
+ }
+ fd = (*env)->GetIntField(env, fdObj, IO_fd_fdID);
+
+ if (ioctl(fd, FIONREAD, &retval) < 0) {
+ return -1;
+ }
+ return retval;
+}
--- a/jdk/src/java.base/windows/conf/tzmappings Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.base/windows/conf/tzmappings Wed Jul 05 20:04:29 2017 +0200
@@ -193,5 +193,10 @@
Turkey Standard Time:926,926::Asia/Istanbul:
Bahia Standard Time:927,927::America/Bahia:
Libya Standard Time:928,928:LY:Africa/Tripoli:
-Western Brazilian Standard Time:929,929:BR:America/Rio_Branco:
-Armenian Standard Time:930,930:AM:Asia/Yerevan:
+Belarus Standard Time:929,929:BY:Europe/Minsk:
+Line Islands Standard Time:930,930::Pacific/Kiritimati:
+Russia Time Zone 10:931,931::Asia/Srednekolymsk:
+Russia Time Zone 11:932,932::Asia/Anadyr:
+Russia Time Zone 3:933,933::Europe/Samara:
+Western Brazilian Standard Time:934,934:BR:America/Rio_Branco:
+Armenian Standard Time:935,935:AM:Asia/Yerevan:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.base/windows/native/libnet/AbstractPlainDatagramSocketImpl.c Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#include <windows.h>
+#include <winsock2.h>
+
+#include "jvm.h"
+#include "jni_util.h"
+#include "net_util.h"
+
+#include "java_net_AbstractPlainDatagramSocketImpl.h"
+
+static jfieldID IO_fd_fdID;
+
+static jfieldID apdsi_fdID;
+
+
+/*
+ * Class: java_net_AbstractPlainDatagramSocketImpl
+ * Method: init
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL
+Java_java_net_AbstractPlainDatagramSocketImpl_init(JNIEnv *env, jclass cls) {
+
+ apdsi_fdID = (*env)->GetFieldID(env, cls, "fd",
+ "Ljava/io/FileDescriptor;");
+ CHECK_NULL(apdsi_fdID);
+
+ IO_fd_fdID = NET_GetFileDescriptorID(env);
+ CHECK_NULL(IO_fd_fdID);
+
+ JNU_CHECK_EXCEPTION(env);
+}
+
+/*
+ * Class: java_net_AbstractPlainDatagramSocketImpl
+ * Method: dataAvailable
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL Java_java_net_AbstractPlainDatagramSocketImpl_dataAvailable
+(JNIEnv *env, jobject this) {
+ SOCKET fd;
+ int retval;
+
+ jobject fdObj = (*env)->GetObjectField(env, this, apdsi_fdID);
+
+ if (IS_NULL(fdObj)) {
+ JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
+ "Socket closed");
+ return -1;
+ }
+ fd = (SOCKET)(*env)->GetIntField(env, fdObj, IO_fd_fdID);
+
+ if (ioctlsocket(fd, FIONREAD, &retval) < 0) {
+ return -1;
+ }
+ return retval;
+}
+
--- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Wed Jul 05 20:04:29 2017 +0200
@@ -567,7 +567,10 @@
CWrapper.NSWindow.makeKeyWindow(nsWindowPtr);
}
} else {
+ // immediately hide the window
CWrapper.NSWindow.orderOut(nsWindowPtr);
+ // process the close
+ CWrapper.NSWindow.close(nsWindowPtr);
}
} else {
// otherwise, put it in a proper z-order
--- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CWrapper.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CWrapper.java Wed Jul 05 20:04:29 2017 +0200
@@ -54,8 +54,26 @@
static native void orderFront(long window);
static native void orderFrontRegardless(long window);
static native void orderWindow(long window, int ordered, long relativeTo);
+
+ /**
+ * Removes the window from the screen.
+ *
+ * @param window the pointer of the NSWindow
+ */
static native void orderOut(long window);
+ /**
+ * Removes the window from the screen and releases it. According to
+ * documentation this method should be similar to {@link #orderOut},
+ * because we use ReleasedWhenClosed:NO, so the window shouldn't be
+ * released. But the close method works differently, for example it
+ * close the space if the window was in the full screen via
+ * {@link CPlatformWindow#toggleFullScreen()}.
+ *
+ * @param window the pointer of the NSWindow
+ */
+ static native void close(long window);
+
static native void addChildWindow(long parent, long child, int ordered);
static native void removeChildWindow(long parent, long child);
--- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/CWrapper.m Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/CWrapper.m Wed Jul 05 20:04:29 2017 +0200
@@ -175,6 +175,23 @@
/*
* Class: sun_lwawt_macosx_CWrapper$NSWindow
+ * Method: close
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL
+Java_sun_lwawt_macosx_CWrapper_00024NSWindow_close
+ (JNIEnv *env, jclass cls, jlong windowPtr)
+{
+JNF_COCOA_ENTER(env);
+ NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
+ [ThreadUtilities performOnMainThreadWaiting:NO block:^(){
+ [window close];
+ }];
+JNF_COCOA_EXIT(env);
+}
+
+/*
+ * Class: sun_lwawt_macosx_CWrapper$NSWindow
* Method: orderFrontRegardless
* Signature: (J)V
*/
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMidiDeviceProvider.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMidiDeviceProvider.java Wed Jul 05 20:04:29 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -117,7 +117,7 @@
}
}
-
+ @Override
public final MidiDevice.Info[] getDeviceInfo() {
readDeviceInfos();
Info[] infos = getInfoCache();
@@ -126,7 +126,7 @@
return localArray;
}
-
+ @Override
public final MidiDevice getDevice(MidiDevice.Info info) {
if (info instanceof Info) {
readDeviceInfos();
@@ -143,9 +143,7 @@
}
}
}
-
- throw new IllegalArgumentException("MidiDevice " + info.toString()
- + " not supported by this provider.");
+ throw MidiUtils.unsupportedDevice(info);
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiUtils.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/MidiUtils.java Wed Jul 05 20:04:29 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -25,9 +25,15 @@
package com.sun.media.sound;
-import javax.sound.midi.*;
import java.util.ArrayList;
+import javax.sound.midi.MetaMessage;
+import javax.sound.midi.MidiDevice;
+import javax.sound.midi.MidiEvent;
+import javax.sound.midi.MidiMessage;
+import javax.sound.midi.Sequence;
+import javax.sound.midi.Track;
+
// TODO:
// - define and use a global symbolic constant for 60000000 (see convertTempo)
@@ -48,6 +54,17 @@
private MidiUtils() {
}
+ /**
+ * Returns an exception which should be thrown if MidiDevice is unsupported.
+ *
+ * @param info an info object that describes the desired device
+ * @return an exception instance
+ */
+ static RuntimeException unsupportedDevice(final MidiDevice.Info info) {
+ return new IllegalArgumentException(String.format(
+ "MidiDevice %s not supported by this provider", info));
+ }
+
/** return true if the passed message is Meta End Of Track */
public static boolean isMetaEndOfTrack(MidiMessage midiMsg) {
// first check if it is a META message at all
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/RealTimeSequencer.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/RealTimeSequencer.java Wed Jul 05 20:04:29 2017 +0200
@@ -64,7 +64,7 @@
/**
* All RealTimeSequencers share this info object.
*/
- static final RealTimeSequencerInfo info = new RealTimeSequencerInfo();
+ static final MidiDevice.Info info = new RealTimeSequencerInfo();
private static final Sequencer.SyncMode[] masterSyncModes = { Sequencer.SyncMode.INTERNAL_CLOCK };
@@ -154,7 +154,7 @@
/* ****************************** CONSTRUCTOR ****************************** */
- RealTimeSequencer() throws MidiUnavailableException {
+ RealTimeSequencer(){
super(info);
if (Printer.trace) Printer.trace(">> RealTimeSequencer CONSTRUCTOR");
@@ -1088,7 +1088,7 @@
private static final String description = "Software sequencer";
private static final String version = "Version 1.0";
- private RealTimeSequencerInfo() {
+ RealTimeSequencerInfo() {
super(name, vendor, description, version);
}
} // class Info
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/RealTimeSequencerProvider.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/RealTimeSequencerProvider.java Wed Jul 05 20:04:29 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -26,7 +26,6 @@
package com.sun.media.sound;
import javax.sound.midi.MidiDevice;
-import javax.sound.midi.MidiUnavailableException;
import javax.sound.midi.spi.MidiDeviceProvider;
/**
@@ -36,23 +35,16 @@
*/
public final class RealTimeSequencerProvider extends MidiDeviceProvider {
-
+ @Override
public MidiDevice.Info[] getDeviceInfo() {
-
- MidiDevice.Info[] localArray = { RealTimeSequencer.info };
- return localArray;
+ return new MidiDevice.Info[]{RealTimeSequencer.info};
}
-
- public MidiDevice getDevice(MidiDevice.Info info) {
- if ((info != null) && (!info.equals(RealTimeSequencer.info))) {
- return null;
+ @Override
+ public MidiDevice getDevice(final MidiDevice.Info info) {
+ if (RealTimeSequencer.info.equals(info)) {
+ return new RealTimeSequencer();
}
-
- try {
- return new RealTimeSequencer();
- } catch (MidiUnavailableException e) {
- return null;
- }
+ throw MidiUtils.unsupportedDevice(info);
}
}
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftProvider.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SoftProvider.java Wed Jul 05 20:04:29 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -22,11 +22,10 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
-import java.util.Arrays;
import javax.sound.midi.MidiDevice;
-import javax.sound.midi.MidiDevice.Info;
import javax.sound.midi.spi.MidiDeviceProvider;
/**
@@ -36,17 +35,16 @@
*/
public final class SoftProvider extends MidiDeviceProvider {
- static final Info softinfo = SoftSynthesizer.info;
- private static final Info[] softinfos = {softinfo};
-
+ @Override
public MidiDevice.Info[] getDeviceInfo() {
- return Arrays.copyOf(softinfos, softinfos.length);
+ return new MidiDevice.Info[]{SoftSynthesizer.info};
}
- public MidiDevice getDevice(MidiDevice.Info info) {
- if (info == softinfo) {
+ @Override
+ public MidiDevice getDevice(final MidiDevice.Info info) {
+ if (SoftSynthesizer.info.equals(info)) {
return new SoftSynthesizer();
}
- return null;
+ throw MidiUtils.unsupportedDevice(info);
}
}
--- a/jdk/src/java.desktop/share/classes/java/awt/GraphicsEnvironment.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.desktop/share/classes/java/awt/GraphicsEnvironment.java Wed Jul 05 20:04:29 2017 +0200
@@ -182,7 +182,8 @@
"SunOS".equals(osName) ||
"FreeBSD".equals(osName) ||
"NetBSD".equals(osName) ||
- "OpenBSD".equals(osName)) &&
+ "OpenBSD".equals(osName) ||
+ "AIX".equals(osName)) &&
(System.getenv("DISPLAY") == null));
}
}
--- a/jdk/src/java.desktop/share/classes/javax/print/PrintServiceLookup.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.desktop/share/classes/javax/print/PrintServiceLookup.java Wed Jul 05 20:04:29 2017 +0200
@@ -245,7 +245,7 @@
public static boolean registerService(PrintService service) {
synchronized (PrintServiceLookup.class) {
- if (service instanceof StreamPrintService) {
+ if (service == null || service instanceof StreamPrintService) {
return false;
}
ArrayList<PrintService> registeredServices = getRegisteredServices();
--- a/jdk/src/java.desktop/share/classes/javax/sound/midi/MidiSystem.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/MidiSystem.java Wed Jul 05 20:04:29 2017 +0200
@@ -31,6 +31,7 @@
import java.io.OutputStream;
import java.net.URL;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
@@ -162,18 +163,11 @@
* of length 0 is returned.
*/
public static MidiDevice.Info[] getMidiDeviceInfo() {
- List<MidiDevice.Info> allInfos = new ArrayList<>();
- List<MidiDeviceProvider> providers = getMidiDeviceProviders();
-
- for(int i = 0; i < providers.size(); i++) {
- MidiDeviceProvider provider = providers.get(i);
- MidiDevice.Info[] tmpinfo = provider.getDeviceInfo();
- for (int j = 0; j < tmpinfo.length; j++) {
- allInfos.add( tmpinfo[j] );
- }
+ final List<MidiDevice.Info> allInfos = new ArrayList<>();
+ for (final MidiDeviceProvider provider : getMidiDeviceProviders()) {
+ Collections.addAll(allInfos, provider.getDeviceInfo());
}
- MidiDevice.Info[] infosArray = allInfos.toArray(new MidiDevice.Info[0]);
- return infosArray;
+ return allInfos.toArray(new MidiDevice.Info[allInfos.size()]);
}
/**
@@ -187,17 +181,15 @@
* MIDI device installed on the system
* @see #getMidiDeviceInfo
*/
- public static MidiDevice getMidiDevice(MidiDevice.Info info) throws MidiUnavailableException {
- List<MidiDeviceProvider> providers = getMidiDeviceProviders();
-
- for(int i = 0; i < providers.size(); i++) {
- MidiDeviceProvider provider = providers.get(i);
+ public static MidiDevice getMidiDevice(final MidiDevice.Info info)
+ throws MidiUnavailableException {
+ for (final MidiDeviceProvider provider : getMidiDeviceProviders()) {
if (provider.isDeviceSupported(info)) {
- MidiDevice device = provider.getDevice(info);
- return device;
+ return provider.getDevice(info);
}
}
- throw new IllegalArgumentException("Requested device not installed: " + info);
+ throw new IllegalArgumentException(String.format(
+ "Requested device not installed: %s", info));
}
/**
--- a/jdk/src/java.desktop/share/classes/javax/sound/midi/spi/MidiDeviceProvider.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/spi/MidiDeviceProvider.java Wed Jul 05 20:04:29 2017 +0200
@@ -25,6 +25,8 @@
package javax.sound.midi.spi;
+import java.util.Arrays;
+
import javax.sound.midi.MidiDevice;
/**
@@ -45,16 +47,8 @@
* @return {@code true} if the specified device is supported, otherwise
* {@code false}
*/
- public boolean isDeviceSupported(MidiDevice.Info info) {
-
- MidiDevice.Info infos[] = getDeviceInfo();
-
- for(int i=0; i<infos.length; i++) {
- if( info.equals( infos[i] ) ) {
- return true;
- }
- }
- return false;
+ public boolean isDeviceSupported(final MidiDevice.Info info) {
+ return Arrays.asList(getDeviceInfo()).contains(info);
}
/**
--- a/jdk/src/java.desktop/share/classes/javax/swing/JComponent.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.desktop/share/classes/javax/swing/JComponent.java Wed Jul 05 20:04:29 2017 +0200
@@ -56,6 +56,7 @@
import java.io.IOException;
import java.io.ObjectInputValidation;
import java.io.InvalidObjectException;
+import java.util.concurrent.atomic.AtomicBoolean;
import javax.swing.border.*;
import javax.swing.event.*;
@@ -354,7 +355,8 @@
private static final int AUTOSCROLLS_SET = 25;
private static final int FOCUS_TRAVERSAL_KEYS_FORWARD_SET = 26;
private static final int FOCUS_TRAVERSAL_KEYS_BACKWARD_SET = 27;
- private static final int REVALIDATE_RUNNABLE_SCHEDULED = 28;
+
+ private transient AtomicBoolean revalidateRunnableScheduled = new AtomicBoolean(false);
/**
* Temporary rectangles.
@@ -4901,16 +4903,11 @@
// To avoid a flood of Runnables when constructing GUIs off
// the EDT, a flag is maintained as to whether or not
// a Runnable has been scheduled.
- synchronized(this) {
- if (getFlag(REVALIDATE_RUNNABLE_SCHEDULED)) {
- return;
- }
- setFlag(REVALIDATE_RUNNABLE_SCHEDULED, true);
+ if (revalidateRunnableScheduled.getAndSet(true)) {
+ return;
}
SunToolkit.executeOnEventHandlerThread(this, () -> {
- synchronized(JComponent.this) {
- setFlag(REVALIDATE_RUNNABLE_SCHEDULED, false);
- }
+ revalidateRunnableScheduled.set(false);
revalidate();
});
}
@@ -5567,6 +5564,7 @@
ToolTipManager.sharedInstance().registerComponent(this);
}
setWriteObjCounter(this, (byte)0);
+ revalidateRunnableScheduled = new AtomicBoolean(false);
}
--- a/jdk/src/java.desktop/share/classes/javax/swing/JTable.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.desktop/share/classes/javax/swing/JTable.java Wed Jul 05 20:04:29 2017 +0200
@@ -3688,17 +3688,17 @@
//
/**
- * Sets the data model for this table to <code>newModel</code> and registers
+ * Sets the data model for this table to {@code dataModel} and registers
* with it for listener notifications from the new data model.
*
- * @param dataModel the new data source for this table
- * @exception IllegalArgumentException if <code>newModel</code> is <code>null</code>
- * @see #getModel
+ * @param dataModel the new data source for this table
+ * @throws IllegalArgumentException if {@code dataModel} is {@code null}
+ * @see #getModel
* @beaninfo
* bound: true
* description: The model that is the source of the data for this view.
*/
- public void setModel(TableModel dataModel) {
+ public void setModel(final TableModel dataModel) {
if (dataModel == null) {
throw new IllegalArgumentException("Cannot set a null TableModel");
}
@@ -3721,29 +3721,30 @@
}
/**
- * Returns the <code>TableModel</code> that provides the data displayed by this
- * <code>JTable</code>.
- *
- * @return the <code>TableModel</code> that provides the data displayed by this <code>JTable</code>
- * @see #setModel
+ * Returns the {@code TableModel} that provides the data displayed by this
+ * {@code JTable}.
+ *
+ * @return the {@code TableModel} that provides the data displayed by this
+ * {@code JTable}
+ * @see #setModel
*/
public TableModel getModel() {
return dataModel;
}
/**
- * Sets the column model for this table to <code>newModel</code> and registers
- * for listener notifications from the new column model. Also sets
- * the column model of the <code>JTableHeader</code> to <code>columnModel</code>.
- *
- * @param columnModel the new data source for this table
- * @exception IllegalArgumentException if <code>columnModel</code> is <code>null</code>
- * @see #getColumnModel
+ * Sets the column model for this table to {@code columnModel} and registers
+ * for listener notifications from the new column model. Also sets the
+ * column model of the {@code JTableHeader} to {@code columnModel}.
+ *
+ * @param columnModel the new data source for this table
+ * @throws IllegalArgumentException if {@code columnModel} is {@code null}
+ * @see #getColumnModel
* @beaninfo
* bound: true
* description: The object governing the way columns appear in the view.
*/
- public void setColumnModel(TableColumnModel columnModel) {
+ public void setColumnModel(final TableColumnModel columnModel) {
if (columnModel == null) {
throw new IllegalArgumentException("Cannot set a null ColumnModel");
}
@@ -3766,54 +3767,55 @@
}
/**
- * Returns the <code>TableColumnModel</code> that contains all column information
+ * Returns the {@code TableColumnModel} that contains all column information
* of this table.
*
- * @return the object that provides the column state of the table
- * @see #setColumnModel
+ * @return the object that provides the column state of the table
+ * @see #setColumnModel
*/
public TableColumnModel getColumnModel() {
return columnModel;
}
/**
- * Sets the row selection model for this table to <code>newModel</code>
+ * Sets the row selection model for this table to {@code selectionModel}
* and registers for listener notifications from the new selection model.
*
- * @param newModel the new selection model
- * @exception IllegalArgumentException if <code>newModel</code> is <code>null</code>
- * @see #getSelectionModel
+ * @param selectionModel the new selection model
+ * @throws IllegalArgumentException if {@code selectionModel} is
+ * {@code null}
+ * @see #getSelectionModel
* @beaninfo
* bound: true
* description: The selection model for rows.
*/
- public void setSelectionModel(ListSelectionModel newModel) {
- if (newModel == null) {
+ public void setSelectionModel(final ListSelectionModel selectionModel) {
+ if (selectionModel == null) {
throw new IllegalArgumentException("Cannot set a null SelectionModel");
}
- ListSelectionModel oldModel = selectionModel;
-
- if (newModel != oldModel) {
+ ListSelectionModel oldModel = this.selectionModel;
+
+ if (selectionModel != oldModel) {
if (oldModel != null) {
oldModel.removeListSelectionListener(this);
}
- selectionModel = newModel;
- newModel.addListSelectionListener(this);
-
- firePropertyChange("selectionModel", oldModel, newModel);
+ this.selectionModel = selectionModel;
+ selectionModel.addListSelectionListener(this);
+
+ firePropertyChange("selectionModel", oldModel, selectionModel);
repaint();
}
}
/**
- * Returns the <code>ListSelectionModel</code> that is used to maintain row
+ * Returns the {@code ListSelectionModel} that is used to maintain row
* selection state.
*
- * @return the object that provides row selection state, <code>null</code>
- * if row selection is not allowed
- * @see #setSelectionModel
+ * @return the object that provides row selection state, {@code null} if row
+ * selection is not allowed
+ * @see #setSelectionModel
*/
public ListSelectionModel getSelectionModel() {
return selectionModel;
--- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicTextUI.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicTextUI.java Wed Jul 05 20:04:29 2017 +0200
@@ -1122,6 +1122,11 @@
Position.Bias b, int direction, Position.Bias[] biasRet)
throws BadLocationException{
Document doc = editor.getDocument();
+
+ if (pos < -1 || pos > doc.getLength()) {
+ throw new BadLocationException("Invalid position", pos);
+ }
+
if (doc instanceof AbstractDocument) {
((AbstractDocument)doc).readLock();
}
@@ -1594,7 +1599,7 @@
int direction,
Position.Bias[] biasRet)
throws BadLocationException {
- if (pos < -1) {
+ if (pos < -1 || pos > getDocument().getLength()) {
throw new BadLocationException("invalid position", pos);
}
if( view != null ) {
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/AsyncBoxView.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.desktop/share/classes/javax/swing/text/AsyncBoxView.java Wed Jul 05 20:04:29 2017 +0200
@@ -854,7 +854,7 @@
int direction,
Position.Bias[] biasRet)
throws BadLocationException {
- if (pos < -1) {
+ if (pos < -1 || pos > getDocument().getLength()) {
throw new BadLocationException("invalid position", pos);
}
return Utilities.getNextVisualPositionFrom(
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/CompositeView.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.desktop/share/classes/javax/swing/text/CompositeView.java Wed Jul 05 20:04:29 2017 +0200
@@ -463,7 +463,7 @@
public int getNextVisualPositionFrom(int pos, Position.Bias b, Shape a,
int direction, Position.Bias[] biasRet)
throws BadLocationException {
- if (pos < -1) {
+ if (pos < -1 || pos > getDocument().getLength()) {
throw new BadLocationException("invalid position", pos);
}
Rectangle alloc = getInsideAllocation(a);
@@ -723,6 +723,9 @@
Shape a, int direction,
Position.Bias[] biasRet)
throws BadLocationException {
+ if (pos < -1 || pos > getDocument().getLength()) {
+ throw new BadLocationException("invalid position", pos);
+ }
return Utilities.getNextVisualPositionFrom(
this, pos, b, a, direction, biasRet);
}
@@ -754,6 +757,9 @@
int direction,
Position.Bias[] biasRet)
throws BadLocationException {
+ if (pos < -1 || pos > getDocument().getLength()) {
+ throw new BadLocationException("invalid position", pos);
+ }
return Utilities.getNextVisualPositionFrom(
this, pos, b, a, direction, biasRet);
}
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/GlyphView.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.desktop/share/classes/javax/swing/text/GlyphView.java Wed Jul 05 20:04:29 2017 +0200
@@ -900,7 +900,7 @@
Position.Bias[] biasRet)
throws BadLocationException {
- if (pos < -1) {
+ if (pos < -1 || pos > getDocument().getLength()) {
throw new BadLocationException("invalid position", pos);
}
return painter.getNextVisualPositionFrom(this, pos, b, a, direction, biasRet);
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/View.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.desktop/share/classes/javax/swing/text/View.java Wed Jul 05 20:04:29 2017 +0200
@@ -500,7 +500,7 @@
public int getNextVisualPositionFrom(int pos, Position.Bias b, Shape a,
int direction, Position.Bias[] biasRet)
throws BadLocationException {
- if (pos < -1) {
+ if (pos < -1 || pos > getDocument().getLength()) {
// -1 is a reserved value, see the code below
throw new BadLocationException("Invalid position", pos);
}
--- a/jdk/src/java.desktop/share/classes/sun/awt/image/BytePackedRaster.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.desktop/share/classes/sun/awt/image/BytePackedRaster.java Wed Jul 05 20:04:29 2017 +0200
@@ -1408,10 +1408,10 @@
}
}
- int lastbit = (dataBitOffset
- + (height-1) * scanlineStride * 8
- + (width-1) * pixelBitStride
- + pixelBitStride - 1);
+ long lastbit = (long) dataBitOffset
+ + (long) (height - 1) * (long) scanlineStride * 8
+ + (long) (width - 1) * (long) pixelBitStride
+ + (long) pixelBitStride - 1;
if (lastbit < 0 || lastbit / 8 >= data.length) {
throw new RasterFormatException("raster dimensions overflow " +
"array bounds");
--- a/jdk/src/java.desktop/share/classes/sun/datatransfer/DataFlavorUtil.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.desktop/share/classes/sun/datatransfer/DataFlavorUtil.java Wed Jul 05 20:04:29 2017 +0200
@@ -581,6 +581,15 @@
return comp;
}
+ // Next prefer text types
+ if (flavor1.isFlavorTextType()) {
+ return 1;
+ }
+
+ if (flavor2.isFlavorTextType()) {
+ return -1;
+ }
+
// Next, look for application/x-java-* types. Prefer unknown
// MIME types because if the user provides his own data flavor,
// it will likely be the most descriptive one.
--- a/jdk/src/java.desktop/share/native/libfontmanager/freetypeScaler.c Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.desktop/share/native/libfontmanager/freetypeScaler.c Wed Jul 05 20:04:29 2017 +0200
@@ -425,7 +425,6 @@
jobject metrics;
jfloat ax, ay, dx, dy, bx, by, lx, ly, mx, my;
jfloat f0 = 0.0;
- FT_Pos bmodifier = 0;
FTScalerContext *context =
(FTScalerContext*) jlong_to_ptr(pScalerContext);
FTScalerInfo *scalerInfo =
@@ -458,43 +457,38 @@
So, we have to do adust them explicitly and stay consistent with what
freetype does to outlines. */
- /* For bolding glyphs are not just widened. Height is also changed
- (see ftsynth.c).
-
- TODO: In vertical direction we could do better job and adjust metrics
- proportionally to glyoh shape. */
- if (context->doBold) {
- bmodifier = FT_MulFix(
- scalerInfo->face->units_per_EM,
- scalerInfo->face->size->metrics.y_scale)/24;
- }
-
/**** Note: only some metrics are affected by styling ***/
+ /* See https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=657854 */
+#define FT_MulFixFloatShift6(a, b) (((float) (a)) * ((float) (b)) / 65536.0 / 64.0)
+
+ /*
+ * See FreeType source code: src/base/ftobjs.c ft_recompute_scaled_metrics()
+ * http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=1659
+ */
/* ascent */
ax = 0;
- ay = -(jfloat) FT26Dot6ToFloat(FT_MulFix(
- ((jlong) scalerInfo->face->ascender + bmodifier/2),
+ ay = -(jfloat) (FT_MulFixFloatShift6(
+ ((jlong) scalerInfo->face->ascender),
(jlong) scalerInfo->face->size->metrics.y_scale));
/* descent */
dx = 0;
- dy = -(jfloat) FT26Dot6ToFloat(FT_MulFix(
- ((jlong) scalerInfo->face->descender + bmodifier/2),
+ dy = -(jfloat) (FT_MulFixFloatShift6(
+ ((jlong) scalerInfo->face->descender),
(jlong) scalerInfo->face->size->metrics.y_scale));
/* baseline */
bx = by = 0;
/* leading */
lx = 0;
- ly = (jfloat) FT26Dot6ToFloat(FT_MulFix(
- (jlong) scalerInfo->face->height + bmodifier,
+ ly = (jfloat) (FT_MulFixFloatShift6(
+ (jlong) scalerInfo->face->height,
(jlong) scalerInfo->face->size->metrics.y_scale))
+ ay - dy;
/* max advance */
mx = (jfloat) FT26Dot6ToFloat(
scalerInfo->face->size->metrics.max_advance +
- 2*bmodifier +
OBLIQUE_MODIFIER(scalerInfo->face->size->metrics.height));
my = 0;
--- a/jdk/src/java.desktop/share/native/libfontmanager/layout/ContextualSubstSubtables.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.desktop/share/native/libfontmanager/layout/ContextualSubstSubtables.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -243,12 +243,22 @@
le_uint16 srSetCount = SWAPW(subRuleSetCount);
if (coverageIndex < srSetCount) {
+ LEReferenceToArrayOf<Offset> subRuleSetTableOffsetArrayRef(base, success,
+ &subRuleSetTableOffsetArray[coverageIndex], 1);
+ if (LE_FAILURE(success)) {
+ return 0;
+ }
Offset subRuleSetTableOffset = SWAPW(subRuleSetTableOffsetArray[coverageIndex]);
LEReferenceTo<SubRuleSetTable>
subRuleSetTable(base, success, (const SubRuleSetTable *) ((char *) this + subRuleSetTableOffset));
le_uint16 subRuleCount = SWAPW(subRuleSetTable->subRuleCount);
le_int32 position = glyphIterator->getCurrStreamPosition();
+ LEReferenceToArrayOf<Offset> subRuleTableOffsetArrayRef(base, success,
+ subRuleSetTable->subRuleTableOffsetArray, subRuleCount);
+ if (LE_FAILURE(success)) {
+ return 0;
+ }
for (le_uint16 subRule = 0; subRule < subRuleCount; subRule += 1) {
Offset subRuleTableOffset =
SWAPW(subRuleSetTable->subRuleTableOffsetArray[subRule]);
@@ -301,34 +311,44 @@
glyphIterator->getCurrGlyphID(),
success);
- if (setClass < scSetCount && subClassSetTableOffsetArray[setClass] != 0) {
- Offset subClassSetTableOffset = SWAPW(subClassSetTableOffsetArray[setClass]);
- LEReferenceTo<SubClassSetTable>
- subClassSetTable(base, success, (const SubClassSetTable *) ((char *) this + subClassSetTableOffset));
- le_uint16 subClassRuleCount = SWAPW(subClassSetTable->subClassRuleCount);
- le_int32 position = glyphIterator->getCurrStreamPosition();
+ if (setClass < scSetCount) {
+ LEReferenceToArrayOf<Offset>
+ subClassSetTableOffsetArrayRef(base, success, subClassSetTableOffsetArray, setClass);
+ if (LE_FAILURE(success)) { return 0; }
+ if (subClassSetTableOffsetArray[setClass] != 0) {
- for (le_uint16 scRule = 0; scRule < subClassRuleCount; scRule += 1) {
- Offset subClassRuleTableOffset =
- SWAPW(subClassSetTable->subClassRuleTableOffsetArray[scRule]);
- LEReferenceTo<SubClassRuleTable>
- subClassRuleTable(subClassSetTable, success, subClassRuleTableOffset);
- le_uint16 matchCount = SWAPW(subClassRuleTable->glyphCount) - 1;
- le_uint16 substCount = SWAPW(subClassRuleTable->substCount);
-
- LEReferenceToArrayOf<le_uint16> classArray(base, success, subClassRuleTable->classArray, matchCount+1);
+ Offset subClassSetTableOffset = SWAPW(subClassSetTableOffsetArray[setClass]);
+ LEReferenceTo<SubClassSetTable>
+ subClassSetTable(base, success, (const SubClassSetTable *) ((char *) this + subClassSetTableOffset));
+ le_uint16 subClassRuleCount = SWAPW(subClassSetTable->subClassRuleCount);
+ le_int32 position = glyphIterator->getCurrStreamPosition();
+ LEReferenceToArrayOf<Offset>
+ subClassRuleTableOffsetArrayRef(base, success, subClassSetTable->subClassRuleTableOffsetArray, subClassRuleCount);
+ if (LE_FAILURE(success)) {
+ return 0;
+ }
+ for (le_uint16 scRule = 0; scRule < subClassRuleCount; scRule += 1) {
+ Offset subClassRuleTableOffset =
+ SWAPW(subClassSetTable->subClassRuleTableOffsetArray[scRule]);
+ LEReferenceTo<SubClassRuleTable>
+ subClassRuleTable(subClassSetTable, success, subClassRuleTableOffset);
+ le_uint16 matchCount = SWAPW(subClassRuleTable->glyphCount) - 1;
+ le_uint16 substCount = SWAPW(subClassRuleTable->substCount);
- if (LE_FAILURE(success)) { return 0; }
- if (matchGlyphClasses(classArray, matchCount, glyphIterator, classDefinitionTable, success)) {
- LEReferenceToArrayOf<SubstitutionLookupRecord>
- substLookupRecordArray(base, success, (const SubstitutionLookupRecord *) &subClassRuleTable->classArray[matchCount], substCount);
+ LEReferenceToArrayOf<le_uint16> classArray(base, success, subClassRuleTable->classArray, matchCount+1);
+
+ if (LE_FAILURE(success)) { return 0; }
+ if (matchGlyphClasses(classArray, matchCount, glyphIterator, classDefinitionTable, success)) {
+ LEReferenceToArrayOf<SubstitutionLookupRecord>
+ substLookupRecordArray(base, success, (const SubstitutionLookupRecord *) &subClassRuleTable->classArray[matchCount], substCount);
- applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position, success);
+ applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position, success);
- return matchCount + 1;
+ return matchCount + 1;
+ }
+
+ glyphIterator->setCurrStreamPosition(position);
}
-
- glyphIterator->setCurrStreamPosition(position);
}
}
@@ -442,13 +462,22 @@
le_uint16 srSetCount = SWAPW(chainSubRuleSetCount);
if (coverageIndex < srSetCount) {
+ LEReferenceToArrayOf<Offset>
+ chainSubRuleSetTableOffsetArrayRef(base, success, chainSubRuleSetTableOffsetArray, coverageIndex);
+ if (LE_FAILURE(success)) {
+ return 0;
+ }
Offset chainSubRuleSetTableOffset = SWAPW(chainSubRuleSetTableOffsetArray[coverageIndex]);
LEReferenceTo<ChainSubRuleSetTable>
chainSubRuleSetTable(base, success, (const ChainSubRuleSetTable *) ((char *) this + chainSubRuleSetTableOffset));
le_uint16 chainSubRuleCount = SWAPW(chainSubRuleSetTable->chainSubRuleCount);
le_int32 position = glyphIterator->getCurrStreamPosition();
GlyphIterator tempIterator(*glyphIterator, emptyFeatureList);
-
+ LEReferenceToArrayOf<Offset>
+ chainSubRuleTableOffsetArrayRef(base, success, chainSubRuleSetTable->chainSubRuleTableOffsetArray, chainSubRuleCount);
+ if (LE_FAILURE(success)) {
+ return 0;
+ }
for (le_uint16 subRule = 0; subRule < chainSubRuleCount; subRule += 1) {
Offset chainSubRuleTableOffset =
SWAPW(chainSubRuleSetTable->chainSubRuleTableOffsetArray[subRule]);
@@ -530,6 +559,11 @@
le_int32 setClass = inputClassDefinitionTable->getGlyphClass(inputClassDefinitionTable,
glyphIterator->getCurrGlyphID(),
success);
+ LEReferenceToArrayOf<Offset>
+ chainSubClassSetTableOffsetArrayRef(base, success, chainSubClassSetTableOffsetArray, setClass);
+ if (LE_FAILURE(success)) {
+ return 0;
+ }
if (setClass < scSetCount && chainSubClassSetTableOffsetArray[setClass] != 0) {
Offset chainSubClassSetTableOffset = SWAPW(chainSubClassSetTableOffsetArray[setClass]);
@@ -538,7 +572,11 @@
le_uint16 chainSubClassRuleCount = SWAPW(chainSubClassSetTable->chainSubClassRuleCount);
le_int32 position = glyphIterator->getCurrStreamPosition();
GlyphIterator tempIterator(*glyphIterator, emptyFeatureList);
-
+ LEReferenceToArrayOf<Offset>
+ chainSubClassRuleTableOffsetArrayRef(base, success, chainSubClassSetTable->chainSubClassRuleTableOffsetArray, chainSubClassRuleCount);
+ if (LE_FAILURE(success)) {
+ return 0;
+ }
for (le_uint16 scRule = 0; scRule < chainSubClassRuleCount; scRule += 1) {
Offset chainSubClassRuleTableOffset =
SWAPW(chainSubClassSetTable->chainSubClassRuleTableOffsetArray[scRule]);
@@ -603,12 +641,14 @@
}
le_uint16 backtrkGlyphCount = SWAPW(backtrackGlyphCount);
+ LEReferenceToArrayOf<Offset> backtrackGlyphArrayRef(base, success, backtrackCoverageTableOffsetArray, backtrkGlyphCount);
+ if (LE_FAILURE(success)) {
+ return 0;
+ }
le_uint16 inputGlyphCount = (le_uint16) SWAPW(backtrackCoverageTableOffsetArray[backtrkGlyphCount]);
LEReferenceToArrayOf<Offset> inputCoverageTableOffsetArray(base, success, &backtrackCoverageTableOffsetArray[backtrkGlyphCount + 1], inputGlyphCount+2); // offset
if (LE_FAILURE(success)) { return 0; }
const le_uint16 lookaheadGlyphCount = (le_uint16) SWAPW(inputCoverageTableOffsetArray[inputGlyphCount]);
-
- if( LE_FAILURE(success)) { return 0; }
LEReferenceToArrayOf<Offset> lookaheadCoverageTableOffsetArray(base, success, inputCoverageTableOffsetArray.getAlias(inputGlyphCount + 1, success), lookaheadGlyphCount+2);
if( LE_FAILURE(success) ) { return 0; }
--- a/jdk/src/java.desktop/unix/classes/sun/print/CUPSPrinter.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.desktop/unix/classes/sun/print/CUPSPrinter.java Wed Jul 05 20:04:29 2017 +0200
@@ -136,7 +136,7 @@
/**
* Returns array of MediaSizeNames derived from PPD.
*/
- public MediaSizeName[] getMediaSizeNames() {
+ MediaSizeName[] getMediaSizeNames() {
initMedia();
return cupsMediaSNames;
}
@@ -145,7 +145,7 @@
/**
* Returns array of Custom MediaSizeNames derived from PPD.
*/
- public CustomMediaSizeName[] getCustomMediaSizeNames() {
+ CustomMediaSizeName[] getCustomMediaSizeNames() {
initMedia();
return cupsCustomMediaSNames;
}
@@ -157,7 +157,7 @@
/**
* Returns array of MediaPrintableArea derived from PPD.
*/
- public MediaPrintableArea[] getMediaPrintableArea() {
+ MediaPrintableArea[] getMediaPrintableArea() {
initMedia();
return cupsMediaPrintables;
}
@@ -165,7 +165,7 @@
/**
* Returns array of MediaTrays derived from PPD.
*/
- public MediaTray[] getMediaTrays() {
+ MediaTray[] getMediaTrays() {
initMedia();
return cupsMediaTrays;
}
--- a/jdk/src/java.desktop/unix/classes/sun/print/IPPPrintService.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.desktop/unix/classes/sun/print/IPPPrintService.java Wed Jul 05 20:04:29 2017 +0200
@@ -1002,7 +1002,9 @@
public synchronized Class<?>[] getSupportedAttributeCategories() {
if (supportedCats != null) {
- return supportedCats;
+ Class<?> [] copyCats = new Class<?>[supportedCats.length];
+ System.arraycopy(supportedCats, 0, copyCats, 0, copyCats.length);
+ return copyCats;
}
initAttributes();
@@ -1065,7 +1067,9 @@
supportedCats = new Class<?>[catList.size()];
catList.toArray(supportedCats);
- return supportedCats;
+ Class<?>[] copyCats = new Class<?>[supportedCats.length];
+ System.arraycopy(supportedCats, 0, copyCats, 0, copyCats.length);
+ return copyCats;
}
--- a/jdk/src/java.desktop/unix/native/common/awt/awt_util.h Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.desktop/unix/native/common/awt/awt_util.h Wed Jul 05 20:04:29 2017 +0200
@@ -52,6 +52,8 @@
*/
extern XErrorHandler current_native_xerror_handler;
+Window get_xawt_root_shell(JNIEnv *env);
+
#endif /* !HEADLESS */
#ifndef INTERSECTS
--- a/jdk/src/java.desktop/unix/native/libawt_xawt/xawt/XlibWrapper.c Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.desktop/unix/native/libawt_xawt/xawt/XlibWrapper.c Wed Jul 05 20:04:29 2017 +0200
@@ -2011,10 +2011,14 @@
* Toolkit thread to process PropertyNotify or SelectionNotify events.
*/
static Bool
-secondary_loop_event(Display* dpy, XEvent* event, char* arg) {
- return (event->type == SelectionNotify ||
- event->type == SelectionClear ||
- event->type == PropertyNotify) ? True : False;
+secondary_loop_event(Display* dpy, XEvent* event, XPointer xawt_root_window) {
+ return (
+ event->type == SelectionNotify ||
+ event->type == SelectionClear ||
+ event->type == PropertyNotify ||
+ (event->type == ConfigureNotify
+ && event->xany.window == *(Window*) xawt_root_window)
+ ) ? True : False;
}
@@ -2025,8 +2029,11 @@
AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);
exitSecondaryLoop = False;
+ Window xawt_root_window = get_xawt_root_shell(env);
+
while (!exitSecondaryLoop) {
- if (XCheckIfEvent((Display*) jlong_to_ptr(display), (XEvent*) jlong_to_ptr(ptr), secondary_loop_event, NULL)) {
+ if (XCheckIfEvent((Display*) jlong_to_ptr(display),
+ (XEvent*) jlong_to_ptr(ptr), secondary_loop_event, (XPointer) &xawt_root_window)) {
return JNI_TRUE;
}
timeout = (timeout < AWT_SECONDARY_LOOP_TIMEOUT) ? (timeout << 1) : AWT_SECONDARY_LOOP_TIMEOUT;
--- a/jdk/src/java.desktop/windows/native/libawt/java2d/windows/GDIRenderer.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.desktop/windows/native/libawt/java2d/windows/GDIRenderer.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -670,7 +670,7 @@
if (ypoints != NULL) {
pPoints = TransformPoly(xpoints, ypoints, transx, transy,
tmpPts, &npoints, FALSE, FALSE);
- env->ReleasePrimitiveArrayCritical(ypointsarray, xpoints, JNI_ABORT);
+ env->ReleasePrimitiveArrayCritical(ypointsarray, ypoints, JNI_ABORT);
}
env->ReleasePrimitiveArrayCritical(xpointsarray, xpoints, JNI_ABORT);
}
--- a/jdk/src/java.desktop/windows/native/libawt/windows/awt_Component.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.desktop/windows/native/libawt/windows/awt_Component.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -3936,7 +3936,6 @@
DASSERT(stringCls);
CHECK_NULL(stringCls);
clauseReading = env->NewObjectArray(cClause, stringCls, NULL);
- env->DeleteLocalRef(stringCls);
DASSERT(clauseReading);
CHECK_NULL(clauseReading);
for (int i=0; i<cClause; i++) env->SetObjectArrayElement(clauseReading, i, rgClauseReading[i]);
--- a/jdk/src/java.desktop/windows/native/libawt/windows/awt_TextArea.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.desktop/windows/native/libawt/windows/awt_TextArea.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -47,16 +47,12 @@
jfieldID AwtTextArea::scrollbarVisibilityID;
-WNDPROC AwtTextArea::sm_pDefWindowProc = NULL;
-
/************************************************************************
* AwtTextArea methods
*/
AwtTextArea::AwtTextArea() {
- m_bIgnoreEnChange = FALSE;
m_bCanUndo = FALSE;
- m_hEditCtrl = NULL;
m_lHDeltaAccum = 0;
m_lVDeltaAccum = 0;
}
@@ -67,10 +63,6 @@
void AwtTextArea::Dispose()
{
- if (m_hEditCtrl != NULL) {
- VERIFY(::DestroyWindow(m_hEditCtrl));
- m_hEditCtrl = NULL;
- }
AwtTextComponent::Dispose();
}
@@ -91,10 +83,6 @@
}
}
-void AwtTextArea::EditGetSel(CHARRANGE &cr) {
- SendMessage(EM_EXGETSEL, 0, reinterpret_cast<LPARAM>(&cr));
-}
-
/* Count how many '\n's are there in jStr */
size_t AwtTextArea::CountNewLines(JNIEnv *env, jstring jStr, size_t maxlen)
{
@@ -149,159 +137,6 @@
return retValue;
}
-/*
- * This routine is a window procedure for the subclass of the standard edit control
- * used to generate context menu. RichEdit controls don't have built-in context menu.
- * To implement this functionality we have to create an invisible edit control and
- * forward WM_CONTEXTMENU messages from a RichEdit control to this helper edit control.
- * While the edit control context menu is active we intercept the message generated in
- * response to particular item selection and forward it back to the RichEdit control.
- * (See AwtTextArea::WmContextMenu for more details).
- */
-LRESULT
-AwtTextArea::EditProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
-
- static BOOL bContextMenuActive = FALSE;
-
- LRESULT retValue = 0;
- MsgRouting mr = mrDoDefault;
-
- DASSERT(::IsWindow(::GetParent(hWnd)));
-
- switch (message) {
- case WM_UNDO:
- case WM_CUT:
- case WM_COPY:
- case WM_PASTE:
- case WM_CLEAR:
- case EM_SETSEL:
- if (bContextMenuActive) {
- ::SendMessage(::GetParent(hWnd), message, wParam, lParam);
- mr = mrConsume;
- }
- break;
- case WM_CONTEXTMENU:
- bContextMenuActive = TRUE;
- break;
- }
-
- if (mr == mrDoDefault) {
- DASSERT(sm_pDefWindowProc != NULL);
- retValue = ::CallWindowProc(sm_pDefWindowProc,
- hWnd, message, wParam, lParam);
- }
-
- if (message == WM_CONTEXTMENU) {
- bContextMenuActive = FALSE;
- }
-
- return retValue;
-}
-
-MsgRouting
-AwtTextArea::WmContextMenu(HWND hCtrl, UINT xPos, UINT yPos) {
- /* Use the system provided edit control class to generate context menu. */
- if (m_hEditCtrl == NULL) {
- DWORD dwStyle = WS_CHILD;
- DWORD dwExStyle = 0;
- m_hEditCtrl = ::CreateWindowEx(dwExStyle,
- L"EDIT",
- L"TEXT",
- dwStyle,
- 0, 0, 0, 0,
- GetHWnd(),
- reinterpret_cast<HMENU>(
- static_cast<INT_PTR>(
- CreateControlID())),
- AwtToolkit::GetInstance().GetModuleHandle(),
- NULL);
- DASSERT(m_hEditCtrl != NULL);
- if (sm_pDefWindowProc == NULL) {
- sm_pDefWindowProc = (WNDPROC)::GetWindowLongPtr(m_hEditCtrl,
- GWLP_WNDPROC);
- }
- ::SetLastError(0);
- INT_PTR ret = ::SetWindowLongPtr(m_hEditCtrl, GWLP_WNDPROC,
- (INT_PTR)AwtTextArea::EditProc);
- DASSERT(ret != 0 || ::GetLastError() == 0);
- }
-
- /*
- * Tricks on the edit control to ensure that its context menu has
- * the correct set of enabled items according to the RichEdit state.
- */
- ::SetWindowText(m_hEditCtrl, TEXT("TEXT"));
-
- if (m_bCanUndo == TRUE && SendMessage(EM_CANUNDO)) {
- /* Enable 'Undo' item. */
- ::SendMessage(m_hEditCtrl, WM_CHAR, 'A', 0);
- }
-
- {
- /*
- * Initial selection for the edit control - (0,1).
- * This enables 'Cut', 'Copy' and 'Delete' and 'Select All'.
- */
- INT nStart = 0;
- INT nEnd = 1;
- if (SendMessage(EM_SELECTIONTYPE) == SEL_EMPTY) {
- /*
- * RichEdit selection is empty - clear selection of the edit control.
- * This disables 'Cut', 'Copy' and 'Delete'.
- */
- nStart = -1;
- nEnd = 0;
- } else {
-
- CHARRANGE cr;
- EditGetSel(cr);
- /* Check if all the text is selected. */
- if (cr.cpMin == 0) {
-
- int len = ::GetWindowTextLength(GetHWnd());
- if (cr.cpMin == 0 && cr.cpMax >= len) {
- /*
- * All the text is selected in RichEdit - select all the
- * text in the edit control. This disables 'Select All'.
- */
- nStart = 0;
- nEnd = -1;
- }
- }
- }
- ::SendMessage(m_hEditCtrl, EM_SETSEL, (WPARAM)nStart, (LPARAM)nEnd);
- }
-
- /* Disable 'Paste' item if the RichEdit control is read-only. */
- ::SendMessage(m_hEditCtrl, EM_SETREADONLY,
- GetStyle() & ES_READONLY ? TRUE : FALSE, 0);
-
- POINT p;
- p.x = xPos;
- p.y = yPos;
-
- /*
- * If the context menu is requested with SHIFT+F10 or VK_APPS key,
- * we position its top left corner to the center of the RichEdit
- * client rect.
- */
- if (p.x == -1 && p.y == -1) {
- RECT r;
- VERIFY(::GetClientRect(GetHWnd(), &r));
- p.x = (r.left + r.right) / 2;
- p.y = (r.top + r.bottom) / 2;
- VERIFY(::ClientToScreen(GetHWnd(), &p));
- }
-
- // The context menu steals focus from the proxy.
- // So, set the focus-restore flag up.
- SetRestoreFocus(TRUE);
- ::SendMessage(m_hEditCtrl, WM_CONTEXTMENU, (WPARAM)m_hEditCtrl, MAKELPARAM(p.x, p.y));
- SetRestoreFocus(FALSE);
-
- return mrConsume;
-}
-
MsgRouting
AwtTextArea::WmNcHitTest(UINT x, UINT y, LRESULT& retVal)
{
@@ -314,27 +149,8 @@
MsgRouting
-AwtTextArea::WmNotify(UINT notifyCode)
-{
- if (notifyCode == EN_CHANGE) {
- /*
- * Ignore notifications if the text hasn't been changed.
- * EN_CHANGE sent on character formatting changes as well.
- */
- if (m_bIgnoreEnChange == FALSE) {
- m_bCanUndo = TRUE;
- DoCallback("valueChanged", "()V");
- } else {
- m_bCanUndo = FALSE;
- }
- }
- return mrDoDefault;
-}
-
-MsgRouting
AwtTextArea::HandleEvent(MSG *msg, BOOL synthetic)
{
- MsgRouting returnVal;
/*
* RichEdit 1.0 control starts internal message loop if the
* left mouse button is pressed while the cursor is not over
@@ -486,26 +302,6 @@
}
delete msg;
return mrConsume;
- } else if (msg->message == WM_RBUTTONUP ||
- (msg->message == WM_SYSKEYDOWN && msg->wParam == VK_F10 &&
- HIBYTE(::GetKeyState(VK_SHIFT)))) {
- POINT p;
- if (msg->message == WM_RBUTTONUP) {
- VERIFY(::GetCursorPos(&p));
- } else {
- p.x = -1;
- p.y = -1;
- }
-
- if (!::PostMessage(GetHWnd(), WM_CONTEXTMENU, (WPARAM)GetHWnd(),
- MAKELPARAM(p.x, p.y))) {
- JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
- JNU_ThrowInternalError(env, "Message not posted, native event queue may be full.");
- env->ExceptionDescribe();
- env->ExceptionClear();
- }
- delete msg;
- return mrConsume;
} else if (msg->message == WM_MOUSEWHEEL) {
// 4417236: If there is an old version of RichEd32.dll which
// does not provide the mouse wheel scrolling we have to
@@ -596,15 +392,7 @@
// 4417236: end of fix
}
- /*
- * Store the 'synthetic' parameter so that the WM_PASTE security check
- * happens only for synthetic events.
- */
- m_synthetic = synthetic;
- returnVal = AwtComponent::HandleEvent(msg, synthetic);
- m_synthetic = FALSE;
-
- return returnVal;
+ return AwtTextComponent::HandleEvent(msg, synthetic);
}
--- a/jdk/src/java.desktop/windows/native/libawt/windows/awt_TextArea.h Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.desktop/windows/native/libawt/windows/awt_TextArea.h Wed Jul 05 20:04:29 2017 +0200
@@ -57,17 +57,11 @@
static size_t GetALength(JNIEnv* env, jstring jStr, size_t maxlen);
LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
- static LRESULT CALLBACK EditProc(HWND hWnd, UINT message,
- WPARAM wParam, LPARAM lParam);
MsgRouting WmEnable(BOOL fEnabled);
- MsgRouting WmContextMenu(HWND hCtrl, UINT xPos, UINT yPos);
- MsgRouting WmNotify(UINT notifyCode);
MsgRouting WmNcHitTest(UINT x, UINT y, LRESULT &retVal);
MsgRouting HandleEvent(MSG *msg, BOOL synthetic);
- INLINE void SetIgnoreEnChange(BOOL b) { m_bIgnoreEnChange = b; }
-
virtual BOOL InheritsNativeMouseWheelBehavior();
virtual void Reshape(int x, int y, int w, int h);
@@ -81,22 +75,7 @@
protected:
void EditSetSel(CHARRANGE &cr);
- void EditGetSel(CHARRANGE &cr);
private:
- // RichEdit 1.0 control generates EN_CHANGE notifications not only
- // on text changes, but also on any character formatting change.
- // This flag is true when the latter case is detected.
- BOOL m_bIgnoreEnChange;
-
- // RichEdit 1.0 control undoes a character formatting change
- // if it is the latest. We don't create our own undo buffer,
- // but just prohibit undo in case if the latest operation
- // is a formatting change.
- BOOL m_bCanUndo;
-
- HWND m_hEditCtrl;
- static WNDPROC sm_pDefWindowProc;
-
LONG m_lHDeltaAccum;
LONG m_lVDeltaAccum;
--- a/jdk/src/java.desktop/windows/native/libawt/windows/awt_TextComponent.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.desktop/windows/native/libawt/windows/awt_TextComponent.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -66,6 +66,8 @@
m_lLastPos = -1;
m_isLFonly = FALSE;
m_EOLchecked = FALSE;
+ m_hEditCtrl = NULL;
+ m_bIgnoreEnChange = FALSE;
// javaEventsMask = 0; // accessibility support
}
@@ -213,6 +215,16 @@
return c;
}
+void AwtTextComponent::Dispose()
+{
+ if (m_hEditCtrl != NULL) {
+ VERIFY(::DestroyWindow(m_hEditCtrl));
+ m_hEditCtrl = NULL;
+ }
+ AwtComponent::Dispose();
+}
+
+
LRESULT
AwtTextComponent::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) {
@@ -322,7 +334,16 @@
AwtTextComponent::WmNotify(UINT notifyCode)
{
if (notifyCode == EN_CHANGE) {
- DoCallback("valueChanged", "()V");
+ /*
+ * Ignore notifications if the text hasn't been changed.
+ * EN_CHANGE sent on character formatting changes as well.
+ */
+ if (m_bIgnoreEnChange == FALSE) {
+ m_bCanUndo = TRUE;
+ DoCallback("valueChanged", "()V");
+ } else {
+ m_bCanUndo = FALSE;
+ }
}
return mrDoDefault;
}
@@ -337,6 +358,28 @@
{
MsgRouting returnVal;
+ if (msg->message == WM_RBUTTONUP ||
+ (msg->message == WM_SYSKEYDOWN && msg->wParam == VK_F10 &&
+ HIBYTE(::GetKeyState(VK_SHIFT)))) {
+ POINT p;
+ if (msg->message == WM_RBUTTONUP) {
+ VERIFY(::GetCursorPos(&p));
+ } else {
+ p.x = -1;
+ p.y = -1;
+ }
+
+ if (!::PostMessage(GetHWnd(), WM_CONTEXTMENU, (WPARAM)GetHWnd(),
+ MAKELPARAM(p.x, p.y))) {
+ JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
+ JNU_ThrowInternalError(env, "Message not posted, native event queue may be full.");
+ env->ExceptionDescribe();
+ env->ExceptionClear();
+ }
+ delete msg;
+ return mrConsume;
+ }
+
/*
* Store the 'synthetic' parameter so that the WM_PASTE security check
* happens only for synthetic events.
@@ -701,6 +744,10 @@
SendMessage(EM_SETBKGNDCOLOR, (WPARAM)FALSE, (LPARAM)GetBackgroundColor());
}
+void AwtTextComponent::EditGetSel(CHARRANGE &cr) {
+ SendMessage(EM_EXGETSEL, 0, reinterpret_cast<LPARAM>(&cr));
+}
+
/************************************************************************
* WTextComponentPeer native methods
@@ -983,6 +1030,161 @@
}
+/*
+ * This routine is a window procedure for the subclass of the standard edit control
+ * used to generate context menu. RichEdit controls don't have built-in context menu.
+ * To implement this functionality we have to create an invisible edit control and
+ * forward WM_CONTEXTMENU messages from a RichEdit control to this helper edit control.
+ * While the edit control context menu is active we intercept the message generated in
+ * response to particular item selection and forward it back to the RichEdit control.
+ * (See AwtTextArea::WmContextMenu for more details).
+ */
+
+WNDPROC AwtTextComponent::sm_pDefWindowProc = NULL;
+
+LRESULT
+AwtTextComponent::EditProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
+
+ static BOOL bContextMenuActive = FALSE;
+
+ LRESULT retValue = 0;
+ MsgRouting mr = mrDoDefault;
+
+ DASSERT(::IsWindow(::GetParent(hWnd)));
+
+ switch (message) {
+ case WM_UNDO:
+ case WM_CUT:
+ case WM_COPY:
+ case WM_PASTE:
+ case WM_CLEAR:
+ case EM_SETSEL:
+ if (bContextMenuActive) {
+ ::SendMessage(::GetParent(hWnd), message, wParam, lParam);
+ mr = mrConsume;
+ }
+ break;
+ case WM_CONTEXTMENU:
+ bContextMenuActive = TRUE;
+ break;
+ }
+
+ if (mr == mrDoDefault) {
+ DASSERT(sm_pDefWindowProc != NULL);
+ retValue = ::CallWindowProc(sm_pDefWindowProc,
+ hWnd, message, wParam, lParam);
+ }
+
+ if (message == WM_CONTEXTMENU) {
+ bContextMenuActive = FALSE;
+ }
+
+ return retValue;
+}
+
+MsgRouting
+AwtTextComponent::WmContextMenu(HWND hCtrl, UINT xPos, UINT yPos) {
+ /* Use the system provided edit control class to generate context menu. */
+ if (m_hEditCtrl == NULL) {
+ DWORD dwStyle = WS_CHILD;
+ DWORD dwExStyle = 0;
+ m_hEditCtrl = ::CreateWindowEx(dwExStyle,
+ L"EDIT",
+ L"TEXT",
+ dwStyle,
+ 0, 0, 0, 0,
+ GetHWnd(),
+ reinterpret_cast<HMENU>(
+ static_cast<INT_PTR>(
+ CreateControlID())),
+ AwtToolkit::GetInstance().GetModuleHandle(),
+ NULL);
+ DASSERT(m_hEditCtrl != NULL);
+ if (sm_pDefWindowProc == NULL) {
+ sm_pDefWindowProc = (WNDPROC)::GetWindowLongPtr(m_hEditCtrl,
+ GWLP_WNDPROC);
+ }
+ ::SetLastError(0);
+ INT_PTR ret = ::SetWindowLongPtr(m_hEditCtrl, GWLP_WNDPROC,
+ (INT_PTR)AwtTextArea::EditProc);
+ DASSERT(ret != 0 || ::GetLastError() == 0);
+ }
+
+ /*
+ * Tricks on the edit control to ensure that its context menu has
+ * the correct set of enabled items according to the RichEdit state.
+ */
+ ::SetWindowText(m_hEditCtrl, TEXT("TEXT"));
+
+ if (m_bCanUndo == TRUE && SendMessage(EM_CANUNDO)) {
+ /* Enable 'Undo' item. */
+ ::SendMessage(m_hEditCtrl, WM_CHAR, 'A', 0);
+ }
+
+ {
+ /*
+ * Initial selection for the edit control - (0,1).
+ * This enables 'Cut', 'Copy' and 'Delete' and 'Select All'.
+ */
+ INT nStart = 0;
+ INT nEnd = 1;
+ if (SendMessage(EM_SELECTIONTYPE) == SEL_EMPTY) {
+ /*
+ * RichEdit selection is empty - clear selection of the edit control.
+ * This disables 'Cut', 'Copy' and 'Delete'.
+ */
+ nStart = -1;
+ nEnd = 0;
+ } else {
+
+ CHARRANGE cr;
+ EditGetSel(cr);
+ /* Check if all the text is selected. */
+ if (cr.cpMin == 0) {
+
+ int len = ::GetWindowTextLength(GetHWnd());
+ if (cr.cpMin == 0 && cr.cpMax >= len) {
+ /*
+ * All the text is selected in RichEdit - select all the
+ * text in the edit control. This disables 'Select All'.
+ */
+ nStart = 0;
+ nEnd = -1;
+ }
+ }
+ }
+ ::SendMessage(m_hEditCtrl, EM_SETSEL, (WPARAM)nStart, (LPARAM)nEnd);
+ }
+
+ /* Disable 'Paste' item if the RichEdit control is read-only. */
+ ::SendMessage(m_hEditCtrl, EM_SETREADONLY,
+ GetStyle() & ES_READONLY ? TRUE : FALSE, 0);
+
+ POINT p;
+ p.x = xPos;
+ p.y = yPos;
+
+ /*
+ * If the context menu is requested with SHIFT+F10 or VK_APPS key,
+ * we position its top left corner to the center of the RichEdit
+ * client rect.
+ */
+ if (p.x == -1 && p.y == -1) {
+ RECT r;
+ VERIFY(::GetClientRect(GetHWnd(), &r));
+ p.x = (r.left + r.right) / 2;
+ p.y = (r.top + r.bottom) / 2;
+ VERIFY(::ClientToScreen(GetHWnd(), &p));
+ }
+
+ // The context menu steals focus from the proxy.
+ // So, set the focus-restore flag up.
+ SetRestoreFocus(TRUE);
+ ::SendMessage(m_hEditCtrl, WM_CONTEXTMENU, (WPARAM)m_hEditCtrl, MAKELPARAM(p.x, p.y));
+ SetRestoreFocus(FALSE);
+
+ return mrConsume;
+}
//
// Accessibility support
--- a/jdk/src/java.desktop/windows/native/libawt/windows/awt_TextComponent.h Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.desktop/windows/native/libawt/windows/awt_TextComponent.h Wed Jul 05 20:04:29 2017 +0200
@@ -47,6 +47,8 @@
static AwtTextComponent* Create(jobject self, jobject parent, BOOL isMultiline);
+ virtual void Dispose();
+
virtual LPCTSTR GetClassName();
LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
@@ -83,6 +85,8 @@
MsgRouting HandleEvent(MSG *msg, BOOL synthetic);
MsgRouting WmPaste();
+ INLINE void SetIgnoreEnChange(BOOL b) { m_bIgnoreEnChange = b; }
+
virtual BOOL IsFocusingMouseMessage(MSG *pMsg);
/* To be fully implemented in a future release
@@ -115,11 +119,24 @@
INLINE VOID SetEndSelectionPos(LONG lPos) { m_lEndPos = lPos; }
INLINE VOID SetLastSelectionPos(LONG lPos) { m_lLastPos = lPos; }
+ void EditGetSel(CHARRANGE &cr);
+
// Used to prevent untrusted code from synthesizing a WM_PASTE message
// by posting a <CTRL>-V KeyEvent
BOOL m_synthetic;
LONG EditGetCharFromPos(POINT& pt);
+ // RichEdit 1.0 control generates EN_CHANGE notifications not only
+ // on text changes, but also on any character formatting change.
+ // This flag is true when the latter case is detected.
+ BOOL m_bIgnoreEnChange;
+
+ // RichEdit 1.0 control undoes a character formatting change
+ // if it is the latest. We don't create our own undo buffer,
+ // but just prohibit undo in case if the latest operation
+ // is a formatting change.
+ BOOL m_bCanUndo;
+
/*****************************************************************
* Inner class OleCallback declaration.
*/
@@ -166,6 +183,13 @@
static OleCallback sm_oleCallback;
+ static WNDPROC sm_pDefWindowProc;
+ HWND m_hEditCtrl;
+
+ static LRESULT CALLBACK EditProc(HWND hWnd, UINT message,
+ WPARAM wParam, LPARAM lParam);
+ MsgRouting WmContextMenu(HWND hCtrl, UINT xPos, UINT yPos);
+
//
// Accessibility support
//
--- a/jdk/src/java.desktop/windows/native/libawt/windows/awt_TextField.cpp Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.desktop/windows/native/libawt/windows/awt_TextField.cpp Wed Jul 05 20:04:29 2017 +0200
@@ -249,13 +249,7 @@
}
}
- /*
- * Store the 'synthetic' parameter so that the WM_PASTE security check
- * happens only for synthetic events.
- */
- m_synthetic = synthetic;
- returnVal = AwtComponent::HandleEvent(msg, synthetic);
- m_synthetic = FALSE;
+ returnVal = AwtTextComponent::HandleEvent(msg, synthetic);
if(systemBeeperEnabled){
SystemParametersInfo(SPI_SETBEEP, 1, NULL, 0);
--- a/jdk/src/java.desktop/windows/native/libsplashscreen/splashscreen_sys.c Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.desktop/windows/native/libsplashscreen/splashscreen_sys.c Wed Jul 05 20:04:29 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -213,6 +213,14 @@
void
SplashRedrawWindow(Splash * splash)
{
+ if (!SplashIsStillLooping(splash)) {
+ KillTimer(splash->hWnd, 0);
+ }
+
+ if (splash->currentFrame < 0) {
+ return;
+ }
+
SplashUpdateScreenData(splash);
if (splash->isLayered) {
BLENDFUNCTION bf;
@@ -303,9 +311,6 @@
time = 0;
SetTimer(splash->hWnd, 0, time, NULL);
}
- else {
- KillTimer(splash->hWnd, 0);
- }
}
void SplashReconfigureNow(Splash * splash) {
--- a/jdk/src/java.logging/share/classes/java/util/logging/LogRecord.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.logging/share/classes/java/util/logging/LogRecord.java Wed Jul 05 20:04:29 2017 +0200
@@ -509,7 +509,13 @@
// If necessary, try to regenerate the resource bundle.
if (resourceBundleName != null) {
try {
- resourceBundle = ResourceBundle.getBundle(resourceBundleName);
+ // use system class loader to ensure the ResourceBundle
+ // instance is a different instance than null loader uses
+ final ResourceBundle bundle =
+ ResourceBundle.getBundle(resourceBundleName,
+ Locale.getDefault(),
+ ClassLoader.getSystemClassLoader());
+ resourceBundle = bundle;
} catch (MissingResourceException ex) {
// This is not a good place to throw an exception,
// so we simply leave the resourceBundle null.
--- a/jdk/src/java.logging/share/classes/java/util/logging/Logger.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.logging/share/classes/java/util/logging/Logger.java Wed Jul 05 20:04:29 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -1937,6 +1937,9 @@
}
setCallersClassLoaderRef(callersClass);
+ if (isSystemLogger && getCallersClassLoader() != null) {
+ checkPermission();
+ }
if (findResourceBundle(name, true) == null) {
// We've failed to find an expected ResourceBundle.
// unset the caller's ClassLoader since we were unable to find the
@@ -2170,11 +2173,13 @@
return trb;
}
final String rbName = isSystemLogger
- ? trb.resourceBundleName
+ // ancestor of a system logger is expected to be a system logger.
+ // ignore resource bundle name if it's not.
+ ? (target.isSystemLogger ? trb.resourceBundleName : null)
: target.getResourceBundleName();
if (rbName != null) {
return LoggerBundle.get(rbName,
- findResourceBundle(rbName, true));
+ findResourceBundle(rbName, true));
}
target = isSystemLogger ? target.parent : target.getParent();
}
--- a/jdk/src/java.naming/share/classes/javax/naming/spi/NamingManager.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.naming/share/classes/javax/naming/spi/NamingManager.java Wed Jul 05 20:04:29 2017 +0200
@@ -25,9 +25,7 @@
package javax.naming.spi;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.StringTokenizer;
+import java.util.*;
import java.net.MalformedURLException;
import javax.naming.*;
@@ -625,15 +623,28 @@
/**
* Creates an initial context using the specified environment
* properties.
- *<p>
- * If an InitialContextFactoryBuilder has been installed,
- * it is used to create the factory for creating the initial context.
- * Otherwise, the class specified in the
- * <tt>Context.INITIAL_CONTEXT_FACTORY</tt> environment property is used.
- * Note that an initial context factory (an object that implements the
- * InitialContextFactory interface) must be public and must have a
- * public constructor that accepts no arguments.
- *
+ * <p>
+ * This is done as follows:
+ * <ul>
+ * <li>If an InitialContextFactoryBuilder has been installed,
+ * it is used to create the factory for creating the initial
+ * context</li>
+ * <li>Otherwise, the class specified in the
+ * <tt>Context.INITIAL_CONTEXT_FACTORY</tt> environment property
+ * is used
+ * <ul>
+ * <li>First, the {@linkplain java.util.ServiceLoader ServiceLoader}
+ * mechanism tries to locate an {@code InitialContextFactory}
+ * provider using the current thread's context class loader</li>
+ * <li>Failing that, this implementation tries to locate a suitable
+ * {@code InitialContextFactory} using a built-in mechanism
+ * <br>
+ * (Note that an initial context factory (an object that implements
+ * the InitialContextFactory interface) must be public and must have
+ * a public constructor that accepts no arguments)</li>
+ * </ul>
+ * </li>
+ * </ul>
* @param env The possibly null environment properties used when
* creating the context.
* @return A non-null initial context.
@@ -649,11 +660,11 @@
*/
public static Context getInitialContext(Hashtable<?,?> env)
throws NamingException {
- InitialContextFactory factory;
+ InitialContextFactory factory = null;
InitialContextFactoryBuilder builder = getInitialContextFactoryBuilder();
if (builder == null) {
- // No factory installed, use property
+ // No builder installed, use property
// Get initial context factory class name
String className = env != null ?
@@ -666,16 +677,39 @@
throw ne;
}
+ ServiceLoader<InitialContextFactory> loader =
+ ServiceLoader.load(InitialContextFactory.class);
+
+ Iterator<InitialContextFactory> iterator = loader.iterator();
try {
- factory = (InitialContextFactory)
- helper.loadClass(className).newInstance();
- } catch(Exception e) {
+ while (iterator.hasNext()) {
+ InitialContextFactory f = iterator.next();
+ if (f.getClass().getName().equals(className)) {
+ factory = f;
+ break;
+ }
+ }
+ } catch (ServiceConfigurationError e) {
NoInitialContextException ne =
- new NoInitialContextException(
- "Cannot instantiate class: " + className);
+ new NoInitialContextException(
+ "Cannot load initial context factory "
+ + "'" + className + "'");
ne.setRootCause(e);
throw ne;
}
+
+ if (factory == null) {
+ try {
+ factory = (InitialContextFactory)
+ helper.loadClass(className).newInstance();
+ } catch (Exception e) {
+ NoInitialContextException ne =
+ new NoInitialContextException(
+ "Cannot instantiate class: " + className);
+ ne.setRootCause(e);
+ throw ne;
+ }
+ }
} else {
factory = builder.createInitialContextFactory(env);
}
--- a/jdk/src/java.security.jgss/share/classes/sun/security/jgss/krb5/Krb5Context.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/jgss/krb5/Krb5Context.java Wed Jul 05 20:04:29 2017 +0200
@@ -244,8 +244,11 @@
* establishment.
*/
public final void requestCredDeleg(boolean value) throws GSSException {
- if (state == STATE_NEW && isInitiator())
- credDelegState = value;
+ if (state == STATE_NEW && isInitiator()) {
+ if (myCred == null || !(myCred instanceof Krb5ProxyCredential)) {
+ credDelegState = value;
+ }
+ }
}
/**
--- a/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/Init.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/Init.java Wed Jul 05 20:04:29 2017 +0200
@@ -25,6 +25,8 @@
import java.io.InputStream;
import java.security.AccessController;
import java.security.PrivilegedAction;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
import java.util.ArrayList;
import java.util.List;
@@ -35,6 +37,7 @@
import com.sun.org.apache.xml.internal.security.algorithms.JCEMapper;
import com.sun.org.apache.xml.internal.security.algorithms.SignatureAlgorithm;
import com.sun.org.apache.xml.internal.security.c14n.Canonicalizer;
+import com.sun.org.apache.xml.internal.security.exceptions.XMLSecurityException;
import com.sun.org.apache.xml.internal.security.keys.keyresolver.KeyResolver;
import com.sun.org.apache.xml.internal.security.transforms.Transform;
import com.sun.org.apache.xml.internal.security.utils.ElementProxy;
@@ -118,43 +121,50 @@
log.log(java.util.logging.Level.FINE, "Registering default algorithms");
}
try {
- //
- // Bind the default prefixes
- //
- ElementProxy.registerDefaultPrefixes();
+ AccessController.doPrivileged(new PrivilegedExceptionAction<Void>(){
+ @Override public Void run() throws XMLSecurityException {
+ //
+ // Bind the default prefixes
+ //
+ ElementProxy.registerDefaultPrefixes();
- //
- // Set the default Transforms
- //
- Transform.registerDefaultAlgorithms();
+ //
+ // Set the default Transforms
+ //
+ Transform.registerDefaultAlgorithms();
- //
- // Set the default signature algorithms
- //
- SignatureAlgorithm.registerDefaultAlgorithms();
+ //
+ // Set the default signature algorithms
+ //
+ SignatureAlgorithm.registerDefaultAlgorithms();
+
+ //
+ // Set the default JCE algorithms
+ //
+ JCEMapper.registerDefaultAlgorithms();
- //
- // Set the default JCE algorithms
- //
- JCEMapper.registerDefaultAlgorithms();
+ //
+ // Set the default c14n algorithms
+ //
+ Canonicalizer.registerDefaultAlgorithms();
- //
- // Set the default c14n algorithms
- //
- Canonicalizer.registerDefaultAlgorithms();
+ //
+ // Register the default resolvers
+ //
+ ResourceResolver.registerDefaultResolvers();
- //
- // Register the default resolvers
- //
- ResourceResolver.registerDefaultResolvers();
+ //
+ // Register the default key resolvers
+ //
+ KeyResolver.registerDefaultResolvers();
- //
- // Register the default key resolvers
- //
- KeyResolver.registerDefaultResolvers();
- } catch (Exception ex) {
- log.log(java.util.logging.Level.SEVERE, ex.getMessage(), ex);
- ex.printStackTrace();
+ return null;
+ }
+ });
+ } catch (PrivilegedActionException ex) {
+ XMLSecurityException xse = (XMLSecurityException)ex.getException();
+ log.log(java.util.logging.Level.SEVERE, xse.getMessage(), xse);
+ xse.printStackTrace();
}
}
--- a/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/algorithms/JCEMapper.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/algorithms/JCEMapper.java Wed Jul 05 20:04:29 2017 +0200
@@ -27,6 +27,7 @@
import com.sun.org.apache.xml.internal.security.encryption.XMLCipher;
import com.sun.org.apache.xml.internal.security.signature.XMLSignature;
+import com.sun.org.apache.xml.internal.security.utils.JavaUtils;
import org.w3c.dom.Element;
@@ -49,8 +50,11 @@
*
* @param id
* @param algorithm
+ * @throws SecurityException if a security manager is installed and the
+ * caller does not have permission to register the JCE algorithm
*/
public static void register(String id, Algorithm algorithm) {
+ JavaUtils.checkRegisterPermission();
algorithmsMap.put(id, algorithm);
}
@@ -296,8 +300,11 @@
/**
* Sets the default Provider for obtaining the security algorithms
* @param provider the default providerId.
+ * @throws SecurityException if a security manager is installed and the
+ * caller does not have permission to set the JCE provider
*/
public static void setProviderId(String provider) {
+ JavaUtils.checkRegisterPermission();
providerName = provider;
}
--- a/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/algorithms/SignatureAlgorithm.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/algorithms/SignatureAlgorithm.java Wed Jul 05 20:04:29 2017 +0200
@@ -37,6 +37,7 @@
import com.sun.org.apache.xml.internal.security.signature.XMLSignature;
import com.sun.org.apache.xml.internal.security.signature.XMLSignatureException;
import com.sun.org.apache.xml.internal.security.utils.Constants;
+import com.sun.org.apache.xml.internal.security.utils.JavaUtils;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
@@ -314,18 +315,21 @@
}
/**
- * Registers implementing class of the Transform algorithm with algorithmURI
+ * Registers implementing class of the SignatureAlgorithm with algorithmURI
*
- * @param algorithmURI algorithmURI URI representation of <code>Transform algorithm</code>.
+ * @param algorithmURI algorithmURI URI representation of <code>SignatureAlgorithm</code>.
* @param implementingClass <code>implementingClass</code> the implementing class of
* {@link SignatureAlgorithmSpi}
* @throws AlgorithmAlreadyRegisteredException if specified algorithmURI is already registered
* @throws XMLSignatureException
+ * @throws SecurityException if a security manager is installed and the
+ * caller does not have permission to register the signature algorithm
*/
@SuppressWarnings("unchecked")
public static void register(String algorithmURI, String implementingClass)
throws AlgorithmAlreadyRegisteredException, ClassNotFoundException,
XMLSignatureException {
+ JavaUtils.checkRegisterPermission();
if (log.isLoggable(java.util.logging.Level.FINE)) {
log.log(java.util.logging.Level.FINE, "Try to register " + algorithmURI + " " + implementingClass);
}
@@ -352,15 +356,18 @@
/**
* Registers implementing class of the Transform algorithm with algorithmURI
*
- * @param algorithmURI algorithmURI URI representation of <code>Transform algorithm</code>.
+ * @param algorithmURI algorithmURI URI representation of <code>SignatureAlgorithm</code>.
* @param implementingClass <code>implementingClass</code> the implementing class of
* {@link SignatureAlgorithmSpi}
* @throws AlgorithmAlreadyRegisteredException if specified algorithmURI is already registered
* @throws XMLSignatureException
+ * @throws SecurityException if a security manager is installed and the
+ * caller does not have permission to register the signature algorithm
*/
public static void register(String algorithmURI, Class<? extends SignatureAlgorithmSpi> implementingClass)
throws AlgorithmAlreadyRegisteredException, ClassNotFoundException,
XMLSignatureException {
+ JavaUtils.checkRegisterPermission();
if (log.isLoggable(java.util.logging.Level.FINE)) {
log.log(java.util.logging.Level.FINE, "Try to register " + algorithmURI + " " + implementingClass);
}
--- a/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/c14n/Canonicalizer.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/c14n/Canonicalizer.java Wed Jul 05 20:04:29 2017 +0200
@@ -41,6 +41,7 @@
import com.sun.org.apache.xml.internal.security.c14n.implementations.Canonicalizer20010315WithComments;
import com.sun.org.apache.xml.internal.security.c14n.implementations.CanonicalizerPhysical;
import com.sun.org.apache.xml.internal.security.exceptions.AlgorithmAlreadyRegisteredException;
+import com.sun.org.apache.xml.internal.security.utils.JavaUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
@@ -142,10 +143,13 @@
* @param algorithmURI
* @param implementingClass
* @throws AlgorithmAlreadyRegisteredException
+ * @throws SecurityException if a security manager is installed and the
+ * caller does not have permission to register the canonicalizer
*/
@SuppressWarnings("unchecked")
public static void register(String algorithmURI, String implementingClass)
throws AlgorithmAlreadyRegisteredException, ClassNotFoundException {
+ JavaUtils.checkRegisterPermission();
// check whether URI is already registered
Class<? extends CanonicalizerSpi> registeredClass =
canonicalizerHash.get(algorithmURI);
@@ -166,9 +170,12 @@
* @param algorithmURI
* @param implementingClass
* @throws AlgorithmAlreadyRegisteredException
+ * @throws SecurityException if a security manager is installed and the
+ * caller does not have permission to register the canonicalizer
*/
- public static void register(String algorithmURI, Class<CanonicalizerSpi> implementingClass)
+ public static void register(String algorithmURI, Class<? extends CanonicalizerSpi> implementingClass)
throws AlgorithmAlreadyRegisteredException, ClassNotFoundException {
+ JavaUtils.checkRegisterPermission();
// check whether URI is already registered
Class<? extends CanonicalizerSpi> registeredClass = canonicalizerHash.get(algorithmURI);
--- a/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/KeyResolver.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/KeyResolver.java Wed Jul 05 20:04:29 2017 +0200
@@ -42,6 +42,7 @@
import com.sun.org.apache.xml.internal.security.keys.keyresolver.implementations.X509SKIResolver;
import com.sun.org.apache.xml.internal.security.keys.keyresolver.implementations.X509SubjectNameResolver;
import com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver;
+import com.sun.org.apache.xml.internal.security.utils.JavaUtils;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
@@ -175,9 +176,12 @@
* @throws InstantiationException
* @throws IllegalAccessException
* @throws ClassNotFoundException
+ * @throws SecurityException if a security manager is installed and the
+ * caller does not have permission to register the key resolver
*/
public static void register(String className, boolean globalResolver)
throws ClassNotFoundException, IllegalAccessException, InstantiationException {
+ JavaUtils.checkRegisterPermission();
KeyResolverSpi keyResolverSpi =
(KeyResolverSpi) Class.forName(className).newInstance();
keyResolverSpi.setGlobalResolver(globalResolver);
@@ -195,8 +199,11 @@
*
* @param className
* @param globalResolver Whether the KeyResolverSpi is a global resolver or not
+ * @throws SecurityException if a security manager is installed and the
+ * caller does not have permission to register the key resolver
*/
public static void registerAtStart(String className, boolean globalResolver) {
+ JavaUtils.checkRegisterPermission();
KeyResolverSpi keyResolverSpi = null;
Exception ex = null;
try {
@@ -228,11 +235,14 @@
*
* @param keyResolverSpi a KeyResolverSpi instance to register
* @param start whether to register the KeyResolverSpi at the start of the list or not
+ * @throws SecurityException if a security manager is installed and the
+ * caller does not have permission to register the key resolver
*/
public static void register(
KeyResolverSpi keyResolverSpi,
boolean start
) {
+ JavaUtils.checkRegisterPermission();
KeyResolver resolver = new KeyResolver(keyResolverSpi);
if (start) {
resolverVector.add(0, resolver);
@@ -254,9 +264,12 @@
* @throws InstantiationException
* @throws IllegalAccessException
* @throws ClassNotFoundException
+ * @throws SecurityException if a security manager is installed and the
+ * caller does not have permission to register the key resolver
*/
public static void registerClassNames(List<String> classNames)
throws ClassNotFoundException, IllegalAccessException, InstantiationException {
+ JavaUtils.checkRegisterPermission();
List<KeyResolver> keyResolverList = new ArrayList<KeyResolver>(classNames.size());
for (String className : classNames) {
KeyResolverSpi keyResolverSpi =
--- a/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/transforms/Transform.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/transforms/Transform.java Wed Jul 05 20:04:29 2017 +0200
@@ -46,6 +46,7 @@
import com.sun.org.apache.xml.internal.security.transforms.implementations.TransformXSLT;
import com.sun.org.apache.xml.internal.security.utils.Constants;
import com.sun.org.apache.xml.internal.security.utils.HelperNodeList;
+import com.sun.org.apache.xml.internal.security.utils.JavaUtils;
import com.sun.org.apache.xml.internal.security.utils.SignatureElementProxy;
import com.sun.org.apache.xml.internal.security.utils.XMLUtils;
import org.w3c.dom.Document;
@@ -181,11 +182,14 @@
* class of {@link TransformSpi}
* @throws AlgorithmAlreadyRegisteredException if specified algorithmURI
* is already registered
+ * @throws SecurityException if a security manager is installed and the
+ * caller does not have permission to register the transform
*/
@SuppressWarnings("unchecked")
public static void register(String algorithmURI, String implementingClass)
throws AlgorithmAlreadyRegisteredException, ClassNotFoundException,
InvalidTransformException {
+ JavaUtils.checkRegisterPermission();
// are we already registered?
Class<? extends TransformSpi> transformSpi = transformSpiHash.get(algorithmURI);
if (transformSpi != null) {
@@ -206,9 +210,12 @@
* class of {@link TransformSpi}
* @throws AlgorithmAlreadyRegisteredException if specified algorithmURI
* is already registered
+ * @throws SecurityException if a security manager is installed and the
+ * caller does not have permission to register the transform
*/
public static void register(String algorithmURI, Class<? extends TransformSpi> implementingClass)
throws AlgorithmAlreadyRegisteredException {
+ JavaUtils.checkRegisterPermission();
// are we already registered?
Class<? extends TransformSpi> transformSpi = transformSpiHash.get(algorithmURI);
if (transformSpi != null) {
--- a/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/ElementProxy.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/ElementProxy.java Wed Jul 05 20:04:29 2017 +0200
@@ -468,9 +468,12 @@
* @param namespace
* @param prefix
* @throws XMLSecurityException
+ * @throws SecurityException if a security manager is installed and the
+ * caller does not have permission to set the default prefix
*/
public static void setDefaultPrefix(String namespace, String prefix)
throws XMLSecurityException {
+ JavaUtils.checkRegisterPermission();
if (prefixMappings.containsValue(prefix)) {
String storedPrefix = prefixMappings.get(namespace);
if (!storedPrefix.equals(prefix)) {
--- a/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/JavaUtils.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/JavaUtils.java Wed Jul 05 20:04:29 2017 +0200
@@ -28,6 +28,7 @@
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.security.SecurityPermission;
/**
* A collection of different, general-purpose methods for JAVA-specific things
@@ -39,6 +40,10 @@
private static java.util.logging.Logger log =
java.util.logging.Logger.getLogger(JavaUtils.class.getName());
+ private static final SecurityPermission REGISTER_PERMISSION =
+ new SecurityPermission(
+ "com.sun.org.apache.xml.internal.security.register");
+
private JavaUtils() {
// we don't allow instantiation
}
@@ -147,6 +152,23 @@
}
/**
+ * Throws a {@code SecurityException} if a security manager is installed
+ * and the caller is not allowed to register an implementation of an
+ * algorithm, transform, or other security sensitive XML Signature function.
+ *
+ * @throws SecurityException if a security manager is installed and the
+ * caller has not been granted the
+ * {@literal "com.sun.org.apache.xml.internal.security.register"}
+ * {@code SecurityPermission}
+ */
+ public static void checkRegisterPermission() {
+ SecurityManager sm = System.getSecurityManager();
+ if (sm != null) {
+ sm.checkPermission(REGISTER_PERMISSION);
+ }
+ }
+
+ /**
* Converts an ASN.1 DSA value to a XML Signature DSA Value.
*
* The JCE DSA Signature algorithm creates ASN.1 encoded (r,s) value
--- a/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/XMLUtils.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/XMLUtils.java Wed Jul 05 20:04:29 2017 +0200
@@ -80,32 +80,44 @@
/**
* Set the prefix for the digital signature namespace
* @param prefix the new prefix for the digital signature namespace
+ * @throws SecurityException if a security manager is installed and the
+ * caller does not have permission to set the prefix
*/
public static void setDsPrefix(String prefix) {
+ JavaUtils.checkRegisterPermission();
dsPrefix = prefix;
}
/**
* Set the prefix for the digital signature 1.1 namespace
* @param prefix the new prefix for the digital signature 1.1 namespace
+ * @throws SecurityException if a security manager is installed and the
+ * caller does not have permission to set the prefix
*/
public static void setDs11Prefix(String prefix) {
+ JavaUtils.checkRegisterPermission();
ds11Prefix = prefix;
}
/**
* Set the prefix for the encryption namespace
* @param prefix the new prefix for the encryption namespace
+ * @throws SecurityException if a security manager is installed and the
+ * caller does not have permission to set the prefix
*/
public static void setXencPrefix(String prefix) {
+ JavaUtils.checkRegisterPermission();
xencPrefix = prefix;
}
/**
* Set the prefix for the encryption namespace 1.1
* @param prefix the new prefix for the encryption namespace 1.1
+ * @throws SecurityException if a security manager is installed and the
+ * caller does not have permission to set the prefix
*/
public static void setXenc11Prefix(String prefix) {
+ JavaUtils.checkRegisterPermission();
xenc11Prefix = prefix;
}
--- a/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/resolver/ResourceResolver.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/resolver/ResourceResolver.java Wed Jul 05 20:04:29 2017 +0200
@@ -27,6 +27,7 @@
import java.util.Map;
import com.sun.org.apache.xml.internal.security.signature.XMLSignatureInput;
+import com.sun.org.apache.xml.internal.security.utils.JavaUtils;
import com.sun.org.apache.xml.internal.security.utils.resolver.implementations.ResolverDirectHTTP;
import com.sun.org.apache.xml.internal.security.utils.resolver.implementations.ResolverFragment;
import com.sun.org.apache.xml.internal.security.utils.resolver.implementations.ResolverLocalFilesystem;
@@ -199,9 +200,12 @@
* the class cannot be registered.
*
* @param className the name of the ResourceResolverSpi class to be registered
+ * @throws SecurityException if a security manager is installed and the
+ * caller does not have permission to register a resource resolver
*/
@SuppressWarnings("unchecked")
public static void register(String className) {
+ JavaUtils.checkRegisterPermission();
try {
Class<ResourceResolverSpi> resourceResolverClass =
(Class<ResourceResolverSpi>) Class.forName(className);
@@ -216,9 +220,12 @@
* list. This method logs a warning if the class cannot be registered.
*
* @param className the name of the ResourceResolverSpi class to be registered
+ * @throws SecurityException if a security manager is installed and the
+ * caller does not have permission to register a resource resolver
*/
@SuppressWarnings("unchecked")
public static void registerAtStart(String className) {
+ JavaUtils.checkRegisterPermission();
try {
Class<ResourceResolverSpi> resourceResolverClass =
(Class<ResourceResolverSpi>) Class.forName(className);
@@ -233,8 +240,11 @@
* cannot be registered.
* @param className
* @param start
+ * @throws SecurityException if a security manager is installed and the
+ * caller does not have permission to register a resource resolver
*/
public static void register(Class<? extends ResourceResolverSpi> className, boolean start) {
+ JavaUtils.checkRegisterPermission();
try {
ResourceResolverSpi resourceResolverSpi = className.newInstance();
register(resourceResolverSpi, start);
@@ -250,8 +260,11 @@
* cannot be registered.
* @param resourceResolverSpi
* @param start
+ * @throws SecurityException if a security manager is installed and the
+ * caller does not have permission to register a resource resolver
*/
public static void register(ResourceResolverSpi resourceResolverSpi, boolean start) {
+ JavaUtils.checkRegisterPermission();
synchronized(resolverList) {
if (start) {
resolverList.add(0, new ResourceResolver(resourceResolverSpi));
--- a/jdk/test/com/sun/tools/attach/StartManagementAgent.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/test/com/sun/tools/attach/StartManagementAgent.java Wed Jul 05 20:04:29 2017 +0200
@@ -53,7 +53,9 @@
public static void main(String[] args) throws Throwable {
ProcessThread processThread = null;
try {
+ System.out.println("Starting test application");
processThread = RunnerUtil.startApplication();
+ System.out.println("Application started");
runTests(processThread.getPid());
} catch (Throwable t) {
System.out.println("StartManagementAgent got unexpected exception: " + t);
@@ -70,6 +72,7 @@
// Try calling with null argument
boolean exception = false;
try {
+ System.out.println("Starting management agent with null");
vm.startManagementAgent(null);
} catch (NullPointerException e) {
exception = true;
@@ -86,6 +89,7 @@
}
p.put("com.sun.management.config.file", f.getAbsolutePath());
try {
+ System.out.println("Starting management agent with bogus port");
vm.startManagementAgent(p);
} catch(AttachOperationFailedException ex) {
// We expect parsing of "apa" above to fail, but if the file path
@@ -93,6 +97,9 @@
if (!ex.getMessage().contains("Invalid com.sun.management.jmxremote.port number")) {
throw ex;
}
+ ex.printStackTrace(System.err);
+ } catch (Throwable t) {
+ t.printStackTrace(System.err);
}
}
@@ -134,14 +141,19 @@
}
public static void testLocalAgent(VirtualMachine vm) throws Exception {
+ System.out.println("Getting VM properties");
Properties agentProps = vm.getAgentProperties();
String address = (String) agentProps.get(LOCAL_CONNECTOR_ADDRESS_PROP);
if (address != null) {
throw new Exception("Local management agent already started");
}
+ System.out.println("Starting local agent");
+
String result = vm.startLocalManagementAgent();
+ System.out.println("Agent started");
+
// try to parse the return value as a JMXServiceURL
new JMXServiceURL(result);
--- a/jdk/test/java/awt/Focus/SortingFPT/JDK8048887.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/test/java/awt/Focus/SortingFPT/JDK8048887.java Wed Jul 05 20:04:29 2017 +0200
@@ -26,7 +26,7 @@
@bug 8048887
@summary Tests SortingFTP for an exception caused by the tim-sort algo.
@author anton.tarasov: area=awt.focus
- @run main JDK8040632
+ @run main JDK8048887
*/
import javax.swing.JFrame;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/GraphicsEnvironment/TestDetectHeadless/TestDetectHeadless.java Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * 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.
+ */
+
+/*
+ * Portions Copyright (c) 2014 IBM Corporation
+ */
+
+public class TestDetectHeadless {
+ public static void main(String[] args) throws Exception {
+ Class.forName("javax.swing.plaf.basic.BasicInternalFrameTitlePane");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/GraphicsEnvironment/TestDetectHeadless/TestDetectHeadless.sh Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,47 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+#
+# 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.
+#
+
+#
+# Portions Copyright (c) 2014 IBM Corporation
+#
+
+# @test
+# @bug 8058930
+# @summary java.awt.GraphicsEnvironment.getHeadlessProperty() does not work for AIX
+#
+# @build TestDetectHeadless
+# @run shell TestDetectHeadless.sh
+
+OS=`uname -s`
+case "$OS" in
+ Windows* | CYGWIN* )
+ echo "Passed"; exit 0 ;;
+ * ) unset DISPLAY ;;
+esac
+
+${TESTJAVA}/bin/java ${TESTVMOPTS} \
+ -cp ${TESTCLASSES} TestDetectHeadless
+
+exit $?
--- a/jdk/test/java/lang/invoke/LFCaching/LambdaFormTestCase.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/test/java/lang/invoke/LFCaching/LambdaFormTestCase.java Wed Jul 05 20:04:29 2017 +0200
@@ -22,6 +22,8 @@
*/
import com.oracle.testlibrary.jsr292.Helper;
+import com.sun.management.HotSpotDiagnosticMXBean;
+import java.lang.management.ManagementFactory;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.function.Function;
@@ -37,6 +39,8 @@
private final static String METHOD_HANDLE_CLASS_NAME = "java.lang.invoke.MethodHandle";
private final static String INTERNAL_FORM_METHOD_NAME = "internalForm";
+ private static final double ITERATIONS_TO_CODE_CACHE_SIZE_RATIO
+ = 45 / (128.0 * 1024 * 1024);
/**
* Reflection link to {@code j.l.i.MethodHandle.internalForm} method. It is
@@ -87,7 +91,35 @@
boolean passed = true;
int testCounter = 0;
int failCounter = 0;
- long iterations = Math.max(1, Helper.TEST_LIMIT / testMethods.size());
+ long testCaseNum = testMethods.size();
+ long iterations = Math.max(1, Helper.TEST_LIMIT / testCaseNum);
+ System.out.printf("Number of iterations according to -DtestLimit is %d (%d cases)%n",
+ iterations, iterations * testCaseNum);
+ HotSpotDiagnosticMXBean hsDiagBean = ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class);
+ long codeCacheSize = Long.parseLong(
+ hsDiagBean.getVMOption("ReservedCodeCacheSize").getValue());
+ System.out.printf("Code cache size is %d bytes%n", codeCacheSize);
+ long iterationsByCodeCacheSize = (long) (codeCacheSize
+ * ITERATIONS_TO_CODE_CACHE_SIZE_RATIO);
+ long nonProfiledCodeCacheSize = Long.parseLong(
+ hsDiagBean.getVMOption("NonProfiledCodeHeapSize").getValue());
+ System.out.printf("Non-profiled code cache size is %d bytes%n", nonProfiledCodeCacheSize);
+ long iterationsByNonProfiledCodeCacheSize = (long) (nonProfiledCodeCacheSize
+ * ITERATIONS_TO_CODE_CACHE_SIZE_RATIO);
+ System.out.printf("Number of iterations limited by code cache size is %d (%d cases)%n",
+ iterationsByCodeCacheSize, iterationsByCodeCacheSize * testCaseNum);
+ System.out.printf("Number of iterations limited by non-profiled code cache size is %d (%d cases)%n",
+ iterationsByNonProfiledCodeCacheSize, iterationsByNonProfiledCodeCacheSize * testCaseNum);
+ iterations = Math.min(iterationsByCodeCacheSize,
+ Math.min(iterations, iterationsByNonProfiledCodeCacheSize));
+ if (iterations == 0) {
+ System.out.println("Warning: code cache size is too small to provide at"
+ + " least one iteration! Test will try to do one iteration.");
+ iterations = 1;
+ }
+ System.out.printf("Number of iterations is set to %d (%d cases)%n",
+ iterations, iterations * testCaseNum);
+ System.out.flush();
for (long i = 0; i < iterations; i++) {
System.err.println(String.format("Iteration %d:", i));
for (TestMethods testMethod : testMethods) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/net/SetFactoryPermission/SetFactoryPermission.java Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * 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 8048052
+ * @summary Test a series of methods which requires "setFactory" runtime permission
+ * @run main SetFactoryPermission success
+ * @run main/othervm/policy=policy.fail SetFactoryPermission fail
+ * @run main/othervm/policy=policy.success SetFactoryPermission success
+ */
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.net.URL;
+import java.net.URLConnection;
+import java.rmi.server.RMISocketFactory;
+import java.security.AccessControlException;
+
+public class SetFactoryPermission {
+ static boolean success = false;
+
+ interface Runner {
+ public void run() throws Exception;
+ }
+
+ public static void main (String[] args) throws Exception {
+ if (args.length > 0) {
+ success = System.getSecurityManager() == null || args[0].equals("success");
+ }
+
+ doTest(()->{
+ System.out.println("Verify URLConnection.setContentHandlerFactor()");
+ URLConnection.setContentHandlerFactory(null);
+ });
+ doTest(()->{
+ System.out.println("Verify URL.setURLStreamHandlerFactory()");
+ URL.setURLStreamHandlerFactory(null);
+ });
+ doTest(()->{
+ System.out.println("Verify ServerSocket.setSocketFactory()");
+ ServerSocket.setSocketFactory(null);
+ });
+ doTest(()->{
+ System.out.println("Verify Socket.setSocketImplFactory()");
+ Socket.setSocketImplFactory(null);
+ });
+ doTest(()->{
+ System.out.println("Verify RMISocketFactory.setSocketFactory()");
+ RMISocketFactory.setSocketFactory(null);
+ });
+ }
+
+ static void doTest(Runner func) throws Exception {
+ try {
+ func.run();
+ if (!success) {
+ throw new RuntimeException("AccessControlException is not thrown. Test failed");
+ }
+ } catch (SecurityException e) {
+ if (success) {
+ e.printStackTrace();
+ throw new RuntimeException("AccessControlException is thrown unexpectedly. Test failed");
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/net/SetFactoryPermission/policy.fail Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,3 @@
+grant {
+
+};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/net/SetFactoryPermission/policy.success Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,4 @@
+grant {
+ permission java.lang.RuntimePermission "setFactory";
+};
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/net/SocketPermission/SocketPermissionTest.java Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,236 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * 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 8047031
+ * @summary SocketPermission tests for legacy socket types
+ * @library ../../../lib/testlibrary
+ * @run testng/othervm/policy=policy SocketPermissionTest
+ */
+import java.io.IOException;
+import java.net.DatagramPacket;
+import java.net.DatagramSocket;
+import java.net.InetAddress;
+import java.net.MulticastSocket;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.net.SocketPermission;
+import java.security.AccessControlContext;
+import java.security.AccessController;
+import java.security.Permission;
+import java.security.Permissions;
+import java.security.PrivilegedAction;
+import java.security.ProtectionDomain;
+import java.util.Arrays;
+import java.util.function.Function;
+import java.util.function.IntConsumer;
+import static jdk.testlibrary.Utils.getFreePort;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+public class SocketPermissionTest {
+ private int freePort = -1;
+
+ //positive tests
+ @Test(dataProvider = "positiveProvider")
+ public void testPositive(Function<String, AccessControlContext> genAcc, IntConsumer func) {
+ String addr = "localhost:" + freePort;
+ AccessControlContext acc = genAcc.apply(addr);
+ AccessController.doPrivileged((PrivilegedAction) () -> {
+ func.accept(freePort);
+ return null;
+ }, acc);
+ }
+
+ //negative tests
+ @Test(dataProvider = "negativeProvider", expectedExceptions = SecurityException.class)
+ public void testNegative(AccessControlContext acc, IntConsumer func) {
+ AccessController.doPrivileged((PrivilegedAction) () -> {
+ func.accept(freePort);
+ return null;
+ }, acc);
+ }
+
+ @BeforeMethod
+ public void setFreePort() throws Exception {
+ freePort = getFreePort();
+ }
+
+ @DataProvider
+ public Object[][] positiveProvider() {
+ //test for SocketPermission "host:port","connect,resolve";
+ Function<String, AccessControlContext> generateAcc1 = (addr) -> getAccessControlContext(
+ new SocketPermission(addr, "listen, connect,resolve"));
+ IntConsumer func1 = (i) -> connectSocketTest(i);
+ IntConsumer func2 = (i) -> connectDatagramSocketTest(i);
+
+ //test for SocketPermission "localhost:1024-","accept";
+ Function<String, AccessControlContext> generateAcc2 = (addr) -> getAccessControlContext(
+ new SocketPermission(addr, "listen,connect,resolve"),
+ new SocketPermission("localhost:1024-", "accept"));
+ IntConsumer func3 = (i) -> acceptServerSocketTest(i);
+
+ //test for SocketPermission "229.227.226.221", "connect,accept"
+ Function<String, AccessControlContext> generateAcc3 = (addr) -> getAccessControlContext(
+ new SocketPermission(addr, "listen,resolve"),
+ new SocketPermission("229.227.226.221", "connect,accept"));
+ IntConsumer func4 = (i) -> sendDatagramPacketTest(i);
+ IntConsumer func5 = (i) -> joinGroupMulticastTest(i);
+
+ //test for SocketPermission "host:port", "listen"
+ Function<String, AccessControlContext> generateAcc4 = (addr) -> getAccessControlContext(
+ new SocketPermission(addr, "listen"));
+ IntConsumer func6 = (i) -> listenDatagramSocketTest(i);
+ IntConsumer func7 = (i) -> listenMulticastSocketTest(i);
+ IntConsumer func8 = (i) -> listenServerSocketTest(i);
+
+ return new Object[][]{
+ {generateAcc1, func1},
+ {generateAcc1, func2},
+ {generateAcc2, func3},
+ {generateAcc3, func4},
+ {generateAcc3, func5},
+ {generateAcc4, func6},
+ {generateAcc4, func7},
+ {generateAcc4, func8}
+ };
+ }
+
+ @DataProvider
+ public Object[][] negativeProvider() {
+ IntConsumer[] funcs = {i -> connectSocketTest(i),
+ i -> connectDatagramSocketTest(i), i -> acceptServerSocketTest(i),
+ i -> sendDatagramPacketTest(i), i -> joinGroupMulticastTest(i),
+ i -> listenDatagramSocketTest(i), i -> listenMulticastSocketTest(i),
+ i -> listenServerSocketTest(i)};
+ return Arrays.stream(funcs).map(f -> {
+ //Construct an AccessControlContext without SocketPermission
+ AccessControlContext acc = getAccessControlContext(
+ new java.io.FilePermission("<<ALL FILES>>", "read,write,execute,delete"),
+ new java.net.NetPermission("*"),
+ new java.util.PropertyPermission("*", "read,write"),
+ new java.lang.reflect.ReflectPermission("*"),
+ new java.lang.RuntimePermission("*"),
+ new java.security.SecurityPermission("*"),
+ new java.io.SerializablePermission("*"));
+ return new Object[]{acc, f};
+ }).toArray(Object[][]::new);
+ }
+
+ public void connectSocketTest(int port) {
+ try (ServerSocket server = new ServerSocket(port);
+ Socket client = new Socket(InetAddress.getLocalHost(), port);) {
+ } catch (IOException ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
+ public void connectDatagramSocketTest(int port) {
+ String msg = "Hello";
+ try {
+ InetAddress me = InetAddress.getLocalHost();
+ try (DatagramSocket ds = new DatagramSocket(port, me)) {
+ DatagramPacket dp = new DatagramPacket(msg.getBytes(),
+ msg.length(), me, port);
+ ds.send(dp);
+ }
+ } catch (IOException ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
+ public void acceptServerSocketTest(int port) {
+ try {
+ InetAddress me = InetAddress.getLocalHost();
+ try (ServerSocket server = new ServerSocket(port)) {
+ Socket client = new Socket(me, port);
+ server.accept();
+ }
+ } catch (IOException ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
+ public static void sendDatagramPacketTest(int port) {
+ String msg = "Hello";
+ try {
+ InetAddress group = InetAddress.getByName("229.227.226.221");
+ try (DatagramSocket s = new DatagramSocket(port)) {
+ DatagramPacket hi = new DatagramPacket(msg.getBytes(),
+ msg.length(), group, port);
+ s.send(hi);
+ }
+ } catch (IOException ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
+ public void joinGroupMulticastTest(int port) {
+ try {
+ InetAddress group = InetAddress.getByName("229.227.226.221");
+ try (MulticastSocket s = new MulticastSocket(port)) {
+ s.joinGroup(group);
+ s.leaveGroup(group);
+ }
+ } catch (IOException ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
+ public void listenDatagramSocketTest(int port) {
+ try (DatagramSocket ds = new DatagramSocket(port)) {
+ } catch (IOException ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
+ public void listenMulticastSocketTest(int port) {
+ try (MulticastSocket ms = new MulticastSocket(port)) {
+ } catch (IOException ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
+ public void listenServerSocketTest(int port) {
+ try (ServerSocket ms = new ServerSocket(port)) {
+ } catch (IOException ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
+ private static AccessControlContext getAccessControlContext(Permission... ps) {
+ Permissions perms = new Permissions();
+ for (Permission p : ps) {
+ perms.add(p);
+ }
+ /*
+ *Create an AccessControlContext that consist a single protection domain
+ * with only the permissions calculated above
+ */
+ ProtectionDomain pd = new ProtectionDomain(null, perms);
+ return new AccessControlContext(new ProtectionDomain[]{pd});
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/net/SocketPermission/policy Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,3 @@
+grant {
+ permission java.security.AllPermission;
+};
\ No newline at end of file
--- a/jdk/test/java/security/cert/CertificateFactory/invalidEncodedCerts/DetectInvalidEncoding.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/test/java/security/cert/CertificateFactory/invalidEncodedCerts/DetectInvalidEncoding.java Wed Jul 05 20:04:29 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,27 +23,548 @@
/**
* @test
- * @bug 4776466
+ * @bug 4776466 8032573
* @summary check that CertificateFactory rejects invalid encoded X.509 certs
*/
import java.io.*;
+import java.util.Collection;
+import java.util.List;
+import java.util.LinkedList;
+import javax.security.auth.x500.X500Principal;
+import java.security.GeneralSecurityException;
import java.security.cert.*;
public class DetectInvalidEncoding {
+ // Originally found in the test file:
+ // java/security/cert/CertificateFactory/invalidEncodedCerts/invalidcert.pem
+ // The first character of the PEM encoding has been changed from "M" to
+ // "X" to force a failure during decoding.
+ private static final String INVALID_CERT =
+ "-----BEGIN CERTIFICATE-----\n" +
+ "XIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx\n" +
+ "EzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28xFTAT\n" +
+ "BgNVBAoTDEJFQSBXZWJMb2dpYzERMA8GA1UECxMIU2VjdXJpdHkxIzAhBgNVBAMT\n" +
+ "GkRlbW8gQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9zdXBw\n" +
+ "b3J0QGJlYS5jb20wHhcNMDAwNTMwMjEzODAxWhcNMDQwNTEzMjEzODAxWjCBjDEL\n" +
+ "MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\n" +
+ "cmFuY2lzY28xFTATBgNVBAoTDEJFQSBXZWJMb2dpYzEZMBcGA1UEAxMQd2VibG9n\n" +
+ "aWMuYmVhLmNvbTEeMBwGCSqGSIb3DQEJARYPc3VwcG9ydEBiZWEuY29tMFwwDQYJ\n" +
+ "KoZIhvcNAQEBBQADSwAwSAJBALdsXEHqKHgs6zj0hU5sXMAUHzoT8kgWXmNkKHXH\n" +
+ "79qbPh6EfdlriW9G/AbRF/pKrCQu7hhllAxREbqTuSlf2EMCAwEAATANBgkqhkiG\n" +
+ "9w0BAQQFAANBACgmqflL5m5LNeJGpWx9aIoABCiuDcpw1fFyegsqGX7CBhffcruS\n" +
+ "1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU=\n" +
+ "-----END CERTIFICATE-----";
+
+ // Created with keytool:
+ // keytool -genkeypair -keyalg rsa -keysize 2048 -keystore <KS_FILE>
+ // -alias root -sigalg SHA256withRSA -dname "CN=Root, O=SomeCompany"
+ // -validity 730 -ext bc:critical=ca:true
+ // -ext ku:critical=keyCertSign,cRLSign
+ private static final String SINGLE_ROOT_CERT =
+ "-----BEGIN CERTIFICATE-----\n" +
+ "MIIDCjCCAfKgAwIBAgIEDUiw+DANBgkqhkiG9w0BAQsFADAlMRQwEgYDVQQKEwtT\n" +
+ "b21lQ29tcGFueTENMAsGA1UEAxMEUm9vdDAeFw0xNDA4MjgyMTI5MjZaFw0xNjA4\n" +
+ "MjcyMTI5MjZaMCUxFDASBgNVBAoTC1NvbWVDb21wYW55MQ0wCwYDVQQDEwRSb290\n" +
+ "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0VFecSNdH6CJhPOSG127\n" +
+ "tuvld4y7GGJ0kQf3Q0b8qgprsXAmn0/bQR+YX7PfS408cFW+q2SWXeY2kC/3chvi\n" +
+ "2syMsGdUJrDzuMbYsbvKPKyuJ2GJskX3mSbLMJj5Tzhg4qmwbzDTFIJ51yGa1Wmh\n" +
+ "i2+4PhltqT0TohvSVJlBrOWNhmvwv5UWsF4e2i04rebDZQoWkmD3MpImZXF/HYre\n" +
+ "9P8NP97vN0xZmh5PySHy2ILXN3ZhTn3tq0YxNSQTaMUfhgoyzWFvZKAnm/tZIh/1\n" +
+ "oswwEQPIZJ25AUTm9r3YPQXl1hsNdLU0asEVYRsgzGSTX5gCuUY+KzhStzisOcUY\n" +
+ "uQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV\n" +
+ "HQ4EFgQUz1FBNixG/KCgcn6FOWzxP1hujG0wDQYJKoZIhvcNAQELBQADggEBAL60\n" +
+ "ZaNc6eIMbKntGVE/pdxxyKwPdDyAAeEevX23KRWoLbQjHXo5jrfDPhI5k45ztlyU\n" +
+ "+tIQbc81LlCl88I4dIx0fvEbxjNaAYhFNXwwSQBs2CuEAdRK8hodXbRcEeI+G10F\n" +
+ "ARIVs2C7JNm/RhxskCWgj6tFIOGaTZ9gHyvlQUEM18sr5fXZlXTqspZCmz3t5XPi\n" +
+ "5/wYLv6vk7k3G8WzMHbBE0bYI+61cCc8rbMHldtymbwSwiqfKC9y7oPEfRCbzVUe\n" +
+ "fgrKcOyVWDuw0y0hhsQL/oONjPp4uK/bl9B7T84t4+ihxdocWKx6eyhFvOvZH9t2\n" +
+ "kUylb9yBUYStwGExMHg=\n" +
+ "-----END CERTIFICATE-----";
+
+ // Created with keytool:
+ // keytool -genkeypair -keyalg rsa -keysize 2048 -keystore <KS_FILE>
+ // -alias root -sigalg SHA256withRSA
+ // -dname "CN=Intermed, O=SomeCompany" -validity 730
+ // -ext bc:critical=ca:true -ext ku:critical=keyCertSign,cRLSign
+ // keytool -certreq -keystore <KS_FILE> -sigalg SHA256withRSA
+ // -alias intermed -dname "CN=Intermed, O=SomeCompany"
+ // keytool -gencert -keystore <KS_FILE> -alias intermed
+ // -sigalg SHA256withRSA -validity 730
+ // -ext bc:critical=ca:true -ext ku:critical=keyCertSign,cRLSign
+ private static final String INTERMED_CA_CERT =
+ "-----BEGIN CERTIFICATE-----\n" +
+ "MIIDLzCCAhegAwIBAgIEIIgOyDANBgkqhkiG9w0BAQsFADAlMRQwEgYDVQQKEwtT\n" +
+ "b21lQ29tcGFueTENMAsGA1UEAxMEUm9vdDAeFw0xNDA4MjgyMjUyNDJaFw0xNjA4\n" +
+ "MDcyMjUyNDJaMCkxFDASBgNVBAoTC1NvbWVDb21wYW55MREwDwYDVQQDEwhJbnRl\n" +
+ "cm1lZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJEecvTWla8kdWx+\n" +
+ "HHu5ryfBpJ95I7V4MEajnmzJVZcwvKhDjlDgABDMuVwFEUUSyeOdbWJF3DLKnyMD\n" +
+ "KTx6/58kuVak3NX2TJ8cmmIlKf1upFbdrEtjYViSnNrApprfO8B3ORdBbO6QDYza\n" +
+ "IkAWdI5GllFnVkb4yhMUBg3zfhglF+bl3D3lVRlp9bCrUZoNRs+mZjhVbcMn22ej\n" +
+ "TfG5Y3VpNM4SN8dFIxPQLLk/aao+cmWEQdbQ0R6ydemRukqrw170olSVLeoGGala\n" +
+ "3D4oJckde8EgNPcghcsdQ6tpGhkpFhmoyzEsuToR7Gq9UT5V2kkqJneiKXqQg4wz\n" +
+ "vMAlUGECAwEAAaNjMGEwHwYDVR0jBBgwFoAUOw+92bevFoJz96pR1DrAkPPUKb0w\n" +
+ "DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLbnErBs\n" +
+ "q/Mhci5XElfjjLZp3GRyMA0GCSqGSIb3DQEBCwUAA4IBAQAq8y2DpkSV31IXZ1vr\n" +
+ "/Ye+Nj/2NvBydFeHVRGMAN1LJv6/Q42TCSXbr6cDQ4NWQUtPm90yZBYJSznkbShx\n" +
+ "HOJEE6R8PRJvoUtMm7fJrNtkybTt6jX4j50Lw8gdYB/rgZb4z8ZQZVEo/0zpW4HV\n" +
+ "Gs+q4z8TkdmLR18hl39sUEsxt99AOBk8NtKKVNfBWq9b0QDhRkXfmqhyeXdDsHOV\n" +
+ "8ksulsa7hseheHhdjziEOpQugh8qzSea2kFPrLB53VjWfa4qDzEPaNhahho9piCu\n" +
+ "82XDnOrcEk9KyHWM7sa7vtK7++W+0MXD/p9nkZ6NHrJXweLriU0DXO6ZY3mzNKJK\n" +
+ "435M\n" +
+ "-----END CERTIFICATE-----";
+
+ // Subordinate cert created using keytool, both certs exported to
+ // files individually, then use openssl to place in a PKCS#7:
+ // openssl crl2pkcs7 -nocrl -certfile <INTERMED-CERT-PEM>
+ // -certfile <ROOT-CERT-PEM> -out <P7-DEST-PEM-FILE>
+ private static final String PKCS7_INTERMED_ROOT_CERTS =
+ "-----BEGIN PKCS7-----\n" +
+ "MIIGbgYJKoZIhvcNAQcCoIIGXzCCBlsCAQExADALBgkqhkiG9w0BBwGgggZBMIID\n" +
+ "LzCCAhegAwIBAgIEIIgOyDANBgkqhkiG9w0BAQsFADAlMRQwEgYDVQQKEwtTb21l\n" +
+ "Q29tcGFueTENMAsGA1UEAxMEUm9vdDAeFw0xNDA4MjgyMjUyNDJaFw0xNjA4MDcy\n" +
+ "MjUyNDJaMCkxFDASBgNVBAoTC1NvbWVDb21wYW55MREwDwYDVQQDEwhJbnRlcm1l\n" +
+ "ZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJEecvTWla8kdWx+HHu5\n" +
+ "ryfBpJ95I7V4MEajnmzJVZcwvKhDjlDgABDMuVwFEUUSyeOdbWJF3DLKnyMDKTx6\n" +
+ "/58kuVak3NX2TJ8cmmIlKf1upFbdrEtjYViSnNrApprfO8B3ORdBbO6QDYzaIkAW\n" +
+ "dI5GllFnVkb4yhMUBg3zfhglF+bl3D3lVRlp9bCrUZoNRs+mZjhVbcMn22ejTfG5\n" +
+ "Y3VpNM4SN8dFIxPQLLk/aao+cmWEQdbQ0R6ydemRukqrw170olSVLeoGGala3D4o\n" +
+ "Jckde8EgNPcghcsdQ6tpGhkpFhmoyzEsuToR7Gq9UT5V2kkqJneiKXqQg4wzvMAl\n" +
+ "UGECAwEAAaNjMGEwHwYDVR0jBBgwFoAUOw+92bevFoJz96pR1DrAkPPUKb0wDwYD\n" +
+ "VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLbnErBsq/Mh\n" +
+ "ci5XElfjjLZp3GRyMA0GCSqGSIb3DQEBCwUAA4IBAQAq8y2DpkSV31IXZ1vr/Ye+\n" +
+ "Nj/2NvBydFeHVRGMAN1LJv6/Q42TCSXbr6cDQ4NWQUtPm90yZBYJSznkbShxHOJE\n" +
+ "E6R8PRJvoUtMm7fJrNtkybTt6jX4j50Lw8gdYB/rgZb4z8ZQZVEo/0zpW4HVGs+q\n" +
+ "4z8TkdmLR18hl39sUEsxt99AOBk8NtKKVNfBWq9b0QDhRkXfmqhyeXdDsHOV8ksu\n" +
+ "lsa7hseheHhdjziEOpQugh8qzSea2kFPrLB53VjWfa4qDzEPaNhahho9piCu82XD\n" +
+ "nOrcEk9KyHWM7sa7vtK7++W+0MXD/p9nkZ6NHrJXweLriU0DXO6ZY3mzNKJK435M\n" +
+ "MIIDCjCCAfKgAwIBAgIEdffjKTANBgkqhkiG9w0BAQsFADAlMRQwEgYDVQQKEwtT\n" +
+ "b21lQ29tcGFueTENMAsGA1UEAxMEUm9vdDAeFw0xNDA4MjgyMjQ2MzZaFw0xNjA4\n" +
+ "MjcyMjQ2MzZaMCUxFDASBgNVBAoTC1NvbWVDb21wYW55MQ0wCwYDVQQDEwRSb290\n" +
+ "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhnXc8Avv54Gk2xjVa2yA\n" +
+ "lBL/Cug1nyvKl5wqmN+foT6cMOX6bneCkJOJ4lSbch3gvl4ctlX/9hm3pB/+HhSr\n" +
+ "em2NcLQrLEq8l9Ar4RnqfoXQR4Uy+4P6wj9OcVV7e/v/+ZPnStOoEAtb5nAwsR2b\n" +
+ "hOC/tIFNwflrsmsmtMSoOiNftpYLFF4eOAdpDrXYMrqNu6ZxZsOQ7WZl4SsVOx1N\n" +
+ "/IINXwBLyoHJDzLZ0iJEV0O6mh846s0n6QXeK1P5d0uLcoZaZ1k8Q4sRcdoLA6rS\n" +
+ "e1WffipBFMvIuoDIigkHZIKVYRLG828rO+PFnRah0ybybkVsN6s3oLxfhswZDvut\n" +
+ "OwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV\n" +
+ "HQ4EFgQUOw+92bevFoJz96pR1DrAkPPUKb0wDQYJKoZIhvcNAQELBQADggEBACBN\n" +
+ "wEaV70FKKBINHtNwesd7TB6fgSaVgDZOO08aseHbXnm7AUhtDV3P5rQR2AsKtbg4\n" +
+ "COhlKw2/Ki18D4DfdCccFKFTRZBjqj2PxNmn6C68l1/bT4PuUXuM7rW++53RcOA7\n" +
+ "TbgLuzA25kSz7XinRvR8L4VwHtppu5tSYEthMIMgLZLGGV9r7kBfpY8lXdxQM8vb\n" +
+ "xZUIysasvVtVUFPOTV6g2dfn8QCoqLOmxyzTLdXe4M6acP6f7lmhgr3LMqDtB6K9\n" +
+ "pN+OImr77zNdZ+jTB+5e9a8gAvc5ZfG7Nk5RfwUatYTAFZ6Uggy2cKmIRpXCia18\n" +
+ "If78mc7goS1+lHkGCs2hADEA\n" +
+ "-----END PKCS7-----";
+
+ // Empty PKCS#7 in DER form can be created with openssl:
+ // openssl crl2pkcs7 -nocrl -outform DER
+ private static final byte[] PKCS7_BER_EMPTY = {
+ 48, 39, 6, 9, 42, -122, 72, -122,
+ -9, 13, 1, 7, 2, -96, 26, 48,
+ 24, 2, 1, 1, 49, 0, 48, 11,
+ 6, 9, 42, -122, 72, -122, -9, 13,
+ 1, 7, 1, -96, 0, -95, 0, 49,
+ 0
+ };
+
+ private static final String JTEST_ROOT_CRL =
+ "-----BEGIN X509 CRL-----\n" +
+ "MIICoTCBigIBATANBgkqhkiG9w0BAQsFADA1MQ4wDAYDVQQKEwVKVGVzdDELMAkG\n" +
+ "A1UECxMCSVQxFjAUBgNVBAMTDUpUZXN0IFJvb3QgQ0EXDTE0MDkwNDE4NDIyMVqg\n" +
+ "MDAuMB8GA1UdIwQYMBaAFO6bllCV6kctH77MfqAtefNeRdsmMAsGA1UdFAQEAgIA\n" +
+ "jjANBgkqhkiG9w0BAQsFAAOCAgEAmp8ihtiRthknDC+VzehmlQw5u8MftMZYQYk5\n" +
+ "EI04SwyzY9JTL8QHb4u7fXjnZAyN89aYPypI5OSyDsyyGP/JDNsBt2Um/fl0aaCl\n" +
+ "Z4Np6x+dB9+oIU1XY7y2+uyQUC5MHivQ5ddbGPoAvK/msbugTGAjHvZpM+l0okiV\n" +
+ "3SofDrii5BSosFEkXfkf2oG9ZLO3YamsFMEZaOj/eWDyGhTyJMGsq2/8NeTF21Tp\n" +
+ "YkeDcTHqR5KHoYXjOIaS7NjmErm+uDpKH9Lq+JUcYrbUhmjnq5z04EsPF2F2L7Vb\n" +
+ "THI+awQAUQit16lXGuz7fFRZi2vPyiaRP5n2QT5D+ac1dAs+oWLDJw6Tf2v9KVTe\n" +
+ "OmW62yd6zQqCwBg+n57UcNu3sv/Sq3t7iRuN0AmWlIhu659POPQv7Np6bEo6dIpp\n" +
+ "u7Ze6D2KPtM177ETHYlCx2a3g9VEZYKrVhQ2749St0Cp5szVq691jFZAWYOzcfEO\n" +
+ "XfK1y25pmlBjvhNIIVRlU+T5rjNb8GaleYKVYnKOcv700K32QxFzcPf7nbNKwW99\n" +
+ "tcaNHFNP+LW/XP8I3CJ8toXLLcOITKVwMA+0GlO5eL7eX5POc+vE9+7IzGuybmU4\n" +
+ "uslxoLdJ0NSZWpYmf6a6qrJ67cj5i3706H+eBsWQcShfSYreh+TyWQaGk+fkEiUV\n" +
+ "iy4QdJ0=\n" +
+ "-----END X509 CRL-----";
+
+ private static final String JTEST_INTERMED_CRL =
+ "-----BEGIN X509 CRL-----\n" +
+ "MIICzzCBuAIBATANBgkqhkiG9w0BAQsFADA/MQ4wDAYDVQQKEwVKVGVzdDELMAkG\n" +
+ "A1UECxMCSVQxIDAeBgNVBAMTF0pUZXN0IEludGVybWVkaWF0ZSBDQSAxFw0xNDA5\n" +
+ "MDQyMjE2NTRaMCIwIAIBBhcNMTQwOTA0MjIxNjU0WjAMMAoGA1UdFQQDCgEFoDAw\n" +
+ "LjAfBgNVHSMEGDAWgBSvRdjbkSMJ3A7s5H6EWghQ+lkw/zALBgNVHRQEBAICAJsw\n" +
+ "DQYJKoZIhvcNAQELBQADggIBALJmikMwil8oywhenoO8o9xxCOIU0xrt3KdfiSXw\n" +
+ "8MtQXZHT9d1C6tlLAsYkWAfmfTvM2OU6wquFCLLsFmDZszbbCqmn4JhYBSKQMqlm\n" +
+ "IHnsiOFPvITW2FU08fWNLM+FtQzPnTFmx/CJo+wfGpq5tZMIbsccsCJ5uvZVAWGh\n" +
+ "0KbPmYcJG/O384+kzr/2H2IaoZoMMABec5c5FEF/tpp8jawzY+0VFyaVrumKWdan\n" +
+ "+3OvRQxT1wLxfNi2vdxB2rmNPo423qanXZAoVv260um3LYlmXBNK1jwQ9lp78jkT\n" +
+ "B7zMVa4hOUWVxdWc/LE6fUYgPsNqZd+hWy/PolIRp5TS21B5hkc5K87LT59GkexK\n" +
+ "vNVKQennOLGtH+Q7htK4UeY4Gm/W7UydOQ0k7hZzyfMDkCfLfNfK0l63qKwUku36\n" +
+ "UdeI1LXqulPEvb/d7rRAAM9p5Sm+RsECj2bcrZBMdIGXcSo26A5tzZpTEC79i4S1\n" +
+ "yxYIooeBnouUkDJ9+VBsJTSKY5fpU8JSkQPRyHKt+trGAkBt2Ka5MqrHtITzQ1vP\n" +
+ "5q4tNr45JGEXllH83NlBpWURfsdtkDHa3lxTD/pkrywOCyzz7wQ22D8Kul7EN8nT\n" +
+ "7LDbN+O3G9GHICxvWlJHp6HMsqGTuH1MIUR+5uZFOJa1S0IzorUIEieLncDUPgzO\n" +
+ "M4JA\n" +
+ "-----END X509 CRL-----";
+
+ // PKCS#7 CRL Set containing JTEST root and intermediate CRLs
+ private static final String PKCS7_CRL_SET =
+ "-----BEGIN PKCS7-----\n" +
+ "MIIFpQYJKoZIhvcNAQcCoIIFljCCBZICAQExADALBgkqhkiG9w0BBwGgAKGCBXgw\n" +
+ "ggKhMIGKAgEBMA0GCSqGSIb3DQEBCwUAMDUxDjAMBgNVBAoTBUpUZXN0MQswCQYD\n" +
+ "VQQLEwJJVDEWMBQGA1UEAxMNSlRlc3QgUm9vdCBDQRcNMTQwOTA0MTg0MjIxWqAw\n" +
+ "MC4wHwYDVR0jBBgwFoAU7puWUJXqRy0fvsx+oC15815F2yYwCwYDVR0UBAQCAgCO\n" +
+ "MA0GCSqGSIb3DQEBCwUAA4ICAQCanyKG2JG2GScML5XN6GaVDDm7wx+0xlhBiTkQ\n" +
+ "jThLDLNj0lMvxAdvi7t9eOdkDI3z1pg/Kkjk5LIOzLIY/8kM2wG3ZSb9+XRpoKVn\n" +
+ "g2nrH50H36ghTVdjvLb67JBQLkweK9Dl11sY+gC8r+axu6BMYCMe9mkz6XSiSJXd\n" +
+ "Kh8OuKLkFKiwUSRd+R/agb1ks7dhqawUwRlo6P95YPIaFPIkwayrb/w15MXbVOli\n" +
+ "R4NxMepHkoehheM4hpLs2OYSub64Okof0ur4lRxittSGaOernPTgSw8XYXYvtVtM\n" +
+ "cj5rBABRCK3XqVca7Pt8VFmLa8/KJpE/mfZBPkP5pzV0Cz6hYsMnDpN/a/0pVN46\n" +
+ "ZbrbJ3rNCoLAGD6fntRw27ey/9Kre3uJG43QCZaUiG7rn0849C/s2npsSjp0imm7\n" +
+ "tl7oPYo+0zXvsRMdiULHZreD1URlgqtWFDbvj1K3QKnmzNWrr3WMVkBZg7Nx8Q5d\n" +
+ "8rXLbmmaUGO+E0ghVGVT5PmuM1vwZqV5gpVico5y/vTQrfZDEXNw9/uds0rBb321\n" +
+ "xo0cU0/4tb9c/wjcIny2hcstw4hMpXAwD7QaU7l4vt5fk85z68T37sjMa7JuZTi6\n" +
+ "yXGgt0nQ1JlaliZ/prqqsnrtyPmLfvTof54GxZBxKF9Jit6H5PJZBoaT5+QSJRWL\n" +
+ "LhB0nTCCAs8wgbgCAQEwDQYJKoZIhvcNAQELBQAwPzEOMAwGA1UEChMFSlRlc3Qx\n" +
+ "CzAJBgNVBAsTAklUMSAwHgYDVQQDExdKVGVzdCBJbnRlcm1lZGlhdGUgQ0EgMRcN\n" +
+ "MTQwOTA0MjIxNjU0WjAiMCACAQYXDTE0MDkwNDIyMTY1NFowDDAKBgNVHRUEAwoB\n" +
+ "BaAwMC4wHwYDVR0jBBgwFoAUr0XY25EjCdwO7OR+hFoIUPpZMP8wCwYDVR0UBAQC\n" +
+ "AgCbMA0GCSqGSIb3DQEBCwUAA4ICAQCyZopDMIpfKMsIXp6DvKPccQjiFNMa7dyn\n" +
+ "X4kl8PDLUF2R0/XdQurZSwLGJFgH5n07zNjlOsKrhQiy7BZg2bM22wqpp+CYWAUi\n" +
+ "kDKpZiB57IjhT7yE1thVNPH1jSzPhbUMz50xZsfwiaPsHxqaubWTCG7HHLAiebr2\n" +
+ "VQFhodCmz5mHCRvzt/OPpM6/9h9iGqGaDDAAXnOXORRBf7aafI2sM2PtFRcmla7p\n" +
+ "ilnWp/tzr0UMU9cC8XzYtr3cQdq5jT6ONt6mp12QKFb9utLpty2JZlwTStY8EPZa\n" +
+ "e/I5Ewe8zFWuITlFlcXVnPyxOn1GID7DamXfoVsvz6JSEaeU0ttQeYZHOSvOy0+f\n" +
+ "RpHsSrzVSkHp5zixrR/kO4bSuFHmOBpv1u1MnTkNJO4Wc8nzA5Any3zXytJet6is\n" +
+ "FJLt+lHXiNS16rpTxL2/3e60QADPaeUpvkbBAo9m3K2QTHSBl3EqNugObc2aUxAu\n" +
+ "/YuEtcsWCKKHgZ6LlJAyfflQbCU0imOX6VPCUpED0chyrfraxgJAbdimuTKqx7SE\n" +
+ "80Nbz+auLTa+OSRhF5ZR/NzZQaVlEX7HbZAx2t5cUw/6ZK8sDgss8+8ENtg/Crpe\n" +
+ "xDfJ0+yw2zfjtxvRhyAsb1pSR6ehzLKhk7h9TCFEfubmRTiWtUtCM6K1CBIni53A\n" +
+ "1D4MzjOCQDEA\n" +
+ "-----END PKCS7-----";
+
public static void main(String[] args) throws Exception {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
- File f = new File
- (System.getProperty("test.src", "."), "invalidcert.pem");
- InputStream inStream = new FileInputStream(f);
- try {
- X509Certificate cert =
- (X509Certificate) cf.generateCertificate(inStream);
- } catch (CertificateParsingException ce) {
- return;
+ List<DecodeTest> validTests = new LinkedList<>();
+ List<DecodeTest> invalidTests = new LinkedList<>();
+
+ // Load up positive test cases (for sanity checks)
+ StringBuilder sb = new StringBuilder();
+
+ validTests.add(new GenMultiCertTest("Single, valid certificate",
+ SINGLE_ROOT_CERT.getBytes(), null,
+ new X500Principal("CN=Root, O=SomeCompany")));
+ validTests.add(new GenMultiCertTest("PEM-encoded PKCS#7 chain",
+ PKCS7_INTERMED_ROOT_CERTS.getBytes(), null,
+ new X500Principal("CN=Intermed, O=SomeCompany"),
+ new X500Principal("CN=Root, O=SomeCompany")));
+ validTests.add(new GenMultiCertTest("Two PEM-encoded X509 certs",
+ (INTERMED_CA_CERT + "\n" + SINGLE_ROOT_CERT).getBytes(),
+ null,
+ new X500Principal("CN=Intermed, O=SomeCompany"),
+ new X500Principal("CN=Root, O=SomeCompany")));
+ validTests.add(new GenMultiCertTest("Empty data", new byte[0], null));
+
+ sb.append("Certificate 1: CN=Root, O=SomeCompany\n");
+ sb.append(SINGLE_ROOT_CERT).append("\n");
+ sb.append("Certificate 2: CN=Intermed, O=SomeCompany\n");
+ sb.append(INTERMED_CA_CERT).append("\n");
+ sb.append("Extra trailing data\n");
+ validTests.add(new GenMultiCertTest(
+ "Two PEM-encoded certs with leading/trailing " +
+ "text data around each.", sb.toString().getBytes(), null,
+ new X500Principal("CN=Root, O=SomeCompany"),
+ new X500Principal("CN=Intermed, O=SomeCompany")));
+ validTests.add(new GenMultiCertTest(
+ "BER-encoded PKCS#7 with empty certificates segment",
+ PKCS7_BER_EMPTY, null));
+ validTests.add(new GenMultiCRLTest(
+ "CRL with leading and trailing text data",
+ ("This is a CRL\n" + JTEST_ROOT_CRL +
+ "\nSee? Told you so\n\n").getBytes(), null,
+ new X500Principal("CN=JTest Root CA,OU=IT,O=JTest")));
+ validTests.add(new GenMultiCRLTest(
+ "Two CRLs, one after the other with leading/trailing text",
+ ("This is a CRL\n" + JTEST_ROOT_CRL +
+ "\nAnd this is another CRL\n" + JTEST_INTERMED_CRL +
+ "\nAnd this is trailing text\n").getBytes(), null,
+ new X500Principal("CN=JTest Root CA,OU=IT,O=JTest"),
+ new X500Principal(
+ "CN=JTest Intermediate CA 1,OU=IT,O=JTest")));
+ validTests.add(new GenMultiCRLTest("Two CRLs in a PKCS#7 CRL set",
+ PKCS7_CRL_SET.getBytes(), null,
+ new X500Principal("CN=JTest Root CA,OU=IT,O=JTest"),
+ new X500Principal("CN=JTest Intermediate CA 1,OU=IT,O=JTest")));
+
+ // Load up all test cases where we expect failures
+ invalidTests.add(new GenSingleCertTest("Invalid PEM encoding",
+ INVALID_CERT.getBytes(),
+ new CertificateParsingException()));
+ invalidTests.add(new GenMultiCertTest("Invalid PEM encoding",
+ INVALID_CERT.getBytes(),
+ new CertificateParsingException()));
+ invalidTests.add(new GenMultiCertTest(
+ "Two cert sequence, one valid and one invalid",
+ (INTERMED_CA_CERT + "\n" + INVALID_CERT).getBytes(),
+ new CertificateParsingException()));
+ invalidTests.add(new GenMultiCertTest("Non-certificate text",
+ "This is not a certificate".getBytes(),
+ new CertificateException()));
+ invalidTests.add(new GenMultiCertTest(
+ "Non-certificate text with partial PEM header (4 hyphens)",
+ "----This is not a valid x509 certificate".getBytes(),
+ new CertificateException()));
+ invalidTests.add(new GenMultiCertTest(
+ "Leading non-certificate text plus valid PEM header, " +
+ "but not on new line",
+ "This is not valid -----BEGIN CERTIFICATE-----".getBytes(),
+ new CertificateException()));
+ byte[] emptyCString = {0};
+ invalidTests.add(new GenMultiCertTest("Empty C-style string",
+ emptyCString, new CertificateException()));
+ invalidTests.add(new GenMultiCRLTest("Non-CRL text",
+ "This is not a CRL".getBytes(), new CRLException()));
+ invalidTests.add(new GenMultiCRLTest("Valid headers, but not a CRL",
+ INTERMED_CA_CERT.getBytes(), new CRLException()));
+
+ System.out.println("===== Valid Tests =====");
+ for (DecodeTest dt : validTests) {
+ dt.passTest();
+ }
+ System.out.print("\n");
+
+ System.out.println("===== Invalid Tests =====");
+ for (DecodeTest dt : invalidTests) {
+ dt.failTest();
+ }
+ }
+
+ public static abstract class DecodeTest {
+ protected String testName;
+ protected byte[] testData;
+ protected Throwable expectedException;
+ protected X500Principal[] principals;
+ protected CertificateFactory cf;
+
+ /**
+ * Construct a DecodeTest
+ *
+ * @param name The test name
+ * @param input A byte array consisting of the input for this test
+ * @param failType An exception whose class should match the expected
+ * exception that will be thrown when this test is run
+ * @param princs Zero of more X500Principals which will be used
+ * to compare the output in a success case.
+ */
+ DecodeTest(String name, byte[] input, Throwable failType,
+ X500Principal... princs) throws CertificateException {
+ testName = name;
+ testData = input.clone();
+ expectedException = failType;
+ principals = princs;
+ cf = CertificateFactory.getInstance("X.509");
+ }
+
+ public abstract void passTest() throws GeneralSecurityException;
+
+ public abstract void failTest() throws GeneralSecurityException;
+ }
+
+ public static class GenMultiCertTest extends DecodeTest {
+ public GenMultiCertTest(String name, byte[] input, Throwable failType,
+ X500Principal... princs) throws CertificateException {
+ super(name, input, failType, princs);
+ }
+
+ @Override
+ public void passTest() throws GeneralSecurityException {
+ Collection<? extends Certificate> certs;
+
+ System.out.println("generateCertificates(): " + testName);
+ certs = cf.generateCertificates(new ByteArrayInputStream(testData));
+
+ // Walk the certs Collection and do a comparison of subject names
+ int i = 0;
+ if (certs.size() == principals.length) {
+ for (Certificate crt : certs) {
+ X509Certificate xc = (X509Certificate)crt;
+ if (!xc.getSubjectX500Principal().equals(
+ principals[i])) {
+ throw new RuntimeException("Name mismatch: " +
+ "cert: " + xc.getSubjectX500Principal() +
+ ", expected: " + principals[i]);
+ }
+ i++;
+ }
+ } else {
+ throw new RuntimeException("Size mismatch: certs = " +
+ certs.size() + ", expected = " +
+ principals.length);
+ }
}
- throw new Exception("CertificateFactory.generateCertificate() did not "
- + "throw CertificateParsingException on invalid X.509 cert data");
+
+ @Override
+ public void failTest() throws GeneralSecurityException {
+ Throwable caughtException = null;
+ Collection<? extends Certificate> certs = null;
+
+ System.out.println("generateCertificates(): " + testName);
+ if (expectedException == null) {
+ throw new RuntimeException("failTest requires non-null " +
+ "expectedException");
+ }
+
+ try {
+ certs =
+ cf.generateCertificates(new ByteArrayInputStream(testData));
+ } catch (CertificateException ce) {
+ caughtException = ce;
+ }
+
+ if (caughtException != null) {
+ // It has to be the right kind of exception though...
+ if (!caughtException.getClass().equals(
+ expectedException.getClass())) {
+ System.err.println("Unexpected exception thrown. " +
+ "Received: " + caughtException + ", Expected: " +
+ expectedException.getClass());
+ throw new RuntimeException(caughtException);
+ }
+ } else {
+ // For a failure test, we'd expect some kind of exception
+ // to be thrown.
+ throw new RuntimeException("Failed to catch expected " +
+ "exception " + expectedException.getClass());
+ }
+ }
+ }
+
+ public static class GenSingleCertTest extends DecodeTest {
+ public GenSingleCertTest(String name, byte[] input, Throwable failType,
+ X500Principal... princs) throws CertificateException {
+ super(name, input, failType, princs);
+ }
+
+ @Override
+ public void passTest() throws GeneralSecurityException {
+ X509Certificate cert;
+
+ System.out.println("generateCertificate(): " + testName);
+ cert = (X509Certificate)cf.generateCertificate(
+ new ByteArrayInputStream(testData));
+
+ // Compare the cert's subject name against the expected value
+ // provided in the test. If multiple X500Principals were provided
+ // just use the first one as the expected value.
+ if (!cert.getSubjectX500Principal().equals(principals[0])) {
+ throw new RuntimeException("Name mismatch: " +
+ "cert: " + cert.getSubjectX500Principal() +
+ ", expected: " + principals[0]);
+ }
+ }
+
+ @Override
+ public void failTest() throws GeneralSecurityException {
+ Throwable caughtException = null;
+ X509Certificate cert = null;
+ System.out.println("generateCertificate(): " + testName);
+
+ if (expectedException == null) {
+ throw new RuntimeException("failTest requires non-null " +
+ "expectedException");
+ }
+
+ try {
+ cert = (X509Certificate)cf.generateCertificate(
+ new ByteArrayInputStream(testData));
+ } catch (CertificateException e) {
+ caughtException = e;
+ }
+
+ if (caughtException != null) {
+ // It has to be the right kind of exception though...
+ if (!caughtException.getClass().equals(
+ expectedException.getClass())) {
+ System.err.println("Unexpected exception thrown. " +
+ "Received: " + caughtException + ", Expected: " +
+ expectedException.getClass());
+ throw new RuntimeException(caughtException);
+ }
+ } else {
+ // For a failure test, we'd expect some kind of exception
+ // to be thrown.
+ throw new RuntimeException("Failed to catch expected " +
+ "exception " + expectedException.getClass());
+ }
+ }
+ }
+
+ public static class GenMultiCRLTest extends DecodeTest {
+ public GenMultiCRLTest(String name, byte[] input, Throwable failType,
+ X500Principal... princs) throws CertificateException {
+ super(name, input, failType, princs);
+ }
+
+ @Override
+ public void passTest() throws GeneralSecurityException {
+ Collection<? extends CRL> crls;
+
+ System.out.println("generateCRLs(): " + testName);
+ crls = cf.generateCRLs(new ByteArrayInputStream(testData));
+
+ // Walk the crls Collection and do a comparison of issuer names
+ int i = 0;
+ if (crls.size() == principals.length) {
+ for (CRL revlist : crls) {
+ X509CRL xc = (X509CRL)revlist;
+ if (!xc.getIssuerX500Principal().equals(principals[i])) {
+ throw new RuntimeException("Name mismatch: " +
+ "CRL: " + xc.getIssuerX500Principal() +
+ ", expected: " + principals[i]);
+ }
+ i++;
+ }
+ } else {
+ throw new RuntimeException("Size mismatch: crls = " +
+ crls.size() + ", expected = " +
+ principals.length);
+ }
+ }
+
+ @Override
+ public void failTest() throws GeneralSecurityException {
+ Throwable caughtException = null;
+ Collection<? extends CRL> crls = null;
+
+ System.out.println("generateCRLs(): " + testName);
+ if (expectedException == null) {
+ throw new RuntimeException("failTest requires non-null " +
+ "expectedException");
+ }
+
+ try {
+ crls =
+ cf.generateCRLs(new ByteArrayInputStream(testData));
+ } catch (CRLException e) {
+ caughtException = e;
+ }
+
+ if (caughtException != null) {
+ // It has to be the right kind of exception though...
+ if (!caughtException.getClass().equals(
+ expectedException.getClass())) {
+ System.err.println("Unexpected exception thrown. " +
+ "Received: " + caughtException + ", Expected: " +
+ expectedException.getClass());
+ throw new RuntimeException(caughtException);
+ }
+ } else {
+ // For a failure test, we'd expect some kind of exception
+ // to be thrown.
+ throw new RuntimeException("Failed to catch expected " +
+ "exception " + expectedException.getClass());
+ }
+ }
}
}
--- a/jdk/test/java/security/cert/CertificateFactory/invalidEncodedCerts/invalidcert.pem Thu Oct 16 12:01:56 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
------BEGIN CERTIFICATE-----
-XIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx
-EzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28xFTAT
-BgNVBAoTDEJFQSBXZWJMb2dpYzERMA8GA1UECxMIU2VjdXJpdHkxIzAhBgNVBAMT
-GkRlbW8gQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9zdXBw
-b3J0QGJlYS5jb20wHhcNMDAwNTMwMjEzODAxWhcNMDQwNTEzMjEzODAxWjCBjDEL
-MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
-cmFuY2lzY28xFTATBgNVBAoTDEJFQSBXZWJMb2dpYzEZMBcGA1UEAxMQd2VibG9n
-aWMuYmVhLmNvbTEeMBwGCSqGSIb3DQEJARYPc3VwcG9ydEBiZWEuY29tMFwwDQYJ
-KoZIhvcNAQEBBQADSwAwSAJBALdsXEHqKHgs6zj0hU5sXMAUHzoT8kgWXmNkKHXH
-79qbPh6EfdlriW9G/AbRF/pKrCQu7hhllAxREbqTuSlf2EMCAwEAATANBgkqhkiG
-9w0BAQQFAANBACgmqflL5m5LNeJGpWx9aIoABCiuDcpw1fFyegsqGX7CBhffcruS
-1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU=
------END CERTIFICATE-----
--- a/jdk/test/java/text/Format/DecimalFormat/TieRoundingTest.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/test/java/text/Format/DecimalFormat/TieRoundingTest.java Wed Jul 05 20:04:29 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/* @test
*
- * @bug 7131459
+ * @bug 7131459 8039915
* @summary test various situations of NumberFormat rounding when close to tie
* @author Olivier Lagneau
* @run main TieRoundingTest
@@ -56,7 +56,7 @@
if (!result.equals(expectedOutput)) {
System.out.println();
System.out.println("========================================");
- System.out.println("***Error formatting double value from string : " +
+ System.out.println("***Failure : error formatting value from string : " +
inputDigits);
System.out.println("NumberFormat pattern is : " +
((DecimalFormat ) nf).toPattern());
@@ -103,7 +103,7 @@
if (!result.equals(expectedOutput)) {
System.out.println();
System.out.println("========================================");
- System.out.println("***Error formatting double value from string : " +
+ System.out.println("***Failure : error formatting value from string : " +
inputDigits);
System.out.println("NumberFormat pattern is : " +
((DecimalFormat ) nf).toPattern());
@@ -144,7 +144,7 @@
if (!result.equals(expectedOutput)) {
System.out.println();
System.out.println("========================================");
- System.out.println("***Error formatting number value from string : " +
+ System.out.println("***Failure : error formatting value from string : " +
inputDigits);
System.out.println("NumberFormat pattern is : " +
((DecimalFormat ) nf).toPattern());
@@ -174,7 +174,7 @@
public static void main(String[] args) {
- // Only the 3 rounding modes below may be impacted by bug 7131459.
+ // The 3 HALF_* rounding modes are impacted by bugs 7131459, 8039915.
// So we do not test the other rounding modes.
RoundingMode[] roundingModes = {
RoundingMode.HALF_DOWN,
@@ -183,10 +183,14 @@
};
// Precise the relative position of input value against its closest tie.
+ // The double values tested below for 3 and 5 fractional digits must follow
+ // this scheme (position toward tie).
String[] tieRelativePositions = {
"below", "exact", "above",
"below", "exact", "above",
"below", "exact", "above",
+ "below", "above", "above",
+ "below", "below", "above",
"below", "exact", "above"
};
@@ -196,9 +200,13 @@
double[] values3FractDigits = {
// unimpacting values close to tie, with less than 3 input fract digits
1.115d, 1.125d, 1.135d,
- // impacting close to tie values covering all 6 cases
+ // HALF_* impacting close to tie values covering all 6 tie cases
0.3115d, 0.3125d, 0.3135d,
0.6865d, 0.6875d, 0.6885d,
+ // specific HALF_UP close to tie values
+ 0.3124d, 0.3126d, 0.3128d,
+ // specific HALF_DOWN close to tie values
+ 0.6864d, 0.6865d, 0.6868d,
// unimpacting values close to tie, with more than 3 input fract digits
1.46885d, 2.46875d, 1.46865d
};
@@ -207,6 +215,8 @@
"1.115d", "1.125d", "1.135d",
"0.3115d", "0.3125d", "0.3135d",
"0.6865d", "0.6875d", "0.6885d",
+ "0.3124d", "0.3126d", "0.3128d",
+ "0.6864d", "0.6865d", "0.6868d",
"1.46885d", "2.46875d", "1.46865d"
};
@@ -214,16 +224,22 @@
{"1.115", "1.125", "1.135",
"0.311", "0.312", "0.314",
"0.686", "0.687", "0.689",
+ "0.312", "0.313", "0.313",
+ "0.686", "0.686", "0.687",
"1.469", "2.469", "1.469"
},
{"1.115", "1.125", "1.135",
"0.311", "0.312", "0.314",
"0.686", "0.688", "0.689",
+ "0.312", "0.313", "0.313",
+ "0.686", "0.686", "0.687",
"1.469", "2.469", "1.469"
},
{"1.115", "1.125", "1.135",
"0.311", "0.313", "0.314",
"0.686", "0.688", "0.689",
+ "0.312", "0.313", "0.313",
+ "0.686", "0.686", "0.687",
"1.469", "2.469", "1.469"
},
};
@@ -250,9 +266,13 @@
double[] values5FractDigits = {
// unimpacting values close to tie, with less than 5 input fract digits
1.3135d, 1.3125d, 1.3115d,
- // impacting values close to tie, covering all 6 cases
+ // HALF_* impacting values close to tie, covering all 6 cases
1.328115d, 1.328125d, 1.328135d,
1.796865d, 1.796875d, 1.796885d,
+ // specific HALF_UP close to tie values
+ 1.328124d, 1.798876d, 1.796889d,
+ // specific HALF_DOWN close to tie values
+ 1.328114d, 1.796865d, 1.328138d,
// unimpacting values close to tie, with more than 5 input fract digits
1.3281149999999d, 1.75390625d, 1.7968750000001d
};
@@ -261,6 +281,8 @@
"1.3135d", "1.3125d", "1.3115d",
"1.328115d", "1.328125d", "1.328135d",
"1.796865d", "1.796875d", "1.796885d",
+ "1.328124d", "1.798876d", "1.796889d",
+ "1.328114d", "1.796865d", "1.328138d",
"1.3281149999999d", "1.75390625d", "1.7968750000001d"
};
@@ -268,16 +290,22 @@
{"1.3135", "1.3125", "1.3115",
"1.32811", "1.32812", "1.32814",
"1.79686", "1.79687", "1.79689",
+ "1.32812", "1.79888", "1.79689",
+ "1.32811", "1.79686", "1.32814",
"1.32811", "1.75391", "1.79688"
},
{"1.3135", "1.3125", "1.3115",
"1.32811", "1.32812", "1.32814",
"1.79686", "1.79688", "1.79689",
+ "1.32812", "1.79888", "1.79689",
+ "1.32811", "1.79686", "1.32814",
"1.32811", "1.75391", "1.79688"
},
{"1.3135", "1.3125", "1.3115",
"1.32811", "1.32813", "1.32814",
"1.79686", "1.79688", "1.79689",
+ "1.32812", "1.79888", "1.79689",
+ "1.32811", "1.79686", "1.32814",
"1.32811", "1.75391", "1.79688"
}
};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/concurrent/FutureTask/NegativeTimeout.java Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2014 Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * 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 8060052
+ * @summary FutureTask; fix underflow when timeout = Long.MIN_VALUE
+ * @author Chris Hegarty
+ */
+
+import java.util.concurrent.FutureTask;
+import java.util.concurrent.TimeoutException;
+import java.util.concurrent.TimeUnit;
+
+// If the bug exists the test will eventually be interrupted by the
+// test harness and fail with an InterruptedException, otherwise it
+// will throw a TimeoutException almost immediately and return silently.
+
+public class NegativeTimeout {
+ public static void main(String[] args) throws Exception {
+ FutureTask<Void> task = new FutureTask<>( () -> { return null; } );
+ try {
+ task.get(Long.MIN_VALUE, TimeUnit.NANOSECONDS);
+ } catch (TimeoutException success) {}
+ }
+}
+
--- a/jdk/test/java/util/zip/InterruptibleZip.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/test/java/util/zip/InterruptibleZip.java Wed Jul 05 20:04:29 2017 +0200
@@ -30,32 +30,14 @@
import java.util.zip.*;
public class InterruptibleZip {
- private static String rtJar() {
- String bcp = System.getProperty("sun.boot.class.path");
- for (String pathElement : bcp.split(File.pathSeparator)) {
- if (pathElement.endsWith(File.separator + "rt.jar") &&
- new File(pathElement).exists()) {
- System.out.println("rtJar="+pathElement);
- return pathElement;
- }
- if (pathElement.endsWith(File.separator + "classes") &&
- new File(pathElement).isDirectory()) {
- System.out.println("rt.jar not available");
- return null;
- }
- }
- throw new Error("Can't find rt.jar or classes directory");
- }
public static void main(String[] args) throws Exception {
/* Interrupt the current thread. The is.read call below
- should continue reading rt.jar.
+ should continue reading input.jar.
*/
- String rtJar = rtJar();
- if (rtJar == null) return;
Thread.currentThread().interrupt();
- ZipFile zf = new ZipFile(rtJar);
- ZipEntry ze = zf.getEntry("java/lang/Object.class");
+ ZipFile zf = new ZipFile(new File(System.getProperty("test.src", "."), "input.jar"));
+ ZipEntry ze = zf.getEntry("Available.java");
InputStream is = zf.getInputStream(ze);
byte[] buf = new byte[512];
int n = is.read(buf);
--- a/jdk/test/java/util/zip/ZipFile/FinalizeZipFile.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/test/java/util/zip/ZipFile/FinalizeZipFile.java Wed Jul 05 20:04:29 2017 +0200
@@ -51,12 +51,11 @@
private static void makeGarbage() throws Throwable {
final Random rnd = new Random();
- final String javaHome = System.getProperty("java.home");
// Create some ZipFiles.
- // Find some .jar files in JDK's lib directory.
- final File lib = new File(javaHome, "lib");
- check(lib.isDirectory());
- final File[] jars = lib.listFiles(
+ // Find some .jar files in test directory.
+ final File testdir = new File(System.getProperty("test.src", "."));
+ check(testdir.isDirectory());
+ final File[] jars = testdir.listFiles(
new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".jar");}});
--- a/jdk/test/javax/management/MBeanInfo/NotificationInfoTest.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/test/javax/management/MBeanInfo/NotificationInfoTest.java Wed Jul 05 20:04:29 2017 +0200
@@ -36,7 +36,6 @@
import java.lang.management.*;
import java.lang.reflect.*;
import java.net.*;
-import java.security.CodeSource;
import java.util.*;
import java.util.jar.*;
import javax.management.*;
@@ -83,27 +82,10 @@
System.out.println("Checking platform MBeans...");
checkPlatformMBeans();
- CodeSource cs =
- javax.management.MBeanServer.class.getProtectionDomain()
- .getCodeSource();
- URL codeBase;
- if (cs == null) {
- String javaHome = System.getProperty("java.home");
- String[] candidates = {"/lib/rt.jar", "/classes/"};
- codeBase = null;
- for (String candidate : candidates) {
- File file = new File(javaHome + candidate);
- if (file.exists()) {
- codeBase = file.toURI().toURL();
- break;
- }
- }
- if (codeBase == null) {
- throw new Exception(
- "Could not determine codeBase for java.home=" + javaHome);
- }
- } else
- codeBase = cs.getLocation();
+ URL codeBase = ClassLoader.getSystemResource("javax/management/MBeanServer.class");
+ if (codeBase == null) {
+ throw new Exception("Could not determine codeBase for " + MBeanServer.class);
+ }
System.out.println();
System.out.println("Looking for standard MBeans...");
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/naming/spi/providers/InitialContextTest.java Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,372 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * 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 javax.naming.Context;
+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.Function;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static java.lang.String.format;
+import static java.util.Arrays.asList;
+import static java.util.Collections.singleton;
+import static java.util.Collections.singletonMap;
+
+/*
+ * @test
+ * @bug 8044627
+ * @summary Examines different ways JNDI providers can hook up themselves and
+ * become available. Each case mimics the most straightforward way of
+ * executing scenarios.
+ */
+public class InitialContextTest {
+
+ public static void main(String[] args) throws Throwable {
+ unknownInitialContextFactory();
+ initialContextFactoryInAJar();
+ initialContextFactoryAsService();
+ }
+
+ private static void unknownInitialContextFactory() throws Throwable {
+
+ // This is a parameter of this test case, it should work for any value
+ // of it, provided a class with this FQN is not available in a runtime.
+ // So pick any name you like.
+ String factoryClassFqn =
+ "net.java.openjdk.test.UnknownInitialContextFactory";
+
+ Path tmp = Files.createDirectory(Paths.get("InitialContextTest-1"));
+
+ Path src = templatesHome().resolve("test.template");
+ Path dst = tmp.resolve("Test.java");
+ Files.copy(src, dst);
+
+ javac(tmp, dst);
+
+ Path build = Files.createDirectory(tmp.resolve("build"));
+ Files.copy(tmp.resolve("Test.class"), build.resolve("Test.class"));
+
+ Map<String, String> props
+ = singletonMap(Context.INITIAL_CONTEXT_FACTORY, factoryClassFqn);
+
+ Result r = java(props, singleton(build), "Test");
+
+ if (r.exitValue == 0 || !r.output.startsWith(
+ stackTraceStringForClassNotFound(factoryClassFqn))) {
+ throw new RuntimeException(
+ "Expected a different kind of failure: " + r.output);
+ }
+ }
+
+ private static String stackTraceStringForClassNotFound(String fqn) {
+ return String.format(
+ "Exception in thread \"main\" javax.naming.NoInitialContextException: "
+ + "Cannot instantiate class: %s "
+ + "[Root exception is java.lang.ClassNotFoundException: %s]",
+ fqn, fqn);
+ }
+
+ private static void initialContextFactoryInAJar() throws Throwable {
+
+ String factoryClassFqn =
+ "net.java.openjdk.test.DummyInitialContextFactory";
+
+ Path tmp = Files.createDirectory(Paths.get("InitialContextTest-2"));
+
+ Path src = templatesHome().resolve("test.template");
+ Path dst = tmp.resolve("Test.java");
+ Files.copy(src, dst);
+
+ Path dst1 = createFactoryFrom(templatesHome().resolve("factory.template"),
+ factoryClassFqn, tmp);
+
+ javac(tmp, dst);
+ Path explodedJar = Files.createDirectory(tmp.resolve("exploded-jar"));
+ javac(explodedJar, dst1);
+ jar(tmp.resolve("test.jar"), explodedJar);
+
+ Path build = Files.createDirectory(tmp.resolve("build"));
+ Files.copy(tmp.resolve("Test.class"), build.resolve("Test.class"));
+ Files.copy(tmp.resolve("test.jar"), build.resolve("test.jar"));
+
+ Map<String, String> props
+ = singletonMap(Context.INITIAL_CONTEXT_FACTORY, factoryClassFqn);
+
+ Result r = java(props, asList(build.resolve("test.jar"), build), "Test");
+
+ if (r.exitValue != 0 || !r.output.isEmpty())
+ throw new RuntimeException(r.output);
+ }
+
+
+ private static Path createFactoryFrom(Path srcTemplate,
+ String factoryFqn,
+ Path dstFolder) throws IOException {
+
+ String factorySimpleName, packageName;
+ int i = factoryFqn.lastIndexOf('.');
+ if (i < 0) {
+ packageName = "";
+ factorySimpleName = factoryFqn;
+ } else {
+ packageName = factoryFqn.substring(0, i);
+ factorySimpleName = factoryFqn.substring(i + 1);
+ }
+
+ Path result = dstFolder.resolve(factorySimpleName + ".java");
+ File dst = result.toFile();
+ File src = srcTemplate.toFile();
+ try (BufferedReader r = new BufferedReader(new FileReader(src));
+ BufferedWriter w = new BufferedWriter(new FileWriter(dst))) {
+
+ List<String> lines = processTemplate(packageName, factorySimpleName,
+ r.lines()).collect(Collectors.toList());
+
+ Iterator<String> it = lines.iterator();
+ if (it.hasNext())
+ w.write(it.next());
+ while (it.hasNext()) {
+ w.newLine();
+ w.write(it.next());
+ }
+ }
+ return result;
+ }
+
+ private static Stream<String> processTemplate(String packageName,
+ String factorySimpleName,
+ Stream<String> lines) {
+ Function<String, String> pckg;
+
+ if (packageName.isEmpty()) {
+ pckg = s -> s.contains("$package") ? "" : s;
+ } else {
+ pckg = s -> s.replaceAll("\\$package", packageName);
+ }
+
+ Function<String, String> factory
+ = s -> s.replaceAll("\\$factoryName", factorySimpleName);
+
+ return lines.map(pckg).map(factory);
+ }
+
+ private static void initialContextFactoryAsService() throws Throwable {
+
+ String factoryClassFqn =
+ "net.java.openjdk.test.BrokenInitialContextFactory";
+
+ Path tmp = Files.createDirectory(Paths.get("InitialContextTest-3"));
+
+ Path src = templatesHome().resolve("test.template");
+ Path dst = tmp.resolve("Test.java");
+ Files.copy(src, dst);
+
+ Path dst1 = createFactoryFrom(templatesHome().resolve("broken_factory.template"),
+ factoryClassFqn, tmp);
+
+ javac(tmp, dst);
+
+ Path explodedJar = Files.createDirectory(tmp.resolve("exploded-jar"));
+ Path services = Files.createDirectories(explodedJar.resolve("META-INF")
+ .resolve("services"));
+
+ Path s = services.resolve("javax.naming.spi.InitialContextFactory");
+ FileWriter fw = new FileWriter(s.toFile());
+ try {
+ fw.write(factoryClassFqn);
+ } finally {
+ fw.close();
+ }
+
+ javac(explodedJar, dst1);
+ jar(tmp.resolve("test.jar"), explodedJar);
+
+ Path build = Files.createDirectory(tmp.resolve("build"));
+ Files.copy(tmp.resolve("Test.class"), build.resolve("Test.class"));
+ Files.copy(tmp.resolve("test.jar"), build.resolve("test.jar"));
+
+ Map<String, String> props = new HashMap<>();
+ props.put("java.ext.dirs", build.toString());
+ props.put(Context.INITIAL_CONTEXT_FACTORY, factoryClassFqn);
+
+ Result r = java(props, singleton(build), "Test");
+
+ if (r.exitValue == 0 || !verifyOutput(r.output, factoryClassFqn))
+ throw new RuntimeException(r.output);
+ }
+
+ // IMO, that's the easiest way that gives you a fair amount of confidence in
+ // that j.u.ServiceLoader is loading a factory rather than Class.forName
+ private static boolean verifyOutput(String output, String fqn) {
+ String s1 = String.format(
+ "Exception in thread \"main\" javax.naming.NoInitialContextException: "
+ + "Cannot load initial context factory '%s' "
+ + "[Root exception is java.util.ServiceConfigurationError: "
+ + "javax.naming.spi.InitialContextFactory: "
+ + "Provider %s could not be instantiated]", fqn, fqn);
+
+ String s2 = String.format("Caused by: java.util.ServiceConfigurationError: "
+ + "javax.naming.spi.InitialContextFactory: "
+ + "Provider %s could not be instantiated", fqn);
+
+ String s3 = "Caused by: java.lang.RuntimeException: "
+ + "This is a broken factory. It is supposed to throw this exception.";
+
+ return output.startsWith(s1) && output.contains(s2)
+ && output.contains(s1);
+ }
+
+ private 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));
+ }
+
+ private static void javac(Path compilationOutput, Path... sourceFiles) {
+ String javac = getJDKTool("javac");
+ List<String> commands = new ArrayList<>();
+ commands.addAll(asList(javac, "-d", compilationOutput.toString()));
+ List<Path> paths = asList(sourceFiles);
+ commands.addAll(paths.stream()
+ .map(Path::toString)
+ .collect(Collectors.toList()));
+ quickFail(run(new ProcessBuilder(commands)));
+ }
+
+ private static void quickFail(Result r) {
+ if (r.exitValue != 0)
+ throw new RuntimeException(r.output);
+ }
+
+ private static Result java(Map<String, String> properties,
+ Collection<Path> classpath,
+ String classname) {
+
+ String java = getJDKTool("java");
+
+ List<String> commands = new ArrayList<>();
+ commands.add(java);
+ commands.addAll(properties.entrySet()
+ .stream()
+ .map(e -> "-D" + e.getKey() + "=" + e.getValue())
+ .collect(Collectors.toList()));
+
+ String cp = classpath.stream()
+ .map(Path::toString)
+ .collect(Collectors.joining(File.pathSeparator));
+ commands.add("-cp");
+ commands.add(cp);
+ commands.add(classname);
+
+ return run(new ProcessBuilder(commands));
+ }
+
+ private static Result run(ProcessBuilder b) {
+ Process p = null;
+ try {
+ p = b.start();
+ } catch (IOException e) {
+ throw new RuntimeException(
+ format("Couldn't start process '%s'", b.command()), e);
+ }
+
+ String output;
+ try {
+ output = toString(p.getInputStream(), p.getErrorStream());
+ } catch (IOException e) {
+ throw new RuntimeException(
+ format("Couldn't read process output '%s'", b.command()), e);
+ }
+
+ try {
+ p.waitFor();
+ } catch (InterruptedException e) {
+ throw new RuntimeException(
+ format("Process hasn't finished '%s'", b.command()), e);
+ }
+
+ return new Result(p.exitValue(), output);
+ }
+
+ private static String getJDKTool(String name) {
+ String testJdk = System.getProperty("test.jdk");
+ if (testJdk == null)
+ throw new RuntimeException("Please provide test.jdk property at a startup");
+ return testJdk + File.separator + "bin" + File.separator + name;
+ }
+
+ private static Path templatesHome() {
+ String testSrc = System.getProperty("test.src");
+ if (testSrc == null)
+ throw new RuntimeException("Please provide test.src property at a startup");
+ return Paths.get(testSrc);
+ }
+
+ private 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();
+ }
+
+ private 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) {
+ }
+ }
+ }
+ }
+
+ private static class Result {
+
+ final int exitValue;
+ final String output;
+
+ private Result(int exitValue, String output) {
+ this.exitValue = exitValue;
+ this.output = output;
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/naming/spi/providers/broken_factory.template Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,178 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * 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 javax.naming.*;
+import javax.naming.spi.InitialContextFactory;
+import java.util.Hashtable;
+
+public class $factoryName implements InitialContextFactory {
+
+ public $factoryName() {
+ throw new RuntimeException(
+ "This is a broken factory. It is supposed to throw this exception.");
+ }
+
+ @Override
+ public Context getInitialContext(Hashtable<?, ?> env) throws NamingException {
+ return new DummyInitialContext();
+ }
+
+ private class DummyInitialContext implements Context {
+
+ @Override
+ public Object lookup(Name name) {
+ return null;
+ }
+
+ @Override
+ public Object lookup(String name) {
+ return null;
+ }
+
+ @Override
+ public void bind(Name name, Object obj) {
+ }
+
+ @Override
+ public void bind(String name, Object obj) {
+ }
+
+ @Override
+ public void rebind(Name name, Object obj) {
+ }
+
+ @Override
+ public void rebind(String name, Object obj) {
+ }
+
+ @Override
+ public void unbind(Name name) {
+ }
+
+ @Override
+ public void unbind(String name) {
+ }
+
+ @Override
+ public void rename(Name oldName, Name newName) {
+ }
+
+ @Override
+ public void rename(String oldName, String newName) {
+ }
+
+ @Override
+ public NamingEnumeration<NameClassPair> list(Name name) {
+ return null;
+ }
+
+ @Override
+ public NamingEnumeration<NameClassPair> list(String name) {
+ return null;
+ }
+
+ @Override
+ public NamingEnumeration<Binding> listBindings(Name name) {
+ return null;
+ }
+
+ @Override
+ public NamingEnumeration<Binding> listBindings(String name) {
+ return null;
+ }
+
+ @Override
+ public void destroySubcontext(Name name) {
+ }
+
+ @Override
+ public void destroySubcontext(String name) {
+ }
+
+ @Override
+ public Context createSubcontext(Name name) {
+ return null;
+ }
+
+ @Override
+ public Context createSubcontext(String name) {
+ return null;
+ }
+
+ @Override
+ public Object lookupLink(Name name) {
+ return null;
+ }
+
+ @Override
+ public Object lookupLink(String name) {
+ return null;
+ }
+
+ @Override
+ public NameParser getNameParser(Name name) {
+ return null;
+ }
+
+ @Override
+ public NameParser getNameParser(String name) {
+ return null;
+ }
+
+ @Override
+ public Name composeName(Name name, Name prefix) {
+ return null;
+ }
+
+ @Override
+ public String composeName(String name, String prefix) {
+ return null;
+ }
+
+ @Override
+ public Object addToEnvironment(String propName, Object propVal) {
+ return null;
+ }
+
+ @Override
+ public Object removeFromEnvironment(String propName) {
+ return null;
+ }
+
+ @Override
+ public Hashtable<?, ?> getEnvironment() {
+ return null;
+ }
+
+ @Override
+ public void close() {
+ }
+
+ @Override
+ public String getNameInNamespace() {
+ return null;
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/naming/spi/providers/factory.template Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,173 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * 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 javax.naming.*;
+import javax.naming.spi.InitialContextFactory;
+import java.util.Hashtable;
+
+public class $factoryName implements InitialContextFactory {
+
+ @Override
+ public Context getInitialContext(Hashtable<?, ?> env) throws NamingException {
+ return new DummyInitialContext();
+ }
+
+ private class DummyInitialContext implements Context {
+
+ @Override
+ public Object lookup(Name name) {
+ return null;
+ }
+
+ @Override
+ public Object lookup(String name) {
+ return null;
+ }
+
+ @Override
+ public void bind(Name name, Object obj) {
+ }
+
+ @Override
+ public void bind(String name, Object obj) {
+ }
+
+ @Override
+ public void rebind(Name name, Object obj) {
+ }
+
+ @Override
+ public void rebind(String name, Object obj) {
+ }
+
+ @Override
+ public void unbind(Name name) {
+ }
+
+ @Override
+ public void unbind(String name) {
+ }
+
+ @Override
+ public void rename(Name oldName, Name newName) {
+ }
+
+ @Override
+ public void rename(String oldName, String newName) {
+ }
+
+ @Override
+ public NamingEnumeration<NameClassPair> list(Name name) {
+ return null;
+ }
+
+ @Override
+ public NamingEnumeration<NameClassPair> list(String name) {
+ return null;
+ }
+
+ @Override
+ public NamingEnumeration<Binding> listBindings(Name name) {
+ return null;
+ }
+
+ @Override
+ public NamingEnumeration<Binding> listBindings(String name) {
+ return null;
+ }
+
+ @Override
+ public void destroySubcontext(Name name) {
+ }
+
+ @Override
+ public void destroySubcontext(String name) {
+ }
+
+ @Override
+ public Context createSubcontext(Name name) {
+ return null;
+ }
+
+ @Override
+ public Context createSubcontext(String name) {
+ return null;
+ }
+
+ @Override
+ public Object lookupLink(Name name) {
+ return null;
+ }
+
+ @Override
+ public Object lookupLink(String name) {
+ return null;
+ }
+
+ @Override
+ public NameParser getNameParser(Name name) {
+ return null;
+ }
+
+ @Override
+ public NameParser getNameParser(String name) {
+ return null;
+ }
+
+ @Override
+ public Name composeName(Name name, Name prefix) {
+ return null;
+ }
+
+ @Override
+ public String composeName(String name, String prefix) {
+ return null;
+ }
+
+ @Override
+ public Object addToEnvironment(String propName, Object propVal) {
+ return null;
+ }
+
+ @Override
+ public Object removeFromEnvironment(String propName) {
+ return null;
+ }
+
+ @Override
+ public Hashtable<?, ?> getEnvironment() {
+ return null;
+ }
+
+ @Override
+ public void close() {
+ }
+
+ @Override
+ public String getNameInNamespace() {
+ return null;
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/naming/spi/providers/test.template Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * 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 javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import java.util.Properties;
+
+public class Test {
+
+ public static void main(String[] args) throws NamingException {
+ Properties env = System.getProperties();
+ Context ctx = new InitialContext(env);
+ try {
+ ctx.lookup("");
+ } finally {
+ ctx.close();
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/print/RegisterNullService.java Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * 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 8059219
+ * @summary Should not be able to register null service.
+ * @run main RegisterNullService
+*/
+
+import javax.print.PrintService;
+import javax.print.PrintServiceLookup;
+
+public class RegisterNullService {
+ public static void main (String [] args) throws RuntimeException {
+
+ boolean registered = PrintServiceLookup.registerService(null);
+ if (registered) {
+ throw new RuntimeException("Null service was registered");
+ }
+ PrintService[] services =
+ PrintServiceLookup.lookupPrintServices(null, null);
+ for (int i = 0; i < services.length; i++) {
+ if (services[i] == null) {
+ throw new RuntimeException("Null service found.");
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/sound/midi/MidiDeviceProvider/NullInfo.java Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * 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.util.Collection;
+import java.util.HashSet;
+
+import javax.sound.midi.MidiDevice;
+import javax.sound.midi.MidiSystem;
+import javax.sound.midi.MidiUnavailableException;
+import javax.sound.midi.spi.MidiDeviceProvider;
+
+import static java.util.ServiceLoader.load;
+
+/**
+ * @test
+ * @bug 8058115
+ * @summary MidiDeviceProvider shouldn't returns incorrect results or throw NPE
+ * in case of null MidiDevice.Info
+ * @author Sergey Bylokhov
+ */
+public final class NullInfo {
+
+ public static void main(final String[] args) {
+ // MidiSystem API
+ try {
+ MidiSystem.getMidiDevice(null);
+ throw new RuntimeException("IllegalArgumentException expected");
+ } catch (final MidiUnavailableException e) {
+ throw new RuntimeException("IllegalArgumentException expected", e);
+ } catch (final IllegalArgumentException ignored) {
+ // expected
+ }
+ // MidiDeviceProvider API
+ final Collection<String> errors = new HashSet<>();
+ for (final MidiDeviceProvider mdp : load(MidiDeviceProvider.class)) {
+ try {
+ if (mdp.isDeviceSupported(null)) {
+ throw new RuntimeException("null is supported");
+ }
+ final MidiDevice device = mdp.getDevice(null);
+ System.err.println("MidiDevice: " + device);
+ throw new RuntimeException("IllegalArgumentException expected");
+ } catch (final IllegalArgumentException e) {
+ errors.add(e.getMessage());
+ }
+ }
+ if (errors.size() != 1) {
+ throw new RuntimeException("Wrong number of messages:" + errors);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/sound/midi/MidiDeviceProvider/UnsupportedInfo.java Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * 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 javax.sound.midi.MidiDevice;
+import javax.sound.midi.MidiSystem;
+import javax.sound.midi.spi.MidiDeviceProvider;
+
+import static java.util.ServiceLoader.load;
+
+/**
+ * @test
+ * @bug 8058115
+ * @summary MidiDeviceProvider shouldn't returns incorrect results in case of
+ * unsupported MidiDevice.Info
+ * @author Sergey Bylokhov
+ */
+public final class UnsupportedInfo {
+
+ public static void main(final String[] args) {
+ final MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
+ for (final MidiDeviceProvider mdp : load(MidiDeviceProvider.class)) {
+ for (final MidiDevice.Info info : infos) {
+ if (mdp.isDeviceSupported(info)) {
+ if (mdp.getDevice(info) == null) {
+ throw new RuntimeException("MidiDevice is null");
+ }
+ } else {
+ try {
+ mdp.getDevice(info);
+ throw new RuntimeException(
+ "IllegalArgumentException expected");
+ } catch (final IllegalArgumentException ignored) {
+ // expected
+ }
+ }
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/text/NavigationFilter/8058305/bug8058305.java Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * 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 javax.swing.JFormattedTextField;
+import javax.swing.JFrame;
+import javax.swing.SwingConstants;
+import javax.swing.SwingUtilities;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.NavigationFilter;
+import javax.swing.text.Position;
+
+/*
+ * @test
+ * @bug 8058305
+ * @summary BadLocationException is not thrown by
+ * javax.swing.text.View.getNextVisualPositionFrom() for invalid positions
+ * @run main bug8058305
+ */
+public class bug8058305 {
+
+ public static void main(String[] args) throws Exception {
+ SwingUtilities.invokeAndWait(bug8058305::createAndShowGUI);
+ }
+
+ private static void createAndShowGUI() {
+ JFrame frame = new JFrame();
+
+ JFormattedTextField textField = new JFormattedTextField();
+ NavigationFilter navigationFilter = new NavigationFilter();
+ textField.setText("Test for Tests");
+ frame.getContentPane().add(textField);
+ frame.pack();
+
+ Position.Bias[] biasRet = {Position.Bias.Forward};
+ try {
+ navigationFilter.getNextVisualPositionFrom(textField, 100,
+ Position.Bias.Backward, SwingConstants.EAST, biasRet);
+ throw new RuntimeException("BadLocationException is not thrown!");
+ } catch (BadLocationException expectedException) {
+ }
+
+ frame.setVisible(true);
+
+ try {
+ navigationFilter.getNextVisualPositionFrom(textField, 200,
+ Position.Bias.Forward, SwingConstants.WEST, biasRet);
+ throw new RuntimeException("BadLocationException is not thrown!");
+ } catch (BadLocationException expectedException) {
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/TEST.properties Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,3 @@
+# This file identifies root(s) of the test-ng hierarchy.
+
+TestNG.dirs = .
--- a/jdk/test/javax/xml/jaxp/testng/validation/8037819/BaseTest.java Thu Oct 16 12:01:56 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,338 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import java.io.File;
-import java.net.URL;
-
-import javax.xml.XMLConstants;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.transform.Result;
-import javax.xml.transform.Source;
-import javax.xml.transform.dom.DOMResult;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.validation.Schema;
-import javax.xml.validation.SchemaFactory;
-import javax.xml.validation.Validator;
-
-
-import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl;
-import com.sun.org.apache.xerces.internal.impl.Constants;
-import com.sun.org.apache.xerces.internal.impl.xs.SchemaGrammar;
-import com.sun.org.apache.xerces.internal.xs.ElementPSVI;
-import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
-import com.sun.org.apache.xerces.internal.xs.XSElementDeclaration;
-import com.sun.org.apache.xerces.internal.xs.XSTypeDefinition;
-import javax.xml.transform.stream.StreamSource;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-public abstract class BaseTest {
- protected final static String ROOT_TYPE = Constants.XERCES_PROPERTY_PREFIX
- + Constants.ROOT_TYPE_DEFINITION_PROPERTY;
-
- protected final static String IGNORE_XSI_TYPE = Constants.XERCES_FEATURE_PREFIX
- + Constants.IGNORE_XSI_TYPE_FEATURE;
-
- protected final static String ID_IDREF_CHECKING = Constants.XERCES_FEATURE_PREFIX
- + Constants.ID_IDREF_CHECKING_FEATURE;
-
- protected final static String IDC_CHECKING = Constants.XERCES_FEATURE_PREFIX
- + Constants.IDC_CHECKING_FEATURE;
-
- protected final static String UNPARSED_ENTITY_CHECKING = Constants.XERCES_FEATURE_PREFIX
- + Constants.UNPARSED_ENTITY_CHECKING_FEATURE;
-
- protected final static String USE_GRAMMAR_POOL_ONLY = Constants.XERCES_FEATURE_PREFIX
- + Constants.USE_GRAMMAR_POOL_ONLY_FEATURE;
-
- protected final static String DYNAMIC_VALIDATION = Constants.XERCES_FEATURE_PREFIX
- + Constants.DYNAMIC_VALIDATION_FEATURE;
-
- protected final static String DOCUMENT_CLASS_NAME = Constants.XERCES_PROPERTY_PREFIX
- + Constants.DOCUMENT_CLASS_NAME_PROPERTY;
-
- protected Schema schema;
- protected Validator fValidator;
-
- protected SpecialCaseErrorHandler fErrorHandler;
-
- DocumentBuilder builder;
- protected Document fDocument;
-
- protected ElementPSVI fRootNode;
-
- protected URL fDocumentURL;
- protected String documentPath;
- protected String fDocumentId;
-
- static String errMessage;
-
- int passed = 0, failed = 0;
-
- public static boolean isWindows = false;
- static {
- if (System.getProperty("os.name").indexOf("Windows")>-1) {
- isWindows = true;
- }
- };
- public static final String USER_DIR = System.getProperty("user.dir", ".");
- public static final String BASE_DIR = System.getProperty("test.src", USER_DIR)
- .replaceAll("\\" + System.getProperty("file.separator"), "/");
-
- protected abstract String getSchemaFile();
-
- protected abstract String getXMLDocument();
-
- public BaseTest(String name) {
- fErrorHandler = new SpecialCaseErrorHandler(getRelevantErrorIDs());
- }
-
- protected void setUp() throws Exception {
-
- DocumentBuilderFactory docFactory = DocumentBuilderFactory
- .newInstance();
- docFactory.setAttribute(DOCUMENT_CLASS_NAME,
- "com.sun.org.apache.xerces.internal.dom.PSVIDocumentImpl");
- docFactory.setNamespaceAware(true);
- builder = docFactory.newDocumentBuilder();
-
- documentPath = BASE_DIR + "/" + getXMLDocument();
-System.out.println("documentPath:"+documentPath);
- if (isWindows) {
- fDocumentId = "file:/" + documentPath;
- } else {
- fDocumentId = "file:" + documentPath;
- }
- //fDocumentURL = ClassLoader.getSystemResource(documentPath);
- //fDocumentURL = getClass().getResource(documentPath);
-System.out.println("fDocumentId:"+fDocumentId);
-//System.out.println("fDocumentURL.toExternalForm:"+fDocumentURL.toExternalForm());
-/**
- if (fDocumentURL == null) {
- throw new FileNotFoundException("Couldn't find xml file for test: " + documentPath);
- }
- fDocument = builder.parse(fDocumentURL.toExternalForm());
- fRootNode = (ElementPSVI) fDocument.getDocumentElement();
- */
- SchemaFactory sf = SchemaFactory
- .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
- sf.setFeature(USE_GRAMMAR_POOL_ONLY, getUseGrammarPoolOnly());
- String schemaPath = BASE_DIR + "/" + getSchemaFile();
- /**
- URL schemaURL = ClassLoader.getSystemResource(schemaPath);
- if (schemaURL == null) {
- throw new FileNotFoundException("Couldn't find schema file for test: " + schemaPath);
- }
- */
- schema = sf.newSchema(new StreamSource(new File(schemaPath)));
- }
-
- protected void tearDown() throws Exception {
- fValidator = null;
- fDocument = null;
- fRootNode = null;
- fErrorHandler.reset();
- System.out.println("\nNumber of tests passed: " + passed);
- System.out.println("Number of tests failed: " + failed + "\n");
-
- if (errMessage != null) {
- throw new RuntimeException(errMessage);
- }
- }
-
- protected void validateDocument() throws Exception {
- Source source = new DOMSource(fDocument);
- source.setSystemId(fDocumentId);
- Result result = new DOMResult(fDocument);
- fValidator.validate(source, result);
- }
-
- protected void validateFragment() throws Exception {
- Source source = new DOMSource((Node) fRootNode);
- source.setSystemId(fDocumentId);
- Result result = new DOMResult((Node) fRootNode);
- fValidator.validate(source, result);
- }
-
- protected void reset() throws Exception {
- try {
-System.out.println("new File(documentPath)" + new File(documentPath));
-
- fDocument = builder.parse(new File(documentPath));
- fRootNode = (ElementPSVI) fDocument.getDocumentElement();
-System.out.println("fDocument" + fDocument);
-System.out.println("fRootNode" + fRootNode);
- fValidator = schema.newValidator();
- fErrorHandler.reset();
- fValidator.setErrorHandler(fErrorHandler);
- fValidator.setFeature(DYNAMIC_VALIDATION, false);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- protected PSVIElementNSImpl getChild(int n) {
- int numFound = 0;
- Node child = ((Node) fRootNode).getFirstChild();
- while (child != null) {
- if (child.getNodeType() == Node.ELEMENT_NODE) {
- numFound++;
- if (numFound == n) {
- return (PSVIElementNSImpl) child;
- }
- }
- child = child.getNextSibling();
- }
- return null;
- }
-
- protected String[] getRelevantErrorIDs() {
- return new String[] {};
- }
-
- protected boolean getUseGrammarPoolOnly() {
- return false;
- }
-
- // specialized asserts
-
- protected void assertValidity(short expectedValidity, short actualValidity) {
- String expectedString = expectedValidity == ItemPSVI.VALIDITY_VALID ? "valid"
- : (expectedValidity == ItemPSVI.VALIDITY_INVALID ? "invalid"
- : "notKnown");
- String actualString = actualValidity == ItemPSVI.VALIDITY_VALID ? "valid"
- : (actualValidity == ItemPSVI.VALIDITY_INVALID ? "invalid"
- : "notKnown");
- String message = "{validity} was <" + actualString
- + "> but it should have been <" + expectedString + ">";
- assertEquals(message, expectedValidity, actualValidity);
- }
-
- protected void assertValidationAttempted(short expectedAttempted,
- short actualAttempted) {
- String expectedString = expectedAttempted == ItemPSVI.VALIDATION_FULL ? "full"
- : (expectedAttempted == ItemPSVI.VALIDATION_PARTIAL ? "partial"
- : "none");
- String actualString = actualAttempted == ItemPSVI.VALIDATION_FULL ? "full"
- : (actualAttempted == ItemPSVI.VALIDATION_PARTIAL ? "partial"
- : "none");
- String message = "{validity} was <" + actualString
- + "> but it should have been <" + expectedString + ">";
- assertEquals(message, expectedAttempted, actualAttempted);
- }
-
- protected void assertElementName(String expectedName, String actualName) {
- assertEquals("Local name of element declaration is wrong.",
- expectedName, actualName);
- }
-
- protected void assertElementNull(XSElementDeclaration elem) {
- assertNull("Element declaration should be null.", elem);
- }
-
- protected void assertElementNamespace(String expectedName, String actualName) {
- assertEquals("Namespace of element declaration is wrong.",
- expectedName, actualName);
- }
-
- protected void assertElementNamespaceNull(String actualName) {
- assertNull("Local name of element declaration should be null.",
- actualName);
- }
-
- protected void assertTypeName(String expectedName, String actualName) {
- assertEquals("Local name of type definition is wrong.", expectedName,
- actualName);
- }
-
- protected void assertTypeNull(XSTypeDefinition type) {
- assertNull("Type definition should be null.", type);
- }
-
- protected void assertTypeNamespace(String expectedName, String actualName) {
- assertEquals("Namespace of type definition is wrong.", expectedName,
- actualName);
- }
-
- protected void assertTypeNamespaceNull(String actualName) {
- assertNull("Namespace of type definition should be null.", actualName);
- }
-
- protected void assertError(String error) {
- assertTrue("Error <" + error + "> should have occured, but did not.",
- fErrorHandler.specialCaseFound(error));
- }
-
- protected void assertNoError(String error) {
- assertFalse("Error <" + error
- + "> should not have occured (but it did)", fErrorHandler
- .specialCaseFound(error));
- }
-
- protected void assertAnyType(XSTypeDefinition type) {
- assertEquals("Type is supposed to be anyType", SchemaGrammar.fAnyType,
- type);
- }
-
- void assertEquals(String msg, Object expected, Object actual) {
- if (!expected.equals(actual)) {
- fail(msg + " Expected: " + expected + " Actual: " + actual);
- } else {
- success(null);
- }
- }
- void assertNull(String msg, Object value) {
- if (value != null) {
- fail(msg);
- } else {
- success(null);
- }
- }
- void assertTrue(String msg, boolean value) {
- if (!value) {
- fail(msg);
- } else {
- success(null);
- }
- }
- void assertFalse(String msg, boolean value) {
- if (value) {
- fail(msg);
- } else {
- success(null);
- }
- }
- void fail(String errMsg) {
- if (errMessage == null) {
- errMessage = errMsg;
- } else {
- errMessage = errMessage + "\n" + errMsg;
- }
- failed++;
- }
-
- void success(String msg) {
- passed++;
- System.out.println(msg);
- if (msg != null) {
- if (msg.length() != 0) {
- System.out.println(msg);
- }
- }
- }
-}
--- a/jdk/test/javax/xml/jaxp/testng/validation/8037819/BasicTest.java Thu Oct 16 12:01:56 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,82 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl;
-import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-public class BasicTest extends BaseTest {
-
- protected String getXMLDocument() {
- return "base.xml";
- }
-
- protected String getSchemaFile() {
- return "base.xsd";
- }
-
- public BasicTest(String name) {
- super(name);
- }
-
- @BeforeClass
- protected void setUp() throws Exception {
- super.setUp();
- }
-
- @AfterClass
- protected void tearDown() throws Exception {
- super.tearDown();
- }
-
- @Test
- public void testSimpleValidation() {
- try {
- reset();
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
- doValidityAsserts();
- }
-
- @Test
- public void testSimpleValidationWithTrivialXSIType() {
- try {
- reset();
- ((PSVIElementNSImpl) fRootNode).setAttributeNS(
- "http://www.w3.org/2001/XMLSchema-instance", "type", "X");
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
- doValidityAsserts();
- }
-
- private void doValidityAsserts() {
- assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
- .getValidationAttempted());
- assertElementName("A", fRootNode.getElementDeclaration().getName());
- assertElementNamespaceNull(fRootNode.getElementDeclaration()
- .getNamespace());
- assertTypeName("X", fRootNode.getTypeDefinition().getName());
- assertTypeNamespaceNull(fRootNode.getTypeDefinition().getNamespace());
- }
-}
--- a/jdk/test/javax/xml/jaxp/testng/validation/8037819/FixedAttrTest.java Thu Oct 16 12:01:56 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,81 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl;
-import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-/**
- * The purpose of this test is to execute all of the isComparable calls in
- * XMLSchemaValidator. There are two calls in processElementContent and two
- * calls in processOneAttribute.
- *
- * @author peterjm
- */
-public class FixedAttrTest extends BaseTest {
-
- protected String getXMLDocument() {
- return "fixedAttr.xml";
- }
-
- protected String getSchemaFile() {
- return "base.xsd";
- }
-
- public FixedAttrTest(String name) {
- super(name);
- }
-
- @BeforeClass
- protected void setUp() throws Exception {
- super.setUp();
- }
-
- @AfterClass
- protected void tearDown() throws Exception {
- super.tearDown();
- }
-
- @Test
- public void testDefault() {
- try {
- reset();
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
- .getValidationAttempted());
- assertElementName("A", fRootNode.getElementDeclaration().getName());
-
- PSVIElementNSImpl child = super.getChild(1);
- assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
- .getValidationAttempted());
- assertElementName("B", child.getElementDeclaration().getName());
-
- child = super.getChild(2);
- assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
- .getValidationAttempted());
- assertElementName("D", child.getElementDeclaration().getName());
- }
-}
--- a/jdk/test/javax/xml/jaxp/testng/validation/8037819/IdIdrefCheckingTest.java Thu Oct 16 12:01:56 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,160 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl;
-import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
-import org.xml.sax.SAXException;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-// duplicate IDs
-// reference to non-existent ID
-
-public class IdIdrefCheckingTest extends BaseTest {
- public static final String DUPLICATE_ID = "cvc-id.2";
-
- public static final String NO_ID_BINDING = "cvc-id.1";
-
- protected String getXMLDocument() {
- return "idIdref.xml";
- }
-
- protected String getSchemaFile() {
- return "base.xsd";
- }
-
- protected String[] getRelevantErrorIDs() {
- return new String[] { DUPLICATE_ID, NO_ID_BINDING };
- }
-
- public IdIdrefCheckingTest(String name) {
- super(name);
- }
-
- @BeforeClass
- protected void setUp() throws Exception {
- super.setUp();
- }
-
- @AfterClass
- protected void tearDown() throws Exception {
- super.tearDown();
- }
-
- @Test
- public void testDefault() {
- try {
- reset();
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkDefault();
- }
-
- @Test
- public void testSetFalse() {
- try {
- reset();
- fValidator.setFeature(ID_IDREF_CHECKING, false);
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkValidResult();
- }
-
- @Test
- public void testSetTrue() {
- try {
- reset();
- fValidator.setFeature(ID_IDREF_CHECKING, true);
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkDefault();
- }
-
- private void checkDefault() {
- assertError(DUPLICATE_ID);
- assertError(NO_ID_BINDING);
-
- assertValidity(ItemPSVI.VALIDITY_INVALID, fRootNode.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
- .getValidationAttempted());
- assertElementName("A", fRootNode.getElementDeclaration().getName());
- assertTypeName("X", fRootNode.getTypeDefinition().getName());
-
- PSVIElementNSImpl child = super.getChild(1);
- assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
- .getValidationAttempted());
- assertElementName("A", child.getElementDeclaration().getName());
- assertTypeName("idType", child.getTypeDefinition().getName());
-
- child = super.getChild(2);
- assertValidity(ItemPSVI.VALIDITY_INVALID, child.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
- .getValidationAttempted());
- assertElementName("A", child.getElementDeclaration().getName());
- assertTypeName("idType", child.getTypeDefinition().getName());
-
- child = super.getChild(3);
- assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
- .getValidationAttempted());
- assertElementName("A", child.getElementDeclaration().getName());
- assertTypeName("idrefType", child.getTypeDefinition().getName());
- }
-
- private void checkValidResult() {
- assertNoError(DUPLICATE_ID);
- assertNoError(NO_ID_BINDING);
-
- assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
- .getValidationAttempted());
- assertElementName("A", fRootNode.getElementDeclaration().getName());
- assertTypeName("X", fRootNode.getTypeDefinition().getName());
-
- PSVIElementNSImpl child = super.getChild(1);
- assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
- .getValidationAttempted());
- assertElementName("A", child.getElementDeclaration().getName());
- assertTypeName("idType", child.getTypeDefinition().getName());
-
- child = super.getChild(2);
- assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
- .getValidationAttempted());
- assertElementName("A", child.getElementDeclaration().getName());
- assertTypeName("idType", child.getTypeDefinition().getName());
-
- child = super.getChild(3);
- assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
- .getValidationAttempted());
- assertElementName("A", child.getElementDeclaration().getName());
- assertTypeName("idrefType", child.getTypeDefinition().getName());
- }
-}
--- a/jdk/test/javax/xml/jaxp/testng/validation/8037819/IdentityConstraintCheckingTest.java Thu Oct 16 12:01:56 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,186 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl;
-import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
-import org.xml.sax.SAXException;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-public class IdentityConstraintCheckingTest extends BaseTest {
- // These values are unstable, since they're not actually error keys, but
- // simply
- // the first part of the error message.
- public static final String DUPLICATE_UNIQUE = "cvc-identity-constraint.4.1";
-
- public static final String DUPLICATE_KEY = "cvc-identity-constraint.4.2.2";
-
- public static final String INVALID_KEYREF = "cvc-identity-constraint.4.3";
-
- protected String getXMLDocument() {
- return "idc.xml";
- }
-
- protected String getSchemaFile() {
- return "idc.xsd";
- }
-
- protected String[] getRelevantErrorIDs() {
- return new String[] { DUPLICATE_UNIQUE, DUPLICATE_KEY, INVALID_KEYREF };
- }
-
- public IdentityConstraintCheckingTest(String name) {
- super(name);
- }
-
- @BeforeClass
- protected void setUp() throws Exception {
- super.setUp();
- }
-
- @AfterClass
- protected void tearDown() throws Exception {
- super.tearDown();
- }
-
- @Test
- public void testDefault() {
- try {
- reset();
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkDefault();
- }
-
- @Test
- public void testSetFalse() {
- try {
- reset();
- fValidator.setFeature(IDC_CHECKING, false);
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkValidResult();
- }
-
- @Test
- public void testSetTrue() {
- try {
- reset();
- fValidator.setFeature(IDC_CHECKING, true);
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkDefault();
- }
-
- private void checkDefault() {
- assertError(DUPLICATE_UNIQUE);
- assertError(DUPLICATE_KEY);
- assertError(INVALID_KEYREF);
-
- assertValidity(ItemPSVI.VALIDITY_INVALID, fRootNode.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
- .getValidationAttempted());
- assertElementName("itemList", fRootNode.getElementDeclaration()
- .getName());
- assertTypeName("itemListType", fRootNode.getTypeDefinition().getName());
-
- // this one is valid because it's the first one to define the unique
- // value
- PSVIElementNSImpl child = super.getChild(1);
- assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
- .getValidationAttempted());
- assertElementName("item", child.getElementDeclaration().getName());
- assertTypeName("itemType", child.getTypeDefinition().getName());
-
- // invalid because it repeats the unique value
- child = super.getChild(2);
- assertValidity(ItemPSVI.VALIDITY_INVALID, child.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
- .getValidationAttempted());
- assertElementName("item", child.getElementDeclaration().getName());
- assertTypeName("itemType", child.getTypeDefinition().getName());
-
- // invalid because it repeats the key
- child = super.getChild(3);
- assertValidity(ItemPSVI.VALIDITY_INVALID, child.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
- .getValidationAttempted());
- assertElementName("item", child.getElementDeclaration().getName());
- assertTypeName("itemType", child.getTypeDefinition().getName());
-
- // valid because key references aren't figured out until the validation
- // root
- child = super.getChild(4);
- assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
- .getValidationAttempted());
- assertElementName("itemRef", child.getElementDeclaration().getName());
- assertTypeName("string", child.getTypeDefinition().getName());
- }
-
- private void checkValidResult() {
- assertNoError(DUPLICATE_UNIQUE);
- assertNoError(DUPLICATE_KEY);
- assertNoError(INVALID_KEYREF);
-
- assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
- .getValidationAttempted());
- assertElementName("itemList", fRootNode.getElementDeclaration()
- .getName());
- assertTypeName("itemListType", fRootNode.getTypeDefinition().getName());
-
- PSVIElementNSImpl child = super.getChild(1);
- assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
- .getValidationAttempted());
- assertElementName("item", child.getElementDeclaration().getName());
- assertTypeName("itemType", child.getTypeDefinition().getName());
-
- child = super.getChild(2);
- assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
- .getValidationAttempted());
- assertElementName("item", child.getElementDeclaration().getName());
- assertTypeName("itemType", child.getTypeDefinition().getName());
-
- child = super.getChild(3);
- assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
- .getValidationAttempted());
- assertElementName("item", child.getElementDeclaration().getName());
- assertTypeName("itemType", child.getTypeDefinition().getName());
-
- child = super.getChild(4);
- assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
- .getValidationAttempted());
- assertElementName("itemRef", child.getElementDeclaration().getName());
- assertTypeName("string", child.getTypeDefinition().getName());
- }
-}
--- a/jdk/test/javax/xml/jaxp/testng/validation/8037819/IgnoreXSITypeTest_A_A.java Thu Oct 16 12:01:56 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,151 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl;
-import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-public class IgnoreXSITypeTest_A_A extends BaseTest {
-
- protected String getXMLDocument() {
- return "xsitype_A_A.xml";
- }
-
- protected String getSchemaFile() {
- return "base.xsd";
- }
-
- public IgnoreXSITypeTest_A_A(String name) {
- super(name);
- }
-
- @BeforeClass
- protected void setUp() throws Exception {
- super.setUp();
- }
-
- @AfterClass
- protected void tearDown() throws Exception {
- super.tearDown();
- }
-
- @Test
- public void testDefaultDocument() {
- try {
- reset();
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- // default value of the feature is false
- checkFalseResult();
- }
-
- @Test
- public void testDefaultFragment() {
- try {
- reset();
- validateFragment();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- // default value of the feature is false
- checkFalseResult();
- }
-
- @Test
- public void testSetFalseDocument() {
- try {
- reset();
- fValidator.setFeature(IGNORE_XSI_TYPE, false);
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkFalseResult();
- }
-
- @Test
- public void testSetFalseFragment() {
- try {
- reset();
- fValidator.setFeature(IGNORE_XSI_TYPE, false);
- validateFragment();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkFalseResult();
- }
-
- @Test
- public void testSetTrueDocument() {
- try {
- reset();
- fValidator.setFeature(IGNORE_XSI_TYPE, true);
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkTrueResult();
- }
-
- @Test
- public void testSetTrueFragment() {
- try {
- reset();
- fValidator.setFeature(IGNORE_XSI_TYPE, true);
- validateFragment();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkTrueResult();
- }
-
- private void checkTrueResult() {
- checkResult();
- }
-
- private void checkFalseResult() {
- checkResult();
- }
-
- private void checkResult() {
- assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
- .getValidationAttempted());
- assertElementName("A", fRootNode.getElementDeclaration().getName());
- assertTypeName("Y", fRootNode.getTypeDefinition().getName());
- assertTypeNamespaceNull(fRootNode.getTypeDefinition().getNamespace());
-
- PSVIElementNSImpl child = super.getChild(1);
- assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
- .getValidationAttempted());
- assertElementName("A", child.getElementDeclaration().getName());
- assertTypeName("Y", child.getTypeDefinition().getName());
- assertTypeNamespaceNull(child.getTypeDefinition().getNamespace());
- }
-}
--- a/jdk/test/javax/xml/jaxp/testng/validation/8037819/IgnoreXSITypeTest_A_C.java Thu Oct 16 12:01:56 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,151 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl;
-import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-public class IgnoreXSITypeTest_A_C extends BaseTest {
-
- protected String getXMLDocument() {
- return "xsitype_A_C.xml";
- }
-
- protected String getSchemaFile() {
- return "base.xsd";
- }
-
- public IgnoreXSITypeTest_A_C(String name) {
- super(name);
- }
-
-
- @BeforeClass
- protected void setUp() throws Exception {
- super.setUp();
- }
-
- @AfterClass
- protected void tearDown() throws Exception {
- super.tearDown();
- }
-
- @Test
- public void testDefaultDocument() {
- try {
- reset();
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- // default value of the feature is false
- checkFalseResult();
- }
-
- @Test
- public void testDefaultFragment() {
- try {
- reset();
- validateFragment();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- // default value of the feature is false
- checkFalseResult();
- }
-
- @Test
- public void testSetFalseDocument() {
- try {
- reset();
- fValidator.setFeature(IGNORE_XSI_TYPE, false);
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkFalseResult();
- }
-
- @Test
- public void testSetFalseFragment() {
- try {
- reset();
- fValidator.setFeature(IGNORE_XSI_TYPE, false);
- validateFragment();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkFalseResult();
- }
-
- @Test
- public void testSetTrueDocument() {
- try {
- reset();
- fValidator.setFeature(IGNORE_XSI_TYPE, true);
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkTrueResult();
- }
-
- @Test
- public void testSetTrueFragment() {
- try {
- reset();
- fValidator.setFeature(IGNORE_XSI_TYPE, true);
- validateFragment();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkTrueResult();
- }
-
- private void checkTrueResult() {
- checkResult();
- }
-
- private void checkFalseResult() {
- checkResult();
- }
-
- private void checkResult() {
- assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
- .getValidationAttempted());
- assertElementName("A", fRootNode.getElementDeclaration().getName());
- assertTypeName("Y", fRootNode.getTypeDefinition().getName());
- assertTypeNamespaceNull(fRootNode.getTypeDefinition().getNamespace());
-
- PSVIElementNSImpl child = super.getChild(1);
- assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
- .getValidationAttempted());
- assertElementNull(child.getElementDeclaration());
- assertTypeName("Y", child.getTypeDefinition().getName());
- assertTypeNamespaceNull(child.getTypeDefinition().getNamespace());
- }
-}
--- a/jdk/test/javax/xml/jaxp/testng/validation/8037819/IgnoreXSITypeTest_C_A.java Thu Oct 16 12:01:56 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,157 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl;
-import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-public class IgnoreXSITypeTest_C_A extends BaseTest {
-
- protected String getXMLDocument() {
- return "xsitype_C_A.xml";
- }
-
- protected String getSchemaFile() {
- return "base.xsd";
- }
-
- public IgnoreXSITypeTest_C_A(String name) {
- super(name);
- }
-
-
- @BeforeClass
- protected void setUp() throws Exception {
- super.setUp();
- }
-
- @AfterClass
- protected void tearDown() throws Exception {
- super.tearDown();
- }
-
- @Test
- public void testDefaultDocument() {
- try {
- reset();
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- // default value of the feature is false
- checkFalseResult();
- }
-
- @Test
- public void testDefaultFragment() {
- try {
- reset();
- validateFragment();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- // default value of the feature is false
- checkFalseResult();
- }
-
- @Test
- public void testSetFalseDocument() {
- try {
- reset();
- fValidator.setFeature(IGNORE_XSI_TYPE, false);
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkFalseResult();
- }
-
- @Test
- public void testSetFalseFragment() {
- try {
- reset();
- fValidator.setFeature(IGNORE_XSI_TYPE, false);
- validateFragment();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkFalseResult();
- }
-
- @Test
- public void testSetTrueDocument() {
- try {
- reset();
- fValidator.setFeature(IGNORE_XSI_TYPE, true);
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkTrueResult();
- }
-
- @Test
- public void testSetTrueFragment() {
- try {
- reset();
- fValidator.setFeature(IGNORE_XSI_TYPE, true);
- validateFragment();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkTrueResult();
- }
-
- private void checkTrueResult() {
- assertValidity(ItemPSVI.VALIDITY_NOTKNOWN, fRootNode.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_PARTIAL, fRootNode
- .getValidationAttempted());
- assertElementNull(fRootNode.getElementDeclaration());
- assertAnyType(fRootNode.getTypeDefinition());
-
- checkChild();
- }
-
- private void checkFalseResult() {
- assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
- .getValidationAttempted());
- assertElementNull(fRootNode.getElementDeclaration());
- assertTypeName("Y", fRootNode.getTypeDefinition().getName());
- assertTypeNamespaceNull(fRootNode.getTypeDefinition().getNamespace());
-
- checkChild();
- }
-
- private void checkChild() {
- PSVIElementNSImpl child = super.getChild(1);
- assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
- .getValidationAttempted());
- assertElementName("A", child.getElementDeclaration().getName());
- assertTypeName("Y", child.getTypeDefinition().getName());
- assertTypeNamespaceNull(child.getTypeDefinition().getNamespace());
- }
-}
--- a/jdk/test/javax/xml/jaxp/testng/validation/8037819/IgnoreXSITypeTest_C_AC.java Thu Oct 16 12:01:56 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,174 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl;
-import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-public class IgnoreXSITypeTest_C_AC extends BaseTest {
-
- protected String getXMLDocument() {
- return "xsitype_C_AC.xml";
- }
-
- protected String getSchemaFile() {
- return "base.xsd";
- }
-
- public IgnoreXSITypeTest_C_AC(String name) {
- super(name);
- }
-
-
- @BeforeClass
- protected void setUp() throws Exception {
- super.setUp();
- }
-
- @AfterClass
- protected void tearDown() throws Exception {
- super.tearDown();
- }
-
- @Test
- public void testDefaultDocument() {
- try {
- reset();
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- // default value of the feature is false
- checkFalseResult();
- }
-
- @Test
- public void testDefaultFragment() {
- try {
- reset();
- validateFragment();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- // default value of the feature is false
- checkFalseResult();
- }
-
- @Test
- public void testSetFalseDocument() {
- try {
- reset();
- fValidator.setFeature(IGNORE_XSI_TYPE, false);
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkFalseResult();
- }
-
- @Test
- public void testSetFalseFragment() {
- try {
- reset();
- fValidator.setFeature(IGNORE_XSI_TYPE, false);
- validateFragment();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkFalseResult();
- }
-
- @Test
- public void testSetTrueDocument() {
- try {
- reset();
- fValidator.setFeature(IGNORE_XSI_TYPE, true);
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkTrueResult();
- }
-
- @Test
- public void testSetTrueFragment() {
- try {
- reset();
- fValidator.setFeature(IGNORE_XSI_TYPE, true);
- validateFragment();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkTrueResult();
- }
-
- private void checkTrueResult() {
- assertValidity(ItemPSVI.VALIDITY_NOTKNOWN, fRootNode.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_PARTIAL, fRootNode
- .getValidationAttempted());
- assertElementNull(fRootNode.getElementDeclaration());
- assertAnyType(fRootNode.getTypeDefinition());
-
- PSVIElementNSImpl child = super.getChild(1);
- assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
- .getValidationAttempted());
- assertElementName("A", child.getElementDeclaration().getName());
- assertTypeName("Y", child.getTypeDefinition().getName());
- assertTypeNamespaceNull(child.getTypeDefinition().getNamespace());
-
- child = super.getChild(2);
- assertValidity(ItemPSVI.VALIDITY_NOTKNOWN, child.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_NONE, child
- .getValidationAttempted());
- assertElementNull(child.getElementDeclaration());
- assertAnyType(child.getTypeDefinition());
- }
-
- private void checkFalseResult() {
- assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
- .getValidationAttempted());
- assertElementNull(fRootNode.getElementDeclaration());
- assertTypeName("Y", fRootNode.getTypeDefinition().getName());
- assertTypeNamespaceNull(fRootNode.getTypeDefinition().getNamespace());
-
- PSVIElementNSImpl child = super.getChild(1);
- assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
- .getValidationAttempted());
- assertElementName("A", child.getElementDeclaration().getName());
- assertTypeName("Y", child.getTypeDefinition().getName());
- assertTypeNamespaceNull(child.getTypeDefinition().getNamespace());
-
- child = super.getChild(2);
- assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
- .getValidationAttempted());
- assertElementNull(child.getElementDeclaration());
- assertTypeName("Y", child.getTypeDefinition().getName());
- assertTypeNamespaceNull(child.getTypeDefinition().getNamespace());
- }
-}
--- a/jdk/test/javax/xml/jaxp/testng/validation/8037819/IgnoreXSITypeTest_C_C.java Thu Oct 16 12:01:56 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,158 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl;
-import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-public class IgnoreXSITypeTest_C_C extends BaseTest {
-
- protected String getXMLDocument() {
- return "xsitype_C_C.xml";
- }
-
- protected String getSchemaFile() {
- return "base.xsd";
- }
-
- public IgnoreXSITypeTest_C_C(String name) {
- super(name);
- }
-
-
- @BeforeClass
- protected void setUp() throws Exception {
- super.setUp();
- }
-
- @AfterClass
- protected void tearDown() throws Exception {
- super.tearDown();
- }
-
- @Test
- public void testDefaultDocument() {
- try {
- reset();
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- // default value of the feature is false
- checkFalseResult();
- }
-
- @Test
- public void testDefaultFragment() {
- try {
- reset();
- validateFragment();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- // default value of the feature is false
- checkFalseResult();
- }
-
- @Test
- public void testSetFalseDocument() {
- try {
- reset();
- fValidator.setFeature(IGNORE_XSI_TYPE, false);
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkFalseResult();
- }
-
- @Test
- public void testSetFalseFragment() {
- try {
- reset();
- fValidator.setFeature(IGNORE_XSI_TYPE, false);
- validateFragment();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkFalseResult();
- }
-
- @Test
- public void testSetTrueDocument() {
- try {
- reset();
- fValidator.setFeature(IGNORE_XSI_TYPE, true);
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkTrueResult();
- }
-
- @Test
- public void testSetTrueFragment() {
- try {
- reset();
- fValidator.setFeature(IGNORE_XSI_TYPE, true);
- validateFragment();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkTrueResult();
- }
-
- private void checkTrueResult() {
- assertValidity(ItemPSVI.VALIDITY_NOTKNOWN, fRootNode.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_NONE, fRootNode
- .getValidationAttempted());
- assertElementNull(fRootNode.getElementDeclaration());
- assertAnyType(fRootNode.getTypeDefinition());
-
- PSVIElementNSImpl child = super.getChild(1);
- assertValidity(ItemPSVI.VALIDITY_NOTKNOWN, child.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_NONE, child
- .getValidationAttempted());
- assertElementNull(child.getElementDeclaration());
- assertAnyType(child.getTypeDefinition());
- }
-
- private void checkFalseResult() {
- assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
- .getValidationAttempted());
- assertElementNull(fRootNode.getElementDeclaration());
- assertTypeName("Y", fRootNode.getTypeDefinition().getName());
- assertTypeNamespaceNull(fRootNode.getTypeDefinition().getNamespace());
-
- PSVIElementNSImpl child = super.getChild(1);
- assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
- .getValidationAttempted());
- assertElementNull(child.getElementDeclaration());
- assertTypeName("Y", child.getTypeDefinition().getName());
- assertTypeNamespaceNull(child.getTypeDefinition().getNamespace());
- }
-}
--- a/jdk/test/javax/xml/jaxp/testng/validation/8037819/IgnoreXSITypeTest_C_CA.java Thu Oct 16 12:01:56 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,173 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl;
-import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-public class IgnoreXSITypeTest_C_CA extends BaseTest {
-
- protected String getXMLDocument() {
- return "xsitype_C_CA.xml";
- }
-
- protected String getSchemaFile() {
- return "base.xsd";
- }
-
- public IgnoreXSITypeTest_C_CA(String name) {
- super(name);
- }
-
- @BeforeClass
- protected void setUp() throws Exception {
- super.setUp();
- }
-
- @AfterClass
- protected void tearDown() throws Exception {
- super.tearDown();
- }
-
- @Test
- public void testDefaultDocument() {
- try {
- reset();
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- // default value of the feature is false
- checkFalseResult();
- }
-
- @Test
- public void testDefaultFragment() {
- try {
- reset();
- validateFragment();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- // default value of the feature is false
- checkFalseResult();
- }
-
- @Test
- public void testSetFalseDocument() {
- try {
- reset();
- fValidator.setFeature(IGNORE_XSI_TYPE, false);
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkFalseResult();
- }
-
- @Test
- public void testSetFalseFragment() {
- try {
- reset();
- fValidator.setFeature(IGNORE_XSI_TYPE, false);
- validateFragment();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkFalseResult();
- }
-
- @Test
- public void testSetTrueDocument() {
- try {
- reset();
- fValidator.setFeature(IGNORE_XSI_TYPE, true);
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkTrueResult();
- }
-
- @Test
- public void testSetTrueFragment() {
- try {
- reset();
- fValidator.setFeature(IGNORE_XSI_TYPE, true);
- validateFragment();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkTrueResult();
- }
-
- private void checkTrueResult() {
- assertValidity(ItemPSVI.VALIDITY_NOTKNOWN, fRootNode.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_PARTIAL, fRootNode
- .getValidationAttempted());
- assertElementNull(fRootNode.getElementDeclaration());
- assertAnyType(fRootNode.getTypeDefinition());
-
- PSVIElementNSImpl child = super.getChild(1);
- assertValidity(ItemPSVI.VALIDITY_NOTKNOWN, child.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_NONE, child
- .getValidationAttempted());
- assertElementNull(child.getElementDeclaration());
- assertAnyType(child.getTypeDefinition());
-
- child = super.getChild(2);
- assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
- .getValidationAttempted());
- assertElementName("A", child.getElementDeclaration().getName());
- assertTypeName("Y", child.getTypeDefinition().getName());
- assertTypeNamespaceNull(child.getTypeDefinition().getNamespace());
- }
-
- private void checkFalseResult() {
- assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
- .getValidationAttempted());
- assertElementNull(fRootNode.getElementDeclaration());
- assertTypeName("Y", fRootNode.getTypeDefinition().getName());
- assertTypeNamespaceNull(fRootNode.getTypeDefinition().getNamespace());
-
- PSVIElementNSImpl child = super.getChild(1);
- assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
- .getValidationAttempted());
- assertElementNull(child.getElementDeclaration());
- assertTypeName("Y", child.getTypeDefinition().getName());
- assertTypeNamespaceNull(child.getTypeDefinition().getNamespace());
-
- child = super.getChild(2);
- assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
- .getValidationAttempted());
- assertElementName("A", child.getElementDeclaration().getName());
- assertTypeName("Y", child.getTypeDefinition().getName());
- assertTypeNamespaceNull(child.getTypeDefinition().getNamespace());
- }
-}
--- a/jdk/test/javax/xml/jaxp/testng/validation/8037819/RootTypeDefinitionTest.java Thu Oct 16 12:01:56 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,235 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import javax.xml.namespace.QName;
-import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl;
-import com.sun.org.apache.xerces.internal.impl.xs.SchemaSymbols;
-import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-public class RootTypeDefinitionTest extends BaseTest {
- private QName unknownType;
-
- private QName typeX;
-
- private QName typeY;
-
- private QName typeZ;
-
- private QName typeOtherNamespace;
-
- private final static String UNKNOWN_TYPE_ERROR = "cvc-type.1";
-
- private final static String INVALID_DERIVATION_ERROR = "cvc-elt.4.3";
-
- protected String getXMLDocument() {
- return "base.xml";
- }
-
- protected String getSchemaFile() {
- return "base.xsd";
- }
-
- protected String[] getRelevantErrorIDs() {
- return new String[] { UNKNOWN_TYPE_ERROR, INVALID_DERIVATION_ERROR };
- }
-
- public RootTypeDefinitionTest(String name) {
- super(name);
- unknownType = new QName("W");
- typeX = new QName("X");
- typeY = new QName("Y");
- typeZ = new QName("Z");
- typeOtherNamespace = new QName("xslt.unittests", "W", "unit");
- }
-
-
- @BeforeClass
- protected void setUp() throws Exception {
- super.setUp();
- }
-
- @AfterClass
- protected void tearDown() throws Exception {
- super.tearDown();
- }
-
- @Test
- public void testDefault() {
- try {
- reset();
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkDefault();
- }
-
- @Test
- public void testSettingNull() {
- try {
- reset();
- fValidator.setProperty(ROOT_TYPE, null);
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkDefault();
- }
-
- @Test
- public void testSettingToUnknownType() {
- try {
- reset();
- fValidator.setProperty(ROOT_TYPE, unknownType);
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- assertError(UNKNOWN_TYPE_ERROR);
- checkDefault();
- }
-
- @Test
- public void testSettingToEqualType() {
- try {
- reset();
- fValidator.setProperty(ROOT_TYPE, typeX);
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
- .getValidationAttempted());
- assertElementNull(fRootNode.getElementDeclaration());
- assertTypeName("X", fRootNode.getTypeDefinition().getName());
- }
-
- @Test
- public void testSettingToDerivedType() {
- try {
- reset();
- // this is required to make it a valid type Y node
- ((PSVIElementNSImpl) fRootNode).setAttributeNS(null, "attr", "typeY");
- fValidator.setProperty(ROOT_TYPE, typeY);
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
- .getValidationAttempted());
- assertElementNull(fRootNode.getElementDeclaration());
- assertTypeName("Y", fRootNode.getTypeDefinition().getName());
- }
-
- @Test
- public void testSettingToNonDerivedType() {
- try {
- reset();
- fValidator.setProperty(ROOT_TYPE, typeZ);
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
- .getValidationAttempted());
- assertElementNull(fRootNode.getElementDeclaration());
- assertTypeName("Z", fRootNode.getTypeDefinition().getName());
- }
-
- @Test
- public void testSettingToOtherSchemaType() {
- try {
- reset();
- ((PSVIElementNSImpl) fRootNode).setAttributeNS(SchemaSymbols.URI_XSI,
- SchemaSymbols.XSI_SCHEMALOCATION,
- "xslt.unittests otherNamespace.xsd");
- fValidator.setProperty(ROOT_TYPE, typeOtherNamespace);
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
- .getValidationAttempted());
- assertElementNull(fRootNode.getElementDeclaration());
- assertTypeName("W", fRootNode.getTypeDefinition().getName());
- assertTypeNamespace("xslt.unittests", fRootNode.getTypeDefinition()
- .getNamespace());
- }
-
- @Test
- public void testSettingTypeAndXSIType() {
- try {
- reset();
- // this is required to make it a valid type Y node
- ((PSVIElementNSImpl) fRootNode).setAttributeNS(null, "attr", "typeY");
- ((PSVIElementNSImpl) fRootNode).setAttributeNS(SchemaSymbols.URI_XSI,
- SchemaSymbols.XSI_TYPE, "Y");
- fValidator.setProperty(ROOT_TYPE, typeX);
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
- .getValidationAttempted());
- assertElementNull(fRootNode.getElementDeclaration());
- assertTypeName("Y", fRootNode.getTypeDefinition().getName());
- }
-
- @Test
- public void testSettingTypeAndInvalidXSIType() {
- try {
- reset();
- ((PSVIElementNSImpl) fRootNode).setAttributeNS(SchemaSymbols.URI_XSI,
- SchemaSymbols.XSI_TYPE, "Z");
- fValidator.setProperty(ROOT_TYPE, typeX);
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- assertError(INVALID_DERIVATION_ERROR);
- assertValidity(ItemPSVI.VALIDITY_INVALID, fRootNode.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
- .getValidationAttempted());
- assertElementNull(fRootNode.getElementDeclaration());
- assertTypeName("Z", fRootNode.getTypeDefinition().getName());
- }
-
- private void checkDefault() {
- assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
- .getValidationAttempted());
- assertElementName("A", fRootNode.getElementDeclaration().getName());
- assertTypeName("X", fRootNode.getTypeDefinition().getName());
- }
-}
--- a/jdk/test/javax/xml/jaxp/testng/validation/8037819/SpecialCaseErrorHandler.java Thu Oct 16 12:01:56 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import java.util.HashMap;
-
-import org.xml.sax.ErrorHandler;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-
-public class SpecialCaseErrorHandler implements ErrorHandler {
- public static final boolean DEBUG = false;
-
- private HashMap<String, Boolean> errors;
-
- public SpecialCaseErrorHandler(String[] specialCases) {
- errors = new HashMap<>();
- for (int i = 0; i < specialCases.length; ++i) {
- errors.put(specialCases[i], Boolean.FALSE);
- }
- }
-
- public void reset() {
- errors.keySet().stream().forEach((error) -> {
- errors.put(error, Boolean.FALSE);
- });
- }
-
- @Override
- public void warning(SAXParseException arg0) throws SAXException {
- if (DEBUG) {
- System.err.println(arg0.getMessage());
- }
- }
-
- @Override
- public void error(SAXParseException arg0) throws SAXException {
- if (DEBUG) {
- System.err.println(arg0.getMessage());
- }
- errors.keySet().stream().filter((error) -> (arg0.getMessage().startsWith(error))).forEach((error) -> {
- errors.put(error, Boolean.TRUE);
- });
- }
-
- public void fatalError(SAXParseException arg0) throws SAXException {
- throw arg0;
- }
-
- public boolean specialCaseFound(String key) {
- return ((Boolean) errors.get(key)).booleanValue();
- }
-}
--- a/jdk/test/javax/xml/jaxp/testng/validation/8037819/TEST.properties Thu Oct 16 12:01:56 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-# This file identifies root(s) of the test-ng hierarchy.
-
-TestNG.dirs = .
--- a/jdk/test/javax/xml/jaxp/testng/validation/8037819/UnparsedEntityCheckingTest.java Thu Oct 16 12:01:56 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,152 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl;
-import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-public class UnparsedEntityCheckingTest extends BaseTest {
- public static final String UNDECLARED_ENTITY = "UndeclaredEntity";
-
- protected String getXMLDocument() {
- return "unparsedEntity.xml";
- }
-
- protected String getSchemaFile() {
- return "base.xsd";
- }
-
- protected String[] getRelevantErrorIDs() {
- return new String[] { UNDECLARED_ENTITY };
- }
-
- public UnparsedEntityCheckingTest(String name) {
- super(name);
- }
-
- @BeforeClass
- protected void setUp() throws Exception {
- super.setUp();
- }
-
- @AfterClass
- protected void tearDown() throws Exception {
- super.tearDown();
- }
-
- @Test
- public void testDefaultValid() {
- try {
- reset();
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkDefault();
- }
-
- @Test
- public void testSetFalseValid() {
- try {
- reset();
- fValidator.setFeature(UNPARSED_ENTITY_CHECKING, false);
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkDefault();
- }
-
- @Test
- public void testSetTrueValid() {
- try {
- reset();
- fValidator.setFeature(UNPARSED_ENTITY_CHECKING, true);
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkDefault();
- }
-
- @Test
- public void testDefaultInvalid() {
- try {
- reset();
- ((PSVIElementNSImpl) fRootNode).setAttributeNS(null,
- "unparsedEntityAttr", "invalid");
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkInvalid();
- }
-
- @Test
- public void testSetFalseInvalid() {
- try {
- reset();
- ((PSVIElementNSImpl) fRootNode).setAttributeNS(null,
- "unparsedEntityAttr", "invalid");
- fValidator.setFeature(UNPARSED_ENTITY_CHECKING, false);
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkDefault();
- }
-
- @Test
- public void testSetTrueInvalid() {
- try {
- reset();
- ((PSVIElementNSImpl) fRootNode).setAttributeNS(null,
- "unparsedEntityAttr", "invalid");
- fValidator.setFeature(UNPARSED_ENTITY_CHECKING, true);
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- checkInvalid();
- }
-
- private void checkDefault() {
- assertNoError(UNDECLARED_ENTITY);
- assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
- .getValidationAttempted());
- assertElementName("A", fRootNode.getElementDeclaration().getName());
- assertTypeName("X", fRootNode.getTypeDefinition().getName());
- }
-
- private void checkInvalid() {
- assertError(UNDECLARED_ENTITY);
- assertValidity(ItemPSVI.VALIDITY_INVALID, fRootNode.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
- .getValidationAttempted());
- assertElementName("A", fRootNode.getElementDeclaration().getName());
- assertTypeName("X", fRootNode.getTypeDefinition().getName());
- }
-}
--- a/jdk/test/javax/xml/jaxp/testng/validation/8037819/UseGrammarPoolOnlyTest_False.java Thu Oct 16 12:01:56 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,85 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-public class UseGrammarPoolOnlyTest_False extends BaseTest {
- private final static String UNKNOWN_TYPE_ERROR = "cvc-type.1";
-
- private final static String INVALID_DERIVATION_ERROR = "cvc-elt.4.3";
-
- protected String getXMLDocument() {
- return "otherNamespace.xml";
- }
-
- protected String getSchemaFile() {
- return "base.xsd";
- }
-
- protected String[] getRelevantErrorIDs() {
- return new String[] { UNKNOWN_TYPE_ERROR, INVALID_DERIVATION_ERROR };
- }
-
- protected boolean getUseGrammarPoolOnly() {
- return false;
- }
-
- public UseGrammarPoolOnlyTest_False(String name) {
- super(name);
- }
-
- @BeforeClass
- protected void setUp() throws Exception {
- super.setUp();
- }
-
- @AfterClass
- protected void tearDown() throws Exception {
- super.tearDown();
- }
-
- /**
- * The purpose of this test is to check if setting the USE_GRAMMAR_POOL_ONLY
- * feature to true causes external schemas to not be read. This
- * functionality already existed prior to adding the XSLT 2.0 validation
- * features; however, because the class that controlled it changed, this
- * test simply ensures that the existing functionality did not disappear.
- * -PM
- */
- @Test
- public void testUsingOnlyGrammarPool() {
- try {
- reset();
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
- .getValidationAttempted());
- assertElementName("A", fRootNode.getElementDeclaration().getName());
- assertElementNamespace("xslt.unittests", fRootNode
- .getElementDeclaration().getNamespace());
- assertTypeName("W", fRootNode.getTypeDefinition().getName());
- assertTypeNamespace("xslt.unittests", fRootNode.getTypeDefinition()
- .getNamespace());
- }
-}
--- a/jdk/test/javax/xml/jaxp/testng/validation/8037819/UseGrammarPoolOnlyTest_True.java Thu Oct 16 12:01:56 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-public class UseGrammarPoolOnlyTest_True extends BaseTest {
-
- protected String getXMLDocument() {
- return "otherNamespace.xml";
- }
-
- protected String getSchemaFile() {
- return "base.xsd";
- }
-
- protected boolean getUseGrammarPoolOnly() {
- return true;
- }
-
- public UseGrammarPoolOnlyTest_True(String name) {
- super(name);
- }
-
- @BeforeClass
- protected void setUp() throws Exception {
- super.setUp();
- }
-
- @AfterClass
- protected void tearDown() throws Exception {
- super.tearDown();
- }
-
- /**
- * The purpose of this test is to check if setting the USE_GRAMMAR_POOL_ONLY
- * feature to true causes external schemas to not be read. This
- * functionality already existed prior to adding the XSLT 2.0 validation
- * features; however, because the class that controlled it changed, this
- * test simply ensures that the existing functionality did not disappear.
- * -PM
- */
- @Test
- public void testUsingOnlyGrammarPool() {
- try {
- reset();
- validateDocument();
- } catch (Exception e) {
- fail("Validation failed: " + e.getMessage());
- }
-
- assertValidity(ItemPSVI.VALIDITY_NOTKNOWN, fRootNode.getValidity());
- assertValidationAttempted(ItemPSVI.VALIDATION_NONE, fRootNode
- .getValidationAttempted());
- assertElementNull(fRootNode.getElementDeclaration());
- assertAnyType(fRootNode.getTypeDefinition());
- }
-}
--- a/jdk/test/javax/xml/jaxp/testng/validation/8037819/base.xml Thu Oct 16 12:01:56 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-<?xml version="1.0"?>
-<A attr="typeX">
-</A>
--- a/jdk/test/javax/xml/jaxp/testng/validation/8037819/base.xsd Thu Oct 16 12:01:56 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,74 +0,0 @@
-<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
-
- <xsd:element name="A" type="X"/>
-
- <!-- The purpose of this element is:
- a) To have a fixed attribute use
- b) To have an attribute with a fixed attribute declaration
- c) To have a complex type with simple content and a fixed value
- d) To have an element declaration with a fixed value
- -->
- <xsd:element name="B" fixed="howdy">
- <xsd:complexType>
- <xsd:simpleContent>
- <xsd:extension base="xsd:string">
- <xsd:attribute ref="fixedAttr" use="required" fixed="hello"/>
- </xsd:extension>
- </xsd:simpleContent>
- </xsd:complexType>
- </xsd:element>
-
- <xsd:element name="D" type="xsd:string" fixed="hey"/>
-
- <xsd:attribute name="attr" type="xsd:string"/>
-
- <xsd:attribute name="unparsedEntityAttr" type="xsd:ENTITIES"/>
-
- <xsd:attribute name="fixedAttr" type="xsd:string" fixed="hello"/>
-
- <xsd:complexType name="X">
- <xsd:sequence>
- <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
- </xsd:sequence>
- <xsd:attribute ref="attr"/>
- <xsd:attribute ref="unparsedEntityAttr"/>
- </xsd:complexType>
-
- <xsd:complexType name="Y">
- <xsd:complexContent>
- <xsd:restriction base="X">
- <xsd:sequence>
- <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
- </xsd:sequence>
- <xsd:attribute ref="attr" fixed="typeY"/>
- <xsd:attribute ref="unparsedEntityAttr" use="prohibited"/>
- </xsd:restriction>
- </xsd:complexContent>
- </xsd:complexType>
-
- <!-- Z is the same as X, but is not derived from X. -->
- <xsd:complexType name="Z">
- <xsd:sequence>
- <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
- </xsd:sequence>
- <xsd:attribute ref="attr"/>
- <xsd:attribute ref="unparsedEntityAttr"/>
- </xsd:complexType>
-
- <xsd:complexType name="idType">
- <xsd:complexContent>
- <xsd:extension base="X">
- <xsd:attribute name="idAttr" type="xsd:ID"/>
- </xsd:extension>
- </xsd:complexContent>
- </xsd:complexType>
-
- <xsd:complexType name="idrefType">
- <xsd:complexContent>
- <xsd:extension base="X">
- <xsd:attribute name="idrefAttr" type="xsd:IDREF"/>
- </xsd:extension>
- </xsd:complexContent>
- </xsd:complexType>
-
-</xsd:schema>
--- a/jdk/test/javax/xml/jaxp/testng/validation/8037819/fixedAttr.xml Thu Oct 16 12:01:56 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-<?xml version="1.0"?>
-<A>
- <B fixedAttr="hello">howdy</B>
- <D>hey</D>
-</A>
--- a/jdk/test/javax/xml/jaxp/testng/validation/8037819/idIdref.xml Thu Oct 16 12:01:56 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-<?xml version="1.0"?>
-<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <A xsi:type="idType" idAttr="ONE"/>
- <A xsi:type="idType" idAttr="ONE"/>
- <A xsi:type="idrefType" idrefAttr="TWO"/>
-</A>
--- a/jdk/test/javax/xml/jaxp/testng/validation/8037819/idc.xml Thu Oct 16 12:01:56 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-<?xml version="1.0"?>
-<itemList>
- <item uniqueAttr="ONE">1</item>
- <item uniqueAttr="ONE">2</item>
- <item uniqueAttr="TWO">2</item>
- <itemRef>3</itemRef>
-</itemList>
--- a/jdk/test/javax/xml/jaxp/testng/validation/8037819/idc.xsd Thu Oct 16 12:01:56 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
-
- <xsd:element name="itemList" type="itemListType">
- <xsd:unique name="itemAttr">
- <xsd:selector xpath="item"/>
- <xsd:field xpath="@uniqueAttr"/>
- </xsd:unique>
-
- <xsd:key name="itemValueKey">
- <xsd:selector xpath="item"/>
- <xsd:field xpath="."/>
- </xsd:key>
-
- <xsd:keyref name="itemKeyRef" refer="itemValueKey">
- <xsd:selector xpath="itemRef"/>
- <xsd:field xpath="."/>
- </xsd:keyref>
- </xsd:element>
-
- <xsd:element name="item" type="itemType"/>
-
- <xsd:attribute name="uniqueAttr" type="xsd:string"/>
-
- <xsd:attribute name="unparsedEntityAttr" type="xsd:ENTITIES"/>
-
- <xsd:complexType name="itemListType">
- <xsd:sequence>
- <xsd:element ref="item" maxOccurs="unbounded"/>
- <xsd:element name="itemRef" type="xsd:string" maxOccurs="unbounded"/>
- </xsd:sequence>
- </xsd:complexType>
-
- <xsd:complexType name="itemType">
- <xsd:simpleContent>
- <xsd:extension base="xsd:string">
- <xsd:attribute ref="uniqueAttr" use="required"/>
- </xsd:extension>
- </xsd:simpleContent>
- </xsd:complexType>
-
-</xsd:schema>
--- a/jdk/test/javax/xml/jaxp/testng/validation/8037819/otherNamespace.xml Thu Oct 16 12:01:56 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-<?xml version="1.0"?>
-<unit:A xmlns:unit="xslt.unittests"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="xslt.unittests otherNamespace.xsd"
- attr="typeX">
-</unit:A>
--- a/jdk/test/javax/xml/jaxp/testng/validation/8037819/otherNamespace.xsd Thu Oct 16 12:01:56 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-<xsd:schema
- xmlns:xsd="http://www.w3.org/2001/XMLSchema"
- xmlns:unit="xslt.unittests"
- targetNamespace="xslt.unittests">
-
- <xsd:import schemaLocation="base.xsd"/>
-
- <xsd:element name="A" type="unit:W"/>
-
- <xsd:complexType name="W">
- <xsd:sequence>
- <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
- </xsd:sequence>
- <xsd:attribute ref="attr"/>
- <xsd:attribute ref="unparsedEntityAttr"/>
- </xsd:complexType>
-
-</xsd:schema>
--- a/jdk/test/javax/xml/jaxp/testng/validation/8037819/unparsedEntity.dtd Thu Oct 16 12:01:56 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-<!NOTATION myNotation SYSTEM "somethingElse" >
-<!ENTITY myUnparsedEntity SYSTEM "something" NDATA myNotation >
-
--- a/jdk/test/javax/xml/jaxp/testng/validation/8037819/unparsedEntity.xml Thu Oct 16 12:01:56 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE personnel SYSTEM "unparsedEntity.dtd">
-<A attr="blah" unparsedEntityAttr="myUnparsedEntity">
-</A>
--- a/jdk/test/javax/xml/jaxp/testng/validation/8037819/xsitype_A_A.xml Thu Oct 16 12:01:56 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-<?xml version="1.0"?>
-<A attr="typeY"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:type="Y">
- <A attr="typeY" xsi:type="Y"/>
-</A>
--- a/jdk/test/javax/xml/jaxp/testng/validation/8037819/xsitype_A_C.xml Thu Oct 16 12:01:56 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-<?xml version="1.0"?>
-<A attr="typeY"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:type="Y">
- <C attr="typeY" xsi:type="Y"/>
-</A>
--- a/jdk/test/javax/xml/jaxp/testng/validation/8037819/xsitype_C_A.xml Thu Oct 16 12:01:56 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-<?xml version="1.0"?>
-<C attr="typeY"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:type="Y">
- <A attr="typeY" xsi:type="Y"/>
-</C>
--- a/jdk/test/javax/xml/jaxp/testng/validation/8037819/xsitype_C_AC.xml Thu Oct 16 12:01:56 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-<?xml version="1.0"?>
-<C attr="typeY"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:type="Y">
- <A attr="typeY" xsi:type="Y"/>
- <C attr="typeY" xsi:type="Y"/>
-</C>
--- a/jdk/test/javax/xml/jaxp/testng/validation/8037819/xsitype_C_C.xml Thu Oct 16 12:01:56 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-<?xml version="1.0"?>
-<C attr="typeY"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:type="Y">
- <C attr="typeY" xsi:type="Y"/>
-</C>
--- a/jdk/test/javax/xml/jaxp/testng/validation/8037819/xsitype_C_CA.xml Thu Oct 16 12:01:56 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-<?xml version="1.0"?>
-<C attr="typeY"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:type="Y">
- <C attr="typeY" xsi:type="Y"/>
- <A attr="typeY" xsi:type="Y"/>
-</C>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/BaseTest.java Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,326 @@
+package validation;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.net.URL;
+
+import javax.xml.XMLConstants;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.dom.DOMResult;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.validation.Schema;
+import javax.xml.validation.SchemaFactory;
+import javax.xml.validation.Validator;
+
+
+import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl;
+import com.sun.org.apache.xerces.internal.impl.Constants;
+import com.sun.org.apache.xerces.internal.impl.xs.SchemaGrammar;
+import com.sun.org.apache.xerces.internal.xs.ElementPSVI;
+import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
+import com.sun.org.apache.xerces.internal.xs.XSElementDeclaration;
+import com.sun.org.apache.xerces.internal.xs.XSTypeDefinition;
+import java.security.Policy;
+import javax.xml.transform.stream.StreamSource;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+
+public abstract class BaseTest {
+ protected final static String ROOT_TYPE = Constants.XERCES_PROPERTY_PREFIX
+ + Constants.ROOT_TYPE_DEFINITION_PROPERTY;
+
+ protected final static String IGNORE_XSI_TYPE = Constants.XERCES_FEATURE_PREFIX
+ + Constants.IGNORE_XSI_TYPE_FEATURE;
+
+ protected final static String ID_IDREF_CHECKING = Constants.XERCES_FEATURE_PREFIX
+ + Constants.ID_IDREF_CHECKING_FEATURE;
+
+ protected final static String IDC_CHECKING = Constants.XERCES_FEATURE_PREFIX
+ + Constants.IDC_CHECKING_FEATURE;
+
+ protected final static String UNPARSED_ENTITY_CHECKING = Constants.XERCES_FEATURE_PREFIX
+ + Constants.UNPARSED_ENTITY_CHECKING_FEATURE;
+
+ protected final static String USE_GRAMMAR_POOL_ONLY = Constants.XERCES_FEATURE_PREFIX
+ + Constants.USE_GRAMMAR_POOL_ONLY_FEATURE;
+
+ protected final static String DYNAMIC_VALIDATION = Constants.XERCES_FEATURE_PREFIX
+ + Constants.DYNAMIC_VALIDATION_FEATURE;
+
+ protected final static String DOCUMENT_CLASS_NAME = Constants.XERCES_PROPERTY_PREFIX
+ + Constants.DOCUMENT_CLASS_NAME_PROPERTY;
+
+ public static boolean isWindows = false;
+ static {
+ if (System.getProperty("os.name").indexOf("Windows")>-1) {
+ isWindows = true;
+ }
+ };
+
+ protected Schema schema;
+ protected Validator fValidator;
+
+ protected SpecialCaseErrorHandler fErrorHandler;
+
+ protected DocumentBuilder builder;
+ protected Document fDocument;
+
+ protected ElementPSVI fRootNode;
+ protected URL fDocumentURL;
+ protected URL fSchemaURL;
+
+ static String errMessage;
+
+ int passed = 0, failed = 0;
+ private boolean hasSM;
+ private Policy orig;
+
+ protected abstract String getSchemaFile();
+
+ protected abstract String getXMLDocument();
+
+ public BaseTest(String name) {
+ fErrorHandler = new SpecialCaseErrorHandler(getRelevantErrorIDs());
+ }
+
+ protected void setUp() throws Exception {
+ if (System.getSecurityManager() != null) {
+ hasSM = true;
+ System.setSecurityManager(null);
+ }
+
+ orig = Policy.getPolicy();
+
+ DocumentBuilderFactory docFactory = DocumentBuilderFactory
+ .newInstance();
+ docFactory.setAttribute(DOCUMENT_CLASS_NAME,
+ "com.sun.org.apache.xerces.internal.dom.PSVIDocumentImpl");
+ docFactory.setNamespaceAware(true);
+ builder = docFactory.newDocumentBuilder();
+ // build the location URL of the document
+ String filepath = System.getProperty("test.src", ".");
+ String packageDir = this.getClass().getPackage().getName().replace('.',
+ '/');
+ String documentPath = filepath + "/" + packageDir + "/" + getXMLDocument();
+ String schemaPath = filepath + "/" + packageDir + "/" + getSchemaFile();
+
+ if (isWindows) {
+ fDocumentURL = new URL("file:/" + documentPath);
+ fSchemaURL = new URL("file:/" + schemaPath);
+ } else {
+ fDocumentURL = new URL("file:" + documentPath);
+ fSchemaURL = new URL("file:" + schemaPath);
+ }
+ if (fDocumentURL == null) {
+ throw new FileNotFoundException("Couldn't find xml file for test: " + documentPath);
+ }
+
+ SchemaFactory sf = SchemaFactory
+ .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
+ sf.setFeature(USE_GRAMMAR_POOL_ONLY, getUseGrammarPoolOnly());
+
+ if (fSchemaURL == null) {
+ throw new FileNotFoundException("Couldn't find schema file for test: " + schemaPath);
+ }
+ schema = sf.newSchema(fSchemaURL);
+
+// String schemaPath = "./jaxp-ri/src/unit-test/apache/xerces/jdk8037819/" + getSchemaFile();
+// Schema schema = sf.newSchema(new StreamSource(new File(schemaPath)));
+ }
+
+ protected void tearDown() throws Exception {
+ System.setSecurityManager(null);
+ Policy.setPolicy(orig);
+ if (hasSM) {
+ System.setSecurityManager(new SecurityManager());
+ }
+
+ builder = null;
+ schema = null;
+ fRootNode = null;
+ fErrorHandler.reset();
+ System.out.println("\nNumber of tests passed: " + passed);
+ System.out.println("Number of tests failed: " + failed + "\n");
+
+ if (errMessage != null) {
+ throw new RuntimeException(errMessage);
+ }
+ }
+
+ protected void validateDocument() throws Exception {
+ Source source = new DOMSource(fDocument);
+ source.setSystemId(fDocumentURL.toExternalForm());
+ Result result = new DOMResult(fDocument);
+
+ fValidator.validate(source, result);
+ }
+
+ protected void validateFragment() throws Exception {
+ Source source = new DOMSource((Node) fRootNode);
+ source.setSystemId(fDocumentURL.toExternalForm());
+ Result result = new DOMResult((Node) fRootNode);
+ fValidator.validate(source, result);
+ }
+
+ protected void reset() throws Exception {
+// fDocument = builder.parse(new File("./jaxp-ri/src/unit-test/apache/xerces/jdk8037819/" + getXMLDocument()));
+ fDocument = builder.parse(fDocumentURL.toExternalForm());
+ fRootNode = (ElementPSVI) fDocument.getDocumentElement();
+ fValidator = schema.newValidator();
+ fErrorHandler.reset();
+ fValidator.setErrorHandler(fErrorHandler);
+ fValidator.setFeature(DYNAMIC_VALIDATION, false);
+ }
+
+ protected PSVIElementNSImpl getChild(int n) {
+ int numFound = 0;
+ Node child = ((Node) fRootNode).getFirstChild();
+ while (child != null) {
+ if (child.getNodeType() == Node.ELEMENT_NODE) {
+ numFound++;
+ if (numFound == n) {
+ return (PSVIElementNSImpl) child;
+ }
+ }
+ child = child.getNextSibling();
+ }
+ return null;
+ }
+
+ protected String[] getRelevantErrorIDs() {
+ return new String[] {};
+ }
+
+ protected boolean getUseGrammarPoolOnly() {
+ return false;
+ }
+
+ // specialized asserts
+
+ protected void assertValidity(short expectedValidity, short actualValidity) {
+ String expectedString = expectedValidity == ItemPSVI.VALIDITY_VALID ? "valid"
+ : (expectedValidity == ItemPSVI.VALIDITY_INVALID ? "invalid"
+ : "notKnown");
+ String actualString = actualValidity == ItemPSVI.VALIDITY_VALID ? "valid"
+ : (actualValidity == ItemPSVI.VALIDITY_INVALID ? "invalid"
+ : "notKnown");
+ String message = "{validity} was <" + actualString
+ + "> but it should have been <" + expectedString + ">";
+ assertEquals(message, expectedValidity, actualValidity);
+ }
+
+ protected void assertValidationAttempted(short expectedAttempted,
+ short actualAttempted) {
+ String expectedString = expectedAttempted == ItemPSVI.VALIDATION_FULL ? "full"
+ : (expectedAttempted == ItemPSVI.VALIDATION_PARTIAL ? "partial"
+ : "none");
+ String actualString = actualAttempted == ItemPSVI.VALIDATION_FULL ? "full"
+ : (actualAttempted == ItemPSVI.VALIDATION_PARTIAL ? "partial"
+ : "none");
+ String message = "{validity} was <" + actualString
+ + "> but it should have been <" + expectedString + ">";
+ assertEquals(message, expectedAttempted, actualAttempted);
+ }
+
+ protected void assertElementName(String expectedName, String actualName) {
+ assertEquals("Local name of element declaration is wrong.",
+ expectedName, actualName);
+ }
+
+ protected void assertElementNull(XSElementDeclaration elem) {
+ assertNull("Element declaration should be null.", elem);
+ }
+
+ protected void assertElementNamespace(String expectedName, String actualName) {
+ assertEquals("Namespace of element declaration is wrong.",
+ expectedName, actualName);
+ }
+
+ protected void assertElementNamespaceNull(String actualName) {
+ assertNull("Local name of element declaration should be null.",
+ actualName);
+ }
+
+ protected void assertTypeName(String expectedName, String actualName) {
+ assertEquals("Local name of type definition is wrong.", expectedName,
+ actualName);
+ }
+
+ protected void assertTypeNull(XSTypeDefinition type) {
+ assertNull("Type definition should be null.", type);
+ }
+
+ protected void assertTypeNamespace(String expectedName, String actualName) {
+ assertEquals("Namespace of type definition is wrong.", expectedName,
+ actualName);
+ }
+
+ protected void assertTypeNamespaceNull(String actualName) {
+ assertNull("Namespace of type definition should be null.", actualName);
+ }
+
+ protected void assertError(String error) {
+ assertTrue("Error <" + error + "> should have occured, but did not.",
+ fErrorHandler.specialCaseFound(error));
+ }
+
+ protected void assertNoError(String error) {
+ assertFalse("Error <" + error
+ + "> should not have occured (but it did)", fErrorHandler
+ .specialCaseFound(error));
+ }
+
+ protected void assertAnyType(XSTypeDefinition type) {
+ assertEquals("Type is supposed to be anyType", SchemaGrammar.fAnyType,
+ type);
+ }
+
+ void assertEquals(String msg, Object expected, Object actual) {
+ if (!expected.equals(actual)) {
+ fail(msg + " Expected: " + expected + " Actual: " + actual);
+ } else {
+ success(null);
+ }
+ }
+ void assertNull(String msg, Object value) {
+ if (value != null) {
+ fail(msg);
+ } else {
+ success(null);
+ }
+ }
+ public void assertTrue(String msg, boolean value) {
+ if (!value) {
+ fail(msg);
+ } else {
+ success(null);
+ }
+ }
+ public void assertFalse(String msg, boolean value) {
+ if (value) {
+ fail(msg);
+ } else {
+ success(null);
+ }
+ }
+ public void fail(String errMsg) {
+ if (errMessage == null) {
+ errMessage = errMsg;
+ } else {
+ errMessage = errMessage + "\n" + errMsg;
+ }
+ failed++;
+ }
+
+ public void success(String msg) {
+ passed++;
+ if (msg != null) {
+ if (msg.length() != 0) {
+ System.out.println(msg);
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/SpecialCaseErrorHandler.java Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,54 @@
+package validation;
+
+import java.util.HashMap;
+import java.util.Iterator;
+
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+public class SpecialCaseErrorHandler implements ErrorHandler {
+ public static final boolean DEBUG = false;
+
+ private HashMap errors;
+
+ public SpecialCaseErrorHandler(String[] specialCases) {
+ errors = new HashMap();
+ for (int i = 0; i < specialCases.length; ++i) {
+ errors.put(specialCases[i], Boolean.FALSE);
+ }
+ }
+
+ public void reset() {
+ for (Iterator iter = errors.keySet().iterator(); iter.hasNext();) {
+ String error = (String) iter.next();
+ errors.put(error, Boolean.FALSE);
+ }
+ }
+
+ public void warning(SAXParseException arg0) throws SAXException {
+ if (DEBUG) {
+ System.err.println(arg0.getMessage());
+ }
+ }
+
+ public void error(SAXParseException arg0) throws SAXException {
+ if (DEBUG) {
+ System.err.println(arg0.getMessage());
+ }
+ for (Iterator iter = errors.keySet().iterator(); iter.hasNext();) {
+ String error = (String) iter.next();
+ if (arg0.getMessage().startsWith(error)) {
+ errors.put(error, Boolean.TRUE);
+ }
+ }
+ }
+
+ public void fatalError(SAXParseException arg0) throws SAXException {
+ throw arg0;
+ }
+
+ public boolean specialCaseFound(String key) {
+ return ((Boolean) errors.get(key)).booleanValue();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/filelist Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,1 @@
+jdk8037819/BasicTest1.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8036951/FeaturePropagationTest.java Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,196 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package validation.jdk8036951;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.net.URL;
+import javax.xml.XMLConstants;
+import javax.xml.transform.Source;
+import javax.xml.transform.stream.StreamSource;
+import javax.xml.validation.Schema;
+import javax.xml.validation.SchemaFactory;
+import javax.xml.validation.Validator;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXNotRecognizedException;
+import org.xml.sax.SAXNotSupportedException;
+import validation.BaseTest;
+
+/**
+ * @author Peter McCracken, IBM
+ * @version $Id$
+ */
+public class FeaturePropagationTest extends BaseTest {
+
+ public final String FEATURE_STRING_DEFAULT_FALSE = "http://apache.org/xml/features/honour-all-schemaLocations";
+ public final String FEATURE_STRING_DEFAULT_TRUE = "http://apache.org/xml/features/validation/schema-full-checking";
+ public final String SECURITY_MANAGER = "http://apache.org/xml/properties/security-manager";
+
+ public FeaturePropagationTest(String name) {
+ super(name);
+ }
+
+ @BeforeClass
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @AfterClass
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ @Test
+ public void testPropertyReset() throws Exception {
+ SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
+ Schema schema = makeSchema(factory, null);
+ Validator validator = schema.newValidator();
+ Object beforeReset = validator.getProperty(SECURITY_MANAGER);
+ validator.setProperty(SECURITY_MANAGER, null);
+ Object changed = validator.getProperty(SECURITY_MANAGER);
+ //for JDK, this is changed since by default the security manager is set
+ assertTrue("Property value should have changed after calling setProperty().", beforeReset != changed);
+ validator.reset();
+ Object afterReset = validator.getProperty(SECURITY_MANAGER);
+ assertTrue("Property value should be the same after calling reset()", beforeReset == afterReset);
+ }
+
+ @Test
+ public void testFeatureReset() throws Exception {
+ SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
+ Schema schema = makeSchema(factory, null);
+ Validator validator = schema.newValidator();
+ validator.setFeature(FEATURE_STRING_DEFAULT_TRUE, false);
+ validator.setFeature(FEATURE_STRING_DEFAULT_FALSE, true);
+ validator.reset();
+ boolean value = validator.getFeature(FEATURE_STRING_DEFAULT_TRUE);
+ assertTrue("After reset, value of feature on Validator should be true.", value);
+ value = validator.getFeature(FEATURE_STRING_DEFAULT_FALSE);
+ assertFalse("After reset, value of feature on Validator should be false.", value);
+ }
+
+ @Test
+ public void testSecureProcessingFeaturePropagationAndReset() throws Exception {
+ SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
+ boolean value;
+ value = factory.getFeature(XMLConstants.FEATURE_SECURE_PROCESSING);
+ //default is true for JDK
+ //assertFalse("Default value of feature on SchemaFactory should have been false.", value);
+ assertTrue("Default value of feature on SchemaFactory should have been false.", value);
+ factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
+ Schema schema = makeSchema(factory, null);
+ Validator validator = schema.newValidator();
+ value = validator.getFeature(XMLConstants.FEATURE_SECURE_PROCESSING);
+ assertTrue("Value of feature on Validator should have been true.", value);
+ validator.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, false);
+ value = validator.getFeature(XMLConstants.FEATURE_SECURE_PROCESSING);
+ assertFalse("Value of feature on Validator should have been false.", value);
+ validator.reset();
+ value = validator.getFeature(XMLConstants.FEATURE_SECURE_PROCESSING);
+ assertTrue("After reset, value of feature on Validator should be true.", value);
+ }
+ /*
+ * Using four basically identical tests to try out the different
+ * instance classes of Schema. They shouldn't differ, because the relevant
+ * code is in a common base class.
+ */
+
+ @Test
+ public void testFeaturePropagationNull() throws Exception {
+ checkFeaturesOnValidator(null);
+ }
+
+ @Test
+ public void testFeaturePropagationEmpty() throws Exception {
+ checkFeaturesOnValidator(new Source[] {});
+ }
+
+ @Test
+ public void testFeaturePropagationSingle() throws Exception {
+ checkFeaturesOnValidator(new Source[] {makeSource("base.xsd")});
+ }
+
+ @Test
+ public void testFeaturePropagationMultiple() throws Exception {
+ checkFeaturesOnValidator(new Source[] {makeSource("base.xsd"), makeSource("idc.xsd")});
+ }
+
+ private void checkFeaturesOnValidator(Source[] sources) throws Exception {
+ try {
+ SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
+ Schema schema = makeSchema(factory, sources);
+ Validator validator = schema.newValidator();
+ boolean value;
+ value = validator.getFeature(FEATURE_STRING_DEFAULT_TRUE);
+ assertTrue("Default value of feature on Validator should have been true.", value);
+ value = validator.getFeature(FEATURE_STRING_DEFAULT_FALSE);
+ assertFalse("Default value of feature on Validator should have been false.", value);
+
+ // checking that the value propagates to the validator
+ factory.setFeature(FEATURE_STRING_DEFAULT_TRUE, false);
+ factory.setFeature(FEATURE_STRING_DEFAULT_FALSE, true);
+ schema = makeSchema(factory, sources);
+ validator = schema.newValidator();
+ value = validator.getFeature(FEATURE_STRING_DEFAULT_TRUE);
+ assertFalse("Value of feature on Validator should have been false.", value);
+ value = validator.getFeature(FEATURE_STRING_DEFAULT_FALSE);
+ assertTrue("Value of feature on Validator should have been true.", value);
+
+ // checking that the validator contains a copy of the features, not a reference
+ factory.setFeature(FEATURE_STRING_DEFAULT_TRUE, true);
+ factory.setFeature(FEATURE_STRING_DEFAULT_FALSE, false);
+ value = validator.getFeature(FEATURE_STRING_DEFAULT_TRUE);
+ assertFalse("Value of feature on Validator should have stayed false.", value);
+ value = validator.getFeature(FEATURE_STRING_DEFAULT_FALSE);
+ assertTrue("Value of feature on Validator should have stayed true.", value);
+ }
+ catch (SAXNotRecognizedException e) {
+ fail(e.getMessage());
+ }
+ catch (SAXNotSupportedException e) {
+ fail(e.getMessage());
+ }
+ }
+
+ private Schema makeSchema(SchemaFactory factory, Source[] sources) throws SAXException {
+ if (sources == null) {
+ return factory.newSchema();
+ }
+ else {
+ return factory.newSchema(sources);
+ }
+ }
+
+ private Source makeSource(String xsd) throws FileNotFoundException {
+ return new StreamSource(fSchemaURL.toExternalForm());
+ }
+
+ @Override
+ protected String getSchemaFile() {
+ return "base.xsd";
+ }
+
+ @Override
+ protected String getXMLDocument() {
+ //not needed
+ return null;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8036951/RootSimpleTypeDefinitionTest.java Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,118 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package validation.jdk8036951;
+
+import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
+import javax.xml.XMLConstants;
+import javax.xml.namespace.QName;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import org.xml.sax.SAXException;
+import validation.BaseTest;
+
+/**
+ * @author Peter McCracken, IBM
+ * @version $Id$
+ */
+public class RootSimpleTypeDefinitionTest extends BaseTest {
+
+ private QName typeString;
+ private QName typeNonNegInt;
+
+ private final static String INVALID_TYPE_ERROR = "cvc-type.3.1.3";
+ private final static String MININCLUSIVE_DERIVATION_ERROR = "cvc-minInclusive-valid";
+
+ protected String getXMLDocument() {
+ return "simpleType.xml";
+ }
+
+ protected String getSchemaFile() {
+ return "base.xsd";
+ }
+
+ protected String[] getRelevantErrorIDs() {
+ return new String[] { INVALID_TYPE_ERROR, MININCLUSIVE_DERIVATION_ERROR };
+ }
+
+ @BeforeClass
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @AfterClass
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ public RootSimpleTypeDefinitionTest(String name) {
+ super(name);
+ // This is a roundabout way of making sure that we're not using an
+ // interned string (so that == doesn't work)
+ String ns = "x" + XMLConstants.W3C_XML_SCHEMA_NS_URI;
+ ns = ns.substring(1);
+ typeString = new QName(ns, "string", "xsd");
+ typeNonNegInt = new QName(ns, "nonNegativeInteger", "xsd");
+ }
+
+ @Test
+ public void testSettingSimpleType() throws Exception {
+ try {
+ reset();
+ fValidator.setProperty(ROOT_TYPE, typeString);
+ } catch (SAXException e1) {
+ fail("Problem setting property: " + e1.getMessage());
+ }
+
+ try {
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
+ .getValidationAttempted());
+ assertElementNull(fRootNode.getElementDeclaration());
+ assertTypeName("string", fRootNode.getTypeDefinition().getName());
+ }
+
+ @Test
+ public void testSettingInvalidSimpleType() throws Exception {
+ try {
+ reset();
+ fValidator.setProperty(ROOT_TYPE, typeNonNegInt);
+ } catch (SAXException e1) {
+ fail("Problem setting property: " + e1.getMessage());
+ }
+
+ try {
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ assertError(INVALID_TYPE_ERROR);
+ assertError(MININCLUSIVE_DERIVATION_ERROR);
+ assertValidity(ItemPSVI.VALIDITY_INVALID, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
+ .getValidationAttempted());
+ assertElementNull(fRootNode.getElementDeclaration());
+ assertTypeName("nonNegativeInteger", fRootNode.getTypeDefinition().getName());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8036951/RootTypeDefinitionTest.java Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package validation.jdk8036951;
+
+
+import com.sun.org.apache.xerces.internal.xs.ElementPSVI;
+import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
+import javax.xml.XMLConstants;
+import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.validation.SchemaFactory;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import org.w3c.dom.Document;
+import validation.BaseTest;
+
+/**
+ * @author Peter McCracken, IBM
+ * @version $Id$
+ */
+public class RootTypeDefinitionTest extends BaseTest {
+
+ private QName unknownType;
+ private QName typeX;
+ private QName typeY;
+ private QName typeZ;
+ private QName typeOtherNamespace;
+
+ private final static String UNKNOWN_TYPE_ERROR = "cvc-type.1";
+
+ private final static String INVALID_DERIVATION_ERROR = "cvc-elt.4.3";
+
+ @BeforeClass
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @AfterClass
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ protected String getXMLDocument() {
+ return "base.xml";
+ }
+
+ protected String getSchemaFile() {
+ return "base.xsd";
+ }
+
+ protected String[] getRelevantErrorIDs() {
+ return new String[] { UNKNOWN_TYPE_ERROR, INVALID_DERIVATION_ERROR };
+ }
+
+ public RootTypeDefinitionTest(String name) {
+ super(name);
+ unknownType = new QName("W");
+ typeX = new QName("X");
+ typeY = new QName("Y");
+ typeZ = new QName("Z");
+ typeOtherNamespace = new QName("xslt.unittests", "W", "unit");
+ }
+
+
+ /**
+ * XERCESJ-1141 root-type-definition property not read by XMLSchemaValidator during reset()
+ */
+ @Test
+ public void testUsingDocumentBuilderFactory() throws Exception {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setAttribute(ROOT_TYPE, typeX);
+ dbf.setAttribute(DOCUMENT_CLASS_NAME,"com.sun.org.apache.xerces.internal.dom.PSVIDocumentImpl");
+ dbf.setNamespaceAware(true);
+ dbf.setValidating(false);
+
+ SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
+ dbf.setSchema(sf.newSchema(fSchemaURL));
+
+ DocumentBuilder db = dbf.newDocumentBuilder();
+ Document document = db.parse(fDocumentURL.toExternalForm());
+ ElementPSVI rootNode = (ElementPSVI) document.getDocumentElement();
+
+ assertValidity(ItemPSVI.VALIDITY_VALID, rootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, rootNode
+ .getValidationAttempted());
+ assertElementNull(rootNode.getElementDeclaration());
+ assertTypeName("X", rootNode.getTypeDefinition().getName());
+ }
+
+ private void checkDefault() {
+ assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
+ .getValidationAttempted());
+ assertElementName("A", fRootNode.getElementDeclaration().getName());
+ assertTypeName("X", fRootNode.getTypeDefinition().getName());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8036951/Xerces1128doc1Test.java Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package validation.jdk8036951;
+
+
+import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl;
+import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import validation.BaseTest;
+
+public class Xerces1128doc1Test extends BaseTest {
+
+ private final static String UNKNOWN_TYPE_ERROR = "cvc-type.1";
+
+ private final static String INVALID_DERIVATION_ERROR = "cvc-elt.4.3";
+
+ @BeforeClass
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @AfterClass
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ protected String getXMLDocument() {
+ return "xerces1128_1.xml";
+ }
+
+ protected String getSchemaFile() {
+ return "xerces1128.xsd";
+ }
+
+ protected String[] getRelevantErrorIDs() {
+ return new String[] { UNKNOWN_TYPE_ERROR, INVALID_DERIVATION_ERROR };
+ }
+
+ public Xerces1128doc1Test(String name) {
+ super(name);
+ }
+
+
+ /**
+ * XERCESJ-1128 values for {validation attempted} property in PSVI
+ */
+ @Test
+ public void testDocument1() {
+ try {
+ reset();
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ // default value of the feature is false
+ checkResult();
+ }
+
+ private void checkResult() {
+ PSVIElementNSImpl child = super.getChild(1);
+ assertValidity(ItemPSVI.VALIDITY_NOTKNOWN, child.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_NONE, child
+ .getValidationAttempted());
+ assertElementNull(child.getElementDeclaration());
+ assertTypeName("anyType", child.getTypeDefinition().getName());
+ assertTypeNamespace("http://www.w3.org/2001/XMLSchema",
+ child.getTypeDefinition().getNamespace());
+
+ child = super.getChild(2);
+ assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
+ .getValidationAttempted());
+ assertElementNull(child.getElementDeclaration());
+ assertTypeName("X", child.getTypeDefinition().getName());
+ assertTypeNamespaceNull(child.getTypeDefinition().getNamespace());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8036951/Xerces1128doc2Test.java Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,96 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package validation.jdk8036951;
+
+
+import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl;
+import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import validation.BaseTest;
+
+public class Xerces1128doc2Test extends BaseTest {
+
+ private final static String UNKNOWN_TYPE_ERROR = "cvc-type.1";
+
+ private final static String INVALID_DERIVATION_ERROR = "cvc-elt.4.3";
+
+ @BeforeClass
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @AfterClass
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ protected String getXMLDocument() {
+ return "xerces1128_2.xml";
+ }
+
+ protected String getSchemaFile() {
+ return "xerces1128.xsd";
+ }
+
+ protected String[] getRelevantErrorIDs() {
+ return new String[] { UNKNOWN_TYPE_ERROR, INVALID_DERIVATION_ERROR };
+ }
+
+ public Xerces1128doc2Test(String name) {
+ super(name);
+ }
+
+
+ /**
+ * XERCESJ-1128 values for {validation attempted} property in PSVI
+ */
+ @Test
+ public void testDocument1() {
+ try {
+ reset();
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ // default value of the feature is false
+ checkResult();
+ }
+
+ private void checkResult() {
+ PSVIElementNSImpl child = super.getChild(1);
+ assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
+ .getValidationAttempted());
+ assertElementNull(child.getElementDeclaration());
+ assertTypeName("X", child.getTypeDefinition().getName());
+ assertTypeNamespaceNull(child.getTypeDefinition().getNamespace());
+
+ child = super.getChild(2);
+ assertValidity(ItemPSVI.VALIDITY_NOTKNOWN, child.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_NONE, child
+ .getValidationAttempted());
+ assertElementNull(child.getElementDeclaration());
+ assertTypeName("anyType", child.getTypeDefinition().getName());
+ assertTypeNamespace("http://www.w3.org/2001/XMLSchema",
+ child.getTypeDefinition().getNamespace());
+
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8036951/base.xml Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<A attr="typeX">
+</A>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8036951/base.xsd Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,74 @@
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+
+ <xsd:element name="A" type="X"/>
+
+ <!-- The purpose of this element is:
+ a) To have a fixed attribute use
+ b) To have an attribute with a fixed attribute declaration
+ c) To have a complex type with simple content and a fixed value
+ d) To have an element declaration with a fixed value
+ -->
+ <xsd:element name="B" fixed="howdy">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute ref="fixedAttr" use="required" fixed="hello"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="D" type="xsd:string" fixed="hey"/>
+
+ <xsd:attribute name="attr" type="xsd:string"/>
+
+ <xsd:attribute name="unparsedEntityAttr" type="xsd:ENTITIES"/>
+
+ <xsd:attribute name="fixedAttr" type="xsd:string" fixed="hello"/>
+
+ <xsd:complexType name="X">
+ <xsd:sequence>
+ <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute ref="attr"/>
+ <xsd:attribute ref="unparsedEntityAttr"/>
+ </xsd:complexType>
+
+ <xsd:complexType name="Y">
+ <xsd:complexContent>
+ <xsd:restriction base="X">
+ <xsd:sequence>
+ <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute ref="attr" fixed="typeY"/>
+ <xsd:attribute ref="unparsedEntityAttr" use="prohibited"/>
+ </xsd:restriction>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+ <!-- Z is the same as X, but is not derived from X. -->
+ <xsd:complexType name="Z">
+ <xsd:sequence>
+ <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute ref="attr"/>
+ <xsd:attribute ref="unparsedEntityAttr"/>
+ </xsd:complexType>
+
+ <xsd:complexType name="idType">
+ <xsd:complexContent>
+ <xsd:extension base="X">
+ <xsd:attribute name="idAttr" type="xsd:ID"/>
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+ <xsd:complexType name="idrefType">
+ <xsd:complexContent>
+ <xsd:extension base="X">
+ <xsd:attribute name="idrefAttr" type="xsd:IDREF"/>
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+</xsd:schema>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8036951/idc.xml Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<itemList>
+ <item uniqueAttr="ONE">1</item>
+ <item uniqueAttr="ONE">2</item>
+ <item uniqueAttr="TWO">2</item>
+ <itemRef>3</itemRef>
+</itemList>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8036951/idc.xsd Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,41 @@
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+
+ <xsd:element name="itemList" type="itemListType">
+ <xsd:unique name="itemAttr">
+ <xsd:selector xpath="item"/>
+ <xsd:field xpath="@uniqueAttr"/>
+ </xsd:unique>
+
+ <xsd:key name="itemValueKey">
+ <xsd:selector xpath="item"/>
+ <xsd:field xpath="."/>
+ </xsd:key>
+
+ <xsd:keyref name="itemKeyRef" refer="itemValueKey">
+ <xsd:selector xpath="itemRef"/>
+ <xsd:field xpath="."/>
+ </xsd:keyref>
+ </xsd:element>
+
+ <xsd:element name="item" type="itemType"/>
+
+ <xsd:attribute name="uniqueAttr" type="xsd:string"/>
+
+ <xsd:attribute name="unparsedEntityAttr" type="xsd:ENTITIES"/>
+
+ <xsd:complexType name="itemListType">
+ <xsd:sequence>
+ <xsd:element ref="item" maxOccurs="unbounded"/>
+ <xsd:element name="itemRef" type="xsd:string" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="itemType">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute ref="uniqueAttr" use="required"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+
+</xsd:schema>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8036951/simpleType.xml Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,2 @@
+<?xml version="1.0"?>
+<S>-12345</S>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8036951/xerces1128.xsd Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,6 @@
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+<xsd:complexType name="X">
+<xsd:sequence>
+</xsd:sequence>
+</xsd:complexType>
+</xsd:schema>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8036951/xerces1128_1.xml Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+<B />
+<C xsi:type="X" />
+</A>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8036951/xerces1128_2.xml Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+<B xsi:type="X" />
+<C />
+</A>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8037819/BasicTest.java Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package validation.jdk8037819;
+
+import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl;
+import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import validation.BaseTest;
+
+public class BasicTest extends BaseTest {
+
+ protected String getXMLDocument() {
+ return "base.xml";
+ }
+
+ protected String getSchemaFile() {
+ return "base.xsd";
+ }
+
+ public BasicTest(String name) {
+ super(name);
+ }
+
+ @BeforeClass
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @AfterClass
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ @Test
+ public void testSimpleValidation() {
+ try {
+ reset();
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+ doValidityAsserts();
+ }
+
+ @Test
+ public void testSimpleValidationWithTrivialXSIType() {
+ try {
+ reset();
+ ((PSVIElementNSImpl) fRootNode).setAttributeNS(
+ "http://www.w3.org/2001/XMLSchema-instance", "type", "X");
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+ doValidityAsserts();
+ }
+
+ private void doValidityAsserts() {
+ assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
+ .getValidationAttempted());
+ assertElementName("A", fRootNode.getElementDeclaration().getName());
+ assertElementNamespaceNull(fRootNode.getElementDeclaration()
+ .getNamespace());
+ assertTypeName("X", fRootNode.getTypeDefinition().getName());
+ assertTypeNamespaceNull(fRootNode.getTypeDefinition().getNamespace());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8037819/BasicTest1.java Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,68 @@
+package validation.jdk8037819;
+
+import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl;
+import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
+import validation.BaseTest;
+
+public class BasicTest1 extends BaseTest {
+ public static void main(String[] args) throws Exception {
+ BasicTest1 test = new BasicTest1();
+ test.setUp();
+ test.testSimpleValidation();
+ test.testSimpleValidationWithTrivialXSIType();
+ test.tearDown();
+ }
+
+ protected String getXMLDocument() {
+ return "base.xml";
+ }
+
+ protected String getSchemaFile() {
+ return "base.xsd";
+ }
+
+ public BasicTest1() {
+ super("BasicTest1");
+ }
+
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ public void testSimpleValidation() {
+ try {
+ reset();
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+ doValidityAsserts();
+ }
+
+ public void testSimpleValidationWithTrivialXSIType() {
+ try {
+ reset();
+ ((PSVIElementNSImpl) fRootNode).setAttributeNS(
+ "http://www.w3.org/2001/XMLSchema-instance", "type", "X");
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+ doValidityAsserts();
+ }
+
+ private void doValidityAsserts() {
+ assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
+ .getValidationAttempted());
+ assertElementName("A", fRootNode.getElementDeclaration().getName());
+ assertElementNamespaceNull(fRootNode.getElementDeclaration()
+ .getNamespace());
+ assertTypeName("X", fRootNode.getTypeDefinition().getName());
+ assertTypeNamespaceNull(fRootNode.getTypeDefinition().getNamespace());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8037819/FixedAttrTest.java Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package validation.jdk8037819;
+
+import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl;
+import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import validation.BaseTest;
+
+/**
+ * The purpose of this test is to execute all of the isComparable calls in
+ * XMLSchemaValidator. There are two calls in processElementContent and two
+ * calls in processOneAttribute.
+ *
+ * @author peterjm
+ */
+public class FixedAttrTest extends BaseTest {
+
+ protected String getXMLDocument() {
+ return "fixedAttr.xml";
+ }
+
+ protected String getSchemaFile() {
+ return "base.xsd";
+ }
+
+ public FixedAttrTest(String name) {
+ super(name);
+ }
+
+ @BeforeClass
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @AfterClass
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ @Test
+ public void testDefault() {
+ try {
+ reset();
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
+ .getValidationAttempted());
+ assertElementName("A", fRootNode.getElementDeclaration().getName());
+
+ PSVIElementNSImpl child = super.getChild(1);
+ assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
+ .getValidationAttempted());
+ assertElementName("B", child.getElementDeclaration().getName());
+
+ child = super.getChild(2);
+ assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
+ .getValidationAttempted());
+ assertElementName("D", child.getElementDeclaration().getName());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8037819/IdIdrefCheckingTest.java Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,162 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package validation.jdk8037819;
+
+import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl;
+import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
+import org.xml.sax.SAXException;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import validation.BaseTest;
+
+// duplicate IDs
+// reference to non-existent ID
+
+public class IdIdrefCheckingTest extends BaseTest {
+ public static final String DUPLICATE_ID = "cvc-id.2";
+
+ public static final String NO_ID_BINDING = "cvc-id.1";
+
+ protected String getXMLDocument() {
+ return "idIdref.xml";
+ }
+
+ protected String getSchemaFile() {
+ return "base.xsd";
+ }
+
+ protected String[] getRelevantErrorIDs() {
+ return new String[] { DUPLICATE_ID, NO_ID_BINDING };
+ }
+
+ public IdIdrefCheckingTest(String name) {
+ super(name);
+ }
+
+ @BeforeClass
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @AfterClass
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ @Test
+ public void testDefault() {
+ try {
+ reset();
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkDefault();
+ }
+
+ @Test
+ public void testSetFalse() {
+ try {
+ reset();
+ fValidator.setFeature(ID_IDREF_CHECKING, false);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkValidResult();
+ }
+
+ @Test
+ public void testSetTrue() {
+ try {
+ reset();
+ fValidator.setFeature(ID_IDREF_CHECKING, true);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkDefault();
+ }
+
+ private void checkDefault() {
+ assertError(DUPLICATE_ID);
+ assertError(NO_ID_BINDING);
+
+ assertValidity(ItemPSVI.VALIDITY_INVALID, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
+ .getValidationAttempted());
+ assertElementName("A", fRootNode.getElementDeclaration().getName());
+ assertTypeName("X", fRootNode.getTypeDefinition().getName());
+
+ PSVIElementNSImpl child = super.getChild(1);
+ assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
+ .getValidationAttempted());
+ assertElementName("A", child.getElementDeclaration().getName());
+ assertTypeName("idType", child.getTypeDefinition().getName());
+
+ child = super.getChild(2);
+ assertValidity(ItemPSVI.VALIDITY_INVALID, child.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
+ .getValidationAttempted());
+ assertElementName("A", child.getElementDeclaration().getName());
+ assertTypeName("idType", child.getTypeDefinition().getName());
+
+ child = super.getChild(3);
+ assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
+ .getValidationAttempted());
+ assertElementName("A", child.getElementDeclaration().getName());
+ assertTypeName("idrefType", child.getTypeDefinition().getName());
+ }
+
+ private void checkValidResult() {
+ assertNoError(DUPLICATE_ID);
+ assertNoError(NO_ID_BINDING);
+
+ assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
+ .getValidationAttempted());
+ assertElementName("A", fRootNode.getElementDeclaration().getName());
+ assertTypeName("X", fRootNode.getTypeDefinition().getName());
+
+ PSVIElementNSImpl child = super.getChild(1);
+ assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
+ .getValidationAttempted());
+ assertElementName("A", child.getElementDeclaration().getName());
+ assertTypeName("idType", child.getTypeDefinition().getName());
+
+ child = super.getChild(2);
+ assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
+ .getValidationAttempted());
+ assertElementName("A", child.getElementDeclaration().getName());
+ assertTypeName("idType", child.getTypeDefinition().getName());
+
+ child = super.getChild(3);
+ assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
+ .getValidationAttempted());
+ assertElementName("A", child.getElementDeclaration().getName());
+ assertTypeName("idrefType", child.getTypeDefinition().getName());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8037819/IdentityConstraintCheckingTest.java Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,188 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package validation.jdk8037819;
+
+import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl;
+import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
+import org.xml.sax.SAXException;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import validation.BaseTest;
+
+public class IdentityConstraintCheckingTest extends BaseTest {
+ // These values are unstable, since they're not actually error keys, but
+ // simply
+ // the first part of the error message.
+ public static final String DUPLICATE_UNIQUE = "cvc-identity-constraint.4.1";
+
+ public static final String DUPLICATE_KEY = "cvc-identity-constraint.4.2.2";
+
+ public static final String INVALID_KEYREF = "cvc-identity-constraint.4.3";
+
+ protected String getXMLDocument() {
+ return "idc.xml";
+ }
+
+ protected String getSchemaFile() {
+ return "idc.xsd";
+ }
+
+ protected String[] getRelevantErrorIDs() {
+ return new String[] { DUPLICATE_UNIQUE, DUPLICATE_KEY, INVALID_KEYREF };
+ }
+
+ public IdentityConstraintCheckingTest(String name) {
+ super(name);
+ }
+
+ @BeforeClass
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @AfterClass
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ @Test
+ public void testDefault() {
+ try {
+ reset();
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkDefault();
+ }
+
+ @Test
+ public void testSetFalse() {
+ try {
+ reset();
+ fValidator.setFeature(IDC_CHECKING, false);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkValidResult();
+ }
+
+ @Test
+ public void testSetTrue() {
+ try {
+ reset();
+ fValidator.setFeature(IDC_CHECKING, true);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkDefault();
+ }
+
+ private void checkDefault() {
+ assertError(DUPLICATE_UNIQUE);
+ assertError(DUPLICATE_KEY);
+ assertError(INVALID_KEYREF);
+
+ assertValidity(ItemPSVI.VALIDITY_INVALID, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
+ .getValidationAttempted());
+ assertElementName("itemList", fRootNode.getElementDeclaration()
+ .getName());
+ assertTypeName("itemListType", fRootNode.getTypeDefinition().getName());
+
+ // this one is valid because it's the first one to define the unique
+ // value
+ PSVIElementNSImpl child = super.getChild(1);
+ assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
+ .getValidationAttempted());
+ assertElementName("item", child.getElementDeclaration().getName());
+ assertTypeName("itemType", child.getTypeDefinition().getName());
+
+ // invalid because it repeats the unique value
+ child = super.getChild(2);
+ assertValidity(ItemPSVI.VALIDITY_INVALID, child.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
+ .getValidationAttempted());
+ assertElementName("item", child.getElementDeclaration().getName());
+ assertTypeName("itemType", child.getTypeDefinition().getName());
+
+ // invalid because it repeats the key
+ child = super.getChild(3);
+ assertValidity(ItemPSVI.VALIDITY_INVALID, child.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
+ .getValidationAttempted());
+ assertElementName("item", child.getElementDeclaration().getName());
+ assertTypeName("itemType", child.getTypeDefinition().getName());
+
+ // valid because key references aren't figured out until the validation
+ // root
+ child = super.getChild(4);
+ assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
+ .getValidationAttempted());
+ assertElementName("itemRef", child.getElementDeclaration().getName());
+ assertTypeName("string", child.getTypeDefinition().getName());
+ }
+
+ private void checkValidResult() {
+ assertNoError(DUPLICATE_UNIQUE);
+ assertNoError(DUPLICATE_KEY);
+ assertNoError(INVALID_KEYREF);
+
+ assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
+ .getValidationAttempted());
+ assertElementName("itemList", fRootNode.getElementDeclaration()
+ .getName());
+ assertTypeName("itemListType", fRootNode.getTypeDefinition().getName());
+
+ PSVIElementNSImpl child = super.getChild(1);
+ assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
+ .getValidationAttempted());
+ assertElementName("item", child.getElementDeclaration().getName());
+ assertTypeName("itemType", child.getTypeDefinition().getName());
+
+ child = super.getChild(2);
+ assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
+ .getValidationAttempted());
+ assertElementName("item", child.getElementDeclaration().getName());
+ assertTypeName("itemType", child.getTypeDefinition().getName());
+
+ child = super.getChild(3);
+ assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
+ .getValidationAttempted());
+ assertElementName("item", child.getElementDeclaration().getName());
+ assertTypeName("itemType", child.getTypeDefinition().getName());
+
+ child = super.getChild(4);
+ assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
+ .getValidationAttempted());
+ assertElementName("itemRef", child.getElementDeclaration().getName());
+ assertTypeName("string", child.getTypeDefinition().getName());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8037819/IgnoreXSITypeTest_A_A.java Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,153 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package validation.jdk8037819;
+
+import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl;
+import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import validation.BaseTest;
+
+public class IgnoreXSITypeTest_A_A extends BaseTest {
+
+ protected String getXMLDocument() {
+ return "xsitype_A_A.xml";
+ }
+
+ protected String getSchemaFile() {
+ return "base.xsd";
+ }
+
+ public IgnoreXSITypeTest_A_A(String name) {
+ super(name);
+ }
+
+ @BeforeClass
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @AfterClass
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ @Test
+ public void testDefaultDocument() {
+ try {
+ reset();
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ // default value of the feature is false
+ checkFalseResult();
+ }
+
+ @Test
+ public void testDefaultFragment() {
+ try {
+ reset();
+ validateFragment();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ // default value of the feature is false
+ checkFalseResult();
+ }
+
+ @Test
+ public void testSetFalseDocument() {
+ try {
+ reset();
+ fValidator.setFeature(IGNORE_XSI_TYPE, false);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkFalseResult();
+ }
+
+ @Test
+ public void testSetFalseFragment() {
+ try {
+ reset();
+ fValidator.setFeature(IGNORE_XSI_TYPE, false);
+ validateFragment();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkFalseResult();
+ }
+
+ @Test
+ public void testSetTrueDocument() {
+ try {
+ reset();
+ fValidator.setFeature(IGNORE_XSI_TYPE, true);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkTrueResult();
+ }
+
+ @Test
+ public void testSetTrueFragment() {
+ try {
+ reset();
+ fValidator.setFeature(IGNORE_XSI_TYPE, true);
+ validateFragment();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkTrueResult();
+ }
+
+ private void checkTrueResult() {
+ checkResult();
+ }
+
+ private void checkFalseResult() {
+ checkResult();
+ }
+
+ private void checkResult() {
+ assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
+ .getValidationAttempted());
+ assertElementName("A", fRootNode.getElementDeclaration().getName());
+ assertTypeName("Y", fRootNode.getTypeDefinition().getName());
+ assertTypeNamespaceNull(fRootNode.getTypeDefinition().getNamespace());
+
+ PSVIElementNSImpl child = super.getChild(1);
+ assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
+ .getValidationAttempted());
+ assertElementName("A", child.getElementDeclaration().getName());
+ assertTypeName("Y", child.getTypeDefinition().getName());
+ assertTypeNamespaceNull(child.getTypeDefinition().getNamespace());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8037819/IgnoreXSITypeTest_A_C.java Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,153 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package validation.jdk8037819;
+
+import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl;
+import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import validation.BaseTest;
+
+public class IgnoreXSITypeTest_A_C extends BaseTest {
+
+ protected String getXMLDocument() {
+ return "xsitype_A_C.xml";
+ }
+
+ protected String getSchemaFile() {
+ return "base.xsd";
+ }
+
+ public IgnoreXSITypeTest_A_C(String name) {
+ super(name);
+ }
+
+
+ @BeforeClass
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @AfterClass
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ @Test
+ public void testDefaultDocument() {
+ try {
+ reset();
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ // default value of the feature is false
+ checkFalseResult();
+ }
+
+ @Test
+ public void testDefaultFragment() {
+ try {
+ reset();
+ validateFragment();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ // default value of the feature is false
+ checkFalseResult();
+ }
+
+ @Test
+ public void testSetFalseDocument() {
+ try {
+ reset();
+ fValidator.setFeature(IGNORE_XSI_TYPE, false);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkFalseResult();
+ }
+
+ @Test
+ public void testSetFalseFragment() {
+ try {
+ reset();
+ fValidator.setFeature(IGNORE_XSI_TYPE, false);
+ validateFragment();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkFalseResult();
+ }
+
+ @Test
+ public void testSetTrueDocument() {
+ try {
+ reset();
+ fValidator.setFeature(IGNORE_XSI_TYPE, true);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkTrueResult();
+ }
+
+ @Test
+ public void testSetTrueFragment() {
+ try {
+ reset();
+ fValidator.setFeature(IGNORE_XSI_TYPE, true);
+ validateFragment();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkTrueResult();
+ }
+
+ private void checkTrueResult() {
+ checkResult();
+ }
+
+ private void checkFalseResult() {
+ checkResult();
+ }
+
+ private void checkResult() {
+ assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
+ .getValidationAttempted());
+ assertElementName("A", fRootNode.getElementDeclaration().getName());
+ assertTypeName("Y", fRootNode.getTypeDefinition().getName());
+ assertTypeNamespaceNull(fRootNode.getTypeDefinition().getNamespace());
+
+ PSVIElementNSImpl child = super.getChild(1);
+ assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
+ .getValidationAttempted());
+ assertElementNull(child.getElementDeclaration());
+ assertTypeName("Y", child.getTypeDefinition().getName());
+ assertTypeNamespaceNull(child.getTypeDefinition().getNamespace());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8037819/IgnoreXSITypeTest_C_A.java Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,159 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package validation.jdk8037819;
+
+import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl;
+import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import validation.BaseTest;
+
+public class IgnoreXSITypeTest_C_A extends BaseTest {
+
+ protected String getXMLDocument() {
+ return "xsitype_C_A.xml";
+ }
+
+ protected String getSchemaFile() {
+ return "base.xsd";
+ }
+
+ public IgnoreXSITypeTest_C_A(String name) {
+ super(name);
+ }
+
+
+ @BeforeClass
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @AfterClass
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ @Test
+ public void testDefaultDocument() {
+ try {
+ reset();
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ // default value of the feature is false
+ checkFalseResult();
+ }
+
+ @Test
+ public void testDefaultFragment() {
+ try {
+ reset();
+ validateFragment();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ // default value of the feature is false
+ checkFalseResult();
+ }
+
+ @Test
+ public void testSetFalseDocument() {
+ try {
+ reset();
+ fValidator.setFeature(IGNORE_XSI_TYPE, false);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkFalseResult();
+ }
+
+ @Test
+ public void testSetFalseFragment() {
+ try {
+ reset();
+ fValidator.setFeature(IGNORE_XSI_TYPE, false);
+ validateFragment();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkFalseResult();
+ }
+
+ @Test
+ public void testSetTrueDocument() {
+ try {
+ reset();
+ fValidator.setFeature(IGNORE_XSI_TYPE, true);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkTrueResult();
+ }
+
+ @Test
+ public void testSetTrueFragment() {
+ try {
+ reset();
+ fValidator.setFeature(IGNORE_XSI_TYPE, true);
+ validateFragment();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkTrueResult();
+ }
+
+ private void checkTrueResult() {
+ assertValidity(ItemPSVI.VALIDITY_NOTKNOWN, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_PARTIAL, fRootNode
+ .getValidationAttempted());
+ assertElementNull(fRootNode.getElementDeclaration());
+ assertAnyType(fRootNode.getTypeDefinition());
+
+ checkChild();
+ }
+
+ private void checkFalseResult() {
+ assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
+ .getValidationAttempted());
+ assertElementNull(fRootNode.getElementDeclaration());
+ assertTypeName("Y", fRootNode.getTypeDefinition().getName());
+ assertTypeNamespaceNull(fRootNode.getTypeDefinition().getNamespace());
+
+ checkChild();
+ }
+
+ private void checkChild() {
+ PSVIElementNSImpl child = super.getChild(1);
+ assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
+ .getValidationAttempted());
+ assertElementName("A", child.getElementDeclaration().getName());
+ assertTypeName("Y", child.getTypeDefinition().getName());
+ assertTypeNamespaceNull(child.getTypeDefinition().getNamespace());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8037819/IgnoreXSITypeTest_C_AC.java Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,176 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package validation.jdk8037819;
+
+import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl;
+import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import validation.BaseTest;
+
+public class IgnoreXSITypeTest_C_AC extends BaseTest {
+
+ protected String getXMLDocument() {
+ return "xsitype_C_AC.xml";
+ }
+
+ protected String getSchemaFile() {
+ return "base.xsd";
+ }
+
+ public IgnoreXSITypeTest_C_AC(String name) {
+ super(name);
+ }
+
+
+ @BeforeClass
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @AfterClass
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ @Test
+ public void testDefaultDocument() {
+ try {
+ reset();
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ // default value of the feature is false
+ checkFalseResult();
+ }
+
+ @Test
+ public void testDefaultFragment() {
+ try {
+ reset();
+ validateFragment();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ // default value of the feature is false
+ checkFalseResult();
+ }
+
+ @Test
+ public void testSetFalseDocument() {
+ try {
+ reset();
+ fValidator.setFeature(IGNORE_XSI_TYPE, false);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkFalseResult();
+ }
+
+ @Test
+ public void testSetFalseFragment() {
+ try {
+ reset();
+ fValidator.setFeature(IGNORE_XSI_TYPE, false);
+ validateFragment();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkFalseResult();
+ }
+
+ @Test
+ public void testSetTrueDocument() {
+ try {
+ reset();
+ fValidator.setFeature(IGNORE_XSI_TYPE, true);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkTrueResult();
+ }
+
+ @Test
+ public void testSetTrueFragment() {
+ try {
+ reset();
+ fValidator.setFeature(IGNORE_XSI_TYPE, true);
+ validateFragment();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkTrueResult();
+ }
+
+ private void checkTrueResult() {
+ assertValidity(ItemPSVI.VALIDITY_NOTKNOWN, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_PARTIAL, fRootNode
+ .getValidationAttempted());
+ assertElementNull(fRootNode.getElementDeclaration());
+ assertAnyType(fRootNode.getTypeDefinition());
+
+ PSVIElementNSImpl child = super.getChild(1);
+ assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
+ .getValidationAttempted());
+ assertElementName("A", child.getElementDeclaration().getName());
+ assertTypeName("Y", child.getTypeDefinition().getName());
+ assertTypeNamespaceNull(child.getTypeDefinition().getNamespace());
+
+ child = super.getChild(2);
+ assertValidity(ItemPSVI.VALIDITY_NOTKNOWN, child.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_NONE, child
+ .getValidationAttempted());
+ assertElementNull(child.getElementDeclaration());
+ assertAnyType(child.getTypeDefinition());
+ }
+
+ private void checkFalseResult() {
+ assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
+ .getValidationAttempted());
+ assertElementNull(fRootNode.getElementDeclaration());
+ assertTypeName("Y", fRootNode.getTypeDefinition().getName());
+ assertTypeNamespaceNull(fRootNode.getTypeDefinition().getNamespace());
+
+ PSVIElementNSImpl child = super.getChild(1);
+ assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
+ .getValidationAttempted());
+ assertElementName("A", child.getElementDeclaration().getName());
+ assertTypeName("Y", child.getTypeDefinition().getName());
+ assertTypeNamespaceNull(child.getTypeDefinition().getNamespace());
+
+ child = super.getChild(2);
+ assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
+ .getValidationAttempted());
+ assertElementNull(child.getElementDeclaration());
+ assertTypeName("Y", child.getTypeDefinition().getName());
+ assertTypeNamespaceNull(child.getTypeDefinition().getNamespace());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8037819/IgnoreXSITypeTest_C_C.java Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,160 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package validation.jdk8037819;
+
+import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl;
+import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import validation.BaseTest;
+
+public class IgnoreXSITypeTest_C_C extends BaseTest {
+
+ protected String getXMLDocument() {
+ return "xsitype_C_C.xml";
+ }
+
+ protected String getSchemaFile() {
+ return "base.xsd";
+ }
+
+ public IgnoreXSITypeTest_C_C(String name) {
+ super(name);
+ }
+
+
+ @BeforeClass
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @AfterClass
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ @Test
+ public void testDefaultDocument() {
+ try {
+ reset();
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ // default value of the feature is false
+ checkFalseResult();
+ }
+
+ @Test
+ public void testDefaultFragment() {
+ try {
+ reset();
+ validateFragment();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ // default value of the feature is false
+ checkFalseResult();
+ }
+
+ @Test
+ public void testSetFalseDocument() {
+ try {
+ reset();
+ fValidator.setFeature(IGNORE_XSI_TYPE, false);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkFalseResult();
+ }
+
+ @Test
+ public void testSetFalseFragment() {
+ try {
+ reset();
+ fValidator.setFeature(IGNORE_XSI_TYPE, false);
+ validateFragment();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkFalseResult();
+ }
+
+ @Test
+ public void testSetTrueDocument() {
+ try {
+ reset();
+ fValidator.setFeature(IGNORE_XSI_TYPE, true);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkTrueResult();
+ }
+
+ @Test
+ public void testSetTrueFragment() {
+ try {
+ reset();
+ fValidator.setFeature(IGNORE_XSI_TYPE, true);
+ validateFragment();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkTrueResult();
+ }
+
+ private void checkTrueResult() {
+ assertValidity(ItemPSVI.VALIDITY_NOTKNOWN, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_NONE, fRootNode
+ .getValidationAttempted());
+ assertElementNull(fRootNode.getElementDeclaration());
+ assertAnyType(fRootNode.getTypeDefinition());
+
+ PSVIElementNSImpl child = super.getChild(1);
+ assertValidity(ItemPSVI.VALIDITY_NOTKNOWN, child.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_NONE, child
+ .getValidationAttempted());
+ assertElementNull(child.getElementDeclaration());
+ assertAnyType(child.getTypeDefinition());
+ }
+
+ private void checkFalseResult() {
+ assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
+ .getValidationAttempted());
+ assertElementNull(fRootNode.getElementDeclaration());
+ assertTypeName("Y", fRootNode.getTypeDefinition().getName());
+ assertTypeNamespaceNull(fRootNode.getTypeDefinition().getNamespace());
+
+ PSVIElementNSImpl child = super.getChild(1);
+ assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
+ .getValidationAttempted());
+ assertElementNull(child.getElementDeclaration());
+ assertTypeName("Y", child.getTypeDefinition().getName());
+ assertTypeNamespaceNull(child.getTypeDefinition().getNamespace());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8037819/IgnoreXSITypeTest_C_CA.java Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,175 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package validation.jdk8037819;
+
+import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl;
+import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import validation.BaseTest;
+
+public class IgnoreXSITypeTest_C_CA extends BaseTest {
+
+ protected String getXMLDocument() {
+ return "xsitype_C_CA.xml";
+ }
+
+ protected String getSchemaFile() {
+ return "base.xsd";
+ }
+
+ public IgnoreXSITypeTest_C_CA(String name) {
+ super(name);
+ }
+
+ @BeforeClass
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @AfterClass
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ @Test
+ public void testDefaultDocument() {
+ try {
+ reset();
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ // default value of the feature is false
+ checkFalseResult();
+ }
+
+ @Test
+ public void testDefaultFragment() {
+ try {
+ reset();
+ validateFragment();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ // default value of the feature is false
+ checkFalseResult();
+ }
+
+ @Test
+ public void testSetFalseDocument() {
+ try {
+ reset();
+ fValidator.setFeature(IGNORE_XSI_TYPE, false);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkFalseResult();
+ }
+
+ @Test
+ public void testSetFalseFragment() {
+ try {
+ reset();
+ fValidator.setFeature(IGNORE_XSI_TYPE, false);
+ validateFragment();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkFalseResult();
+ }
+
+ @Test
+ public void testSetTrueDocument() {
+ try {
+ reset();
+ fValidator.setFeature(IGNORE_XSI_TYPE, true);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkTrueResult();
+ }
+
+ @Test
+ public void testSetTrueFragment() {
+ try {
+ reset();
+ fValidator.setFeature(IGNORE_XSI_TYPE, true);
+ validateFragment();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkTrueResult();
+ }
+
+ private void checkTrueResult() {
+ assertValidity(ItemPSVI.VALIDITY_NOTKNOWN, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_PARTIAL, fRootNode
+ .getValidationAttempted());
+ assertElementNull(fRootNode.getElementDeclaration());
+ assertAnyType(fRootNode.getTypeDefinition());
+
+ PSVIElementNSImpl child = super.getChild(1);
+ assertValidity(ItemPSVI.VALIDITY_NOTKNOWN, child.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_NONE, child
+ .getValidationAttempted());
+ assertElementNull(child.getElementDeclaration());
+ assertAnyType(child.getTypeDefinition());
+
+ child = super.getChild(2);
+ assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
+ .getValidationAttempted());
+ assertElementName("A", child.getElementDeclaration().getName());
+ assertTypeName("Y", child.getTypeDefinition().getName());
+ assertTypeNamespaceNull(child.getTypeDefinition().getNamespace());
+ }
+
+ private void checkFalseResult() {
+ assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
+ .getValidationAttempted());
+ assertElementNull(fRootNode.getElementDeclaration());
+ assertTypeName("Y", fRootNode.getTypeDefinition().getName());
+ assertTypeNamespaceNull(fRootNode.getTypeDefinition().getNamespace());
+
+ PSVIElementNSImpl child = super.getChild(1);
+ assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
+ .getValidationAttempted());
+ assertElementNull(child.getElementDeclaration());
+ assertTypeName("Y", child.getTypeDefinition().getName());
+ assertTypeNamespaceNull(child.getTypeDefinition().getNamespace());
+
+ child = super.getChild(2);
+ assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child
+ .getValidationAttempted());
+ assertElementName("A", child.getElementDeclaration().getName());
+ assertTypeName("Y", child.getTypeDefinition().getName());
+ assertTypeNamespaceNull(child.getTypeDefinition().getNamespace());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8037819/RootTypeDefinitionTest.java Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,237 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package validation.jdk8037819;
+
+import javax.xml.namespace.QName;
+import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl;
+import com.sun.org.apache.xerces.internal.impl.xs.SchemaSymbols;
+import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import validation.BaseTest;
+
+public class RootTypeDefinitionTest extends BaseTest {
+ private QName unknownType;
+
+ private QName typeX;
+
+ private QName typeY;
+
+ private QName typeZ;
+
+ private QName typeOtherNamespace;
+
+ private final static String UNKNOWN_TYPE_ERROR = "cvc-type.1";
+
+ private final static String INVALID_DERIVATION_ERROR = "cvc-elt.4.3";
+
+ protected String getXMLDocument() {
+ return "base.xml";
+ }
+
+ protected String getSchemaFile() {
+ return "base.xsd";
+ }
+
+ protected String[] getRelevantErrorIDs() {
+ return new String[] { UNKNOWN_TYPE_ERROR, INVALID_DERIVATION_ERROR };
+ }
+
+ public RootTypeDefinitionTest(String name) {
+ super(name);
+ unknownType = new QName("W");
+ typeX = new QName("X");
+ typeY = new QName("Y");
+ typeZ = new QName("Z");
+ typeOtherNamespace = new QName("xslt.unittests", "W", "unit");
+ }
+
+
+ @BeforeClass
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @AfterClass
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ @Test
+ public void testDefault() {
+ try {
+ reset();
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkDefault();
+ }
+
+ @Test
+ public void testSettingNull() {
+ try {
+ reset();
+ fValidator.setProperty(ROOT_TYPE, null);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkDefault();
+ }
+
+ @Test
+ public void testSettingToUnknownType() {
+ try {
+ reset();
+ fValidator.setProperty(ROOT_TYPE, unknownType);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ assertError(UNKNOWN_TYPE_ERROR);
+ checkDefault();
+ }
+
+ @Test
+ public void testSettingToEqualType() {
+ try {
+ reset();
+ fValidator.setProperty(ROOT_TYPE, typeX);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
+ .getValidationAttempted());
+ assertElementNull(fRootNode.getElementDeclaration());
+ assertTypeName("X", fRootNode.getTypeDefinition().getName());
+ }
+
+ @Test
+ public void testSettingToDerivedType() {
+ try {
+ reset();
+ // this is required to make it a valid type Y node
+ ((PSVIElementNSImpl) fRootNode).setAttributeNS(null, "attr", "typeY");
+ fValidator.setProperty(ROOT_TYPE, typeY);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
+ .getValidationAttempted());
+ assertElementNull(fRootNode.getElementDeclaration());
+ assertTypeName("Y", fRootNode.getTypeDefinition().getName());
+ }
+
+ @Test
+ public void testSettingToNonDerivedType() {
+ try {
+ reset();
+ fValidator.setProperty(ROOT_TYPE, typeZ);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
+ .getValidationAttempted());
+ assertElementNull(fRootNode.getElementDeclaration());
+ assertTypeName("Z", fRootNode.getTypeDefinition().getName());
+ }
+
+ @Test
+ public void testSettingToOtherSchemaType() {
+ try {
+ reset();
+ ((PSVIElementNSImpl) fRootNode).setAttributeNS(SchemaSymbols.URI_XSI,
+ SchemaSymbols.XSI_SCHEMALOCATION,
+ "xslt.unittests otherNamespace.xsd");
+ fValidator.setProperty(ROOT_TYPE, typeOtherNamespace);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
+ .getValidationAttempted());
+ assertElementNull(fRootNode.getElementDeclaration());
+ assertTypeName("W", fRootNode.getTypeDefinition().getName());
+ assertTypeNamespace("xslt.unittests", fRootNode.getTypeDefinition()
+ .getNamespace());
+ }
+
+ @Test
+ public void testSettingTypeAndXSIType() {
+ try {
+ reset();
+ // this is required to make it a valid type Y node
+ ((PSVIElementNSImpl) fRootNode).setAttributeNS(null, "attr", "typeY");
+ ((PSVIElementNSImpl) fRootNode).setAttributeNS(SchemaSymbols.URI_XSI,
+ SchemaSymbols.XSI_TYPE, "Y");
+ fValidator.setProperty(ROOT_TYPE, typeX);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
+ .getValidationAttempted());
+ assertElementNull(fRootNode.getElementDeclaration());
+ assertTypeName("Y", fRootNode.getTypeDefinition().getName());
+ }
+
+ @Test
+ public void testSettingTypeAndInvalidXSIType() {
+ try {
+ reset();
+ ((PSVIElementNSImpl) fRootNode).setAttributeNS(SchemaSymbols.URI_XSI,
+ SchemaSymbols.XSI_TYPE, "Z");
+ fValidator.setProperty(ROOT_TYPE, typeX);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ assertError(INVALID_DERIVATION_ERROR);
+ assertValidity(ItemPSVI.VALIDITY_INVALID, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
+ .getValidationAttempted());
+ assertElementNull(fRootNode.getElementDeclaration());
+ assertTypeName("Z", fRootNode.getTypeDefinition().getName());
+ }
+
+ private void checkDefault() {
+ assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
+ .getValidationAttempted());
+ assertElementName("A", fRootNode.getElementDeclaration().getName());
+ assertTypeName("X", fRootNode.getTypeDefinition().getName());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8037819/UnparsedEntityCheckingTest.java Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,154 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package validation.jdk8037819;
+
+import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl;
+import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import validation.BaseTest;
+
+public class UnparsedEntityCheckingTest extends BaseTest {
+ public static final String UNDECLARED_ENTITY = "UndeclaredEntity";
+
+ protected String getXMLDocument() {
+ return "unparsedEntity.xml";
+ }
+
+ protected String getSchemaFile() {
+ return "base.xsd";
+ }
+
+ protected String[] getRelevantErrorIDs() {
+ return new String[] { UNDECLARED_ENTITY };
+ }
+
+ public UnparsedEntityCheckingTest(String name) {
+ super(name);
+ }
+
+ @BeforeClass
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @AfterClass
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ @Test
+ public void testDefaultValid() {
+ try {
+ reset();
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkDefault();
+ }
+
+ @Test
+ public void testSetFalseValid() {
+ try {
+ reset();
+ fValidator.setFeature(UNPARSED_ENTITY_CHECKING, false);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkDefault();
+ }
+
+ @Test
+ public void testSetTrueValid() {
+ try {
+ reset();
+ fValidator.setFeature(UNPARSED_ENTITY_CHECKING, true);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkDefault();
+ }
+
+ @Test
+ public void testDefaultInvalid() {
+ try {
+ reset();
+ ((PSVIElementNSImpl) fRootNode).setAttributeNS(null,
+ "unparsedEntityAttr", "invalid");
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkInvalid();
+ }
+
+ @Test
+ public void testSetFalseInvalid() {
+ try {
+ reset();
+ ((PSVIElementNSImpl) fRootNode).setAttributeNS(null,
+ "unparsedEntityAttr", "invalid");
+ fValidator.setFeature(UNPARSED_ENTITY_CHECKING, false);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkDefault();
+ }
+
+ @Test
+ public void testSetTrueInvalid() {
+ try {
+ reset();
+ ((PSVIElementNSImpl) fRootNode).setAttributeNS(null,
+ "unparsedEntityAttr", "invalid");
+ fValidator.setFeature(UNPARSED_ENTITY_CHECKING, true);
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ checkInvalid();
+ }
+
+ private void checkDefault() {
+ assertNoError(UNDECLARED_ENTITY);
+ assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
+ .getValidationAttempted());
+ assertElementName("A", fRootNode.getElementDeclaration().getName());
+ assertTypeName("X", fRootNode.getTypeDefinition().getName());
+ }
+
+ private void checkInvalid() {
+ assertError(UNDECLARED_ENTITY);
+ assertValidity(ItemPSVI.VALIDITY_INVALID, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
+ .getValidationAttempted());
+ assertElementName("A", fRootNode.getElementDeclaration().getName());
+ assertTypeName("X", fRootNode.getTypeDefinition().getName());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8037819/UseGrammarPoolOnlyTest_False.java Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package validation.jdk8037819;
+
+import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import validation.BaseTest;
+
+public class UseGrammarPoolOnlyTest_False extends BaseTest {
+ private final static String UNKNOWN_TYPE_ERROR = "cvc-type.1";
+
+ private final static String INVALID_DERIVATION_ERROR = "cvc-elt.4.3";
+
+ protected String getXMLDocument() {
+ return "otherNamespace.xml";
+ }
+
+ protected String getSchemaFile() {
+ return "base.xsd";
+ }
+
+ protected String[] getRelevantErrorIDs() {
+ return new String[] { UNKNOWN_TYPE_ERROR, INVALID_DERIVATION_ERROR };
+ }
+
+ protected boolean getUseGrammarPoolOnly() {
+ return false;
+ }
+
+ public UseGrammarPoolOnlyTest_False(String name) {
+ super(name);
+ }
+
+ @BeforeClass
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @AfterClass
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ /**
+ * The purpose of this test is to check if setting the USE_GRAMMAR_POOL_ONLY
+ * feature to true causes external schemas to not be read. This
+ * functionality already existed prior to adding the XSLT 2.0 validation
+ * features; however, because the class that controlled it changed, this
+ * test simply ensures that the existing functionality did not disappear.
+ * -PM
+ */
+ @Test
+ public void testUsingOnlyGrammarPool() {
+ try {
+ reset();
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode
+ .getValidationAttempted());
+ assertElementName("A", fRootNode.getElementDeclaration().getName());
+ assertElementNamespace("xslt.unittests", fRootNode
+ .getElementDeclaration().getNamespace());
+ assertTypeName("W", fRootNode.getTypeDefinition().getName());
+ assertTypeNamespace("xslt.unittests", fRootNode.getTypeDefinition()
+ .getNamespace());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8037819/UseGrammarPoolOnlyTest_True.java Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package validation.jdk8037819;
+
+import com.sun.org.apache.xerces.internal.xs.ItemPSVI;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import validation.BaseTest;
+
+public class UseGrammarPoolOnlyTest_True extends BaseTest {
+
+ protected String getXMLDocument() {
+ return "otherNamespace.xml";
+ }
+
+ protected String getSchemaFile() {
+ return "base.xsd";
+ }
+
+ protected boolean getUseGrammarPoolOnly() {
+ return true;
+ }
+
+ public UseGrammarPoolOnlyTest_True(String name) {
+ super(name);
+ }
+
+ @BeforeClass
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @AfterClass
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ /**
+ * The purpose of this test is to check if setting the USE_GRAMMAR_POOL_ONLY
+ * feature to true causes external schemas to not be read. This
+ * functionality already existed prior to adding the XSLT 2.0 validation
+ * features; however, because the class that controlled it changed, this
+ * test simply ensures that the existing functionality did not disappear.
+ * -PM
+ */
+ @Test
+ public void testUsingOnlyGrammarPool() {
+ try {
+ reset();
+ validateDocument();
+ } catch (Exception e) {
+ fail("Validation failed: " + e.getMessage());
+ }
+
+ assertValidity(ItemPSVI.VALIDITY_NOTKNOWN, fRootNode.getValidity());
+ assertValidationAttempted(ItemPSVI.VALIDATION_NONE, fRootNode
+ .getValidationAttempted());
+ assertElementNull(fRootNode.getElementDeclaration());
+ assertAnyType(fRootNode.getTypeDefinition());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8037819/base.xml Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<A attr="typeX">
+</A>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8037819/base.xsd Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,74 @@
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+
+ <xsd:element name="A" type="X"/>
+
+ <!-- The purpose of this element is:
+ a) To have a fixed attribute use
+ b) To have an attribute with a fixed attribute declaration
+ c) To have a complex type with simple content and a fixed value
+ d) To have an element declaration with a fixed value
+ -->
+ <xsd:element name="B" fixed="howdy">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute ref="fixedAttr" use="required" fixed="hello"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="D" type="xsd:string" fixed="hey"/>
+
+ <xsd:attribute name="attr" type="xsd:string"/>
+
+ <xsd:attribute name="unparsedEntityAttr" type="xsd:ENTITIES"/>
+
+ <xsd:attribute name="fixedAttr" type="xsd:string" fixed="hello"/>
+
+ <xsd:complexType name="X">
+ <xsd:sequence>
+ <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute ref="attr"/>
+ <xsd:attribute ref="unparsedEntityAttr"/>
+ </xsd:complexType>
+
+ <xsd:complexType name="Y">
+ <xsd:complexContent>
+ <xsd:restriction base="X">
+ <xsd:sequence>
+ <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute ref="attr" fixed="typeY"/>
+ <xsd:attribute ref="unparsedEntityAttr" use="prohibited"/>
+ </xsd:restriction>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+ <!-- Z is the same as X, but is not derived from X. -->
+ <xsd:complexType name="Z">
+ <xsd:sequence>
+ <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute ref="attr"/>
+ <xsd:attribute ref="unparsedEntityAttr"/>
+ </xsd:complexType>
+
+ <xsd:complexType name="idType">
+ <xsd:complexContent>
+ <xsd:extension base="X">
+ <xsd:attribute name="idAttr" type="xsd:ID"/>
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+ <xsd:complexType name="idrefType">
+ <xsd:complexContent>
+ <xsd:extension base="X">
+ <xsd:attribute name="idrefAttr" type="xsd:IDREF"/>
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+</xsd:schema>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8037819/fixedAttr.xml Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<A>
+ <B fixedAttr="hello">howdy</B>
+ <D>hey</D>
+</A>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8037819/idIdref.xml Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <A xsi:type="idType" idAttr="ONE"/>
+ <A xsi:type="idType" idAttr="ONE"/>
+ <A xsi:type="idrefType" idrefAttr="TWO"/>
+</A>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8037819/idc.xml Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<itemList>
+ <item uniqueAttr="ONE">1</item>
+ <item uniqueAttr="ONE">2</item>
+ <item uniqueAttr="TWO">2</item>
+ <itemRef>3</itemRef>
+</itemList>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8037819/idc.xsd Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,41 @@
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+
+ <xsd:element name="itemList" type="itemListType">
+ <xsd:unique name="itemAttr">
+ <xsd:selector xpath="item"/>
+ <xsd:field xpath="@uniqueAttr"/>
+ </xsd:unique>
+
+ <xsd:key name="itemValueKey">
+ <xsd:selector xpath="item"/>
+ <xsd:field xpath="."/>
+ </xsd:key>
+
+ <xsd:keyref name="itemKeyRef" refer="itemValueKey">
+ <xsd:selector xpath="itemRef"/>
+ <xsd:field xpath="."/>
+ </xsd:keyref>
+ </xsd:element>
+
+ <xsd:element name="item" type="itemType"/>
+
+ <xsd:attribute name="uniqueAttr" type="xsd:string"/>
+
+ <xsd:attribute name="unparsedEntityAttr" type="xsd:ENTITIES"/>
+
+ <xsd:complexType name="itemListType">
+ <xsd:sequence>
+ <xsd:element ref="item" maxOccurs="unbounded"/>
+ <xsd:element name="itemRef" type="xsd:string" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="itemType">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute ref="uniqueAttr" use="required"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+
+</xsd:schema>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8037819/otherNamespace.xml Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<unit:A xmlns:unit="xslt.unittests"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="xslt.unittests otherNamespace.xsd"
+ attr="typeX">
+</unit:A>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8037819/otherNamespace.xsd Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,18 @@
+<xsd:schema
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:unit="xslt.unittests"
+ targetNamespace="xslt.unittests">
+
+ <xsd:import schemaLocation="base.xsd"/>
+
+ <xsd:element name="A" type="unit:W"/>
+
+ <xsd:complexType name="W">
+ <xsd:sequence>
+ <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute ref="attr"/>
+ <xsd:attribute ref="unparsedEntityAttr"/>
+ </xsd:complexType>
+
+</xsd:schema>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8037819/unparsedEntity.dtd Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,2 @@
+<!NOTATION myNotation SYSTEM "somethingElse" >
+<!ENTITY myUnparsedEntity SYSTEM "something" NDATA myNotation >
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8037819/unparsedEntity.xml Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<!DOCTYPE personnel SYSTEM "unparsedEntity.dtd">
+<A attr="blah" unparsedEntityAttr="myUnparsedEntity">
+</A>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8037819/xsitype_A_A.xml Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<A attr="typeY"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:type="Y">
+ <A attr="typeY" xsi:type="Y"/>
+</A>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8037819/xsitype_A_C.xml Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<A attr="typeY"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:type="Y">
+ <C attr="typeY" xsi:type="Y"/>
+</A>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8037819/xsitype_C_A.xml Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<C attr="typeY"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:type="Y">
+ <A attr="typeY" xsi:type="Y"/>
+</C>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8037819/xsitype_C_AC.xml Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<C attr="typeY"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:type="Y">
+ <A attr="typeY" xsi:type="Y"/>
+ <C attr="typeY" xsi:type="Y"/>
+</C>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8037819/xsitype_C_C.xml Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<C attr="typeY"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:type="Y">
+ <C attr="typeY" xsi:type="Y"/>
+</C>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/validation/jdk8037819/xsitype_C_CA.xml Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<C attr="typeY"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:type="Y">
+ <C attr="typeY" xsi:type="Y"/>
+ <A attr="typeY" xsi:type="Y"/>
+</C>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/awt/datatransfer/DataFlavorComparatorTest1.java Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * 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 8058473
+ @summary "Comparison method violates its general contract" when using Clipboard
+ Ensure that DataFlavorComparator conforms to Comparator contract
+ @author Anton Nashatyrev
+ @run main DataFlavorComparatorTest1
+*/
+import sun.datatransfer.DataFlavorUtil;
+
+import java.awt.datatransfer.DataFlavor;
+import java.util.Comparator;
+
+public class DataFlavorComparatorTest1 {
+
+ public static void main(String[] args) throws Exception {
+ String[] mimes = new String[] {
+ "text/plain",
+ "text/plain; charset=unicode",
+ "text/plain; charset=cp1251",
+ "text/plain; charset=unicode; class=java.io.InputStream",
+ "text/plain; charset=unicode; class=java.io.Serializable",
+ "text/plain; charset=unicode; class=java.lang.Object",
+ "text/plain; class=java.lang.String",
+ "text/plain; class=java.io.Reader",
+ "text/plain; class=java.lang.Object",
+ "text/html",
+ "text/html; charset=unicode",
+ "text/html; charset=cp1251",
+ "text/html; charset=unicode; class=java.io.InputStream",
+ "text/html; charset=unicode; class=java.io.Serializable",
+ "text/html; charset=unicode; class=java.lang.Object",
+ "text/html; class=java.lang.String",
+ "text/html; class=java.io.Reader",
+ "text/html; class=java.lang.Object",
+ "text/unknown",
+ "text/unknown; charset=unicode",
+ "text/unknown; charset=cp1251",
+ "text/unknown; charset=unicode; class=java.io.InputStream",
+ "text/unknown; charset=unicode; class=java.io.Serializable",
+ "text/unknown; charset=unicode; class=java.lang.Object",
+ "text/unknown; class=java.lang.String",
+ "text/unknown; class=java.io.Reader",
+ "text/unknown; class=java.lang.Object",
+ "application/unknown; class=java.io.InputStream",
+ "application/unknown; class=java.lang.Object",
+ "application/unknown",
+ "application/x-java-jvm-local-objectref; class=java.io.InputStream",
+ "application/x-java-jvm-local-objectref; class=java.lang.Object",
+ "application/x-java-jvm-local-objectref",
+ "unknown/flavor",
+ "unknown/flavor; class=java.io.InputStream",
+ "unknown/flavor; class=java.lang.Object",
+ };
+
+ DataFlavor[] flavors = new DataFlavor[mimes.length];
+ for (int i = 0; i < flavors.length; i++) {
+ flavors[i] = new DataFlavor(mimes[i]);
+ }
+
+ testComparator(DataFlavorUtil.getDataFlavorComparator(), flavors);
+
+ System.out.println("Passed.");
+ }
+
+ private static void testComparator(Comparator cmp, DataFlavor[] flavs)
+ throws ClassNotFoundException {
+
+ for (DataFlavor x: flavs) {
+ for (DataFlavor y: flavs) {
+ if (Math.signum(cmp.compare(x,y)) != -Math.signum(cmp.compare(y,x))) {
+ throw new RuntimeException("Antisymmetry violated: " + x + ", " + y);
+ }
+ if (cmp.compare(x,y) == 0 && !x.equals(y)) {
+ throw new RuntimeException("Equals rule violated: " + x + ", " + y);
+ }
+ for (DataFlavor z: flavs) {
+ if (cmp.compare(x,y) == 0) {
+ if (Math.signum(cmp.compare(x, z)) != Math.signum(cmp.compare(y, z))) {
+ throw new RuntimeException("Transitivity (1) violated: " + x + ", " + y + ", " + z);
+ }
+ } else {
+ if (Math.signum(cmp.compare(x, y)) == Math.signum(cmp.compare(y, z))) {
+ if (Math.signum(cmp.compare(x, y)) != Math.signum(cmp.compare(x, z))) {
+ throw new RuntimeException("Transitivity (2) violated: " + x + ", " + y + ", " + z);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
--- a/jdk/test/sun/security/krb5/auto/S4U2proxy.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/test/sun/security/krb5/auto/S4U2proxy.java Wed Jul 05 20:04:29 2017 +0200
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 6355584
+ * @bug 6355584 8044215
* @summary Introduce constrained Kerberos delegation
* @compile -XDignore.symbol.file S4U2proxy.java
* @run main/othervm S4U2proxy krb5
@@ -69,6 +69,10 @@
Context p = s.delegated();
p.startAsClient(OneKDC.BACKEND, mech);
+
+ // 8044215: requestCredDeleg is useless and harmless
+ p.x().requestCredDeleg(true);
+
b.startAsServer(mech);
Context.handshake(p, b);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/tools/keytool/keyalg.sh Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,47 @@
+#
+# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+#
+# 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 8029659
+# @summary Keytool, print key algorithm of certificate or key entry
+#
+
+if [ "${TESTJAVA}" = "" ] ; then
+ JAVAC_CMD=`which javac`
+ TESTJAVA=`dirname $JAVAC_CMD`/..
+fi
+
+KS=ks
+KEYTOOL="$TESTJAVA/bin/keytool ${TESTTOOLVMOPTS} -keystore ks -storepass changeit -keypass changeit"
+
+rm $KS 2> /dev/null
+
+$KEYTOOL -genkeypair -alias ca -dname CN=CA -keyalg EC || exit 1
+$KEYTOOL -genkeypair -alias user -dname CN=User -keyalg RSA -keysize 1024 || exit 2
+$KEYTOOL -certreq -alias user |
+ $KEYTOOL -gencert -alias ca -rfc -sigalg SHA1withECDSA |
+ $KEYTOOL -printcert > user.dump || exit 3
+
+cat user.dump | grep "Signature algorithm name:" | grep SHA1withECDSA || exit 4
+cat user.dump | grep "Subject Public Key Algorithm:" | grep RSA | grep 1024 || exit 5
+
--- a/jdk/test/sun/util/logging/SourceClassName.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/test/sun/util/logging/SourceClassName.java Wed Jul 05 20:04:29 2017 +0200
@@ -54,7 +54,8 @@
plog.severe("Log message {0} {1}", (Object[]) params);
// create a java.util.logging.Logger
- // now java.util.logging.Logger should be created for each platform logger
+ // now java.util.logging.Logger should be created for each platform
+ // logger
Logger logger = Logger.getLogger("test.log.bar");
logger.log(Level.SEVERE, "Log message {0} {1}", params);
@@ -82,6 +83,19 @@
record[i++] = line;
if (i == 2) {
i = 0;
+ // check log message
+ if (!record[1].equals(EXPECTED_LOG)) {
+ // it can sometime happen that some static initializer
+ // in the system will log an error message - due to e.g.
+ // some kind of misconfiguration or system settings.
+ // For instance - somethink like:
+ // INFO: currency.properties entry for FR ignored
+ // because the value format is not recognized.
+ // instead of failing if we get such an unexpected
+ // message, we will simply print that out.
+ System.out.println("*** WARNING: Unexpected log: " + record[1]);
+ continue;
+ }
count++;
// check source class name and method
String[] ss = record[0].split("\\s+");
@@ -92,10 +106,6 @@
ss[len-2] + " " + ss[len-1]);
}
- // check log message
- if (!record[1].equals(EXPECTED_LOG)) {
- throw new RuntimeException("Unexpected log: " + record[1]);
- }
}
}
if (count != 3) {
--- a/jdk/test/tools/jar/LeadingGarbage.java Thu Oct 16 12:01:56 2014 -0700
+++ b/jdk/test/tools/jar/LeadingGarbage.java Wed Jul 05 20:04:29 2017 +0200
@@ -30,7 +30,6 @@
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
-import sun.tools.jar.Main;
import jdk.testlibrary.OutputAnalyzer;
import jdk.testlibrary.ProcessTools;
@@ -54,9 +53,9 @@
final File leadingGarbageZip = new File("leadingGarbage.zip");
void createFile(File f) throws IOException {
- OutputStream fos = new FileOutputStream(f);
- fos.write(f.getName().getBytes("UTF-8"));
- fos.close();
+ try (OutputStream fos = new FileOutputStream(f)) {
+ fos.write(f.getName().getBytes("UTF-8"));
+ }
}
void createFiles() throws IOException {
@@ -88,8 +87,9 @@
void createZipWithLeadingGarbage() throws Throwable {
createNormalZip();
createFile(leadingGarbageZip);
- OutputStream fos = new FileOutputStream(leadingGarbageZip, true);
- Files.copy(normalZip.toPath(), fos);
+ try (OutputStream fos = new FileOutputStream(leadingGarbageZip, true)) {
+ Files.copy(normalZip.toPath(), fos);
+ }
assertTrue(normalZip.length() < leadingGarbageZip.length());
assertTrue(normalZip.delete());
}
@@ -111,7 +111,7 @@
a.shouldHaveExitValue(0);
StringBuilder expected = new StringBuilder();
for (File file : files)
- expected.append(file.getName()).append('\n');
+ expected.append(file.getName()).append(System.lineSeparator());
a.stdoutShouldMatch(expected.toString());
a.stderrShouldMatch("\\A\\Z");
}
--- a/jdk/test/tools/jar/normalize/TestNormal.java Thu Oct 16 12:01:56 2014 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,147 +0,0 @@
-/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * 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
- * @run main/timeout=600 TestNormal
- * @bug 8020802
- * @summary Need an ability to create jar files that are invariant to the pack200 packing/unpacking
- * @author Alexander Zuev
- */
-
-import java.io.*;
-import java.util.Collections;
-import java.util.Properties;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
-
-public class TestNormal {
- private static String FS = File.separator;
-
- public static void main(String args[]) throws Exception {
- Properties p = System.getProperties();
- String java_home = p.getProperty("test.jdk");
- String dtjar = java_home + File.separator + "lib"
- + File.separator + "dt.jar";
-
- File folder = new File("dt");
- if (folder.exists()) {
- delete(folder);
- }
- folder.mkdir();
-
- try {
- extractJar(new JarFile(dtjar), folder);
- execJavaCommand(java_home, "jar cnf normalized.jar -C dt .");
- execJavaCommand(java_home, "jar cf original.jar -C dt .");
- execJavaCommand(java_home, "pack200 -r repacked.jar original.jar");
- compareJars(new JarFile("normalized.jar"), new JarFile("repacked.jar"));
- } finally {
- String[] cleanupList = {"dt", "normalized.jar", "original.jar", "repacked.jar"};
- for (String s : cleanupList) {
- delete(new File(s));
- }
- }
- }
-
- public static void execJavaCommand(String java_home, String cmd) throws Exception {
- Process proc = Runtime.getRuntime().exec(java_home + FS + "bin" + FS + cmd);
- String s;
- BufferedReader stdInput =
- new BufferedReader(new InputStreamReader(proc.getInputStream()));
- BufferedReader stdError =
- new BufferedReader(new InputStreamReader(proc.getErrorStream()));
- while ((s = stdInput.readLine()) != null) {
- System.out.println(s);
- }
- while ((s = stdError.readLine()) != null) {
- System.err.println(s);
- }
- }
-
- public static void compareJars(JarFile jf1, JarFile jf2) throws Exception {
- try {
- if (jf1.size() != jf2.size()) {
- throw new Exception("Jars " + jf1.getName() + " and " + jf2.getName()
- + " have different number of entries");
- }
- for (JarEntry elem1 : Collections.list(jf1.entries())) {
- JarEntry elem2 = jf2.getJarEntry(elem1.getName());
- if (elem2 == null) {
- throw new Exception("Element " + elem1.getName() + " is missing from " + jf2.getName());
- }
- if (!elem1.isDirectory() && elem1.getCrc() != elem2.getCrc()) {
- throw new Exception("The crc of " + elem1.getName() + " is different.");
- }
- }
- } finally {
- jf1.close();
- jf2.close();
- }
- }
-
- public static void extractJar(JarFile jf, File where) throws Exception {
- for (JarEntry file : Collections.list(jf.entries())) {
- File out = new File(where, file.getName());
- if (file.isDirectory()) {
- out.mkdirs();
- continue;
- }
- File parent = out.getParentFile();
- if (parent != null && !parent.exists()) {
- parent.mkdirs();
- }
- InputStream is = null;
- OutputStream os = null;
- try {
- is = jf.getInputStream(file);
- os = new FileOutputStream(out);
- while (is.available() > 0) {
- os.write(is.read());
- }
- } finally {
- if (is != null) {
- is.close();
- }
- if (os != null) {
- os.close();
- }
- }
- }
- }
-
- static void delete(File f) throws IOException {
- if (!f.exists()) {
- return;
- }
- if (f.isDirectory()) {
- for (File c : f.listFiles()) {
- delete(c);
- }
- }
- if (!f.delete()) {
- throw new FileNotFoundException("Failed to delete file: " + f);
- }
- }
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/tools/pack200/TestNormal.java Wed Jul 05 20:04:29 2017 +0200
@@ -0,0 +1,147 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * 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
+ * @run main/timeout=600 TestNormal
+ * @bug 8020802
+ * @summary Need an ability to create jar files that are invariant to the pack200 packing/unpacking
+ * @author Alexander Zuev
+ */
+
+import java.io.*;
+import java.util.Collections;
+import java.util.Properties;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+
+public class TestNormal {
+ private static String FS = File.separator;
+
+ public static void main(String args[]) throws Exception {
+ Properties p = System.getProperties();
+ String java_home = p.getProperty("test.jdk");
+ File testJar = new File("test.jar");
+ Utils.jar("cvf", testJar.getName(), Utils.TEST_CLS_DIR.getAbsolutePath());
+
+ File folder = new File("testdir");
+ if (folder.exists()) {
+ delete(folder);
+ }
+ folder.mkdir();
+
+ try {
+ extractJar(new JarFile(testJar), folder);
+ execJavaCommand(java_home, "jar cnf normalized.jar -C testdir .");
+ execJavaCommand(java_home, "jar cf original.jar -C testdir .");
+ execJavaCommand(java_home, "pack200 -r repacked.jar original.jar");
+ compareJars(new JarFile("normalized.jar"), new JarFile("repacked.jar"));
+ } finally {
+ String[] cleanupList = {"testdir", "normalized.jar", "original.jar", "repacked.jar"};
+ for (String s : cleanupList) {
+ delete(new File(s));
+ }
+ }
+ }
+
+ public static void execJavaCommand(String java_home, String cmd) throws Exception {
+ Process proc = Runtime.getRuntime().exec(java_home + FS + "bin" + FS + cmd);
+ String s;
+ BufferedReader stdInput =
+ new BufferedReader(new InputStreamReader(proc.getInputStream()));
+ BufferedReader stdError =
+ new BufferedReader(new InputStreamReader(proc.getErrorStream()));
+ while ((s = stdInput.readLine()) != null) {
+ System.out.println(s);
+ }
+ while ((s = stdError.readLine()) != null) {
+ System.err.println(s);
+ }
+ }
+
+ public static void compareJars(JarFile jf1, JarFile jf2) throws Exception {
+ try {
+ if (jf1.size() != jf2.size()) {
+ throw new Exception("Jars " + jf1.getName() + " and " + jf2.getName()
+ + " have different number of entries");
+ }
+ for (JarEntry elem1 : Collections.list(jf1.entries())) {
+ JarEntry elem2 = jf2.getJarEntry(elem1.getName());
+ if (elem2 == null) {
+ throw new Exception("Element " + elem1.getName() + " is missing from " + jf2.getName());
+ }
+ if (!elem1.isDirectory() && elem1.getCrc() != elem2.getCrc()) {
+ throw new Exception("The crc of " + elem1.getName() + " is different.");
+ }
+ }
+ } finally {
+ jf1.close();
+ jf2.close();
+ }
+ }
+
+ public static void extractJar(JarFile jf, File where) throws Exception {
+ for (JarEntry file : Collections.list(jf.entries())) {
+ File out = new File(where, file.getName());
+ if (file.isDirectory()) {
+ out.mkdirs();
+ continue;
+ }
+ File parent = out.getParentFile();
+ if (parent != null && !parent.exists()) {
+ parent.mkdirs();
+ }
+ InputStream is = null;
+ OutputStream os = null;
+ try {
+ is = jf.getInputStream(file);
+ os = new FileOutputStream(out);
+ while (is.available() > 0) {
+ os.write(is.read());
+ }
+ } finally {
+ if (is != null) {
+ is.close();
+ }
+ if (os != null) {
+ os.close();
+ }
+ }
+ }
+ }
+
+ static void delete(File f) throws IOException {
+ if (!f.exists()) {
+ return;
+ }
+ if (f.isDirectory()) {
+ for (File c : f.listFiles()) {
+ delete(c);
+ }
+ }
+ if (!f.delete()) {
+ throw new FileNotFoundException("Failed to delete file: " + f);
+ }
+ }
+}
--- a/make/MakeHelpers.gmk Thu Oct 16 12:01:56 2014 -0700
+++ b/make/MakeHelpers.gmk Wed Jul 05 20:04:29 2017 +0200
@@ -324,9 +324,10 @@
+($(CD) $$(dir $$(firstword $$(wildcard $$(addsuffix /$$(strip $3)/$$(strip $4)-$$(strip $1).gmk, \
$(MAKE_DIR_LIST))))) \
&& $(MAKE) $(MAKE_ARGS) \
- -f $$(strip $4)-$$(strip $1).gmk \
- $$(addprefix -I, $$(wildcard $(MAKE_DIR_LIST) \
- $$(addsuffix /$$(strip $3), $(MAKE_DIR_LIST)))))
+ -f $$(strip $4)-$$(strip $1).gmk \
+ $$(addprefix -I, $$(wildcard $(MAKE_DIR_LIST) \
+ $$(addsuffix /$$(strip $3), $(MAKE_DIR_LIST)))) \
+ MODULE=$$(strip $1))
endef
################################################################################
--- a/modules.xml Thu Oct 16 12:01:56 2014 -0700
+++ b/modules.xml Wed Jul 05 20:04:29 2017 +0200
@@ -1491,16 +1491,6 @@
</export>
</module>
<module>
- <name>jdk.compact3</name>
- <depend re-exports="true">java.compact3</depend>
- <depend re-exports="true">java.smartcardio</depend>
- <depend re-exports="true">jdk.httpserver</depend>
- <depend re-exports="true">jdk.naming.dns</depend>
- <depend re-exports="true">jdk.naming.rmi</depend>
- <depend re-exports="true">jdk.sctp</depend>
- <depend re-exports="true">jdk.security.auth</depend>
- </module>
- <module>
<name>jdk.compiler</name>
<depend>java.base</depend>
<depend re-exports="true">java.compiler</depend>
@@ -1735,7 +1725,6 @@
<depend>java.base</depend>
<depend>java.desktop</depend>
<depend>java.se</depend>
- <depend>jdk.compact3</depend>
</module>
<module>
<name>jdk.scripting.nashorn</name>