/******************************************************************************* * Copyright (c) 2001, 2010 Mathew A. Nelson and Robocode contributors * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://robocode.sourceforge.net/license/epl-v10.html * * Contributors: * Mathew A. Nelson * - Initial API and implementation * Flemming N. Larsen * - File name is being quoted * - Code cleanup * - Updated to use methods from FileUtil and Logger, which replaces methods * that have been (re)moved from the robocode.util.Utils class * - Added missing close() on InputStreams *******************************************************************************/ package net.sf.robocode.ui.editor; import net.sf.robocode.io.FileUtil; import net.sf.robocode.io.Logger; import net.sf.robocode.ui.dialog.ConsoleDialog; import net.sf.robocode.ui.dialog.WindowUtil; import java.io.IOException; /** * @author Mathew A. Nelson (original) * @author Flemming N. Larsen (contributor) */ public class RobocodeCompiler { private final String compilerBinary; private final RobocodeEditor editor; private final String compilerOptions; private final String compilerClassPath; protected RobocodeCompiler(RobocodeEditor editor, String binary, String options, String classPath) { super(); this.compilerBinary = binary; this.compilerOptions = options; this.compilerClassPath = classPath; this.editor = editor; } public void compile(String fileName) { fileName = FileUtil.quoteFileName(fileName); ConsoleDialog console; if (editor != null) { console = new ConsoleDialog(editor, "Compiling", false); } else { console = new ConsoleDialog(); } console.setSize(500, 400); console.setText("Compiling...\n"); WindowUtil.centerShow(editor, console); try { StringBuffer command = new StringBuffer(compilerBinary).append(' ').append(compilerOptions).append(' ').append(compilerClassPath).append(' ').append( fileName); Logger.logMessage("Compile command: " + command); ProcessBuilder pb = new ProcessBuilder(command.toString().split(" ")); pb.redirectErrorStream(true); pb.directory(FileUtil.getCwd()); Process p = pb.start(); // The waitFor() must done after reading the input and error stream of the process console.processStream(p.getInputStream()); p.waitFor(); if (p.exitValue() == 0) { console.append("Compiled successfully.\n"); console.setTitle("Compiled successfully."); } else { console.append("Compile Failed (" + p.exitValue() + ")\n"); console.setTitle("Compile failed."); } } catch (IOException e) { console.append("Unable to compile!\n"); console.append("Exception was: " + e.toString() + "\n"); console.append("Does " + compilerBinary + " exist?\n"); console.setTitle("Exception while compiling"); } catch (InterruptedException e) { // Immediately reasserts the exception by interrupting the caller thread itself Thread.currentThread().interrupt(); console.append("Compile interrupted.\n"); console.setTitle("Compile interrupted."); } } }