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