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 5fc30b25d4 Stacktrace analyzer window fixes
     new 5e3d77990f Merge pull request #6841 from 
mbien/stacktrace-analyzer-fixes
5fc30b25d4 is described below

commit 5fc30b25d4dcd6310501729e16b40072de4430de
Author: Michael Bien <[email protected]>
AuthorDate: Thu Dec 14 08:27:41 2023 +0100

    Stacktrace analyzer window fixes
    
     - update matcher to be more forgiving when traces are pasted from ANSI
       decorated sources (some loggers use colors for exception elements)
     - some loggers add extra spaces to stack trace lines
     - properly escape angle brackets in cell renderer
     - some indentation fixes for lines which are rendered without link
       (e.g native code calls)
     - avoid using deprecated methods
---
 java/java.navigation/manifest.mf                   |   2 +-
 .../java/navigation/BreadCrumbsScanningTask.java   |   1 -
 .../java/navigation/ElementScanningTask.java       |   1 -
 .../modules/java/navigation/HTMLDocView.java       |   2 +-
 .../java/stackanalyzer/AnalyserCellRenderer.java   |  28 +++--
 .../java/stackanalyzer/AnalyzeStackAction.java     |   1 +
 .../stackanalyzer/AnalyzeStackTopComponent.java    |   3 +-
 .../java/stackanalyzer/StackLineAnalyser.java      | 123 ++++++++++-----------
 .../java/stackanalyzer/StackLineAnalyserTest.java  |  30 ++++-
 9 files changed, 106 insertions(+), 85 deletions(-)

diff --git a/java/java.navigation/manifest.mf b/java/java.navigation/manifest.mf
index 5676d2f62b..e2849f4135 100644
--- a/java/java.navigation/manifest.mf
+++ b/java/java.navigation/manifest.mf
@@ -5,4 +5,4 @@ OpenIDE-Module-Localizing-Bundle: 
org/netbeans/modules/java/navigation/Bundle.pr
 OpenIDE-Module-Requires: org.openide.windows.WindowManager
 OpenIDE-Module-Specification-Version: 1.63
 AutoUpdate-Show-In-Client: false
-
+OpenIDE-Module-Java-Dependencies: Java > 11
diff --git 
a/java/java.navigation/src/org/netbeans/modules/java/navigation/BreadCrumbsScanningTask.java
 
b/java/java.navigation/src/org/netbeans/modules/java/navigation/BreadCrumbsScanningTask.java
index 424e72ff09..82824d2c88 100644
--- 
a/java/java.navigation/src/org/netbeans/modules/java/navigation/BreadCrumbsScanningTask.java
+++ 
b/java/java.navigation/src/org/netbeans/modules/java/navigation/BreadCrumbsScanningTask.java
@@ -40,7 +40,6 @@ import org.netbeans.modules.parsing.spi.SchedulerEvent;
 import org.netbeans.modules.parsing.spi.SchedulerTask;
 import org.netbeans.modules.parsing.spi.TaskFactory;
 import org.netbeans.modules.parsing.spi.TaskIndexingMode;
