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 }