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);