IDEA-141243 Support ant-contrib try/catch-task (by Martin Zdarsky https://github.com/zdary)

This commit is contained in:
Eugene Zhuravlev
2016-10-31 22:10:58 +01:00
@@ -24,6 +24,7 @@ import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.reflect.Field;
import java.util.Stack;
public final class IdeaAntLogger2 extends DefaultLogger {
static SegmentedOutputStream ourErr;
@@ -46,6 +47,12 @@ public final class IdeaAntLogger2 extends DefaultLogger {
*/
public static final String OUTPUT_PREFIX = "IDEA_ANT_INTEGRATION";
private final ThreadLocal myCallingTasks = new ThreadLocal() {
protected Object initialValue() {
return new Stack();
}
};
private final Priority myMessagePriority = new MessagePriority();
private final Priority myTargetPriority = new StatePriority(Project.MSG_INFO);
private final Priority myTaskPriority = new StatePriority(Project.MSG_INFO);
@@ -87,12 +94,19 @@ public final class IdeaAntLogger2 extends DefaultLogger {
}
public synchronized void taskStarted(BuildEvent event) {
myTaskPriority.sendMessage(TASK, event.getPriority(), event.getTask().getTaskName());
final String taskName = event.getTask().getTaskName();
getTaskCallStack().push(taskName);
myTaskPriority.sendMessage(TASK, event.getPriority(), taskName);
}
public synchronized void taskFinished(BuildEvent event) {
sendException(event, true);
myTaskPriority.sendMessage(TASK_END, event.getPriority(), event.getException());
try {
sendException(event, true);
myTaskPriority.sendMessage(TASK_END, event.getPriority(), event.getException());
}
finally {
getTaskCallStack().pop();
}
}
public synchronized void messageLogged(BuildEvent event) {
@@ -136,11 +150,12 @@ public final class IdeaAntLogger2 extends DefaultLogger {
private boolean sendException(BuildEvent event, boolean isFailOnError) {
Throwable exception = event.getException();
if (exception != null) {
if (isFailOnError) {
final boolean insideTryTask = getTaskCallStack().contains("try");
if (isFailOnError && !insideTryTask) {
myAlwaysSend.sendMessage(EXCEPTION, event.getPriority(), exception);
return true;
}
myMessagePriority.sendMessage(MESSAGE, Project.MSG_WARN, exception.getMessage());
myMessagePriority.sendMessage(MESSAGE, insideTryTask? Project.MSG_VERBOSE : Project.MSG_WARN, exception.getMessage());
}
return false;
}
@@ -165,6 +180,10 @@ public final class IdeaAntLogger2 extends DefaultLogger {
return packet;
}
private Stack getTaskCallStack() {
return (Stack)myCallingTasks.get();
}
private abstract class Priority {
protected void peformSendMessage(char id, int priority, String text) {
PacketWriter packet = createPacket(id, priority);