package org.smoothbuild.cli;
import java.io.PrintStream;
import java.util.Iterator;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.smoothbuild.lang.message.CodeLocation;
import org.smoothbuild.lang.message.ErrorMessage;
import org.smoothbuild.lang.message.InfoMessage;
import org.smoothbuild.lang.message.Message;
import org.smoothbuild.lang.message.WarningMessage;
import com.google.common.base.Splitter;
@Singleton
public class Console {
public static final int MESSAGE_GROUP_NAME_HEADER_LENGTH = 73;
private static final String GROUP_PREFIX = " + ";
private static final String MESSAGE_FIRST_LINE_PREFIX = " " + GROUP_PREFIX;
private static final String MESSAGE_OTHER_LINES_PREFIX = " ";
private final PrintStream printStream;
private int errorCount;
private int warningCount;
private int infoCount;
@Inject
public Console() {
this(System.out);
}
public Console(PrintStream printStream) {
this.printStream = printStream;
}
public void error(CodeLocation location, String message) {
println("build.smooth:" + location.line() + ": error: " + message);
errorCount++;
}
public void error(String message) {
println("error: " + message);
errorCount++;
}
public void print(String header, Iterable<? extends Message> messages) {
println(GROUP_PREFIX + header);
print(messages);
}
private void print(Iterable<? extends Message> messages) {
for (Message message : messages) {
print(message);
incrementCount(message);
}
}
private void incrementCount(Message message) {
if (message instanceof ErrorMessage) {
errorCount++;
} else if (message instanceof WarningMessage) {
warningCount++;
} else if (message instanceof InfoMessage) {
infoCount++;
} else {
throw new RuntimeException("Unknown message type: " + message.getClass().getCanonicalName());
}
}
public boolean isErrorReported() {
return errorCount != 0;
}
public void printFinalSummary() {
String message = isErrorReported() ? "FAILED :(" : "SUCCESS :)";
println(GROUP_PREFIX + message);
printMessageStats();
}
private void printMessageStats() {
printStat(errorCount, "error(s)");
printStat(warningCount, "warning(s)");
printStat(infoCount, "info(s)");
}
private void printStat(int count, String messageType) {
if (count != 0) {
println(MESSAGE_FIRST_LINE_PREFIX + count + " " + messageType);
}
}
protected void print(Message message) {
Iterator<String> it = Splitter.on("\n").split(message.toString()).iterator();
print(MESSAGE_FIRST_LINE_PREFIX);
println(it.next());
while (it.hasNext()) {
print(MESSAGE_OTHER_LINES_PREFIX);
println(it.next());
}
}
private void println(String line) {
printStream.println(line);
}
private void print(String line) {
printStream.print(line);
}
}