001 package toolbus; 002 003 import java.io.File; 004 import java.io.IOException; 005 import java.net.URL; 006 007 import org.eclipse.core.runtime.FileLocator; 008 import org.eclipse.core.runtime.IConfigurationElement; 009 import org.eclipse.core.runtime.IExtension; 010 import org.eclipse.core.runtime.IExtensionPoint; 011 import org.eclipse.core.runtime.IExtensionRegistry; 012 import org.eclipse.core.runtime.Platform; 013 import org.eclipse.core.runtime.Plugin; 014 import org.eclipse.ui.IStartup; 015 import org.osgi.framework.Bundle; 016 017 import aterm.pure.PureFactory; 018 019 public class ToolBusEclipsePlugin extends Plugin implements IStartup{ 020 private static final String pluginId = "toolbus"; 021 022 private static final String toolbusConfig = "config"; 023 024 private static class SingletonToolBus{ 025 private final ToolBus toolbus; 026 027 private SingletonToolBus(){ 028 super(); 029 String configFile = getConfigFile(); 030 031 if (configFile != null) { 032 toolbus = new ToolBus(new String[]{"-properties", getConfigFile()}); 033 } 034 else { 035 throw new RuntimeException("There was no proper toolbus extension found, so the ToolBus will not function"); 036 } 037 } 038 039 public ToolBus getToolBus(){ 040 return toolbus; 041 } 042 } 043 044 private static class InstanceKeeper{ 045 private static SingletonToolBus instance; 046 static{ 047 instance = new SingletonToolBus(); 048 runToolBus(instance.getToolBus()); 049 } 050 } 051 052 /** 053 * This constructor should only be called by the Eclipse Workbench. 054 */ 055 public ToolBusEclipsePlugin(){ 056 super(); 057 } 058 059 public void earlyStartup(){ 060 getInstance(); // Initialize this thing. 061 } 062 063 /** 064 * The plugin activator is a singleton. Use this method to obtain the 065 * instance. 066 */ 067 private static SingletonToolBus getInstance(){ 068 return InstanceKeeper.instance; 069 } 070 071 /** 072 * This method is needed for other plugins to connect to the Bus. 073 * 074 * @return The port number to connect to using the adapter. 075 */ 076 public static int getPort(){ 077 return getInstance().getToolBus().getPort(); 078 } 079 080 public static PureFactory getFactory(){ 081 return getInstance().getToolBus().getTBTermFactory(); 082 } 083 084 public static ToolBus getToolBus(){ 085 return getInstance().getToolBus(); 086 } 087 088 private static void runToolBus(final ToolBus toolbus){ 089 try{ 090 toolbus.parsecup(); 091 toolbus.prepare(); 092 Thread thread = new Thread(new Runnable(){ 093 public void run(){ 094 toolbus.execute(); 095 } 096 }); 097 thread.setName(pluginId); 098 thread.start(); 099 100 DebugConsole debugConsole = new DebugConsole(toolbus); 101 debugConsole.show(); 102 }catch(Exception rex){ 103 rex.printStackTrace(); 104 throw new RuntimeException(rex); 105 } 106 } 107 108 private static String getConfigFile(){ 109 IExtensionRegistry registry = Platform.getExtensionRegistry(); 110 IExtensionPoint point = registry.getExtensionPoint(pluginId, toolbusConfig); 111 112 IExtension extensions[] = point.getExtensions(); 113 114 if(extensions.length == 1){ 115 IConfigurationElement[] configElements = extensions[0].getConfigurationElements(); 116 for(int i = configElements.length - 1; i >= 0; i--){ 117 IConfigurationElement ce = configElements[i]; 118 if(ce.getName().equals("toolbus")){ 119 String configPath = ce.getAttribute("config"); 120 121 Bundle bundle = Platform.getBundle(ce.getContributor().getName()); 122 File file; 123 124 try{ 125 file = getFile(bundle, configPath); 126 127 if (file != null) { 128 return file.getAbsolutePath(); 129 } 130 }catch(IOException e){ 131 System.err.println("Failed to get config file: " + configPath); 132 e.printStackTrace(); 133 } 134 } 135 } 136 } 137 138 return null; 139 } 140 141 /** 142 * This method finds the file pointing to by resourcePath in bundle, and returns its file handle. 143 * 144 * @param bundle 145 * @param resourcePath 146 * @return 147 * @throws IOException 148 */ 149 public static File getFile(Bundle bundle, String resourcePath) throws IOException { 150 URL url = bundle.getEntry(resourcePath); 151 152 File file = null; 153 154 if(url != null){ 155 file = new File(FileLocator.toFileURL(url).getPath()); 156 } 157 158 return file; 159 } 160 161 }