/*
* Copyright ( c ) 2013 , 2016 , Oracle and / or its affiliates . All rights reserved .
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER .
*
* This code is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License version 2 only , as
* published by the Free Software Foundation .
*
* This code is distributed in the hope that it will be useful , but WITHOUT
* ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE . See the GNU General Public License
* version 2 for more details ( a copy is included in the LICENSE file that
* accompanied this code ) .
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work ; if not , write to the Free Software Foundation ,
* Inc . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 USA .
*
* Please contact Oracle , 500 Oracle Parkway , Redwood Shores , CA 94065 USA
* or visit www . oracle . com if you need additional information or have any
* questions .
*/
package toolbox;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import static toolbox.ToolBox.lineSeparator;
/**
* The supertype for tasks .
* Complex operations are modeled by building and running a " Task " object .
* Tasks are typically configured in a fluent series of calls .
*/
public interface Task {
/**
* Returns the name of the task .
* @ return the name of the task
*/
String name();
/**
* Executes the task as currently configured .
* @ return a Result object containing the results of running the task
* @ throws TaskError if the outcome of the task was not as expected
*/
Result run() throws TaskError;
/**
* Exception thrown by { @ code Task . run } when the outcome is not as
* expected .
*/
public static class TaskError extends Error {
/**
* Creates a TaskError object with the given message .
* @ param message the message
*/
public TaskError(String message) {
super (message);
}
}
/**
* An enum to indicate the mode a task should use it is when executed .
*/
public enum Mode {
/**
* The task should use the interface used by the command
* line launcher for the task .
* For example , for javac : com . sun . tools . javac . Main . compile
*/
CMDLINE,
/**
* The task should use a publicly defined API for the task .
* For example , for javac : javax . tools . JavaCompiler
*/
API,
/**
* The task should use the standard launcher for the task .
* For example , $ JAVA_HOME / bin / javac
*/
EXEC
}
/**
* An enum to indicate the expected success or failure of executing a task .
*/
public enum Expect {
/** It is expected that the task will complete successfully. */
SUCCESS,
/** It is expected that the task will not complete successfully. */
FAIL
}
/**
* An enum to identify the streams that may be written by a { @ code Task } .
*/
public enum OutputKind {
/** Identifies output written to {@code System.out} or {@code stdout}. */
STDOUT,
/** Identifies output written to {@code System.err} or {@code stderr}. */
STDERR,
/** Identifies output written to a stream provided directly to the task. */
DIRECT
};
/**
* The results from running a { @ link Task } .
* The results contain the exit code returned when the tool was invoked ,
* and a map containing the output written to any streams during the
* execution of the tool .
* All tools support " stdout " and " stderr " .
* Tools that take an explicit PrintWriter save output written to that
* stream as " main " .
*/
public static class Result {
final ToolBox toolBox;
final Task task;
final int exitCode;
final Map<OutputKind, String> outputMap;
Result(ToolBox toolBox, Task task, int exitCode, Map<OutputKind, String> outputMap) {
this .toolBox = toolBox;
this .task = task;
this .exitCode = exitCode;
this .outputMap = outputMap;
}
/**
* Returns the content of a specified stream .
* @ param outputKind the kind of the selected stream
* @ return the content that was written to that stream when the tool
* was executed .
*/
public String getOutput(OutputKind outputKind) {
return outputMap.get(outputKind);
}
/**
* Returns the content of named streams as a list of lines .
* @ param outputKinds the kinds of the selected streams
* @ return the content that was written to the given streams when the tool
* was executed .
*/
public List<String> getOutputLines(OutputKind... outputKinds) {
List<String> result = new ArrayList<>();
for (OutputKind outputKind : outputKinds) {
result.addAll(Arrays.asList(outputMap.get(outputKind).split(lineSeparator)));
}
return result;
}
/**
* Writes the content of the specified stream to the log .
* @ param kind the kind of the selected stream
* @ return this Result object
*/
public Result write(OutputKind kind) {
PrintStream out = toolBox.out;
String text = getOutput(kind);
if (text == null || text.isEmpty())
out.println("[" + task.name() + ":" + kind + "]: empty" );
else {
out.println("[" + task.name() + ":" + kind + "]:" );
out.print(text);
}
return this ;
}
/**
* Writes the content of all streams with any content to the log .
* @ return this Result object
*/
public Result writeAll() {
PrintStream out = toolBox.out;
outputMap.forEach((name, text) -> {
if (!text.isEmpty()) {
out.println("[" + name + "]:" );
out.print(text);
}
});
return this ;
}
}
}
Messung V0.5 in Prozent C=87 H=95 G=90
¤ Dauer der Verarbeitung: 0.5 Sekunden
¤
*© Formatika GbR, Deutschland