blob: 693cf1b93abbcccbe94c28a4de47c94ab7257b84 [file] [log] [blame]
/*
* Copyright 2008 Google Inc.
*
* 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.google.gwt.dev;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.dev.javac.CompilationProblemReporter;
import com.google.gwt.dev.util.log.PrintWriterTreeLogger;
/**
* Used to run compiler tasks with the appropriate logger.
*/
public class CompileTaskRunner {
/**
* A task to run with a logger based on options.
*/
public interface CompileTask {
boolean run(TreeLogger logger) throws UnableToCompleteException;
}
/**
* Runs the main action with an appropriate logger. If a gui-based TreeLogger
* is used, this method will not return until its window is closed by the
* user.
*/
public static boolean runWithAppropriateLogger(
CompileTaskOptions options, final CompileTask task) {
// Set any platform specific system properties.
BootStrapPlatform.applyPlatformHacks();
if (System.getProperty("java.awt.headless") == null) {
System.setProperty("java.awt.headless", "true");
}
PrintWriterTreeLogger logger = new PrintWriterTreeLogger();
logger.setMaxDetail(options.getLogLevel());
return doRun(logger, task);
}
private static boolean doRun(TreeLogger logger, CompileTask task) {
try {
return task.run(logger);
} catch (UnableToCompleteException e) {
// Assume logged.
} catch (Throwable e) {
CompilationProblemReporter.logAndTranslateException(logger, e);
}
return false;
}
/**
* Waits for a thread to terminate before it returns. This method is a
* non-cancellable task, in that it will defer thread interruption until it is
* done.
*
* @param godot the thread that is being waited on.
*/
private static void waitForThreadToTerminate(final Thread godot) {
// Goetz pattern for non-cancellable tasks.
// http://www-128.ibm.com/developerworks/java/library/j-jtp05236.html
boolean isInterrupted = false;
try {
while (true) {
try {
godot.join();
return;
} catch (InterruptedException e) {
isInterrupted = true;
}
}
} finally {
if (isInterrupted) {
Thread.currentThread().interrupt();
}
}
}
}