aboutsummaryrefslogtreecommitdiff
path: root/libjava/gnu/java/rmi/rmic/CompilerProcess.java
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/gnu/java/rmi/rmic/CompilerProcess.java')
-rw-r--r--libjava/gnu/java/rmi/rmic/CompilerProcess.java65
1 files changed, 59 insertions, 6 deletions
diff --git a/libjava/gnu/java/rmi/rmic/CompilerProcess.java b/libjava/gnu/java/rmi/rmic/CompilerProcess.java
index b3db08de43f..0de36b62b0e 100644
--- a/libjava/gnu/java/rmi/rmic/CompilerProcess.java
+++ b/libjava/gnu/java/rmi/rmic/CompilerProcess.java
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2001 Free Software Foundation, Inc.
+ Copyright (c) 2001, 2003 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -37,19 +37,71 @@ exception statement from your version. */
package gnu.java.rmi.rmic;
-/** Subclass of Compiler that can be subclassed to invoke a process to
- * do its work. */
+import java.io.InputStream;
+
+/**
+ * Subclass of Compiler that can be subclassed to invoke a process to
+ * do its work.
+ */
public abstract class CompilerProcess extends Compiler
{
/** This is used to compute the command line for the process. */
public abstract String[] computeArguments (String filename);
+ /**
+ * This is used to compute the command line for the process.
+ * Most compilers typically arrange their arguments as in
+ * <compiler name and arguments> <optional destination> <filename>.
+ * This method builds an argument array out that. It should be used
+ * to define computeArguments for those compilers that follow the
+ * argument convention described above.
+ */
+ public static String[] computeTypicalArguments(String[] compilerArgs,
+ String destination, String filename)
+ {
+ /* length of compiler specific arguments */
+ final int len = compilerArgs.length;
+
+ /* length of returned array of arguments */
+ final int arglen = len + (destination == null ? 0 : 2) + 1;
+
+ /* Allocate String array for computed arguments. */
+ String [] args = new String[arglen];
+
+ /* Fill in compiler arguments. */
+ System.arraycopy(compilerArgs, 0, args, 0, len);
+
+ /* Fill in destination argument if necessary. */
+ if (destination != null)
+ {
+ args[len] = "-d";
+ args[len + 1] = destination;
+ }
+
+ /* Fill in filename */
+ args[arglen - 1] = filename;
+
+ return args;
+ }
+
public void compile (String name) throws Exception
{
String[] args = computeArguments (name);
Process p = Runtime.getRuntime ().exec (args);
- // FIXME: probably should collect compiler output here and then
- // put it into the exception message.
+
+ /* Print compiler output to System.out. */
+ InputStream procin = p.getInputStream();
+ for (int ch = procin.read(); ch != -1; ch = procin.read())
+ System.out.print((char) ch);
+
+ /* Collect compiler error output in a buffer.
+ * If compilation fails, it will be used for an error message.
+ */
+ StringBuffer stderr = new StringBuffer();
+ InputStream procerr = p.getErrorStream();
+ for (int ch = procerr.read(); ch != -1; ch = procerr.read())
+ stderr.append((char) ch);
+
int result;
while (true)
{
@@ -65,7 +117,8 @@ public abstract class CompilerProcess extends Compiler
if (result != 0)
{
// FIXME: wrong exception class.
- throw new Exception ("compiler exited with status: " + result);
+ throw new Exception ("compiler exited with status: " + result,
+ new RMICException(stderr.toString()));
}
}
}