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