47 import java.util.Map; |
47 import java.util.Map; |
48 import java.util.Set; |
48 import java.util.Set; |
49 import myloaders.MySameClassLoader; |
49 import myloaders.MySameClassLoader; |
50 |
50 |
51 // |
51 // |
52 // ClassLoader1 --> defines m1 --> no packages |
52 // ClassLoader1 --> defines m1x --> no packages |
53 // defines m2 --> packages p2 |
53 // defines m2x --> packages p2 |
54 // |
54 // |
55 // m1 can read m2 |
55 // m1x can read m2x |
56 // package p2 in m2 is exported unqualifiedly |
56 // package p2 in m2x is exported unqualifiedly |
57 // |
57 // |
58 // class p1.c1 defined in an unnamed module tries to access p2.c2 defined in m2 |
58 // class p1.c1 defined in an unnamed module tries to access p2.c2 defined in m2x |
59 // Access allowed, an unnamed module can read all modules and p2 in module |
59 // Access allowed, an unnamed module can read all modules and p2 in module |
60 // m2 is exported to all unnamed modules. |
60 // m2x is exported to all unnamed modules. |
61 |
61 |
62 public class ExportAllUnnamed { |
62 public class ExportAllUnnamed { |
63 |
63 |
64 // Create a Layer over the boot layer. |
64 // Create a Layer over the boot layer. |
65 // Define modules within this layer to test access between |
65 // Define modules within this layer to test access between |
66 // publically defined classes within packages of those modules. |
66 // publically defined classes within packages of those modules. |
67 public void createLayerOnBoot() throws Throwable { |
67 public void createLayerOnBoot() throws Throwable { |
68 |
68 |
69 // Define module: m1 |
69 // Define module: m1x |
70 // Can read: java.base, m2 |
70 // Can read: java.base, m2x |
71 // Packages: none |
71 // Packages: none |
72 // Packages exported: none |
72 // Packages exported: none |
73 ModuleDescriptor descriptor_m1 = |
73 ModuleDescriptor descriptor_m1x = |
74 ModuleDescriptor.module("m1") |
74 ModuleDescriptor.newModule("m1x") |
75 .requires("java.base") |
75 .requires("java.base") |
76 .requires("m2") |
76 .requires("m2x") |
77 .build(); |
77 .build(); |
78 |
78 |
79 // Define module: m2 |
79 // Define module: m2x |
80 // Can read: java.base |
80 // Can read: java.base |
81 // Packages: p2 |
81 // Packages: p2 |
82 // Packages exported: p2 is exported unqualifiedly |
82 // Packages exported: p2 is exported unqualifiedly |
83 ModuleDescriptor descriptor_m2 = |
83 ModuleDescriptor descriptor_m2x = |
84 ModuleDescriptor.module("m2") |
84 ModuleDescriptor.newModule("m2x") |
85 .requires("java.base") |
85 .requires("java.base") |
86 .exports("p2", Set.of("m1")) |
86 .exports("p2", Set.of("m1x")) |
87 .build(); |
87 .build(); |
88 |
88 |
89 // Set up a ModuleFinder containing all modules for this layer. |
89 // Set up a ModuleFinder containing all modules for this layer. |
90 ModuleFinder finder = ModuleLibrary.of(descriptor_m1, descriptor_m2); |
90 ModuleFinder finder = ModuleLibrary.of(descriptor_m1x, descriptor_m2x); |
91 |
91 |
92 // Resolves "m1" |
92 // Resolves "m1x" |
93 Configuration cf = Layer.boot() |
93 Configuration cf = Layer.boot() |
94 .configuration() |
94 .configuration() |
95 .resolveRequires(finder, ModuleFinder.of(), Set.of("m1")); |
95 .resolve(finder, ModuleFinder.of(), Set.of("m1x")); |
96 |
96 |
97 // map each module to differing class loaders for this test |
97 // map each module to differing class loaders for this test |
98 Map<String, ClassLoader> map = new HashMap<>(); |
98 Map<String, ClassLoader> map = new HashMap<>(); |
99 map.put("m1", MySameClassLoader.loader1); |
99 map.put("m1x", MySameClassLoader.loader1); |
100 map.put("m2", MySameClassLoader.loader1); |
100 map.put("m2x", MySameClassLoader.loader1); |
101 |
101 |
102 // Create Layer that contains m1 & m2 |
102 // Create Layer that contains m1x & m2x |
103 Layer layer = Layer.boot().defineModules(cf, map::get); |
103 Layer layer = Layer.boot().defineModules(cf, map::get); |
104 |
104 |
105 assertTrue(layer.findLoader("m1") == MySameClassLoader.loader1); |
105 assertTrue(layer.findLoader("m1x") == MySameClassLoader.loader1); |
106 assertTrue(layer.findLoader("m2") == MySameClassLoader.loader1); |
106 assertTrue(layer.findLoader("m2x") == MySameClassLoader.loader1); |
107 assertTrue(layer.findLoader("java.base") == null); |
107 assertTrue(layer.findLoader("java.base") == null); |
108 |
108 |
109 Class p2_c2_class = MySameClassLoader.loader1.loadClass("p2.c2"); |
109 Class p2_c2_class = MySameClassLoader.loader1.loadClass("p2.c2"); |
110 Module m2 = p2_c2_class.getModule(); |
110 Module m2x = p2_c2_class.getModule(); |
111 |
111 |
112 // Export m2/p2 to all unnamed modules. |
112 // Export m2x/p2 to all unnamed modules. |
113 jdk.internal.module.Modules.addExportsToAllUnnamed(m2, "p2"); |
113 jdk.internal.module.Modules.addExportsToAllUnnamed(m2x, "p2"); |
114 |
114 |
115 // now use the same loader to load class p1.c1 |
115 // now use the same loader to load class p1.c1 |
116 Class p1_c1_class = MySameClassLoader.loader1.loadClass("p1.c1"); |
116 Class p1_c1_class = MySameClassLoader.loader1.loadClass("p1.c1"); |
117 try { |
117 try { |
118 p1_c1_class.newInstance(); |
118 p1_c1_class.newInstance(); |