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 }