1 32 package net.sf.retrotranslator.transformer; 33 34 import java.io.File ; 35 import net.sf.retrotranslator.runtime.impl.*; 36 37 40 public class JITRetrotranslator { 41 42 private boolean advanced; 43 private String backport; 44 45 public JITRetrotranslator() { 46 } 47 48 public void setAdvanced(boolean advanced) { 49 this.advanced = advanced; 50 } 51 52 public void setBackport(String backport) { 53 this.backport = backport; 54 } 55 56 public boolean run() { 57 if (isJava5Supported()) return true; 58 ReplacementLocatorFactory factory = new ReplacementLocatorFactory( 59 ClassVersion.VERSION_14, advanced, false, Backport.asList(backport)); 60 ClassTransformer transformer = new ClassTransformer(true, false, false, null, null, factory); 61 ClassDescriptor.setBytecodeTransformer(transformer); 62 SunJITRetrotranslator.install(transformer); 63 if (isJava5Supported()) return true; 64 JRockitJITRetrotranslator.install(transformer); 65 return isJava5Supported(); 66 } 67 68 private static boolean isJava5Supported() { 69 class ClassFactory extends ClassLoader { 70 public Class defineClass(String name, byte[] bytes) { 71 return defineClass(name, bytes, 0, bytes.length); 72 } 73 } 74 byte[] bytes = RuntimeTools.getBytecode(JITRetrotranslator.class); 75 System.arraycopy(new byte[]{0, 0, 0, 49}, 0, bytes, 4, 4); 76 try { 77 new ClassFactory().defineClass(JITRetrotranslator.class.getName(), bytes); 78 return true; 79 } catch (ClassFormatError e) { 80 return false; 81 } 82 } 83 84 public static void main(String [] args) throws Exception { 85 JITRetrotranslator jit = new JITRetrotranslator(); 86 boolean jar = false; 87 int i; 88 for (i = 0; i < args.length; i++) { 89 String option = args[i]; 90 if (option.equals("-advanced")) { 91 jit.setAdvanced(true); 92 } else if (option.equals("-backport") && i + 1 < args.length) { 93 jit.setBackport(args[++i]); 94 } else if (option.equals("-jar")) { 95 jar = true; 96 i++; 97 break; 98 } else { 99 break; 100 } 101 } 102 if (i == args.length) { 103 printUsageAndExit(); 104 } 105 if (!jit.run()) { 106 System.out.println("Cannot install JIT Retrotranslator."); 107 } 108 if (jar) { 109 File file = new File (args[i]); 110 if (!file.isFile()) printErrorAndExit("Unable to access jarfile " + file); 111 JarClassLoader classLoader = new JarClassLoader(file, getClassLoader()); 112 String mainClass = classLoader.getMainClass(); 113 if (mainClass == null) printErrorAndExit("Failed to load Main-Class manifest attribute from " + file); 114 Thread.currentThread().setContextClassLoader(classLoader); 115 execute(classLoader, mainClass, remove(args, i + 1)); 116 } else { 117 execute(getClassLoader(), args[i], remove(args, i + 1)); 118 } 119 } 120 121 private static ClassLoader getClassLoader() { 122 ClassLoader classLoader = JITRetrotranslator.class.getClassLoader(); 123 return classLoader != null ? classLoader : ClassLoader.getSystemClassLoader(); 124 } 125 126 private static String [] remove(String [] original, int count) { 127 String [] result = new String [original.length - count]; 128 System.arraycopy(original, original.length - result.length, result, 0, result.length); 129 return result; 130 } 131 132 private static void execute(ClassLoader classLoader, String mainClass, String [] args) throws Exception { 133 try { 134 classLoader.loadClass(mainClass).getMethod("main", String [].class).invoke(null, new Object []{args}); 135 } catch (NoSuchMethodException e) { 136 printErrorAndExit("Could not find the method \"main\" in: " + mainClass); 137 } catch (ClassNotFoundException e) { 138 printErrorAndExit("Could not find the main class: " + mainClass); 139 } 140 } 141 142 private static void printUsageAndExit() { 143 String version = JITRetrotranslator.class.getPackage().getImplementationVersion(); 144 String suffix = (version == null) ? "" : "-" + version; 145 StringBuilder builder = new StringBuilder ("Usage: java -cp retrotranslator-transformer").append(suffix); 146 builder.append(".jar").append(File.pathSeparator); 147 builder.append("<classpath> net.sf.retrotranslator.transformer.JITRetrotranslator" + 148 " [-advanced] [-backport <packages>] <class> [<args...>]\n"); 149 builder.append(" or java -cp retrotranslator-transformer").append(suffix); 150 builder.append(".jar net.sf.retrotranslator.transformer.JITRetrotranslator" + 151 " [-advanced] [-backport <packages>] -jar <jarfile> [<args...>]"); 152 System.out.println(builder); 153 System.exit(1); 154 } 155 156 private static void printErrorAndExit(String msg) { 157 System.out.println(msg); 158 System.exit(1); 159 } 160 } 161 | Popular Tags |