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