-import org.openide.nodes.Node;
 
 /**
  *
diff --git 
a/java/java.navigation/src/org/netbeans/modules/java/navigation/ElementScanningTask.java
 
b/java/java.navigation/src/org/netbeans/modules/java/navigation/ElementScanningTask.java
index ab864a47d7..63ddcb6b4b 100644
--- 
a/java/java.navigation/src/org/netbeans/modules/java/navigation/ElementScanningTask.java
+++ 
b/java/java.navigation/src/org/netbeans/modules/java/navigation/ElementScanningTask.java
@@ -52,7 +52,6 @@ import javax.lang.model.element.VariableElement;
 import javax.lang.model.type.ArrayType;
 import javax.lang.model.type.TypeKind;
 import javax.lang.model.type.TypeMirror;
-import javax.lang.model.util.Elements;
 import javax.lang.model.util.Elements.Origin;
 import org.netbeans.api.annotations.common.CheckForNull;
 import org.netbeans.api.annotations.common.NonNull;
diff --git 
a/java/java.navigation/src/org/netbeans/modules/java/navigation/HTMLDocView.java
 
b/java/java.navigation/src/org/netbeans/modules/java/navigation/HTMLDocView.java
index 1ffc020aa6..b0c5001849 100644
--- 
a/java/java.navigation/src/org/netbeans/modules/java/navigation/HTMLDocView.java
+++ 
b/java/java.navigation/src/org/netbeans/modules/java/navigation/HTMLDocView.java
@@ -39,7 +39,6 @@ import javax.swing.text.html.HTMLEditorKit;
 import org.netbeans.api.editor.mimelookup.MimeLookup;
 import org.netbeans.api.editor.settings.FontColorNames;
 import org.netbeans.api.editor.settings.FontColorSettings;
-import org.netbeans.editor.EditorUI;
 
 /**
  *  HTML documentation view.
@@ -118,6 +117,7 @@ class HTMLDocView extends JEditorPane {
         });
     }
     
+    @Override
     protected EditorKit createDefaultEditorKit() {
         // it is extremelly slow to init it
         if (htmlKit == null){
diff --git 
a/java/java.navigation/src/org/netbeans/modules/java/stackanalyzer/AnalyserCellRenderer.java
 
b/java/java.navigation/src/org/netbeans/modules/java/stackanalyzer/AnalyserCellRenderer.java
index 8829b7d0eb..44d0641faf 100644
--- 
a/java/java.navigation/src/org/netbeans/modules/java/stackanalyzer/AnalyserCellRenderer.java
+++ 
b/java/java.navigation/src/org/netbeans/modules/java/stackanalyzer/AnalyserCellRenderer.java
@@ -98,19 +98,15 @@ class AnalyserCellRenderer extends DefaultListCellRenderer {
             if (isSelected) {
                 sb.append("<style> a.val {text-decoration: underline; color: 
"+toRgbText(getForeground())+"} </style><body>");
             }
-            String prefix = line.substring (0, link.getStartOffset ());
-            if (prefix.startsWith("at ")) {
-                prefix = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" + 
prefix;
-            }
-            sb.append (prefix);
-            sb.append ("<a class=\"val\" href=\"\">");
-            sb.append (line.substring (link.getStartOffset (), 
link.getEndOffset ()));
-            sb.append ("</a>");
-            sb.append (line.substring (link.getEndOffset ()));
-            sb.append ("</body></html>");
-            setText (sb.toString ());
+            sb.append(indentAt(escapeAngleBrackets(line.substring(0, 
link.getStartOffset())), "&nbsp;"));
+            sb.append("<a class=\"val\" href=\"\">");
+            
sb.append(escapeAngleBrackets(line.substring(link.getStartOffset(), 
link.getEndOffset())));
+            sb.append("</a>");
+            
sb.append(escapeAngleBrackets(line.substring(link.getEndOffset())));
+            sb.append("</body></html>");
+            setText(sb.toString ());
         } else {
-            setText (line.trim ());
+            setText(indentAt(line.strip(), " "));
         }
 
         setEnabled (list.isEnabled ());
@@ -145,5 +141,13 @@ class AnalyserCellRenderer extends DefaultListCellRenderer 
{
     private String toRgbText(Color c) {
         return String.format("#%02x%02x%02x", c.getRed(), c.getGreen(), 
c.getBlue());
     }
+
+    private String escapeAngleBrackets(String str) {
+        return str.replace("<", "&lt;");
+    }
+
+    private String indentAt(String str, String indent) {
+        return str.startsWith("at ") ? indent.repeat(8) + str : str;
+    }
 }
 
diff --git 
a/java/java.navigation/src/org/netbeans/modules/java/stackanalyzer/AnalyzeStackAction.java
 
b/java/java.navigation/src/org/netbeans/modules/java/stackanalyzer/AnalyzeStackAction.java
index 182a260855..2a4191b27e 100644
--- 
a/java/java.navigation/src/org/netbeans/modules/java/stackanalyzer/AnalyzeStackAction.java
+++ 
b/java/java.navigation/src/org/netbeans/modules/java/stackanalyzer/AnalyzeStackAction.java
@@ -34,6 +34,7 @@ public class AnalyzeStackAction extends AbstractAction {
 //        putValue(SMALL_ICON, new 
ImageIcon(Utilities.loadImage(AnalyzeStackTopComponent.ICON_PATH, true)));
     }
 
+    @Override
     public void actionPerformed(ActionEvent evt) {
         TopComponent win = AnalyzeStackTopComponent.findInstance();
         win.open();
diff --git 
a/java/java.navigation/src/org/netbeans/modules/java/stackanalyzer/AnalyzeStackTopComponent.java
 
b/java/java.navigation/src/org/netbeans/modules/java/stackanalyzer/AnalyzeStackTopComponent.java
index a6a098191b..14aa953deb 100644
--- 
a/java/java.navigation/src/org/netbeans/modules/java/stackanalyzer/AnalyzeStackTopComponent.java
+++ 
b/java/java.navigation/src/org/netbeans/modules/java/stackanalyzer/AnalyzeStackTopComponent.java
@@ -139,7 +139,8 @@ final class AnalyzeStackTopComponent extends TopComponent {
         String lastLine = null;
         try {
             while ((currentLine = r.readLine()) != null) {
-                currentLine = currentLine.trim();
+                // strip ANSI symbols just in case the terminal/clipboard 
hasn't done that
+                currentLine = 
currentLine.replaceAll("\u001B\\[[\\d;]*[^\\d;]", "").strip();
                 if (StackLineAnalyser.matches(currentLine)) {
                     if (lastLine != null) {
                         model.addElement(lastLine);
diff --git 
a/java/java.navigation/src/org/netbeans/modules/java/stackanalyzer/StackLineAnalyser.java
 
b/java/java.navigation/src/org/netbeans/modules/java/stackanalyzer/StackLineAnalyser.java
index c7c5bbc29f..e13ef2a5cd 100644
--- 
a/java/java.navigation/src/org/netbeans/modules/java/stackanalyzer/StackLineAnalyser.java
+++ 
b/java/java.navigation/src/org/netbeans/modules/java/stackanalyzer/StackLineAnalyser.java
@@ -27,11 +27,9 @@ import java.util.regex.Pattern;
 import javax.swing.text.StyledDocument;
 import org.netbeans.api.annotations.common.CheckForNull;
 import org.netbeans.api.annotations.common.NullAllowed;
-
 import org.netbeans.api.java.classpath.ClassPath;
 import org.netbeans.api.java.classpath.GlobalPathRegistry;
 import org.netbeans.api.progress.ProgressHandle;
-import org.netbeans.api.progress.ProgressHandleFactory;
 import org.netbeans.spi.java.classpath.support.ClassPathSupport;
 import org.openide.awt.StatusDisplayer;
 import org.openide.cookies.EditorCookie;
@@ -57,11 +55,12 @@ class StackLineAnalyser {
     private static final String IDENTIFIER =
         "\\p{javaJavaIdentifierStart}\\p{javaJavaIdentifierPart}*";    // 
NOI18N
     private static final Pattern LINE_PATTERN = Pattern.compile(
-        "at\\s" +                                       //  initial at // 
NOI18N
+        "at\\s+" +                                       //  initial at // 
NOI18N
         "("+IDENTIFIER+"(?:\\."+IDENTIFIER+")*/)?" + // optional module name 
