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