001 /*
002
003 $Id: PluginLoader.java,v 1.3 2003/05/08 10:34:22 culdesac Exp $
004
005 */
006
007 package sharpster.common;
008
009 import java.io.*;
010 import java.net.*;
011 import java.util.*;
012
013 public class PluginLoader extends ClassLoader {
014
015 /**
016 * Loads a plugin specified by a name and a directory.
017 *
018 * @return The plugin object.
019 */
020 public static Object load(String name, String path) {
021 PluginLoader loader = new PluginLoader();
022 return loader.loadClass(name, path);
023 }
024
025 /**
026 * Loads a class specified by a name and a directory.
027 *
028 * @return The class object.
029 */
030 private Object loadClass(String name, String path) {
031 String filename = name + ".class";
032 Object tempObject = null;
033 Class tempClass = null;
034
035 //Check wheter the class is already loaded
036 tempClass = findLoadedClass(name);
037
038 if(tempClass == null) {
039 try {
040 //Check wheter the class is a system class
041 tempClass = findSystemClass(name);
042 }
043 catch(Exception e) {
044 }
045 }
046
047 if(tempClass == null) {
048 try {
049 byte data[] = loadClassData(path, filename);
050 tempClass = defineClass(name, data, 0, data.length);
051 if(tempClass == null) {
052 return null;
053 }
054 } catch (Exception e) {
055 return null;
056 }
057 }
058
059 try {
060 tempObject = tempClass.newInstance();
061 } catch(Exception e) {
062 return null;
063 }
064
065 return tempObject;
066 }
067
068 /**
069 * Loads a class data specified by a name and a directory.
070 *
071 * @return A byte array containing the class definition.
072 */
073 private byte[] loadClassData(String path, String filename) throws IOException {
074 File filehandler = new File(path, filename);
075
076 int size = (int)filehandler.length();
077 byte buffer[] = new byte[size];
078
079 FileInputStream fileinput = new FileInputStream(filehandler);
080 DataInputStream datainput = new DataInputStream(fileinput);
081
082 datainput.readFully(buffer);
083 datainput.close();
084
085 return buffer;
086 }
087 }
088