46 import java.util.Map; |
46 import java.util.Map; |
47 import java.util.Set; |
47 import java.util.Set; |
48 import myloaders.MySameClassLoader; |
48 import myloaders.MySameClassLoader; |
49 |
49 |
50 // |
50 // |
51 // ClassLoader1 --> defines m1 --> packages p1 |
51 // ClassLoader1 --> defines m1x --> packages p1 |
52 // defines m2 --> packages p2 |
52 // defines m2x --> packages p2 |
53 // defines m3 --> packages p3 |
53 // defines m3x --> packages p3 |
54 // |
54 // |
55 // m1 can read m2 |
55 // m1x can read m2x |
56 // package p2 in m2 is exported to m3 |
56 // package p2 in m2x is exported to m3x |
57 // |
57 // |
58 // class p1.c1 defined in m1 tries to access p2.c2 defined in m2 |
58 // class p1.c1 defined in m1x tries to access p2.c2 defined in m2x |
59 // Access denied since although m1 can read m2, p2 is exported only to m3. |
59 // Access denied since although m1x can read m2x, p2 is exported only to m3x. |
60 // |
60 // |
61 public class ExpQualOther { |
61 public class ExpQualOther { |
62 |
62 |
63 // Create a Layer over the boot layer. |
63 // Create a Layer over the boot layer. |
64 // Define modules within this layer to test access between |
64 // Define modules within this layer to test access between |
65 // publically defined classes within packages of those modules. |
65 // publically defined classes within packages of those modules. |
66 public void createLayerOnBoot() throws Throwable { |
66 public void createLayerOnBoot() throws Throwable { |
67 |
67 |
68 // Define module: m1 |
68 // Define module: m1x |
69 // Can read: java.base, m2, m3 |
69 // Can read: java.base, m2x, m3x |
70 // Packages: p1 |
70 // Packages: p1 |
71 // Packages exported: p1 is exported unqualifiedly |
71 // Packages exported: p1 is exported unqualifiedly |
72 ModuleDescriptor descriptor_m1 = |
72 ModuleDescriptor descriptor_m1x = |
73 ModuleDescriptor.module("m1") |
73 ModuleDescriptor.newModule("m1x") |
74 .requires("java.base") |
74 .requires("java.base") |
75 .requires("m2") |
75 .requires("m2x") |
76 .requires("m3") |
76 .requires("m3x") |
77 .exports("p1") |
77 .exports("p1") |
78 .build(); |
78 .build(); |
79 |
79 |
80 // Define module: m2 |
80 // Define module: m2x |
81 // Can read: java.base |
81 // Can read: java.base |
82 // Packages: p2 |
82 // Packages: p2 |
83 // Packages exported: p2 is exported to m3 |
83 // Packages exported: p2 is exported to m3x |
84 ModuleDescriptor descriptor_m2 = |
84 ModuleDescriptor descriptor_m2x = |
85 ModuleDescriptor.module("m2") |
85 ModuleDescriptor.newModule("m2x") |
86 .requires("java.base") |
86 .requires("java.base") |
87 .exports("p2", Set.of("m3")) |
87 .exports("p2", Set.of("m3x")) |
88 .build(); |
88 .build(); |
89 |
89 |
90 // Define module: m3 |
90 // Define module: m3x |
91 // Can read: java.base, m2 |
91 // Can read: java.base, m2x |
92 // Packages: p3 |
92 // Packages: p3 |
93 // Packages exported: none |
93 // Packages exported: none |
94 ModuleDescriptor descriptor_m3 = |
94 ModuleDescriptor descriptor_m3x = |
95 ModuleDescriptor.module("m3") |
95 ModuleDescriptor.newModule("m3x") |
96 .requires("java.base") |
96 .requires("java.base") |
97 .requires("m2") |
97 .requires("m2x") |
98 .contains("p3") |
98 .packages(Set.of("p3")) |
99 .build(); |
99 .build(); |
100 |
100 |
101 // Set up a ModuleFinder containing all modules for this layer. |
101 // Set up a ModuleFinder containing all modules for this layer. |
102 ModuleFinder finder = ModuleLibrary.of(descriptor_m1, descriptor_m2, descriptor_m3); |
102 ModuleFinder finder = ModuleLibrary.of(descriptor_m1x, descriptor_m2x, descriptor_m3x); |
103 |
103 |
104 // Resolves "m1" |
104 // Resolves "m1x" |
105 Configuration cf = Layer.boot() |
105 Configuration cf = Layer.boot() |
106 .configuration() |
106 .configuration() |
107 .resolveRequires(finder, ModuleFinder.of(), Set.of("m1")); |
107 .resolve(finder, ModuleFinder.of(), Set.of("m1x")); |
108 |
108 |
109 // map each module to differing class loaders for this test |
109 // map each module to differing class loaders for this test |
110 Map<String, ClassLoader> map = new HashMap<>(); |
110 Map<String, ClassLoader> map = new HashMap<>(); |
111 map.put("m1", MySameClassLoader.loader1); |
111 map.put("m1x", MySameClassLoader.loader1); |
112 map.put("m2", MySameClassLoader.loader1); |
112 map.put("m2x", MySameClassLoader.loader1); |
113 map.put("m3", MySameClassLoader.loader1); |
113 map.put("m3x", MySameClassLoader.loader1); |
114 |
114 |
115 // Create Layer that contains m1 & m2 |
115 // Create Layer that contains m1x & m2x |
116 Layer layer = Layer.boot().defineModules(cf, map::get); |
116 Layer layer = Layer.boot().defineModules(cf, map::get); |
117 |
117 |
118 assertTrue(layer.findLoader("m1") == MySameClassLoader.loader1); |
118 assertTrue(layer.findLoader("m1x") == MySameClassLoader.loader1); |
119 assertTrue(layer.findLoader("m2") == MySameClassLoader.loader1); |
119 assertTrue(layer.findLoader("m2x") == MySameClassLoader.loader1); |
120 assertTrue(layer.findLoader("m3") == MySameClassLoader.loader1); |
120 assertTrue(layer.findLoader("m3x") == MySameClassLoader.loader1); |
121 assertTrue(layer.findLoader("java.base") == null); |
121 assertTrue(layer.findLoader("java.base") == null); |
122 |
122 |
123 // now use the same loader to load class p1.c1 |
123 // now use the same loader to load class p1.c1 |
124 Class p1_c1_class = MySameClassLoader.loader1.loadClass("p1.c1"); |
124 Class p1_c1_class = MySameClassLoader.loader1.loadClass("p1.c1"); |
125 try { |
125 try { |
126 p1_c1_class.newInstance(); |
126 p1_c1_class.newInstance(); |
127 throw new RuntimeException("Failed to get IAE (p2 in m2 is exported to m3 not to m1)"); |
127 throw new RuntimeException("Failed to get IAE (p2 in m2x is exported to m3x not to m1x)"); |
128 } catch (IllegalAccessError e) { |
128 } catch (IllegalAccessError e) { |
129 System.out.println(e.getMessage()); |
129 System.out.println(e.getMessage()); |
130 if (!e.getMessage().contains("does not export")) { |
130 if (!e.getMessage().contains("does not export")) { |
131 throw new RuntimeException("Wrong message: " + e.getMessage()); |
131 throw new RuntimeException("Wrong message: " + e.getMessage()); |
132 } |
132 } |