IDEA-141243 Support ant-contrib try/catch-task (by Martin Zdarsky https://github...
authorEugene Zhuravlev <jeka@intellij.com>
Mon, 31 Oct 2016 21:09:07 +0000 (22:09 +0100)
committerEugene Zhuravlev <jeka@intellij.com>
Mon, 31 Oct 2016 21:10:58 +0000 (22:10 +0100)
1  2 
java/java-runtime/src/com/intellij/rt/ant/execution/IdeaAntLogger2.java

index a48f488e92b15c7c0fd6f710ca8310efa0a85530,22f94f87eac75db2dc45bcd0df906bcff0e96a07..49c81e5b4dc2c1fe5a46dd94e42d79aa0d3585af
@@@ -46,6 -47,9 +47,12 @@@ public final class IdeaAntLogger2 exten
     */
    public static final String OUTPUT_PREFIX = "IDEA_ANT_INTEGRATION";
  
 -  private final Thread myMainThread;
 -  private final Stack myCallingTasks = new Stack();
++  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);
    }
  
    public synchronized void taskStarted(BuildEvent event) {
 -    if (Thread.currentThread() == myMainThread) {
 -      myCallingTasks.push(event.getTask().getTaskName());
 -    }
--    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());
 -    if (Thread.currentThread() == myMainThread) {
 -      myCallingTasks.pop();
++    try {
++      sendException(event, true);
++      myTaskPriority.sendMessage(TASK_END, event.getPriority(), event.getException());
++    }
++    finally {
++      getTaskCallStack().pop();
+     }
    }
  
    public synchronized void messageLogged(BuildEvent event) {
    private boolean sendException(BuildEvent event, boolean isFailOnError) {
      Throwable exception = event.getException();
      if (exception != null) {
-       if (isFailOnError) {
 -      if (isFailOnError && !isInTryCatch()) {
++      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, isInTryCatch() ? Project.MSG_VERBOSE : Project.MSG_WARN, exception.getMessage());
++      myMessagePriority.sendMessage(MESSAGE, insideTryTask? Project.MSG_VERBOSE : Project.MSG_WARN, exception.getMessage());
      }
      return false;
    }
      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);