001 package edu.rice.cs.cunit; 002 003 import edu.rice.cs.cunit.instrumentors.threadCheck.CompoundThreadCheckStrategy; 004 import edu.rice.cs.cunit.instrumentors.threadCheck.CompoundReflectionThreadCheckStrategy; 005 import edu.rice.cs.cunit.util.Debug; 006 007 import java.io.FileOutputStream; 008 import java.io.PrintStream; 009 import java.io.FileNotFoundException; 010 011 /** 012 * Execute a Java program by loading it with the InstrumentingClassLoader and running the Thread Checker. 013 * 014 * @author Mathias Ricken 015 */ 016 public class TCRun extends ACUnitRun { 017 /** 018 * String with syntax description for TCRun. 019 */ 020 protected static final String OPTIONS_FORMAT_TCRUN = "[-h] [-d] [-output <txt>] [-r] [-ns] [-backup] [-X <s>] <class> [args...]"; 021 022 /** 023 * Static main method. 024 * 025 * @param args command line arguments 026 */ 027 public static void main(String args[]) { 028 (new TCRun()).run(args); 029 } 030 031 /** 032 * Print a help message to the specified stream. 033 * @param out output stream 034 */ 035 protected static void help(PrintStream out) { 036 // ---------1---------2---------3---------4---------5---------6---------7---------8 037 out.println("Flags : "+ OPTIONS_FORMAT_TCRUN); 038 out.println("-h Show this help"); 039 out.println("-d Debug output"); 040 out.println("-output <txt> Debug output to file <txt>"); 041 out.println("-r Run the reflection-based instrumentor"); 042 out.println("-ns Do not save instrumented class files"); 043 out.println("-backup Make backups of original class files (only if no -nw)"); 044 out.println("-X <s> Pass <s> as parameter to instrumentors; may be repeated"); 045 out.println("<class> [args...] Class file whose main method to execute, and arguments."); 046 } 047 048 /** 049 * Read the command line arguments or ask for them in a dialog. 050 * 051 * @param args command line arguments 052 */ 053 protected void readArgs(String[] args) { 054 if (args.length == 0) { 055 help(System.err); 056 System.exit(1); 057 } 058 059 int argIndex = 0; 060 while(args[argIndex].startsWith("-")) { 061 final String a = args[argIndex]; 062 if (a.equalsIgnoreCase("-?") || a.equalsIgnoreCase("-h")) { 063 help(System.out); 064 System.exit(1); 065 } 066 else if (a.equals("-nw")) { 067 _noSaveInstrumented = true; 068 } 069 else if (a.equals("-backup")) { 070 _makeBackups = true; 071 } 072 else if (a.equals("-d")) { 073 Debug.out.setDebug(true); 074 } 075 else if (a.equals("-output")) { 076 if (argIndex + 1 > args.length) { 077 System.err.println("Error: <txt> file parameter missing."); 078 help(System.err); 079 System.exit(1); 080 } 081 String name = args[++argIndex]; 082 try { 083 FileOutputStream debugOut = new FileOutputStream(name); 084 Debug.out.setOutput(new PrintStream(debugOut, true)); 085 Debug.out.setDebug(true); 086 } 087 catch(FileNotFoundException e) { 088 System.err.println("Error: Could not open <txt> file " + name + " for output."); 089 System.exit(1); 090 } 091 } 092 else if (a.equals("-r")) { 093 _instrumentorClassName = CompoundReflectionThreadCheckStrategy.class.getName(); 094 } 095 else if (a.equals("-X")) { 096 if (argIndex + 1 > args.length) { 097 System.err.println("Error: <s> parameter missing."); 098 help(System.err); 099 System.exit(1); 100 } 101 _parameters.add(args[++argIndex]); 102 } 103 ++argIndex; 104 } 105 106 if (_noSaveInstrumented && _makeBackups) { 107 System.err.println("Error: -backup may only be specified without -ns."); 108 System.exit(1); 109 } 110 111 _className = args[argIndex]; 112 113 _progArgs = new String[args.length - 1 - argIndex]; 114 System.arraycopy(args, 1, _progArgs, 0, _progArgs.length); 115 } 116 117 /** 118 * @return the default name of the instrumentor. 119 */ 120 public String getDefaultInstrumentorName() { 121 return CompoundThreadCheckStrategy.class.getName(); 122 } 123 }