diff options
Diffstat (limited to 'libjava/gnu/gcj/runtime')
| -rw-r--r-- | libjava/gnu/gcj/runtime/BootClassLoader.java | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/libjava/gnu/gcj/runtime/BootClassLoader.java b/libjava/gnu/gcj/runtime/BootClassLoader.java new file mode 100644 index 00000000000..6223c733b9f --- /dev/null +++ b/libjava/gnu/gcj/runtime/BootClassLoader.java @@ -0,0 +1,102 @@ +/* Copyright (C) 2005 Free Software Foundation + + This file is part of libgcj. + +This software is copyrighted work licensed under the terms of the +Libgcj License. Please consult the file "LIBGCJ_LICENSE" for +details. */ + +package gnu.gcj.runtime; + +import java.io.File; +import java.io.FilenameFilter; +import java.io.IOException; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.Enumeration; +import java.util.HashSet; +import java.util.StringTokenizer; + +/** + * This is a helper for the bootstrap class loader. It is a + * URLClassLoader so that we can read a class path and re-use all the + * existing code for finding classes, extracting them from jars, etc. + * However, it is never called the way that an ordinary ClassLoader is + * called. For instance, loadClass() is never used. + */ +public final class BootClassLoader extends URLClassLoader +{ + BootClassLoader(String libdir) + { + super(new URL[0]); + + // Add the contents of the endorsed directories. + StringTokenizer st + = new StringTokenizer (System.getProperty ("java.endorsed.dirs", ""), + File.pathSeparator); + try + { + while (st.hasMoreElements ()) + { + String dirname = st.nextToken (); + File dir = new File (dirname); + if (dir.exists ()) + { + if (! dirname.endsWith (File.separator)) + dirname = dirname + File.separator; + String files[] = dir.list (new FilenameFilter () + { + public boolean accept (File dir, String name) + { + return name.endsWith (".jar") || name.endsWith (".zip"); + } + }); + for (int i = files.length - 1; i >= 0; i--) + addURL(new URL("file", "", -1, dirname + files[i])); + } + } + + String w3clib = (libdir + File.separator + + System.mapLibraryName ("w3c-gcj")); + addURL(new URL("gcjlib", "", -1, w3clib)); + String saxlib = (libdir + File.separator + + System.mapLibraryName ("sax-gcj")); + addURL(new URL("gcjlib", "", -1, saxlib)); + } + catch (java.net.MalformedURLException x) + { + // This should never happen. + throw new RuntimeException(x); + } + } + + public Class bootLoadClass(String name) + throws ClassNotFoundException + { + Class c = findLoadedClass(name); + if (c == null) + { + try + { + // We could hack URLClassLoader to make this more + // efficient, if it mattered. + c = findClass(name); + } + catch (ClassNotFoundException _) + { + c = null; + } + } + return c; + } + + public URL bootGetResource(String name) + { + return findResource(name); + } + + public Enumeration bootGetResources(String name) throws IOException + { + return findResources(name); + } +} |

