/* * Copyright 2000-2009 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.intellij.rt.compiler; import java.io.*; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Vector; /** * MUST BE COMPILED WITH JDK 1.1 IN ORDER TO SUPPORT JAVAC LAUNCHING FOR ALL JDKs */ public class JavacRunner { /** * @param args - params * 0. jdk version string * 1. javac main class * 2. javac parameters */ public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, ClassNotFoundException, IOException { if (!JavacResourcesReader.dumpPatterns()) { return; } final String versionString = args[0]; final Class aClass = Class.forName(args[1]); //noinspection HardCodedStringLiteral final Method mainMethod = aClass.getMethod("main", new Class[] {String[].class}); String[] newArgs; if (versionString.indexOf("1.1") > -1) { // expand the file final Vector arguments = new Vector(); boolean isClasspath = false; for (int idx = 3; idx < args.length; idx++) { final String arg = args[idx]; if (arg.startsWith("@") && !isClasspath) { String path = arg.substring(1); addFilesToCompile(arguments, path); } else { isClasspath = "-classpath".equals(arg) || "-cp".equals(arg) || "-bootclasspath".equals(arg); arguments.addElement(arg); } } newArgs = new String[arguments.size()]; for (int idx = 0; idx < newArgs.length; idx++) { newArgs[idx] = (String)arguments.elementAt(idx); } } else { newArgs = new String[args.length - 2]; System.arraycopy(args, 2, newArgs, 0, newArgs.length); } expandClasspath(newArgs); try { mainMethod.invoke(null, new Object[] {newArgs}); } catch (Throwable e) { System.err.print(e.getMessage()); e.printStackTrace(System.err); } } private static void addFilesToCompile(Vector arguments, String path) throws IOException { BufferedReader reader = null; try { reader = new BufferedReader(new FileReader(new File(path))); for (String filePath = reader.readLine(); filePath != null; filePath = reader.readLine()) { arguments.addElement(filePath.replace('/', File.separatorChar)); } } finally { if (reader != null) { reader.close(); } } } private static void expandClasspath(String[] args) throws IOException { for (int idx = 0; idx < args.length; idx++) { final String arg = args[idx]; //noinspection HardCodedStringLiteral if ("-classpath".equals(arg) || "-cp".equals(arg) || "-bootclasspath".equals(arg)) { final String cpValue = args[idx + 1]; if (cpValue.startsWith("@")) { args[idx + 1] = readClasspath(cpValue.substring(1)); } } } } public static String readClasspath(String filePath) throws IOException { final DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream(new File(filePath)))); try { return readString(in); } finally { in.close(); } } private static String readString(DataInput stream) throws IOException { int length = stream.readInt(); if (length == -1) return null; char[] chars = new char[length]; byte[] bytes = new byte[length*2]; stream.readFully(bytes); for (int i = 0, i2 = 0; i < length; i++, i2+=2) { chars[i] = (char)((bytes[i2] << 8) + (bytes[i2 + 1] & 0xFF)); } return new String(chars); } }