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    }