001    package toolbus.tifs;
002    
003    import java.io.File;
004    import java.io.FileNotFoundException;
005    import java.io.FileOutputStream;
006    import java.io.IOException;
007    import java.io.PrintStream;
008    import java.util.Calendar;
009    import java.util.Iterator;
010    import java.util.StringTokenizer;
011    
012    import aterm.ATerm;
013    import aterm.ATermFactory;
014    
015    public class TifToJava{
016            private final Tif tif;
017            private final String outputBaseDir;
018            
019            private String capitalize(String s){
020                    return s.substring(0, 1).toUpperCase() + s.substring(1);
021            }
022            
023            public TifToJava(Tif tif, String outputBaseDir){
024                    this.tif = tif;
025                    this.outputBaseDir = outputBaseDir;
026            }
027            
028            private void generate(){
029                    Iterator<Process> iter = tif.fetchProcessIterator();
030                    while(iter.hasNext()){
031                            Process process = iter.next();
032                            PrintStream out = openOutputFile(process);
033                            emitHeader(out);
034                            generateProcessInterface(process, out);
035                            out.close();
036                    }
037            }
038            
039            private void emitHeader(PrintStream out){
040                    String timeStamp = Calendar.getInstance().getTime().toString();
041                    out.println("// Generated by TifToJava on " + timeStamp);
042                    out.println();
043                    out.println("package " + tif.getPackageName() + ";");
044                    out.println();
045            }
046            
047            private void generateProcessInterface(Process process, PrintStream out){
048                    out.println("public interface " + getInterfaceName(process));
049                    out.println('{');
050                    Iterator<Communication> iter = process.fetchCommunicationIterator();
051                    while(iter.hasNext()){
052                            Communication comm = iter.next();
053                            out.print("  ");
054                            generateCommunication(comm, out);
055                    }
056                    out.println('}');
057            }
058            
059            private void generateCommunication(Communication comm, PrintStream out){
060                    out.print("public ");
061                    out.print(comm.getResultType());
062                    out.print(' ');
063                    out.print(communicationToMethodName(comm.getName()));
064                    out.print('(');
065                    generateArguments(comm, out);
066                    out.println(");");
067            }
068            
069            private void generateArguments(Communication comm, PrintStream out){
070                    Iterator<String> iter = comm.fetchArgumentIterator();
071                    int argCount = 0;
072                    while(iter.hasNext()){
073                            String type = iter.next();
074                            out.print(type);
075                            out.print(' ');
076                            out.print("arg");
077                            out.print(argCount++);
078                            if(iter.hasNext()){
079                                    out.print(", ");
080                            }
081                    }
082            }
083            
084            private String getInterfaceName(Process process){
085                    return capitalize(tif.getToolName()) + process.getName();
086            }
087            
088            private PrintStream openOutputFile(Process process){
089                    File outputDirectory = createOutputDirectory(tif.getPackageName());
090                    String fileName = getInterfaceName(process) + ".java";
091                    try{
092                            File outputFile = new File(outputDirectory, fileName);
093                            return new PrintStream(new FileOutputStream(outputFile));
094                    }catch(FileNotFoundException e){
095                            throw new RuntimeException(e);
096                    }
097            }
098            
099            private File createOutputDirectory(String packageName){
100                    String outputDirName = packageName.replace('.', File.separatorChar);
101                    if(!outputBaseDir.equals("")){
102                            outputDirName = outputBaseDir + File.separatorChar + outputDirName;
103                    }
104                    
105                    File outputDir = new File(outputDirName);
106                    outputDir.mkdirs();
107                    return outputDir;
108            }
109            
110            
111            // Convert dash-separated communication-name to javaMethodName
112            private String communicationToMethodName(String communicationName){
113                    StringBuilder buf = new StringBuilder();
114                    StringTokenizer tokenizer = new StringTokenizer(communicationName, "-");
115                    if(tokenizer.hasMoreTokens()){
116                            buf.append(tokenizer.nextToken());
117                    }
118                    while(tokenizer.hasMoreTokens()){
119                            buf.append(capitalize(tokenizer.nextToken()));
120                    }
121                    return buf.toString();
122            }
123            
124            private static boolean isCommandLineSwitch(String arg, String shortName, String longName){
125                    return shortName.equals(arg) || longName.startsWith(arg);
126            }
127            
128            public static void main(String[] args){
129                    String fileName = "";
130                    String outputBaseDir = "";
131                    
132                    for(int i = 0; i < args.length; i++){
133                            if(isCommandLineSwitch(args[i], "-t", "--tifs")){
134                                    fileName = args[++i];
135                            }
136                            if(isCommandLineSwitch(args[i], "-o", "--output-dir")){
137                                    outputBaseDir = args[++i];
138                            }
139                    }
140                    
141                    ATermFactory factory = new aterm.pure.PureFactory();
142                    ATerm tifsTerm = null;
143                    
144                    try{
145                            tifsTerm = factory.readFromFile(fileName);
146                    }catch(IOException e){
147                            System.err.println("Error reading " + fileName + ": " + e);
148                    }
149                    Tif tif = new Tif(tifsTerm);
150                    // System.out.println(tif.toString());
151                    TifToJava generator = new TifToJava(tif, outputBaseDir);
152                    generator.generate();
153            }
154            
155    }