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