1 32 package net.sf.retrotranslator.transformer; 33 34 import java.io.File ; 35 import java.util.*; 36 37 40 public class Retrotranslator implements MessageLogger { 41 42 private LinkedList<FileContainer> src = new LinkedList<FileContainer>(); 43 private FileContainer dest; 44 private boolean stripsign; 45 private boolean retainapi; 46 private boolean retainflags; 47 private boolean verbose; 48 private boolean lazy; 49 private boolean advanced; 50 private boolean verify; 51 private List<File > classpath = new ArrayList<File >(); 52 private MessageLogger logger = this; 53 private SourceMask sourceMask = new SourceMask(null); 54 private String embed; 55 private List<Backport> backports = new ArrayList<Backport>(); 56 private ClassVersion target = ClassVersion.VERSION_14; 57 private ClassLoader classLoader; 58 59 public Retrotranslator() { 60 } 61 62 public void addSrcdir(File srcdir) { 63 if (!srcdir.isDirectory()) throw new IllegalArgumentException ("Invalid srcdir: " + srcdir); 64 src.add(new FolderFileContainer(srcdir)); 65 } 66 67 public void addSrcjar(File srcjar) { 68 if (!srcjar.isFile()) throw new IllegalArgumentException ("Invalid srcjar: " + srcjar); 69 src.add(new JarFileContainer(srcjar)); 70 } 71 72 public void addSourceFiles(File srcdir, List<String > fileNames) { 73 if (!srcdir.isDirectory()) throw new IllegalArgumentException ("Invalid srcdir: " + srcdir); 74 src.add(new FolderFileContainer(srcdir, fileNames)); 75 } 76 77 public void setDestdir(File destdir) { 78 if (!destdir.isDirectory()) throw new IllegalArgumentException ("Invalid destdir: " + destdir); 79 if (dest != null) throw new IllegalArgumentException ("Destination already set."); 80 dest = new FolderFileContainer(destdir); 81 } 82 83 public void setDestjar(File destjar) { 84 if (destjar.isDirectory()) throw new IllegalArgumentException ("Invalid destjar: " + destjar); 85 if (dest != null) throw new IllegalArgumentException ("Destination already set."); 86 dest = new JarFileContainer(destjar); 87 } 88 89 public void setStripsign(boolean stripsign) { 90 this.stripsign = stripsign; 91 } 92 93 public void setRetainapi(boolean retainapi) { 94 this.retainapi = retainapi; 95 } 96 97 public void setRetainflags(boolean retainflags) { 98 this.retainflags = retainflags; 99 } 100 101 public void setVerbose(boolean verbose) { 102 this.verbose = verbose; 103 } 104 105 public void setLazy(boolean lazy) { 106 this.lazy = lazy; 107 } 108 109 public void setAdvanced(boolean advanced) { 110 this.advanced = advanced; 111 } 112 113 public void setVerify(boolean verify) { 114 this.verify = verify; 115 } 116 117 public void addClasspathElement(File classpathElement) { 118 this.classpath.add(classpathElement); 119 } 120 121 public void addClasspath(String classpath) { 122 StringTokenizer tokenizer = new StringTokenizer(classpath, File.pathSeparator); 123 while (tokenizer.hasMoreTokens()) { 124 addClasspathElement(new File (tokenizer.nextToken())); 125 } 126 } 127 128 public void setSrcmask(String srcmask) { 129 sourceMask = new SourceMask(srcmask); 130 } 131 132 public void setEmbed(String embed) { 133 this.embed = embed; 134 } 135 136 public void setBackport(String backport) { 137 backports = Backport.asList(backport); 138 } 139 140 public void setTarget(String target) { 141 this.target = ClassVersion.valueOf(target); 142 } 143 144 public void setLogger(MessageLogger logger) { 145 this.logger = logger; 146 } 147 148 public void setClassLoader(ClassLoader classLoader) { 149 this.classLoader = classLoader; 150 } 151 152 public void log(Message message) { 153 System.out.println(message); 154 } 155 156 public boolean run() { 157 if (src.isEmpty()) throw new IllegalArgumentException ("Source not set."); 158 EmbeddingConverter converter = null; 159 if (embed != null) { 160 if (dest == null) throw new IllegalArgumentException ("Destination required for embedding!"); 161 if (lazy) throw new IllegalArgumentException ("Embedding cannot be lazy!"); 162 converter = new EmbeddingConverter(embed); 163 } 164 SystemLogger systemLogger = new SystemLogger(logger, verbose); 165 ReplacementLocatorFactory locatorFactory = new ReplacementLocatorFactory(target, advanced, retainapi, backports); 166 ClassTransformer classTransformer = new ClassTransformer( 167 lazy, stripsign, retainflags, systemLogger, converter, locatorFactory); 168 TextFileTransformer fileTransformer = new TextFileTransformer(locatorFactory); 169 FileTranslator translator = new FileTranslator( 170 classTransformer, fileTransformer, converter, systemLogger, sourceMask); 171 for (FileContainer container : src) { 172 translator.transform(container, dest != null ? dest : container); 173 } 174 if (converter != null) { 175 translator.embed(dest); 176 } 177 if (dest != null) dest.flush(systemLogger); 178 if (!verify) return true; 179 ClassLoader loader = classLoader; 180 if (loader == null && classpath.isEmpty()) { 181 loader = this.getClass().getClassLoader(); 182 } 183 ClassReaderFactory factory = new ClassReaderFactory(loader); 184 try { 185 return verify(factory, systemLogger); 186 } finally { 187 factory.close(); 188 } 189 } 190 191 private boolean verify(ClassReaderFactory factory, SystemLogger systemLogger) { 192 if (dest != null) { 193 factory.appendPath(dest.getLocation()); 194 } else { 195 for (FileContainer container : src) { 196 factory.appendPath(container.getLocation()); 197 } 198 } 199 for (File file : classpath) { 200 factory.appendPath(file); 201 } 202 if (dest != null) { 203 verify(factory, dest, systemLogger); 204 } else { 205 for (FileContainer container : src) { 206 verify(factory, container, systemLogger); 207 } 208 } 209 return systemLogger.isReliable(); 210 } 211 212 private void verify(ClassReaderFactory factory, FileContainer container, SystemLogger systemLogger) { 213 systemLogger.log(new Message(Level.INFO, 214 "Verifying " + container.getFileCount() + " file(s) in " + container + ".")); 215 int warningCount = 0; 216 for (final FileEntry entry : container.getEntries()) { 217 if (sourceMask.matches(entry.getName())) { 218 byte[] content = entry.getContent(); 219 if (TransformerTools.isClassFile(content)) { 220 systemLogger.setFile(container.getLocation(), entry.getName()); 221 systemLogger.logForFile(Level.VERBOSE, "Verification"); 222 warningCount += new ReferenceVerifyingVisitor(factory, systemLogger).verify(content); 223 } 224 } 225 } 226 String result = warningCount != 0 ? " with " + warningCount + " warning(s)." : " successfully."; 227 systemLogger.log(new Message(Level.INFO, 228 "Verification of " + container.getFileCount() + " file(s) completed" + result)); 229 } 230 231 private boolean execute(String [] args) { 232 int i = 0; 233 while (i < args.length) { 234 String string = args[i++]; 235 if (string.equals("-srcdir") && i < args.length) { 236 addSrcdir(new File (args[i++])); 237 } else if (string.equals("-srcjar") && i < args.length) { 238 addSrcjar(new File (args[i++])); 239 } else if (string.equals("-destdir") && i < args.length) { 240 setDestdir(new File (args[i++])); 241 } else if (string.equals("-destjar") && i < args.length) { 242 setDestjar(new File (args[i++])); 243 } else if (string.equals("-stripsign")) { 244 setStripsign(true); 245 } else if (string.equals("-retainapi")) { 246 setRetainapi(true); 247 } else if (string.equals("-retainflags")) { 248 setRetainflags(true); 249 } else if (string.equals("-verbose")) { 250 setVerbose(true); 251 } else if (string.equals("-lazy")) { 252 setLazy(true); 253 } else if (string.equals("-advanced")) { 254 setAdvanced(true); 255 } else if (string.equals("-verify")) { 256 setVerify(true); 257 } else if (string.equals("-classpath") && i < args.length) { 258 addClasspath(args[i++]); 259 } else if (string.equals("-srcmask") && i < args.length) { 260 setSrcmask(args[i++]); 261 } else if (string.equals("-embed") && i < args.length) { 262 setEmbed(args[i++]); 263 } else if (string.equals("-backport") && i < args.length) { 264 setBackport(args[i++]); 265 } else if (string.equals("-target") && i < args.length) { 266 setTarget(args[i++]); 267 } else { 268 throw new IllegalArgumentException ("Unknown option: " + string); 269 } 270 } 271 return run(); 272 } 273 274 private static void printUsage() { 275 String version = Retrotranslator.class.getPackage().getImplementationVersion(); 276 String suffix = (version == null) ? "" : "-" + version; 277 System.out.println("Usage: java -jar retrotranslator-transformer" + suffix + ".jar" + 278 " [-srcdir <path> | -srcjar <file>] [-destdir <path> | -destjar <file>] [-stripsign]" + 279 " [-verbose] [-lazy] [-advanced] [-retainapi] [-retainflags] [-verify] [-target <version>]" + 280 " [-classpath <classpath>] [-srcmask <mask>] [-embed <package>] [-backport <packages>]"); 281 } 282 283 public static void main(String [] args) { 284 if (args.length == 0) { 285 printUsage(); 286 return; 287 } 288 try { 289 if (!new Retrotranslator().execute(args)) { 290 System.exit(2); 291 } 292 } catch (IllegalArgumentException e) { 293 System.out.println(e.getMessage()); 294 printUsage(); 295 System.exit(1); 296 } 297 } 298 299 } 300 | Popular Tags |