You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by mb...@apache.org on 2022/12/21 19:52:58 UTC
[netbeans] branch master updated: fix output window stacktrace parsing when mvnd is used.
This is an automated email from the ASF dual-hosted git repository.
mbien pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git
The following commit(s) were added to refs/heads/master by this push:
new b2856f4e59 fix output window stacktrace parsing when mvnd is used.
new 8678d582a4 Merge pull request #5099 from mbien/mvnd-stacktrace-parsing-fix
b2856f4e59 is described below
commit b2856f4e59642c20c747888ff29aefa10b8b622b
Author: Michael Bien <mb...@gmail.com>
AuthorDate: Mon Dec 12 22:44:24 2022 +0100
fix output window stacktrace parsing when mvnd is used.
mvnd is using WARN instead of WARNING and prints the output type
(stderr|stdout) on exceptions.
Improvements to some regex patterns so that the faster match() can
be used instead of find(), which improves parsing speed of long lines.
---
.../modules/maven/api/output/OutputUtils.java | 13 +++---
.../maven/execute/CommandLineOutputHandler.java | 52 +++++++++++++++++-----
.../output/DependencyAnalyzeOutputProcessor.java | 3 +-
.../maven/output/JavaOutputListenerProvider.java | 2 +-
4 files changed, 50 insertions(+), 20 deletions(-)
diff --git a/java/maven/src/org/netbeans/modules/maven/api/output/OutputUtils.java b/java/maven/src/org/netbeans/modules/maven/api/output/OutputUtils.java
index 88a8e09a2b..ae905247fd 100644
--- a/java/maven/src/org/netbeans/modules/maven/api/output/OutputUtils.java
+++ b/java/maven/src/org/netbeans/modules/maven/api/output/OutputUtils.java
@@ -50,7 +50,9 @@ import org.openide.windows.OutputListener;
* @author mkleint
*/
public final class OutputUtils {
- public static final Pattern linePattern = Pattern.compile("(?:\\[catch\\])?\\sat (.*)\\((?:Native Method|(.*)\\.java\\:(\\d+))\\)"); //NOI18N
+
+ // example: '[WARN] at java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:142)'
+ public static final Pattern linePattern = Pattern.compile("(?:\\[\\w+\\])?\\s*(?:\\[catch\\]\\s)?at\\s(.*)\\((?:Native Method|(.*)\\.java\\:(\\d+))\\)"); //NOI18N
private static final Map<Project, StacktraceOutputListener> projectStacktraceListeners = new WeakHashMap<>();
private static final Map<FileObject, StacktraceOutputListener> fileStacktraceListeners = new WeakHashMap<>();
@@ -115,13 +117,10 @@ public final class OutputUtils {
return null;
}
- /**
- *
- * @param line
- * @param classPath
- * @return
- */
private static StacktraceAttributes matchStackTraceLine(String line) {
+ if (!line.endsWith(")")) {
+ return null; // fast path -> not a stack trace
+ }
Matcher match = linePattern.matcher(line);
if (match.matches() && match.groupCount() == 3) {
String method = match.group(1);
diff --git a/java/maven/src/org/netbeans/modules/maven/execute/CommandLineOutputHandler.java b/java/maven/src/org/netbeans/modules/maven/execute/CommandLineOutputHandler.java
index ea8bcf98d0..0e4f54fff8 100644
--- a/java/maven/src/org/netbeans/modules/maven/execute/CommandLineOutputHandler.java
+++ b/java/maven/src/org/netbeans/modules/maven/execute/CommandLineOutputHandler.java
@@ -78,16 +78,25 @@ public class CommandLineOutputHandler extends AbstractOutputHandler {
private static final RequestProcessor PROCESSOR = new RequestProcessor("Maven ComandLine Output Redirection", Integer.getInteger("maven.concurrent.builds", 16) * 2); //NOI18N
private static final Logger LOG = Logger.getLogger(CommandLineOutputHandler.class.getName());
private InputOutput inputOutput;
- private static final Pattern linePattern = Pattern.compile("\\[(DEBUG|INFO|WARNING|ERROR|FATAL)\\] (.*)"); // NOI18N
+
+ /*
+ * example: '[WARN] [stderr] Exception in thread "main" java.lang.UnsupportedOperationException'
+ * @see Output#mapLevel for details
+ */
+ private static final Pattern linePattern = Pattern.compile("(\\[(DEBUG|TRACE|INFO|WARN|WARNING|ERROR|FATAL)\\]\\s)?(?:\\[(?:stderr|stdout)\\]\\s)?(.*)"); // NOI18N
+
public static final Pattern startPatternM2 = Pattern.compile("\\[INFO\\] \\[([\\w]*):([\\w]*)[ ]?.*\\]"); // NOI18N
public static final Pattern startPatternM3 = Pattern.compile("\\[INFO\\] --- (\\S+):\\S+:(\\S+)(?: [(]\\S+[)])? @ \\S+ ---"); // ExecutionEventLogger.mojoStarted NOI18N
+
private static final Pattern mavenSomethingPlugin = Pattern.compile("maven-(.+)-plugin"); // NOI18N
private static final Pattern somethingMavenPlugin = Pattern.compile("(.+)-maven-plugin"); // NOI18N
+
/** @see org.apache.maven.cli.ExecutionEventLogger#logReactorSummary */
static final Pattern reactorFailure = Pattern.compile("\\[INFO\\] (.+) [.]* FAILURE \\[.+\\]"); // NOI18N
- private static final Pattern stackTraceElement = OutputUtils.linePattern;
-
public static final Pattern reactorSummaryLine = Pattern.compile("(.+) [.]* (FAILURE|SUCCESS) (\\[.+\\])?"); // NOI18N
+
+ private static final Pattern stackTraceElement = OutputUtils.linePattern;
+
private OutputWriter stdOut;
private String currentProject;
private String currentTag;
@@ -319,15 +328,20 @@ public class CommandLineOutputHandler extends AbstractOutputHandler {
}
Matcher lineMatcher = linePattern.matcher(line);
if (lineMatcher.matches()) {
- Level level = Level.valueOf(lineMatcher.group(1));
- String text = lineMatcher.group(2);
- updateFoldForException(text);
- processLine(MavenSettings.getDefault().isShowLoggingLevel() ? line : text, stdOut, level);
+ String level_group = lineMatcher.group(1);
+ Level level = mapLevel(lineMatcher.group(2));
+ String msg = lineMatcher.group(3);
+ updateFoldForException(msg);
+ if (MavenSettings.getDefault().isShowLoggingLevel() && level_group != null) {
+ processLine(level_group + msg, stdOut, level);
+ } else {
+ processLine(msg, stdOut, level);
+ }
if (level == Level.INFO && contextImpl == null) { //only perform for maven 2.x now
- checkProgress(text);
+ checkProgress(msg);
}
} else {
- // oh well..
+ // shouldn't happen since linePattern should match everything
updateFoldForException(line);
processLine(line, stdOut, Level.INFO);
}
@@ -367,6 +381,24 @@ public class CommandLineOutputHandler extends AbstractOutputHandler {
}
}
+ // mvnd uses standard SLF4J levels while mvn prints WARN as WARNING
+ // see MavenSimpleLogger#renderLevel(int) in the maven repo
+ private Level mapLevel(String string) {
+ if (string == null) {
+ return Level.INFO;
+ } else if ("WARN".equals(string)) {
+ return Level.WARNING;
+ } else if ("TRACE".equals(string)) {
+ return Level.DEBUG; // where is trace?
+ } else {
+ try {
+ return Level.valueOf(string);
+ } catch (IllegalArgumentException ex) {
+ return Level.INFO;
+ }
+ }
+ }
+
private ExecutionEventObject parseExecEvent(String line) {
String jsonContent = line.substring(INFO_NETBEANS_EXEC_EVENT.length());
try {
@@ -390,7 +422,7 @@ public class CommandLineOutputHandler extends AbstractOutputHandler {
* or is another text, and update folds accordingly.
*/
private void updateFoldForException(String line) {
- if (stackTraceElement.matcher(line).find()) {
+ if (line.endsWith(")") && stackTraceElement.matcher(line).matches()) {
inStackTrace = true;
if (!currentTreeNode.hasInnerOutputFold()) {
currentTreeNode.startInnerOutputFold(inputOutput);
diff --git a/java/maven/src/org/netbeans/modules/maven/output/DependencyAnalyzeOutputProcessor.java b/java/maven/src/org/netbeans/modules/maven/output/DependencyAnalyzeOutputProcessor.java
index cbdf86d950..a48a7d3c12 100644
--- a/java/maven/src/org/netbeans/modules/maven/output/DependencyAnalyzeOutputProcessor.java
+++ b/java/maven/src/org/netbeans/modules/maven/output/DependencyAnalyzeOutputProcessor.java
@@ -22,7 +22,6 @@ package org.netbeans.modules.maven.output;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.netbeans.api.project.Project;
-import org.netbeans.modules.maven.NbMavenProjectImpl;
import org.netbeans.modules.maven.api.ModelUtils;
import org.netbeans.modules.maven.api.output.OutputProcessor;
import org.netbeans.modules.maven.api.output.OutputVisitor;
@@ -51,7 +50,7 @@ public class DependencyAnalyzeOutputProcessor implements OutputProcessor {
DependencyAnalyzeOutputProcessor(Project project) {
started = false;
start = Pattern.compile(".*Used undeclared dependencies.*", Pattern.DOTALL); //NOI18N
- dependency = Pattern.compile("\\s*(?:\\[WARNING\\])?\\s*(.*):(.*):(.*):(.*):(.*)", Pattern.DOTALL); //NOI18N
+ dependency = Pattern.compile("\\s*(?:\\[WARNING|WARN\\])?\\s*(.*):(.*):(.*):(.*):(.*)", Pattern.DOTALL); //NOI18N
this.project = project;
}
diff --git a/java/maven/src/org/netbeans/modules/maven/output/JavaOutputListenerProvider.java b/java/maven/src/org/netbeans/modules/maven/output/JavaOutputListenerProvider.java
index 9750a700b2..31b99e360e 100644
--- a/java/maven/src/org/netbeans/modules/maven/output/JavaOutputListenerProvider.java
+++ b/java/maven/src/org/netbeans/modules/maven/output/JavaOutputListenerProvider.java
@@ -83,7 +83,7 @@ public class JavaOutputListenerProvider implements OutputProcessor {
this.config = config;
//[javac] required because of forked compilation
//DOTALL seems to fix MEVENIDE-455 on windows. one of the characters seems to be a some kind of newline and that's why the line doesnt' get matched otherwise.
- failPattern = Pattern.compile("\\s*(?:\\[(WARNING|ERROR)\\])?(?:\\[javac\\])?(?:Compilation failure)?\\s*(?<" + GROUP_CLAZZ_NAME + ">.*)\\.java\\:\\[(?<" + GROUP_LINE_NR + ">[0-9]*),([0-9]*)\\] (?<" + GROUP_TEXT + ">.*)", Pattern.DOTALL); //NOI18N
+ failPattern = Pattern.compile("\\s*(?:\\[(WARNING|WARN|ERROR)\\])?(?:\\[javac\\])?(?:Compilation failure)?\\s*(?<" + GROUP_CLAZZ_NAME + ">.*)\\.java\\:\\[(?<" + GROUP_LINE_NR + ">[0-9]*),([0-9]*)\\] (?<" + GROUP_TEXT + ">.*)", Pattern.DOTALL); //NOI18N
}
private static final Pattern COMPILER_PROBLEM = Pattern.compile(".*module-info\\.java:.*module not found: .*");
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@netbeans.apache.org
For additional commands, e-mail: commits-help@netbeans.apache.org
For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists