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