< prev index next >
src/java.base/share/classes/jdk/internal/loader/BuiltinClassLoader.java
Print this page
*** 58,67 ****
--- 58,68 ----
import java.util.stream.Stream;
import jdk.internal.misc.VM;
import jdk.internal.module.ModulePatcher.PatchedModuleReader;
import jdk.internal.module.SystemModules;
+ import jdk.internal.module.Resources;
/**
* The platform or application class loader. Resources loaded from modules
* defined to the boot class loader are also loaded via an instance of this
*** 161,170 ****
--- 162,179 ----
this.nameToModule = new ConcurrentHashMap<>();
this.moduleToReader = new ConcurrentHashMap<>();
}
/**
+ * Returns {@code true} if there is a class path associated with this
+ * class loader.
+ */
+ boolean hasClassPath() {
+ return ucp != null;
+ }
+
+ /**
* Register a module this this class loader. This has the effect of making
* the types in the module visible.
*/
public void loadModule(ModuleReference mref) {
assert !VM.isModuleSystemInited();
*** 246,267 ****
* Finds a resource with the given name in the modules defined to this
* class loader or its class path.
*/
@Override
public URL findResource(String name) {
! String pn = ResourceHelper.getPackageName(name);
LoadedModule module = packageToModule.get(pn);
if (module != null) {
// resource is in a package of a module defined to this loader
! if (module.loader() == this
! && (name.endsWith(".class") || isOpen(module.mref(), pn))) {
try {
! return findResource(module.name(), name); // checks URL
} catch (IOException ioe) {
return null;
}
}
} else {
// not in a module package but may be in module defined to this loader
--- 255,282 ----
* Finds a resource with the given name in the modules defined to this
* class loader or its class path.
*/
@Override
public URL findResource(String name) {
! String pn = Resources.toPackageName(name);
LoadedModule module = packageToModule.get(pn);
if (module != null) {
// resource is in a package of a module defined to this loader
! if (module.loader() == this) {
! URL url;
try {
! url = findResource(module.name(), name); // checks URL
} catch (IOException ioe) {
return null;
}
+ if (url != null
+ && (name.endsWith(".class")
+ || url.toString().endsWith("/")
+ || isOpen(module.mref(), pn))) {
+ return url;
+ }
}
} else {
// not in a module package but may be in module defined to this loader
*** 291,309 ****
*/
@Override
public Enumeration<URL> findResources(String name) throws IOException {
List<URL> checked = new ArrayList<>(); // list of checked URLs
! String pn = ResourceHelper.getPackageName(name);
LoadedModule module = packageToModule.get(pn);
if (module != null) {
// resource is in a package of a module defined to this loader
! if (module.loader() == this
! && (name.endsWith(".class") || isOpen(module.mref(), pn))) {
URL url = findResource(module.name(), name); // checks URL
! if (url != null) {
checked.add(url);
}
}
} else {
--- 306,326 ----
*/
@Override
public Enumeration<URL> findResources(String name) throws IOException {
List<URL> checked = new ArrayList<>(); // list of checked URLs
! String pn = Resources.toPackageName(name);
LoadedModule module = packageToModule.get(pn);
if (module != null) {
// resource is in a package of a module defined to this loader
! if (module.loader() == this) {
URL url = findResource(module.name(), name); // checks URL
! if (url != null
! && (name.endsWith(".class")
! || url.toString().endsWith("/")
! || isOpen(module.mref(), pn))) {
checked.add(url);
}
}
} else {
*** 349,363 ****
try {
urls = AccessController.doPrivileged(
new PrivilegedExceptionAction<>() {
@Override
public List<URL> run() throws IOException {
! List<URL> result = new ArrayList<>();
for (ModuleReference mref : nameToModule.values()) {
URI u = moduleReaderFor(mref).find(name).orElse(null);
if (u != null) {
try {
result.add(u.toURL());
} catch (MalformedURLException |
IllegalArgumentException e) {
}
}
--- 366,382 ----
try {
urls = AccessController.doPrivileged(
new PrivilegedExceptionAction<>() {
@Override
public List<URL> run() throws IOException {
! List<URL> result = null;
for (ModuleReference mref : nameToModule.values()) {
URI u = moduleReaderFor(mref).find(name).orElse(null);
if (u != null) {
try {
+ if (result == null)
+ result = new ArrayList<>();
result.add(u.toURL());
} catch (MalformedURLException |
IllegalArgumentException e) {
}
}
*** 373,383 ****
if (VM.isModuleSystemInited()) {
if (map == null) {
map = new ConcurrentHashMap<>();
this.resourceCache = new SoftReference<>(map);
}
! if (urls.isEmpty())
urls = Collections.emptyList();
map.putIfAbsent(name, urls);
}
return urls;
}
--- 392,402 ----
if (VM.isModuleSystemInited()) {
if (map == null) {
map = new ConcurrentHashMap<>();
this.resourceCache = new SoftReference<>(map);
}
! if (urls == null)
urls = Collections.emptyList();
map.putIfAbsent(name, urls);
}
return urls;
}
*** 868,885 ****
implVendor,
sealBase);
}
/**
- * Returns {@code true} if there is a class path associated with this
- * class loader.
- */
- boolean hasClassPath() {
- return ucp != null;
- }
-
- /**
* Returns {@code true} if the specified package name is sealed according to
* the given manifest.
*/
private boolean isSealed(String pn, Manifest man) {
String path = pn.replace('.', '/').concat("/");
--- 887,896 ----
*** 973,983 ****
* packages. This will be replaced once the ModuleDescriptor.Opens
* API is updated.
*/
private boolean isOpen(ModuleReference mref, String pn) {
ModuleDescriptor descriptor = mref.descriptor();
! if (descriptor.isOpen())
return true;
for (ModuleDescriptor.Opens opens : descriptor.opens()) {
String source = opens.source();
if (!opens.isQualified() && source.equals(pn)) {
return true;
--- 984,994 ----
* packages. This will be replaced once the ModuleDescriptor.Opens
* API is updated.
*/
private boolean isOpen(ModuleReference mref, String pn) {
ModuleDescriptor descriptor = mref.descriptor();
! if (descriptor.isOpen() || descriptor.isAutomatic())
return true;
for (ModuleDescriptor.Opens opens : descriptor.opens()) {
String source = opens.source();
if (!opens.isQualified() && source.equals(pn)) {
return true;
< prev index next >