// NOI18N
         "(("+IDENTIFIER+"(\\."+IDENTIFIER+")*)\\.)?("+IDENTIFIER+")" + // 
class name // NOI18N
-        
"\\.("+IDENTIFIER+"|\\<init\\>|\\<clinit\\>)\\((?:"+IDENTIFIER+"(?:\\."+IDENTIFIER+")*/)?"
 +IDENTIFIER+"\\.?("+IDENTIFIER+ // method and file name // NOI18N
-        ")\\:([0-9]*)\\)");                              // line number // 
NOI18N
+        "\\.("+IDENTIFIER+"|\\<init\\>|\\<clinit\\>)\\s*"+ // method name
+        
"\\((?:"+IDENTIFIER+"(?:\\."+IDENTIFIER+")*/)?"+IDENTIFIER+"(\\.(?:\\p{javaJavaIdentifierPart}+))?"+
 // '(File.java' // NOI18N
+        "\\:([0-9]*)\\)");                              // ':123)' // NOI18N
 
     static boolean matches(String line) {
         Matcher matcher = LINE_PATTERN.matcher(line);
@@ -71,7 +70,7 @@ class StackLineAnalyser {
     static Link analyse(String line) {
         Matcher matcher = LINE_PATTERN.matcher(line);
         if (matcher.find()) {
-            int lineNumber = -1;
+            int lineNumber;
             try {
                 lineNumber = Integer.parseInt(matcher.group(8));
             } catch (NumberFormatException nfe) {
@@ -81,7 +80,7 @@ class StackLineAnalyser {
             if (matcher.group(1) != null) {
                 moduleStart = matcher.start(1);
             }
-            String ext = "." + matcher.group(7);
+            String ext = matcher.group(7);       
             if (matcher.group(2)==null ) {
                 return new Link(matcher.group(5),
                             lineNumber,
@@ -144,75 +143,67 @@ class StackLineAnalyser {
                 resources.add(name + ".java"); //NOI18N
                 idx = name.lastIndexOf('$');
             }
-            final ProgressHandle handle = ProgressHandleFactory.createHandle(
+            final ProgressHandle handle = ProgressHandle.createHandle(
                 NbBundle.getMessage(StackLineAnalyser.class, 
"TXT_OpeningSource", resources.get(0)));
             handle.start();
-            RP.execute(
-                new Runnable() {
-                    @Override
-                    public void run() {
-                        DataObject dobj = null;
-                        try {
-                            final ClassPath classPath = 
ClassPathSupport.createClassPath(
+            RP.execute(() -> {
+                DataObject dobj = null;
+                try {
+                    final ClassPath classPath = 
ClassPathSupport.createClassPath(
                             
GlobalPathRegistry.getDefault().getSourceRoots().toArray(new FileObject[0]));
-                            for (String resource : resources) {
-                                dobj = 
findDataObject(classPath.findResource(resource));
-                                if (dobj != null)
-                                    break;
+                    for (String resource : resources) {
+                        dobj = 
findDataObject(classPath.findResource(resource));
+                        if (dobj != null)
+                            break;
+                    }
+                } finally {
+                    final DataObject dataObject = dobj;
+                    Mutex.EVENT.readAccess(() -> {
+                        try {
+                            if (dataObject == null) {
+                                StatusDisplayer.getDefault().setStatusText(
+                                        
NbBundle.getMessage(StackLineAnalyser.class,
+                                                
"AnalyzeStackTopComponent.sourceNotFound",
+                                                new 
Object[]{resources.get(0)}));
+                                return;
                             }
-                        } finally {
-                            final DataObject dataObject = dobj;
-                            Mutex.EVENT.readAccess(new Runnable() {
-                                @Override
-                                public void run() {
-                                    try {
-                                        if (dataObject == null) {
-                                            
StatusDisplayer.getDefault().setStatusText(
-                                            
NbBundle.getMessage(StackLineAnalyser.class,
-                                            
"AnalyzeStackTopComponent.sourceNotFound",
-                                            new Object[]{resources.get(0)}));
-                                            return;
-                                        }
-                                        try {
-                                            EditorCookie editorCookie = 
(EditorCookie) dataObject.getCookie(EditorCookie.class);
-                                            LineCookie lineCookie = 
(LineCookie) dataObject.getCookie(LineCookie.class);
-                                            if (editorCookie != null && 
lineCookie != null && lineNumber != -1) {
-                                                StyledDocument doc = 
editorCookie.openDocument();
-                                                if (doc != null) {
-                                                    if (lineNumber != -1) {
-                                                        try {
-                                                            Line l = 
lineCookie.getLineSet().getCurrent(lineNumber - 1);
-
-                                                            if (l != null) {
-                                                                
l.show(Line.SHOW_GOTO);
-                                                                return;
-                                                            }
-                                                        } catch 
(IndexOutOfBoundsException oob) {
-                                                            //line number is 
no more valid, do not report as an error
-                                                            
StatusDisplayer.getDefault().setStatusText(
-                                                            
NbBundle.getMessage(StackLineAnalyser.class,
-                                                            
"AnalyzeStackTopComponent.lineNotFound",
-                                                            new 
Object[]{lineNumber}));
-                                                        }
-                                                    }
+                            try {
+                                EditorCookie editorCookie = 
dataObject.getLookup().lookup(EditorCookie.class);
+                                LineCookie lineCookie = 
dataObject.getLookup().lookup(LineCookie.class);
+                                if (editorCookie != null && lineCookie != null 
&& lineNumber != -1) {
+                                    StyledDocument doc = 
editorCookie.openDocument();
+                                    if (doc != null) {
+                                        if (lineNumber != -1) {
+                                            try {
+                                                Line l = 
lineCookie.getLineSet().getCurrent(lineNumber - 1);
+                                                if (l != null) {
+                                                    
l.show(Line.ShowOpenType.OPEN, Line.ShowVisibilityType.FRONT);
+                                                    return;
                                                 }
+                                            } catch (IndexOutOfBoundsException 
oob) {
+                                                //line number is no more 
valid, do not report as an error
+                                                
StatusDisplayer.getDefault().setStatusText(
+                                                        
NbBundle.getMessage(StackLineAnalyser.class,
+                                                                
"AnalyzeStackTopComponent.lineNotFound",
+                                                                new 
Object[]{lineNumber}));
                                             }
-                                            OpenCookie openCookie = 
(OpenCookie) dataObject.getCookie(OpenCookie.class);
-                                            if (openCookie != null) {
-                                                openCookie.open();
-                                                return;
-                                            }
-                                        } catch (IOException e) {
-                                            Exceptions.printStackTrace(e);
                                         }
-                                    } finally {
-                                        handle.finish();
                                     }
                                 }
-                            });
+                                OpenCookie openCookie = 
dataObject.getLookup().lookup(OpenCookie.class);
+                                if (openCookie != null) {
+                                    openCookie.open();
+                                    return;
+                                }
+                            } catch (IOException e) {
+                                Exceptions.printStackTrace(e);
+                            }
+                        } finally {
+                            handle.finish();
                         }
-                    }
-                });
+                    });
+                }
+            });
         }
     }
 
diff --git 
a/java/java.navigation/test/unit/src/org/netbeans/modules/java/stackanalyzer/StackLineAnalyserTest.java
 
b/java/java.navigation/test/unit/src/org/netbeans/modules/java/stackanalyzer/StackLineAnalyserTest.java
index 7d871e3425..40dbd39f94 100644
--- 
a/java/java.navigation/test/unit/src/org/netbeans/modules/java/stackanalyzer/StackLineAnalyserTest.java
+++ 
b/java/java.navigation/test/unit/src/org/netbeans/modules/java/stackanalyzer/StackLineAnalyserTest.java
@@ -48,17 +48,40 @@ public class StackLineAnalyserTest extends NbTestCase {
         assertTrue(StackLineAnalyser.matches("             [exec]     at 
org.openide.filesystems.FileUtil.normalizeFileOnMac(FileUtil.java:1714)"));
         assertTrue(StackLineAnalyser.matches("at 
java.base/java.lang.String.lastIndexOf(String.java:1627)"));
         assertTrue(StackLineAnalyser.matches(" at 
java.base/java.lang.String.lastIndexOf(String.java:1627)"));
+        // some loggers (e.g. MavenSimpleLogger until MNG-7970/#1342 which is 
maven's default logger) seem to add a space before the '('
+        assertTrue(StackLineAnalyser.matches("    at 
java.util.zip.ZipFile$CleanableResource.<init> (ZipFile.java:742)"));
     }
 
     @Test
     public void testMatchesScalaLines() throws Exception {
-        assertTrue(StackLineAnalyser.matches("at 
org.enso.compiler.core.ir.MetadataStorage.$anonfun$getUnsafe$1(MetadataStorage.scala:80)"));
-        StackLineAnalyser.Link l = StackLineAnalyser.analyse("at 
org.enso.compiler.core.ir.MetadataStorage.$anonfun$getUnsafe$1(MetadataStorage.scala:80)");
+        String line = "at 
org.enso.compiler.core.ir.MetadataStorage.$anonfun$getUnsafe$1(MetadataStorage.scala:80)";
+        assertTrue(StackLineAnalyser.matches(line));
+        StackLineAnalyser.Link l = StackLineAnalyser.analyse(line);
         assertEquals(3, l.getStartOffset());
         assertEquals(91, l.getEndOffset());
         assertEquals(".scala", l.getExtension());
     }
 
+    @Test
+    public void testMatchesUnknownFileLines() throws Exception {
+        String line = "at org.Unknown(Unknown:80)";
+        assertTrue(StackLineAnalyser.matches(line));
+        StackLineAnalyser.Link l = StackLineAnalyser.analyse(line);
+        assertEquals(3, l.getStartOffset());
+        assertEquals(26, l.getEndOffset());
+        assertEquals(null, l.getExtension());
+    }
+
+    @Test
+    public void testMatchesWithNoPackage() throws Exception {
+        String line = "\tat NewClass.main(NewClass.java:12)";
+        assertTrue(StackLineAnalyser.matches(line));
+        StackLineAnalyser.Link l = StackLineAnalyser.analyse(line);
+        assertEquals(4, l.getStartOffset());
+        assertEquals(35, l.getEndOffset());
+        assertEquals(".java", l.getExtension());
+    }
+
     @Test
     public void testModuleStackTraceMatches() throws Exception {
         assertTrue(StackLineAnalyser.matches("at 
library.Library.init(Utilities/Library.java:24)"));
@@ -85,6 +108,9 @@ public class StackLineAnalyserTest extends NbTestCase {
         l = StackLineAnalyser.analyse(" at 
java.base/java.lang.String.lastIndexOf(String.java:1627)");
         assertEquals(4, l.getStartOffset());
         assertEquals(60, l.getEndOffset());
+        l = StackLineAnalyser.analyse("    at 
java.util.zip.ZipFile$CleanableResource.<init> (ZipFile.java:742)");
+        assertEquals(7, l.getStartOffset());
+        assertEquals(72, l.getEndOffset());
     }
 
     @Test


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists

Reply via email to