001 package toolbus.tool; 002 003 import java.net.MalformedURLException; 004 import java.net.URL; 005 import java.net.URLClassLoader; 006 import java.util.ArrayList; 007 import java.util.Iterator; 008 import java.util.List; 009 010 import toolbus.TBTermFactory; 011 import toolbus.ToolBus; 012 import toolbus.atom.Atom; 013 import aterm.ATerm; 014 import aterm.ATermAppl; 015 import aterm.ATermList; 016 import aterm.ATermPlaceholder; 017 018 public class ToolDefinition{ 019 private final ToolBus toolbus; 020 private final TBTermFactory tbfactory; 021 022 private final String toolName; 023 private final String hostName; 024 private final String command; 025 private final String className; 026 private final String kind; 027 028 private volatile boolean signatureIsSet = false; 029 030 private ATermList inputSignature; 031 private ATermList outputSignature; 032 private ATermList otherSignature; 033 034 public ToolDefinition(String toolName, String host, String kind, String command, String className, ToolBus toolbus){ 035 this.toolName = toolName; 036 this.hostName = host; 037 this.kind = kind; 038 this.command = command; 039 this.className = className; 040 this.toolbus = toolbus; 041 this.tbfactory = toolbus.getTBTermFactory(); 042 043 inputSignature = tbfactory.EmptyList; 044 outputSignature = tbfactory.EmptyList; 045 otherSignature = tbfactory.EmptyList; 046 } 047 048 public boolean isDirectlyStartableJavaNGTool(){ 049 return false;//return ("javaNG".equals(kind) && (hostName == null || hostName == "localhost")); 050 } 051 052 public String getHostName(){ 053 return hostName; 054 } 055 056 public String getKind(){ 057 return kind; 058 } 059 060 public String getName(){ 061 return toolName; 062 } 063 064 public ATermPlaceholder getNameAsPlaceholder(){ 065 ATerm t = tbfactory.make(toolName); 066 return tbfactory.makePlaceholder(t); 067 } 068 069 public String getClassPath(){ 070 String path = toolbus.getProperty(toolName + ".classpath"); 071 if(path == null) path = toolbus.getProperty("java.class.path"); 072 073 return path; 074 } 075 076 public URL[] getLoadPath(){ 077 // System.err.println("toolName = " + toolName); 078 String path = getClassPath(); 079 if(path == null) return new URL[]{}; 080 081 // System.err.println("path = " + path); 082 String[] elems = path.split("[ ;:,\n\r]"); 083 List<URL> urls = new ArrayList<URL>(elems.length); 084 for(int i = 0; i < elems.length; i++){ 085 String url = elems[i]; 086 if(url.length() > 0){ 087 url = "file://" + url; 088 // System.err.println("url = '" + url + "'"); 089 try{ 090 urls.add(new URL(url)); 091 }catch(MalformedURLException e){ 092 System.err.println("Malformed URL " + url + " ignored."); 093 } 094 } 095 } 096 return urls.toArray(new URL[urls.size()]); 097 } 098 099 public String getCommand(){ 100 return command; 101 } 102 103 public String getClassName(){ 104 return className; 105 } 106 107 public ATermList getInputSignature(){ 108 return inputSignature; 109 } 110 111 public ATermList getOutputSignature(){ 112 return outputSignature; 113 } 114 115 public ATermList getOtherSignature(){ 116 return otherSignature; 117 } 118 119 public ATerm getSignature(){ 120 return tbfactory.make("signature(<term>, <term>, <term>))", inputSignature, outputSignature, otherSignature); 121 } 122 123 public void calculateToolSignature(List<Atom> atoms){ 124 if(signatureIsSet) return; 125 126 ATermPlaceholder toolPlaceholder = getNameAsPlaceholder(); 127 128 Iterator<Atom> atomsIterator = atoms.iterator(); 129 while(atomsIterator.hasNext()){ 130 ATermAppl sig = atomsIterator.next().toATerm(); 131 if(sig.getArity() > 0){ 132 ATerm ap = sig.getArgument(0); 133 if(ap.equals(toolPlaceholder)){ 134 if(sig.getName().equals("rec-eval") || sig.getName().equals("rec-do")){ 135 inputSignature = tbfactory.makeList(sig, inputSignature); 136 }else if(sig.getName().equals("snd-event") || sig.getName().equals("snd-value") || sig.getName().equals("rec-ack-event")){ 137 outputSignature = tbfactory.makeList(sig, outputSignature); 138 }else if(sig.getName().equals("snd-connect") || sig.getName().equals("snd-disconnect")){ 139 otherSignature = tbfactory.makeList(sig, otherSignature); 140 } 141 } 142 } 143 } 144 145 otherSignature = tbfactory.makeList(tbfactory.parse("rec-terminate(<"+toolName+">, <term>)"), otherSignature); 146 147 signatureIsSet = true; 148 } 149 150 public ClassLoader createClassLoader(){ 151 return new URLClassLoader(getLoadPath()); 152 } 153 }