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 }