1 19 package org.lucane.client; 20 21 import org.lucane.common.*; 22 import org.lucane.common.net.ObjectConnection; 23 24 import java.net.URL ; 25 import java.util.*; 26 27 28 32 public class PluginManager 33 { 34 private static PluginManager instance = null; 35 36 private HashMap availablePlugins; 38 39 private ArrayList runningPlugins; 41 42 47 public static PluginManager getInstance() 48 { 49 if(instance == null) 50 instance = new PluginManager(); 51 52 return instance; 53 } 54 55 58 private PluginManager() 59 { 60 this.availablePlugins = new HashMap(); 61 this.runningPlugins = new ArrayList(); 62 } 63 64 66 74 public Plugin newPluginInstance(String name, ConnectInfo[] friends, boolean starter) 75 { 76 Plugin base = (Plugin)this.availablePlugins.get(name); 77 Plugin p = base.newInstance(friends); 78 p.setStarter(starter); 79 p.setName(base.getName()); 80 p.setLocale(Client.getInstance().getConfig().getLanguage()); 81 82 return p; 83 } 84 85 92 public Plugin load(ObjectConnection oc, Message message) 93 { 94 String name = message.getApplication(); 95 Logging.getLogger().fine("Trying to load plugin " + name); 96 97 Plugin p = newPluginInstance(name, new ConnectInfo[0], false); 98 p.setStarter(false); 99 p.load(oc, message.getSender(), (String )message.getData()); 100 (new Thread (p, p.getName())).start(); 101 Logging.getLogger().info("Plugin " + name + " loaded."); 102 return p; 103 } 104 105 111 public Plugin run(String name, ConnectInfo[] friends) 112 { 113 Logging.getLogger().fine("Trying to run plugin " + name); 114 Plugin p = newPluginInstance(name, friends, true); 115 p.setStarter(true); 116 (new Thread (p, p.getName())).start(); 117 Logging.getLogger().fine("Plugin " + name + " started."); 118 119 return p; 120 } 121 122 124 130 public boolean isAvailable(String name) 131 { 132 return this.isAvailable(name, "", false); 133 } 134 135 142 public boolean isAvailable(String name, String version) 143 { 144 return isAvailable(name, version, false); 145 } 146 147 155 protected boolean isAvailable(String name, String version, boolean load) 156 { 157 Plugin plugin; 158 if(load == true) 159 { 160 try 161 { 162 LucaneClassLoader loader = LucaneClassLoader.getInstance(); 163 String baseURL = System.getProperty("user.dir") + "/" + Client.APPLICATIONS_DIRECTORY; 164 String jarUrl = baseURL + name + ".jar"; 165 URL url = new URL ("jar:file:///" + jarUrl + "!/"); 166 loader.addUrl(url); 167 Logging.getLogger().fine("plugin URL: " + url); 168 169 String className = JarUtils.getPluginClass(jarUrl); 171 Logging.getLogger().finer("classname: " + className); 172 173 plugin = (Plugin)Class.forName(className, true, loader).newInstance(); 174 plugin.setName(name); 175 plugin.setLocale(Client.getInstance().getConfig().getLanguage()); 176 this.availablePlugins.put(plugin.getName(), plugin); 177 Logging.getLogger().info("Loaded plugin " + plugin.getName() + " v. " + 178 plugin.getVersion()); 179 } 180 catch(Exception e) 181 { 182 return false; 183 } 184 } 185 186 187 plugin = (Plugin)this.availablePlugins.get(name); 188 return plugin != null && (plugin.getVersion().equals(version) || version.length() == 0); 189 } 190 191 196 public Iterator getAvailablePlugins() 197 { 198 return this.availablePlugins.values().iterator(); 199 } 200 201 207 public Plugin getPlugin(String name) 208 { 209 return (Plugin)this.availablePlugins.get(name); 210 } 211 212 213 215 218 protected void addRunningPlugin(Plugin p) 219 { 220 Logging.getLogger().fine("registering : " + p.getName()); 221 this.runningPlugins.add(p); 222 } 223 224 227 protected void removeRunningPlugin(Plugin p) 228 { 229 Logging.getLogger().fine("unregistering : " + p.getName()); 230 this.runningPlugins.remove(p); 231 232 if(runningPlugins.isEmpty() || p.getName().equals(Client.getInstance().getStartupPlugin())) 235 Client.getInstance().cleanExit(); 236 } 237 238 243 public Iterator getRunningPlugins() 244 { 245 return runningPlugins.iterator(); 246 } 247 } 248 | Popular Tags |