/*
 * 作成日: 2005/10/29
 */
package asandatabasebrowser.util;

import java.io.*;

public class PathClassLoader extends ClassLoader {
	 
	String[] paths;
	/**
	 * @param paths	個々のパスには末尾にセパレータをつけないこと。
	 */
	public PathClassLoader(String[] paths) {
		this.paths = paths;
	}

	public Class findClass(String name) {
		byte[] b = loadClassData(name);
		if (b == null) return null;
		return defineClass(name, b, 0, b.length);
	}

	
	/**
	 * 指定されたパスを使って、サーバのクラスを取得する.
	 */
	private byte[] loadClassData(String name) {
		// クラス名からファイル名を取得。
		String fname = name.replace('.', File.separatorChar) + ".class";
		// 個々のパスにファイルがあるかどうかを探す。
		for (int i=0; i<paths.length; i++) {
			File file = new File(paths[i] + File.separatorChar + fname);
			if (file.exists()) {
				byte[] bytes = new byte[(int) file.length()];
				FileInputStream in = null;
				try {
					in = new FileInputStream(file);
					int len = in.read(bytes);
					if (len == bytes.length) return bytes;
				}
				catch (IOException e) {
					e.printStackTrace();
				}
				finally {
					if (file != null) try { in.close(); } catch (IOException e1) {}
				}
			}
		}
		return null;	// 見つからなかった(;_;)
	}

}
