summaryrefslogtreecommitdiffstats
path: root/libjava/gnu/gcj/runtime/BootClassLoader.java
blob: 6223c733b9fed78d2b4f16e52c7cb4626aae4abd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
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);
  }
}
OpenPOWER on IntegriCloud