/**
 * @author  M. Privat
 */

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

public class NetworkClassLoader extends ClassLoader {
	URL url;
	Hashtable cache = new Hashtable();

	public NetworkClassLoader(URL u) {
		url = u;
	}

	private byte loadClassData(String name)[] {
		byte[] b = null;

		try {
			URL url1 = new URL(url.getProtocol(), url.getHost(),
									url.getFile() + '/' + name + ".class");

			URLConnection cnx = url1.openConnection();
			int len = cnx.getContentLength();

			b = new byte[len];
			DataInputStream in = new DataInputStream(url1.openStream());
			in.readFully(b);
			in.close();
		}
		catch( Exception isItASystemClass ) {
			return null;
		}
		return b;
	}

	public synchronized Class loadClass(String name, boolean resolve) {
		Class c = (Class)cache.get(name);
		if (c == null) {
			byte data[] = loadClassData(name);
			if( data != null )
				c = defineClass(name, data, 0, data.length);
			else try {
				c = Class.forName(name);
			}
			catch(Exception ignore) {}

			if(c==null) System.err.println("Ouch " + name);
			else cache.put(name, c);
		}
		if (resolve)
			resolveClass(c);

		return c;
	}
}

