001 package edu.rice.cs.cunit; 002 003 import edu.rice.cs.cunit.instrumentors.IInstrumentationStrategy; 004 import edu.rice.cs.cunit.instrumentors.threadCheck.CompoundThreadCheckStrategy; 005 import edu.rice.cs.cunit.instrumentors.threadCheck.CompoundReflectionThreadCheckStrategy; 006 import edu.rice.cs.cunit.util.Debug; 007 008 import java.io.FileNotFoundException; 009 import java.io.FileOutputStream; 010 import java.io.PrintStream; 011 012 /** 013 * Instruments files using the CompoundThreadCheckStrategy. 014 * 015 * @author Mathias Ricken 016 */ 017 public class TCFileInstrumentor extends FileInstrumentor { 018 /** 019 * Run the general file instrumentor. 020 * @param args command line arguments. 021 */ 022 public static void main(String[] args) { 023 setDefaultCunitRtJarName("tcrt.jar"); 024 setDefaultInstrumentorName(CompoundThreadCheckStrategy.class.getName()); 025 setDefaultSystemInstrumentorName(CompoundThreadCheckStrategy.class.getName()); 026 new TCTool().run(args); 027 } 028 029 /** 030 * Class to perform the command line utility tasks. 031 */ 032 public static class TCTool extends FileInstrumentor.Tool { 033 /** 034 * Check the arguments, set the fields, and return the index of the first file. 035 * @param args command line arguments 036 * @return index of first file 037 */ 038 protected int checkArgs(String[] args) { 039 if (args.length == 0) { 040 help(System.out); 041 System.exit(1); 042 } 043 044 int argIndex = 0; 045 while((argIndex < args.length) && (args[argIndex].startsWith("-"))) { 046 String a = args[argIndex++]; 047 if (a.equals("-h")) { 048 help(System.out); 049 System.exit(1); 050 } 051 else if (a.equals("-quiet")) { 052 Debug.out.setDebug(false); 053 } 054 else if (a.equals("-nobackup")) { 055 _createBackups = false; 056 } 057 else if (a.equals("-unpackjars")) { 058 _unpackJars = true; 059 } 060 else if (a.equals("-noannot")) { 061 _addAnnotationAttribute = false; 062 } 063 else if (a.equals("-output")) { 064 if (argIndex + 1 > args.length) { 065 System.err.println("Error: <txt> file parameter missing."); 066 help(System.err); 067 System.exit(1); 068 } 069 String name = args[argIndex++]; 070 try { 071 _debugOut = new FileOutputStream(name); 072 Debug.out.setOutput(new PrintStream(_debugOut, true)); 073 } 074 catch(FileNotFoundException e) { 075 System.err.println("Error: Could not open <txt> file " + name + " for output."); 076 System.exit(1); 077 } 078 } 079 else if (a.equals("-rt")) { 080 _instrumentRt = true; 081 } 082 else if (a.equals("-rts")) { 083 if (argIndex + 1 > args.length) { 084 System.err.println("Error: <s> jar file parameter missing."); 085 help(System.err); 086 System.exit(1); 087 } 088 _sourceRtJarName = args[argIndex++]; 089 } 090 else if (a.equals("-rtm")) { 091 if (argIndex + 1 > args.length) { 092 System.err.println("Error: <m> jar file parameter missing."); 093 help(System.err); 094 System.exit(1); 095 } 096 _cunitRtJarName = args[argIndex++]; 097 } 098 else if (a.equals("-rtd")) { 099 if (argIndex + 1 > args.length) { 100 System.err.println("Error: <d> jar file parameter missing."); 101 help(System.err); 102 System.exit(1); 103 } 104 _destRtJarName = args[argIndex++]; 105 } 106 else if (a.equals("-r")) { 107 _instrumentorClassName = CompoundReflectionThreadCheckStrategy.class.getName(); 108 _sysInstrumentorClassName = CompoundReflectionThreadCheckStrategy.class.getName(); 109 } 110 else if (a.equals("-X")) { 111 if (argIndex + 1 > args.length) { 112 System.err.println("Error: <s> parameter missing."); 113 help(System.err); 114 System.exit(1); 115 } 116 _parameters.add(args[argIndex++]); 117 } 118 } 119 return argIndex; 120 } 121 122 /** 123 * Print out a help message. 124 * @param out stream to output to 125 */ 126 protected void help(PrintStream out) { 127 // ---------1---------2---------3---------4---------5---------6---------7---------8 128 out.println("Flags : [-h] [-quiet] [-output <txt>] [-rt] [-rts <s>] [-rtm <m>] [-rtd <d>]"); 129 out.println(" [-nobackup] [-r] [-X <s>]"); 130 out.println(" [-noannot] [<filename> ...]"); 131 out.println("-h Show this help"); 132 out.println("-quiet No output"); 133 out.println("-output <txt> Save output in the text file <txt>"); 134 out.println("-rt Instrument the rt.jar file <s> using the instrumentor,"); 135 out.println(" instrument the Concutest jar file <m> using the"); 136 out.println(" system instrumentor, and write to the jar file <d>"); 137 out.println("-rts <s> Specify the source rt.jar file <s> (rt.jar)"); 138 out.println("-rtm <m> Specify the Concutest jar file <m> (cunitrt.jar)"); 139 out.println("-rtd <d> Specify the destination jar file <d> (rt_i.jar)"); 140 out.println("-nobackup Do not create backup files (*.jar~ or *.class~)"); 141 out.println("-r Use the reflection-based instrumentor"); 142 out.println("-X <s> Pass <s> as parameter to instrumentors; may be repeated"); 143 out.println("-noannot Do not annotate class files with the instrumentors used"); 144 out.println("-unpackjars Unpack/repack all jar files into temporary directories"); 145 out.println("<filename> ... List of class or jar file names to instrument using"); 146 out.println(" the instrumentor"); 147 out.println(); 148 out.println("If -unpackjars is used and -X class-path= has been specified, then the"); 149 out.println("jar files on the class path will be replaced by their temporary directories."); 150 out.println("Jar files inside jar files will not be unpacked."); 151 } 152 } 153 154 /** 155 * Creates a new instrumenting class loader using specified instrumentors. 156 * @param instrumentors array of instrumentors 157 */ 158 public TCFileInstrumentor(IInstrumentationStrategy[] instrumentors) { 159 super(instrumentors); 160 } 161 }