diff --git a/java/java-runtime/src/com/intellij/rt/ant/execution/AntMain2.java b/java/java-runtime/src/com/intellij/rt/ant/execution/AntMain2.java index 40e0ba39a191..8b45dca43967 100644 --- a/java/java-runtime/src/com/intellij/rt/ant/execution/AntMain2.java +++ b/java/java-runtime/src/com/intellij/rt/ant/execution/AntMain2.java @@ -18,9 +18,6 @@ package com.intellij.rt.ant.execution; import java.lang.reflect.InvocationTargetException; public final class AntMain2 { - public static final int MSG_VERBOSE = 3; - public static final int MSG_ERR = 0; - public static final int MSG_WARN = 1; public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { IdeaAntLogger2.guardStreams(); diff --git a/plugins/ant/src/META-INF/plugin.xml b/plugins/ant/src/META-INF/plugin.xml index c5f42a4a1121..1fc05dc788ba 100644 --- a/plugins/ant/src/META-INF/plugin.xml +++ b/plugins/ant/src/META-INF/plugin.xml @@ -9,6 +9,10 @@ com.intellij.lang.ant.resources.AntActionsBundle com.intellij.properties + + + + diff --git a/plugins/ant/src/com/intellij/lang/ant/config/execution/AntBuildMessageView.java b/plugins/ant/src/com/intellij/lang/ant/config/execution/AntBuildMessageView.java index 1f98db75a402..6fb39be0dcf1 100644 --- a/plugins/ant/src/com/intellij/lang/ant/config/execution/AntBuildMessageView.java +++ b/plugins/ant/src/com/intellij/lang/ant/config/execution/AntBuildMessageView.java @@ -48,7 +48,6 @@ import com.intellij.openapi.wm.WindowManager; import com.intellij.openapi.wm.ex.IdeFocusTraversalPolicy; import com.intellij.peer.PeerFactory; import com.intellij.problems.WolfTheProblemSolver; -import com.intellij.rt.ant.execution.AntMain2; import com.intellij.ui.content.*; import com.intellij.util.text.DateFormatUtil; import com.intellij.util.ui.UIUtil; @@ -76,14 +75,17 @@ public final class AntBuildMessageView extends JPanel implements DataProvider, O private static final Key KEY = Key.create("BuildMessageView.KEY"); private static final String BUILD_CONTENT_NAME = AntBundle.message("ant.build.tab.content.title"); + public static final int PRIORITY_ERR = 0; + public static final int PRIORITY_WARN = 1; + public static final int PRIORITY_BRIEF = 2; + public static final int PRIORITY_VERBOSE = 3; + private OutputParser myParsingThread; private final Project myProject; private final JPanel myMessagePanel; private AntBuildFileBase myBuildFile; private final String[] myTargets; - private static final int VERBOSE_MODE = AntMain2.MSG_VERBOSE; - private static final int BRIEF_MODE = AntMain2.MSG_VERBOSE - 1; - private int myPriorityThreshold = BRIEF_MODE; + private int myPriorityThreshold = PRIORITY_BRIEF; private int myErrorCount; private int myWarningCount; private boolean myIsOutputPaused = false; @@ -98,6 +100,8 @@ public final class AntBuildMessageView extends JPanel implements DataProvider, O private JPanel myProgressPanel; + private final AntMessageCustomizer[] myMessageCustomizers = AntMessageCustomizer.EP_NAME.getExtensions(); + private final Timer myScrollerTimer = UIUtil.createNamedTimer("Ant message view timer", 1000, new ActionListener() { public void actionPerformed(ActionEvent e) { if (myTreeView != null && myCommandsProcessedCount < myLog.size()) { @@ -161,14 +165,14 @@ public final class AntBuildMessageView extends JPanel implements DataProvider, O } public void setVerboseMode(boolean verbose) { - changeDetalizationLevel(verbose ? VERBOSE_MODE : BRIEF_MODE); + changeDetalizationLevel(verbose ? PRIORITY_VERBOSE : PRIORITY_BRIEF); if (myBuildFile != null) { myBuildFile.setVerboseMode(verbose); } } public boolean isVerboseMode() { - return myPriorityThreshold == VERBOSE_MODE; + return myPriorityThreshold == PRIORITY_VERBOSE; } private synchronized void changeDetalizationLevel(int priorityThreshold) { @@ -380,9 +384,27 @@ public final class AntBuildMessageView extends JPanel implements DataProvider, O addCommand(new StartTaskCommand(taskName)); } - public void outputMessage(String message, int priority) { - updateErrorAndWarningCounters(priority); - addMessage(MessageType.MESSAGE, priority, message, null, 0, 0); + public void outputMessage(final String text, final int priority) { + final AntMessage customizedMessage = getCustomizedMessage(text, priority); + final AntMessage message = customizedMessage != null + ? customizedMessage + : new AntMessage(MessageType.MESSAGE, priority, text, null, 0, 0); + updateErrorAndWarningCounters(message.getPriority()); + addCommand(new AddMessageCommand(message)); + } + + @Nullable + private AntMessage getCustomizedMessage(final String text, final int priority) { + AntMessage customizedMessage = null; + + for (AntMessageCustomizer customizer : myMessageCustomizers) { + customizedMessage = customizer.createCustomizedMessage(text, priority); + if (customizedMessage != null) { + break; + } + } + + return customizedMessage; } public void outputError(String error, int priority) { @@ -394,7 +416,7 @@ public final class AntBuildMessageView extends JPanel implements DataProvider, O } public void outputException(String exception) { - updateErrorAndWarningCounters(0); + updateErrorAndWarningCounters(PRIORITY_ERR); AntMessage message = createErrorMessage(MessageType.ERROR, 0, exception); addCommand(new AddExceptionCommand(message)); WolfTheProblemSolver wolf = WolfTheProblemSolver.getInstance(myProject); @@ -403,10 +425,10 @@ public final class AntBuildMessageView extends JPanel implements DataProvider, O private void updateErrorAndWarningCounters(int priority) { - if (priority == AntMain2.MSG_ERR) { + if (priority == PRIORITY_ERR) { myErrorCount++; } - else if (priority == AntMain2.MSG_WARN) { + else if (priority == PRIORITY_WARN) { myWarningCount++; } } @@ -474,7 +496,7 @@ public final class AntBuildMessageView extends JPanel implements DataProvider, O } public void outputJavacMessage(MessageType type, String[] text, VirtualFile file, String url, int line, int column) { - int priority = type == MessageType.ERROR ? AntMain2.MSG_ERR : AntMain2.MSG_VERBOSE; + int priority = type == MessageType.ERROR ? PRIORITY_ERR : PRIORITY_VERBOSE; updateErrorAndWarningCounters(priority); AntMessage message = new AntMessage(type, priority, text, file, line, column); addCommand(new AddJavacMessageCommand(message, url)); diff --git a/plugins/ant/src/com/intellij/lang/ant/config/execution/AntMessage.java b/plugins/ant/src/com/intellij/lang/ant/config/execution/AntMessage.java index 8c7784620684..c9791d5e6d43 100644 --- a/plugins/ant/src/com/intellij/lang/ant/config/execution/AntMessage.java +++ b/plugins/ant/src/com/intellij/lang/ant/config/execution/AntMessage.java @@ -22,7 +22,7 @@ import com.intellij.util.StringBuilderSpinAllocator; import java.util.ArrayList; import java.util.StringTokenizer; -final class AntMessage { +public final class AntMessage { private final AntBuildMessageView.MessageType myType; private final int myPriority; private final String myText; diff --git a/plugins/ant/src/com/intellij/lang/ant/config/execution/AntMessageCustomizer.java b/plugins/ant/src/com/intellij/lang/ant/config/execution/AntMessageCustomizer.java new file mode 100644 index 000000000000..76fc7d15dacb --- /dev/null +++ b/plugins/ant/src/com/intellij/lang/ant/config/execution/AntMessageCustomizer.java @@ -0,0 +1,14 @@ +package com.intellij.lang.ant.config.execution; + +import com.intellij.openapi.extensions.ExtensionPointName; +import org.jetbrains.annotations.Nullable; + +public abstract class AntMessageCustomizer { + + public static final ExtensionPointName EP_NAME = ExtensionPointName.create("AntSupport.AntMessageCustomizer"); + + @Nullable + public AntMessage createCustomizedMessage(String text, int priority) { + return null; + } +} diff --git a/plugins/ant/src/com/intellij/lang/ant/config/execution/MessageTreeRenderer.java b/plugins/ant/src/com/intellij/lang/ant/config/execution/MessageTreeRenderer.java index ce3a27c30ce8..2a626e69a537 100644 --- a/plugins/ant/src/com/intellij/lang/ant/config/execution/MessageTreeRenderer.java +++ b/plugins/ant/src/com/intellij/lang/ant/config/execution/MessageTreeRenderer.java @@ -17,7 +17,6 @@ package com.intellij.lang.ant.config.execution; import com.intellij.lang.ant.AntIcons; import com.intellij.openapi.util.IconLoader; -import com.intellij.rt.ant.execution.AntMain2; import com.intellij.ui.IdeBorderFactory; import com.intellij.ui.MultilineTreeCellRenderer; import com.intellij.ui.SideBorder; @@ -69,7 +68,7 @@ final class MessageTreeRenderer extends MultilineTreeCellRenderer { icon = PlatformIcons.TASK_ICON; } else if (type == AntBuildMessageView.MessageType.MESSAGE) { - if (node.getPriority() == AntMain2.MSG_WARN) { + if (node.getPriority() == AntBuildMessageView.PRIORITY_WARN) { icon = myWarningIcon; } else { diff --git a/plugins/ant/src/com/intellij/lang/ant/config/execution/OutputParser.java b/plugins/ant/src/com/intellij/lang/ant/config/execution/OutputParser.java index 6ba74f07083f..f96df5472736 100644 --- a/plugins/ant/src/com/intellij/lang/ant/config/execution/OutputParser.java +++ b/plugins/ant/src/com/intellij/lang/ant/config/execution/OutputParser.java @@ -27,7 +27,6 @@ import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; -import com.intellij.rt.ant.execution.AntMain2; import com.intellij.rt.ant.execution.IdeaAntLogger2; import com.intellij.util.text.StringTokenizer; import org.jetbrains.annotations.NonNls; @@ -146,7 +145,7 @@ public class OutputParser{ if (IdeaAntLogger2.MESSAGE == tagName) { if (myIsEcho) { - myMessageView.outputMessage(tagValue, AntMain2.MSG_VERBOSE); + myMessageView.outputMessage(tagValue, AntBuildMessageView.PRIORITY_VERBOSE); } else { myMessageView.outputMessage(tagValue, priority);