001    package nl.cwi.sen1.gui.plugin;
002    
003    import java.io.IOException;
004    import java.net.JarURLConnection;
005    import java.net.MalformedURLException;
006    import java.net.URL;
007    import java.net.URLClassLoader;
008    import java.util.StringTokenizer;
009    import java.util.jar.Attributes;
010    
011    
012    import aterm.ATermAppl;
013    import aterm.ATermList;
014    
015    public class PluginLoader extends URLClassLoader {
016            private static final String CLASSPATH_SEPARATORS = ":";
017    
018            private URL pluginURL;
019    
020            public PluginLoader(String pluginName) {
021                    super(new URL[] {});
022                    this.pluginURL = createURL(pluginName);
023                    addURL(pluginURL);
024            }
025    
026            public PluginLoader(String pluginName, ATermList classPathEntries) {
027                    this(pluginName);
028                    for (int i = 0; !classPathEntries.isEmpty(); i++) {
029                            String entry = ((ATermAppl) classPathEntries.getFirst()).getName();
030                            addURL(createURL(entry));
031                            classPathEntries = classPathEntries.getNext();
032                    }
033            }
034    
035            public PluginLoader(String pluginName, String classPath) {
036                    this(pluginName);
037                    StringTokenizer tok = new StringTokenizer(classPath,
038                                    CLASSPATH_SEPARATORS);
039                    while (tok.hasMoreTokens()) {
040                            String url = tok.nextToken();
041                            try {
042                                    addURL(new URL("file:" + url));
043                            } catch (MalformedURLException e) {
044                                    System.err.println("Ignoring malformed url: " + url);
045                            }
046                    }
047            }
048    
049            private URL createURL(String jarName) {
050                    URL url = null;
051                    try {
052                            url = new URL(jarName);
053                    } catch (MalformedURLException e) {
054                            System.err.println("Invalid URL: " + jarName);
055                    }
056                    return url;
057            }
058    
059            /**
060             * Returns the name of the jar file main class, or null if no "Main-Class"
061             * manifest attribute was defined.
062             */
063            private String findPluginMain() throws IOException {
064              String pluginMain = null;
065              URL u = new URL("jar", "", pluginURL + "!/");
066              JarURLConnection uc = (JarURLConnection) u.openConnection();
067              Attributes attr = uc.getMainAttributes();
068              if (attr != null) {
069                pluginMain = attr.getValue(Attributes.Name.MAIN_CLASS);
070              } else {
071                System.err.println("Unable to find a Main-Class in plugin: " + pluginURL);
072              }
073              return pluginMain;
074            }
075    
076            public StudioPlugin instantiatePlugin() {
077              try {
078                String pluginMain = findPluginMain();
079                StudioPlugin plugin = null;
080                Class<?> cl = loadClass(pluginMain);
081                return (StudioPlugin) cl.newInstance();
082              } catch (Exception e) {
083                System.err.println("Failed to instantiate plugin:" + pluginURL + "\n"  + e.getMessage());
084                return null;
085              }
086            }
087    }