apply javac log level approach to directJavac

This commit is contained in:
Mark Harrah 2011-06-26 12:27:06 -04:00
parent 48940bf23c
commit 0831552dc5
2 changed files with 22 additions and 8 deletions

View File

@ -51,14 +51,17 @@ object JavaCompiler
} }
val directJavac = (arguments: Seq[String], log: Logger) => val directJavac = (arguments: Seq[String], log: Logger) =>
{ {
val writer = new java.io.PrintWriter(new LoggerWriter(log, Level.Error)) val logger = new LoggerWriter(log)
val writer = new java.io.PrintWriter(logger)
val argsArray = arguments.toArray val argsArray = arguments.toArray
val javac = Class.forName("com.sun.tools.javac.Main") val javac = Class.forName("com.sun.tools.javac.Main")
log.debug("Calling javac directly.") log.debug("Calling javac directly.")
javac.getDeclaredMethod("compile", classOf[Array[String]], classOf[java.io.PrintWriter]) val compileMethod = javac.getDeclaredMethod("compile", classOf[Array[String]], classOf[java.io.PrintWriter])
.invoke(null, argsArray, writer)
.asInstanceOf[java.lang.Integer] var exitCode = -1
.intValue try { exitCode = compileMethod.invoke(null, argsArray, writer).asInstanceOf[java.lang.Integer].intValue }
finally { logger.flushLines( if(exitCode == 0) Level.Warn else Level.Error) }
exitCode
} }
def withArgumentFile[T](args: Seq[String])(f: File => T): T = def withArgumentFile[T](args: Seq[String])(f: File => T): T =
{ {

View File

@ -5,11 +5,13 @@ package sbt
/** Provides a `java.io.Writer` interface to a `Logger`. Content is line-buffered and logged at `level`. /** Provides a `java.io.Writer` interface to a `Logger`. Content is line-buffered and logged at `level`.
* A line is delimited by `nl`, which is by default the platform line separator.*/ * A line is delimited by `nl`, which is by default the platform line separator.*/
class LoggerWriter(delegate: Logger, level: Level.Value, nl: String) extends java.io.Writer class LoggerWriter(delegate: Logger, unbufferedLevel: Option[Level.Value], nl: String = System.getProperty("line.separator")) extends java.io.Writer
{ {
def this(delegate: Logger, level: Level.Value) = this(delegate, level, System.getProperty("line.separator")) def this(delegate: Logger, level: Level.Value) = this(delegate, Some(level))
def this(delegate: Logger) = this(delegate, None)
private[this] val buffer = new StringBuilder private[this] val buffer = new StringBuilder
private[this] val lines = new collection.mutable.ListBuffer[String]
override def close() = flush() override def close() = flush()
override def flush(): Unit = override def flush(): Unit =
@ -20,6 +22,12 @@ class LoggerWriter(delegate: Logger, level: Level.Value, nl: String) extends jav
buffer.clear() buffer.clear()
} }
} }
def flushLines(level: Level.Value): Unit =
synchronized {
for(line <- lines)
delegate.log(level, line)
lines.clear()
}
override def write(content: Array[Char], offset: Int, length: Int): Unit = override def write(content: Array[Char], offset: Int, length: Int): Unit =
synchronized { synchronized {
buffer.appendAll(content, offset, length) buffer.appendAll(content, offset, length)
@ -36,5 +44,8 @@ class LoggerWriter(delegate: Logger, level: Level.Value, nl: String) extends jav
process() process()
} }
} }
private[this] def log(s: String): Unit = delegate.log(level, s) private[this] def log(s: String): Unit = unbufferedLevel match {
case None => lines += s
case Some(level) => delegate.log(level, s)
}
} }