< prev index next >

src/java.base/share/classes/jdk/internal/loader/Loader.java

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this --- 1,7 ---- /* ! * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this
*** 196,206 **** this.localPackageToModule = localPackageToModule; this.acc = AccessController.getContext(); } - /** * Completes initialization of this Loader. This method populates * remotePackageToLoader with the packages of the remote modules, where * "remote modules" are the modules read by modules defined to this loader. * --- 196,205 ----
*** 251,262 **** if (loader == null) loader = ClassLoaders.platformClassLoader(); } // find the packages that are exported to the target module - String target = resolvedModule.name(); ModuleDescriptor descriptor = other.reference().descriptor(); for (ModuleDescriptor.Exports e : descriptor.exports()) { boolean delegate; if (e.isQualified()) { // qualified export in same configuration delegate = (other.configuration() == cf) --- 250,265 ---- if (loader == null) loader = ClassLoaders.platformClassLoader(); } // find the packages that are exported to the target module ModuleDescriptor descriptor = other.reference().descriptor(); + if (descriptor.isAutomatic()) { + ClassLoader l = loader; + descriptor.packages().forEach(pn -> remotePackage(pn, l)); + } else { + String target = resolvedModule.name(); for (ModuleDescriptor.Exports e : descriptor.exports()) { boolean delegate; if (e.isQualified()) { // qualified export in same configuration delegate = (other.configuration() == cf)
*** 265,279 **** // unqualified delegate = true; } if (delegate) { ! String pn = e.source(); ! ClassLoader l = remotePackageToLoader.putIfAbsent(pn, loader); ! if (l != null && l != loader) { ! throw new IllegalArgumentException("Package " ! + pn + " cannot be imported from multiple loaders"); } } } } --- 268,278 ---- // unqualified delegate = true; } if (delegate) { ! remotePackage(e.source(), loader); } } } }
*** 281,290 **** --- 280,305 ---- return this; } /** + * Adds to remotePackageToLoader so that an attempt to load a class in + * the package delegates to the given class loader. + * + * @throws IllegalStateException + * if the package is already mapped to a different class loader + */ + private void remotePackage(String pn, ClassLoader loader) { + ClassLoader l = remotePackageToLoader.putIfAbsent(pn, loader); + if (l != null && l != loader) { + throw new IllegalStateException("Package " + + pn + " cannot be imported from multiple loaders"); + } + } + + + /** * Find the layer corresponding to the given configuration in the tree * of layers rooted at the given parent. */ private Optional<ModuleLayer> findModuleLayer(ModuleLayer parent, Configuration cf) { return SharedSecrets.getJavaLangAccess().layers(parent)
< prev index next >