/* Copyright (C) 1999  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.  */

/* Author: Kresten Krab Thorup <krab@gnu.org>  */

package gnu.gcj.runtime;

import java.io.*;
import java.util.StringTokenizer;
import java.net.URL;

final class VMClassLoader extends java.net.URLClassLoader
{
  private VMClassLoader ()
  {	
    super (init());
  }

  private static URL[] init() 
  {
    StringTokenizer st
	= new StringTokenizer (System.getProperty ("java.class.path", "."),
			       System.getProperty ("path.separator", ":"));

    java.util.Vector p = new java.util.Vector();
    while (st.hasMoreElements ()) 
      {  
	String e = st.nextToken ();
	try
	  {
	    if (e.endsWith(".jar") || e.endsWith (".zip"))
	      {
		File archive = new File (e);
		try {
		  p.addElement(new URL("jar", "", -1, "file://"
				       + archive.getCanonicalPath ()
				       + "!/"));
		} catch (IOException ex) {
		  // empty
		}
	      }
	    else if (e.endsWith ("/"))
	      p.addElement (new URL("file", "", -1, e));
	    else if (new File (e).isDirectory ())
	      p.addElement (new URL("file", "", -1, e + "/"));
	    else
	      /* Ignore path element. */;
	  } 
	catch (java.net.MalformedURLException x)
	  {
	    /* Ignore this path element */
	  }
      }

    URL[] urls = new URL[p.size()];
    p.copyInto (urls);
    return urls;
  }

  /** This is overridden to search the internal hash table, which 
   * will only search existing linked-in classes.   This will make
   * the default implementation of loadClass (in ClassLoader) work right.
   */
  protected final native Class findSystemClass(String name) 
    throws java.lang.ClassNotFoundException, java.lang.LinkageError;

  // Return the sole VMClassLoader.
  private static synchronized VMClassLoader getVMClassLoader ()
  {
    if (redirect == null)
      redirect = new VMClassLoader ();
    return redirect;
  }

  // The only VMClassLoader that can exist.
  private static VMClassLoader redirect;
}
