author | dholmes |
Mon, 14 Oct 2019 22:20:03 -0400 | |
changeset 58590 | 97974e906efb |
parent 53952 | 3ccf7e10ba07 |
permissions | -rw-r--r-- |
50735
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
1 |
/* |
53952
3ccf7e10ba07
8219714: [testbug] com/sun/jdi/RedefineNestmateAttr/TestNestmateAttr.java must pass classpath to subprocess
goetz
parents:
50952
diff
changeset
|
2 |
* Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved. |
50735
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
3 |
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
4 |
* |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
5 |
* This code is free software; you can redistribute it and/or modify it |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
6 |
* under the terms of the GNU General Public License version 2 only, as |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
7 |
* published by the Free Software Foundation. |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
8 |
* |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
9 |
* This code is distributed in the hope that it will be useful, but WITHOUT |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
10 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
11 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
12 |
* version 2 for more details (a copy is included in the LICENSE file that |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
13 |
* accompanied this code). |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
14 |
* |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
15 |
* You should have received a copy of the GNU General Public License version |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
16 |
* 2 along with this work; if not, write to the Free Software Foundation, |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
17 |
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
18 |
* |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
19 |
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
20 |
* or visit www.oracle.com if you need additional information or have any |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
21 |
* questions. |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
22 |
*/ |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
23 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
24 |
/* |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
25 |
* @test |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
26 |
* @bug 8046171 |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
27 |
* @summary Class redefinition must preclude changes to nest attributes |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
28 |
* @comment This is a copy of test/jdk/java/lang/instrument/RedefineNestmateAttr/ |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
29 |
* @comment modified for JDI |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
30 |
* @library /test/lib .. |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
31 |
* @modules java.compiler |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
32 |
* @run build TestScaffold VMConnection TargetListener TargetAdapter |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
33 |
* @compile NamedBuffer.java |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
34 |
* @compile Host/Host.java |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
35 |
* @run main/othervm TestNestmateAttr Host |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
36 |
* @compile HostA/Host.java |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
37 |
* @run main/othervm TestNestmateAttr HostA |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
38 |
* @compile HostAB/Host.java |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
39 |
* @run main/othervm TestNestmateAttr HostAB |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
40 |
* @compile HostABC/Host.java |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
41 |
* @run main/othervm TestNestmateAttr HostABC |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
42 |
*/ |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
43 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
44 |
/* Test Description |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
45 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
46 |
The basic test class is called Host and we have variants that have zero or more |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
47 |
nested classes named A, B, C etc. Each variant of Host is defined in source |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
48 |
code in its own directory i.e. |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
49 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
50 |
Host/Host.java defines zero nested classes |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
51 |
HostA/Host.java defines one nested class A |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
52 |
HostAB/Host.java defines two nested classes A and B (in that order) |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
53 |
etc. |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
54 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
55 |
Each Host class has the form: |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
56 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
57 |
public class Host { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
58 |
public static String getID() { return "<directory name>/Host.java"; } |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
59 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
60 |
< zero or more empty nested classes> |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
61 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
62 |
public int m() { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
63 |
return 1; // original class |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
64 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
65 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
66 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
67 |
Under each directory is a directory "redef" with a modified version of the Host |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
68 |
class that changes the ID to e.g. Host/redef/Host.java, and the method m() |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
69 |
returns 2. This allows us to check we have the redefined class loaded. |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
70 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
71 |
Using Host' to represent the redefined version we test redefinition |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
72 |
combinations as follows: |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
73 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
74 |
Host: |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
75 |
Host -> Host' - succeeds m() returns 2 |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
76 |
Host -> HostA' - fails - added a nest member |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
77 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
78 |
HostA: |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
79 |
HostA -> HostA' - succeeds m() returns 2 |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
80 |
HostA -> Host' - fails - removed a nest member |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
81 |
HostA -> HostAB' - fails - added a nest member |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
82 |
HostA -> HostB' - fails - replaced a nest member |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
83 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
84 |
HostAB: |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
85 |
HostAB -> HostAB' - succeeds m() returns 2 |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
86 |
HostAB -> HostBA' - succeeds m() returns 2 |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
87 |
HostAB -> HostA' - fails - removed a nest member |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
88 |
HostAB -> HostABC' - fails - added a nest member |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
89 |
HostAB -> HostAC' - fails - replaced a nest member |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
90 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
91 |
HostABC: |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
92 |
HostABC -> HostABC' - succeeds m() returns 2 |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
93 |
HostABC -> HostACB' - succeeds m() returns 2 |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
94 |
HostABC -> HostBAC' - succeeds m() returns 2 |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
95 |
HostABC -> HostBCA' - succeeds m() returns 2 |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
96 |
HostABC -> HostCAB' - succeeds m() returns 2 |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
97 |
HostABC -> HostCBA' - succeeds m() returns 2 |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
98 |
HostABC -> HostAB' - fails - removed a nest member |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
99 |
HostABC -> HostABCD' - fails - added a nest member |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
100 |
HostABC -> HostABD' - fails - replaced a nest member |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
101 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
102 |
More than three nested classes doesn't add to the code coverage so |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
103 |
we stop here. |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
104 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
105 |
Note that we always try to load the redefined version even when we expect it |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
106 |
to fail. |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
107 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
108 |
We can only directly load one class Host per classloader, so to run all the |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
109 |
groups we either need to use new classloaders, or we reinvoke the test |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
110 |
requesting a different primary directory. We chose the latter using |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
111 |
multiple @run tags. So we proceed as follows: |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
112 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
113 |
@compile Host/Host.java |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
114 |
@run TestNestmateAttr Host |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
115 |
@compile HostA/Host.java - replaces previous Host.class |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
116 |
@run TestNestmateAttr HostA |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
117 |
@compile HostAB/Host.java - replaces previous Host.class |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
118 |
@run TestNestmateAttr HostAB |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
119 |
etc. |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
120 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
121 |
Within the test we directly compile redefined versions of the classes, |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
122 |
using CompilerUtil, and then read the .class file directly as a byte[]. |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
123 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
124 |
Finally we test redefinition of the NestHost attribute - which is |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
125 |
conceptually simple, but in fact very tricky to do. We do that |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
126 |
when testing HostA so we can reuse the Host$A class. |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
127 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
128 |
*/ |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
129 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
130 |
import com.sun.jdi.*; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
131 |
import com.sun.jdi.event.*; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
132 |
import com.sun.jdi.request.*; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
133 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
134 |
import java.io.File; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
135 |
import java.io.FileInputStream; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
136 |
import java.util.ArrayList; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
137 |
import java.util.Arrays; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
138 |
import java.util.Collections; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
139 |
import java.util.HashMap; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
140 |
import java.util.List; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
141 |
import java.util.Map; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
142 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
143 |
import jdk.test.lib.ByteCodeLoader; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
144 |
import jdk.test.lib.compiler.CompilerUtils; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
145 |
import jdk.test.lib.compiler.InMemoryJavaCompiler; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
146 |
import static jdk.test.lib.Asserts.assertTrue; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
147 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
148 |
/* For JDI the test is split across two VMs and so split into |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
149 |
two main classes. This is the class we will run under the debugger. |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
150 |
Package access so we can define in the same source file for ease of |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
151 |
reference. |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
152 |
*/ |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
153 |
class Target { |
58590
97974e906efb
8232182: RedefineNestmateAttr/TestNestmateAttr.java failes due to ObjectCollectedException
dholmes
parents:
53952
diff
changeset
|
154 |
|
97974e906efb
8232182: RedefineNestmateAttr/TestNestmateAttr.java failes due to ObjectCollectedException
dholmes
parents:
53952
diff
changeset
|
155 |
static Class<?> topLevelHostA; // Prevent unloading of the class |
97974e906efb
8232182: RedefineNestmateAttr/TestNestmateAttr.java failes due to ObjectCollectedException
dholmes
parents:
53952
diff
changeset
|
156 |
|
50735
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
157 |
// We have to load all of the variants of the classes that we will |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
158 |
// attempt to redefine. This requires some in-memory compilation |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
159 |
// and use of additional classloaders. |
58590
97974e906efb
8232182: RedefineNestmateAttr/TestNestmateAttr.java failes due to ObjectCollectedException
dholmes
parents:
53952
diff
changeset
|
160 |
|
50735
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
161 |
public static void main(String[] args) throws Throwable { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
162 |
String origin = args[0]; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
163 |
System.out.println("Target: Testing original Host class from " + origin); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
164 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
165 |
// Make sure the Host class loaded directly is an original version |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
166 |
// and from the expected location |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
167 |
Host h = new Host(); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
168 |
assertTrue(h.m() == 1); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
169 |
assertTrue(Host.getID().startsWith(origin + "/")); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
170 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
171 |
// The rest of this setup is only needed for the case |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
172 |
// when we perform the checkNestHostChanges() test. |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
173 |
if (origin.equals("HostA")) { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
174 |
String name = "Host$A"; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
175 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
176 |
// Have to do this reflectively as there is no Host$A |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
177 |
// when compiling the "Host/" case. |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
178 |
Class<?> nestedA = Class.forName(name); // triggers initialization |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
179 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
180 |
// This is compiled as a top-level class: the $ in the name is not |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
181 |
// significant to the compiler. |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
182 |
String hostA = "public class " + name + " {}"; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
183 |
byte[] bytes = InMemoryJavaCompiler.compile(name, hostA); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
184 |
// And we have to load this into a new classloader |
58590
97974e906efb
8232182: RedefineNestmateAttr/TestNestmateAttr.java failes due to ObjectCollectedException
dholmes
parents:
53952
diff
changeset
|
185 |
topLevelHostA = ByteCodeLoader.load(name, bytes); |
50735
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
186 |
// The loaded class has not been linked (as per ClassLoader.resolveClass) |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
187 |
// and so will be filtered out by VirtualMachine.allClasses(). There are |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
188 |
// a number of ways to force linking - this is the simplest. |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
189 |
Object o = topLevelHostA.newInstance(); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
190 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
191 |
// sanity check |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
192 |
assertTrue(nestedA.getClassLoader() != topLevelHostA.getClassLoader()); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
193 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
194 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
195 |
|
50952
529e8aec67bd
8205966: [testbug] New Nestmates JDI test times out with Xcomp on sparc
dholmes
parents:
50735
diff
changeset
|
196 |
breakpoint(); // debugger runs to here before enabling events |
50735
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
197 |
allowRedefine(); // debugger stops us here to attempt redefinitions |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
198 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
199 |
System.out.println("Target executed okay"); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
200 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
201 |
|
50952
529e8aec67bd
8205966: [testbug] New Nestmates JDI test times out with Xcomp on sparc
dholmes
parents:
50735
diff
changeset
|
202 |
static void allowRedefine() { } |
529e8aec67bd
8205966: [testbug] New Nestmates JDI test times out with Xcomp on sparc
dholmes
parents:
50735
diff
changeset
|
203 |
static void breakpoint() { } |
50735
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
204 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
205 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
206 |
public class TestNestmateAttr extends TestScaffold { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
207 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
208 |
static final String SRC = System.getProperty("test.src"); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
209 |
static final String DEST = System.getProperty("test.classes"); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
210 |
static final boolean VERBOSE = Boolean.getBoolean("verbose"); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
211 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
212 |
static String origin; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
213 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
214 |
// override this to correct a bug so arguments can be passed to |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
215 |
// the Target class |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
216 |
protected void startUp(String targetName) { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
217 |
List<String> argList = new ArrayList<>(Arrays.asList(args)); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
218 |
argList.add(0, targetName); // pre-pend so it becomes the first "app" arg |
53952
3ccf7e10ba07
8219714: [testbug] com/sun/jdi/RedefineNestmateAttr/TestNestmateAttr.java must pass classpath to subprocess
goetz
parents:
50952
diff
changeset
|
219 |
// We need the class path that contains the path to jdk.test.lib.Asserts. |
3ccf7e10ba07
8219714: [testbug] com/sun/jdi/RedefineNestmateAttr/TestNestmateAttr.java must pass classpath to subprocess
goetz
parents:
50952
diff
changeset
|
220 |
argList.add(0, " -cp " + System.getProperty("test.class.path")); |
50735
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
221 |
println("run args: " + argList); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
222 |
connect((String[]) argList.toArray(args)); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
223 |
waitForVMStart(); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
224 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
225 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
226 |
TestNestmateAttr (String[] args) { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
227 |
super(args); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
228 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
229 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
230 |
public static void main(String[] args) throws Throwable { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
231 |
origin = args[0]; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
232 |
new TestNestmateAttr(args).startTests(); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
233 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
234 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
235 |
public void runTests() throws Exception { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
236 |
// Get Target into debuggable state |
50952
529e8aec67bd
8205966: [testbug] New Nestmates JDI test times out with Xcomp on sparc
dholmes
parents:
50735
diff
changeset
|
237 |
BreakpointEvent bpe = startTo("Target", "breakpoint", "()V"); |
50735
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
238 |
EventRequestManager erm = vm().eventRequestManager(); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
239 |
MethodEntryRequest mee = erm.createMethodEntryRequest(); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
240 |
mee.addClassFilter("Target"); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
241 |
mee.enable(); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
242 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
243 |
// Allow application to complete and shut down |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
244 |
listenUntilVMDisconnect(); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
245 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
246 |
if (getExceptionCaught()) { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
247 |
throw new Exception("TestNestmateAttr: failed due to unexpected exception - check logs for details"); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
248 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
249 |
else if (!testFailed) { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
250 |
println("TestNestmateAttr: passed"); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
251 |
} else { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
252 |
throw new Exception("TestNestmateAttr: failure reported - check log for details"); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
253 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
254 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
255 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
256 |
// All the actual work is done from here once we see we've entered Target.allowRedefine() |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
257 |
public void methodEntered(MethodEntryEvent event) { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
258 |
Method meth = event.location().method(); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
259 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
260 |
if (!meth.name().equals("allowRedefine")) { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
261 |
return; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
262 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
263 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
264 |
System.out.println("TestNestmateAttr: Testing original Host class from " + origin); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
265 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
266 |
String[] badTransforms; // directories of bad classes |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
267 |
String[] goodTransforms; // directories of good classes |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
268 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
269 |
boolean testNestHostChanges = false; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
270 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
271 |
switch (origin) { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
272 |
case "Host": |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
273 |
badTransforms = new String[] { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
274 |
"HostA" // add member |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
275 |
}; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
276 |
goodTransforms = new String[] { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
277 |
origin |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
278 |
}; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
279 |
break; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
280 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
281 |
case "HostA": |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
282 |
badTransforms = new String[] { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
283 |
"Host", // remove member |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
284 |
"HostAB", // add member |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
285 |
"HostB" // change member |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
286 |
}; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
287 |
goodTransforms = new String[] { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
288 |
origin |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
289 |
}; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
290 |
testNestHostChanges = true; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
291 |
break; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
292 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
293 |
case "HostAB": |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
294 |
badTransforms = new String[] { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
295 |
"HostA", // remove member |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
296 |
"HostABC", // add member |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
297 |
"HostAC" // change member |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
298 |
}; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
299 |
goodTransforms = new String[] { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
300 |
origin, |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
301 |
"HostBA" // reorder members |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
302 |
}; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
303 |
break; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
304 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
305 |
case "HostABC": |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
306 |
badTransforms = new String[] { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
307 |
"HostAB", // remove member |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
308 |
"HostABCD", // add member |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
309 |
"HostABD" // change member |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
310 |
}; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
311 |
goodTransforms = new String[] { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
312 |
origin, |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
313 |
"HostACB", // reorder members |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
314 |
"HostBAC", // reorder members |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
315 |
"HostBCA", // reorder members |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
316 |
"HostCAB", // reorder members |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
317 |
"HostCBA" // reorder members |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
318 |
}; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
319 |
break; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
320 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
321 |
default: throw new Error("Unknown test directory: " + origin); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
322 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
323 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
324 |
// Need to locate the type we will be trying to redefine in Target |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
325 |
findReferenceTypes(); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
326 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
327 |
try { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
328 |
// Compile and check bad transformations |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
329 |
checkBadTransforms(_Host, badTransforms); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
330 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
331 |
// Compile and check good transformations |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
332 |
checkGoodTransforms(_Host, goodTransforms); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
333 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
334 |
if (testNestHostChanges) |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
335 |
checkNestHostChanges(); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
336 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
337 |
catch (Throwable t) { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
338 |
failure(t); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
339 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
340 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
341 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
342 |
// override to give exception details |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
343 |
protected void failure(Throwable t) { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
344 |
super.failure(t.getMessage()); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
345 |
t.printStackTrace(System.out); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
346 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
347 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
348 |
// These are references to the types in Target |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
349 |
// that we will be trying to redefine. |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
350 |
ReferenceType _Host; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
351 |
ReferenceType _Host_A_nested; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
352 |
ReferenceType _Host_A_topLevel; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
353 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
354 |
void findReferenceTypes() { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
355 |
List<ReferenceType> classes = vm().allClasses(); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
356 |
ClassLoaderReference cl = null; // track the main loader |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
357 |
ReferenceType a1 = null; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
358 |
ReferenceType a2 = null; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
359 |
for (ReferenceType c : classes) { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
360 |
String name = c.name(); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
361 |
if (name.equals("Host")) { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
362 |
_Host = c; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
363 |
cl = c.classLoader(); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
364 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
365 |
else if (name.equals("Host$A")) { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
366 |
if (a1 == null) { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
367 |
a1 = c; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
368 |
} else if (a2 == null) { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
369 |
a2 = c; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
370 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
371 |
else { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
372 |
assertTrue(false); // Too many Host$A classes found! |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
373 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
374 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
375 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
376 |
assertTrue(_Host != null); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
377 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
378 |
// The rest of this setup is only needed for the case |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
379 |
// when we perform the checkNestHostChanges() test. |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
380 |
if (origin.equals("HostA")) { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
381 |
assertTrue(a1 != null); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
382 |
assertTrue(a2 != null); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
383 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
384 |
if (a1.classLoader() == cl) { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
385 |
_Host_A_nested = a1; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
386 |
assertTrue(a2.classLoader() != cl); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
387 |
_Host_A_topLevel = a2; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
388 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
389 |
else if (a2.classLoader() == cl) { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
390 |
_Host_A_nested = a2; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
391 |
assertTrue(a1.classLoader() != cl); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
392 |
_Host_A_topLevel = a1; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
393 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
394 |
else { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
395 |
assertTrue(false); // Wrong classLoaders found |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
396 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
397 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
398 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
399 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
400 |
void checkNestHostChanges() throws Throwable { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
401 |
Map<ReferenceType, byte[]> map = new HashMap<>(); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
402 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
403 |
// case 1: remove NestHost attribute |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
404 |
// - try to redefine nested Host$A with a top-level |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
405 |
// class called Host$A |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
406 |
System.out.println("Trying bad retransform that removes the NestHost attribute"); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
407 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
408 |
String name = "Host$A"; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
409 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
410 |
// This is compiled as a top-level class: the $ in the name is not |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
411 |
// significant to the compiler. |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
412 |
String hostA = "public class " + name + " {}"; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
413 |
byte[] bytes = InMemoryJavaCompiler.compile(name, hostA); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
414 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
415 |
map.put(_Host_A_nested, bytes); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
416 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
417 |
try { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
418 |
vm().redefineClasses(map); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
419 |
throw new Error("Retransformation to top-level class " + name + |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
420 |
" succeeded unexpectedly"); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
421 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
422 |
catch (UnsupportedOperationException uoe) { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
423 |
if (uoe.getMessage().contains("changes to class attribute not implemented")) { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
424 |
System.out.println("Got expected exception " + uoe); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
425 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
426 |
else throw new Error("Wrong UnsupportedOperationException", uoe); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
427 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
428 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
429 |
map.clear(); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
430 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
431 |
// case 2: add NestHost attribute |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
432 |
// - This is tricky because the class with no NestHost attribute |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
433 |
// has to have the name of a nested class! But we know how to |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
434 |
// do that as we already created a top-level Host$A. So now |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
435 |
// we try to replace with a really nested Host$A. |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
436 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
437 |
System.out.println("Trying bad retransform that adds the NestHost attribute"); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
438 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
439 |
byte[] nestedBytes; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
440 |
File clsfile = new File(DEST + "/" + name + ".class"); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
441 |
if (VERBOSE) System.out.println("Reading bytes from " + clsfile); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
442 |
try (FileInputStream str = new FileInputStream(clsfile)) { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
443 |
nestedBytes = NamedBuffer.loadBufferFromStream(str); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
444 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
445 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
446 |
map.put(_Host_A_topLevel, nestedBytes); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
447 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
448 |
try { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
449 |
vm().redefineClasses(map); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
450 |
throw new Error("Retransformation to nested class " + name + |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
451 |
" succeeded unexpectedly"); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
452 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
453 |
catch (UnsupportedOperationException uoe) { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
454 |
if (uoe.getMessage().contains("changes to class attribute not implemented")) { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
455 |
System.out.println("Got expected exception " + uoe); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
456 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
457 |
else throw new Error("Wrong UnsupportedOperationException", uoe); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
458 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
459 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
460 |
map.clear(); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
461 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
462 |
// case 3: replace the NestHost attribute |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
463 |
// - the easiest way (perhaps only reasonable way) to do this |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
464 |
// is to search for the Utf8 entry used by the Constant_ClassRef, |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
465 |
// set in the NestHost attribute, and edit it to refer to a different |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
466 |
// name. We reuse nestedBytes from above. |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
467 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
468 |
System.out.println("Trying bad retransform that changes the NestHost attribute"); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
469 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
470 |
int utf8Entry_length = 7; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
471 |
boolean found = false; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
472 |
for (int i = 0; i < nestedBytes.length - utf8Entry_length; i++) { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
473 |
if (nestedBytes[i] == 1 && // utf8 tag |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
474 |
nestedBytes[i+1] == 0 && // msb of length |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
475 |
nestedBytes[i+2] == 4 && // lsb of length |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
476 |
nestedBytes[i+3] == (byte) 'H' && |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
477 |
nestedBytes[i+4] == (byte) 'o' && |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
478 |
nestedBytes[i+5] == (byte) 's' && |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
479 |
nestedBytes[i+6] == (byte) 't') { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
480 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
481 |
if (VERBOSE) System.out.println("Appear to have found Host utf8 entry starting at " + i); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
482 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
483 |
nestedBytes[i+3] = (byte) 'G'; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
484 |
found = true; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
485 |
break; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
486 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
487 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
488 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
489 |
if (!found) |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
490 |
throw new Error("Could not locate 'Host' name in byte array"); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
491 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
492 |
map.put(_Host_A_nested, nestedBytes); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
493 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
494 |
try { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
495 |
vm().redefineClasses(map); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
496 |
throw new Error("Retransformation to modified nested class" + |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
497 |
" succeeded unexpectedly"); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
498 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
499 |
catch (UnsupportedOperationException uoe) { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
500 |
if (uoe.getMessage().contains("changes to class attribute not implemented")) { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
501 |
System.out.println("Got expected exception " + uoe); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
502 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
503 |
else throw new Error("Wrong UnsupportedOperationException", uoe); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
504 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
505 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
506 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
507 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
508 |
void checkGoodTransforms(ReferenceType c, String[] dirs) throws Throwable { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
509 |
// To verify the redefinition actually took place we will invoke the |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
510 |
// Host.getID method and check the result. To do that we need to find the |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
511 |
// main thread in the target VM. We don't check that "(new Host()).m()" |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
512 |
// returns 2 due to the complexity of setting that up via JDI. |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
513 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
514 |
ThreadReference main = null; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
515 |
List<ThreadReference> threads = vm().allThreads(); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
516 |
for (ThreadReference t : threads) { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
517 |
if (t.name().equals("main")) { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
518 |
main = t; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
519 |
break; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
520 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
521 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
522 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
523 |
assertTrue(main != null); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
524 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
525 |
// Now find the method |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
526 |
Method getID = null; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
527 |
List<Method> methods = _Host.methodsByName("getID"); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
528 |
assertTrue(methods.size() == 1); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
529 |
getID = methods.get(0); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
530 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
531 |
Map<ReferenceType, byte[]> map = new HashMap<>(); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
532 |
for (String dir : dirs) { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
533 |
dir += "/redef"; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
534 |
System.out.println("Trying good retransform from " + dir); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
535 |
byte[] buf = bytesForHostClass(dir); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
536 |
map.put(c, buf); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
537 |
vm().redefineClasses(map); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
538 |
map.clear(); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
539 |
// Test redefinition worked |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
540 |
Value v = ((ClassType)_Host).invokeMethod(main, getID, Collections.emptyList(), 0); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
541 |
assertTrue(v instanceof StringReference); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
542 |
String id = ((StringReference)v).value(); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
543 |
if (VERBOSE) System.out.println("Redefined ID: " + id); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
544 |
assertTrue(id.startsWith(dir)); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
545 |
assertTrue(id.contains("/redef/")); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
546 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
547 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
548 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
549 |
void checkBadTransforms(ReferenceType c, String[] dirs) throws Throwable { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
550 |
Map<ReferenceType, byte[]> map = new HashMap<>(); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
551 |
for (String dir : dirs) { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
552 |
dir += "/redef"; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
553 |
System.out.println("Trying bad retransform from " + dir); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
554 |
byte[] buf = bytesForHostClass(dir); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
555 |
map.put(c, buf); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
556 |
try { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
557 |
vm().redefineClasses(map); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
558 |
throw new Error("Retransformation from directory " + dir + |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
559 |
" succeeded unexpectedly"); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
560 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
561 |
catch (UnsupportedOperationException uoe) { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
562 |
if (uoe.getMessage().contains("changes to class attribute not implemented")) { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
563 |
System.out.println("Got expected exception " + uoe); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
564 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
565 |
else throw new Error("Wrong UnsupportedOperationException", uoe); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
566 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
567 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
568 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
569 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
570 |
static byte[] bytesForHostClass(String dir) throws Throwable { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
571 |
compile("/" + dir); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
572 |
File clsfile = new File(DEST + "/" + dir + "/Host.class"); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
573 |
if (VERBOSE) System.out.println("Reading bytes from " + clsfile); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
574 |
byte[] buf = null; |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
575 |
try (FileInputStream str = new FileInputStream(clsfile)) { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
576 |
return buf = NamedBuffer.loadBufferFromStream(str); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
577 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
578 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
579 |
|
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
580 |
static void compile(String dir) throws Throwable { |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
581 |
File src = new File(SRC + dir); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
582 |
File dst = new File(DEST + dir); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
583 |
if (VERBOSE) System.out.println("Compiling from: " + src + "\n" + |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
584 |
" to: " + dst); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
585 |
CompilerUtils.compile(src.toPath(), |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
586 |
dst.toPath(), |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
587 |
false /* don't recurse */, |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
588 |
new String[0]); |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
589 |
} |
2f2af62dfac7
8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents:
diff
changeset
|
590 |
} |