You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by sj...@apache.org on 2022/07/25 08:43:50 UTC

[maven-jxr] branch master updated: [JXR-170] NullPointerException while parsing Java 15 multi-line String source - Add support for parsing sources with Java 15 multi-line Strings - Add JUnit test case - Implement toString on class BaseType - Require non-null name on BaseType construtor - Prevent construction of types with null name - Add version to maven-enforcer-plugin plugin to prevent failure of integration test JXR-143_nofork

This is an automated email from the ASF dual-hosted git repository.

sjaranowski pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-jxr.git


The following commit(s) were added to refs/heads/master by this push:
     new 87995c6  [JXR-170] NullPointerException while parsing Java 15 multi-line String source - Add support for parsing sources with Java 15 multi-line Strings - Add JUnit test case - Implement toString on class BaseType - Require non-null name on BaseType construtor - Prevent construction of types with null name - Add version to maven-enforcer-plugin plugin to prevent failure of integration test JXR-143_nofork
87995c6 is described below

commit 87995c6e2484f3a6476fc29c600c294ede849f22
Author: Markus Spann <sm...@outlook.de>
AuthorDate: Sun Jul 24 15:47:20 2022 +0200

    [JXR-170] NullPointerException while parsing Java 15 multi-line String source
    - Add support for parsing sources with Java 15 multi-line Strings
    - Add JUnit test case
    - Implement toString on class BaseType
    - Require non-null name on BaseType construtor
    - Prevent construction of types with null name
    - Add version to maven-enforcer-plugin plugin to prevent failure of integration test JXR-143_nofork
---
 maven-jxr-plugin/src/it/JXR-143_nofork/pom.xml     |  1 +
 .../java/org/apache/maven/jxr/pacman/BaseType.java | 29 ++++++++-------
 .../org/apache/maven/jxr/pacman/ClassType.java     |  5 +--
 .../org/apache/maven/jxr/pacman/ImportType.java    |  2 +-
 .../org/apache/maven/jxr/pacman/JavaFileImpl.java  | 42 +++++++++++++++++-----
 .../org/apache/maven/jxr/pacman/PackageType.java   |  4 +--
 .../apache/maven/jxr/pacman/JavaFileImplTest.java  | 12 ++++++-
 .../jxr/pacman/ClassWithMultiLineString.java}      | 39 ++++++--------------
 8 files changed, 78 insertions(+), 56 deletions(-)

diff --git a/maven-jxr-plugin/src/it/JXR-143_nofork/pom.xml b/maven-jxr-plugin/src/it/JXR-143_nofork/pom.xml
index c1cf179..d84d314 100644
--- a/maven-jxr-plugin/src/it/JXR-143_nofork/pom.xml
+++ b/maven-jxr-plugin/src/it/JXR-143_nofork/pom.xml
@@ -44,6 +44,7 @@ under the License.
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-enforcer-plugin</artifactId>
+        <version>3.1.0</version>
         <executions>
           <execution>
             <goals>
diff --git a/maven-jxr/src/main/java/org/apache/maven/jxr/pacman/BaseType.java b/maven-jxr/src/main/java/org/apache/maven/jxr/pacman/BaseType.java
index e0485c9..c309469 100644
--- a/maven-jxr/src/main/java/org/apache/maven/jxr/pacman/BaseType.java
+++ b/maven-jxr/src/main/java/org/apache/maven/jxr/pacman/BaseType.java
@@ -19,6 +19,8 @@ package org.apache.maven.jxr.pacman;
  * under the License.
  */
 
+import java.util.Objects;
+
 /**
  * put your documentation comment here
  *
@@ -26,8 +28,17 @@ package org.apache.maven.jxr.pacman;
  */
 public abstract class BaseType
 {
-    private String name = null;
+    private final String name;
 
+    /**
+     * Construct type and set its name.
+     *
+     * @param name type name
+     */
+    public BaseType( String name )
+    {
+        this.name = Objects.requireNonNull( name );
+    }
 
     /**
      * Get the name for this type
@@ -36,22 +47,14 @@ public abstract class BaseType
      */
     public String getName()
     {
-        if ( name == null )
-        {
-            return "";
-        }
         return this.name;
     }
 
-
-    /**
-     * Set the name for this type
-     *
-     * @param name The new name value
-     */
-    public void setName( String name )
+    @Override
+    public String toString()
     {
-        this.name = name;
+        return getClass().getSimpleName() + "[name=" + name + "]";
     }
+
 }
 
diff --git a/maven-jxr/src/main/java/org/apache/maven/jxr/pacman/ClassType.java b/maven-jxr/src/main/java/org/apache/maven/jxr/pacman/ClassType.java
index e5783fd..023332e 100644
--- a/maven-jxr/src/main/java/org/apache/maven/jxr/pacman/ClassType.java
+++ b/maven-jxr/src/main/java/org/apache/maven/jxr/pacman/ClassType.java
@@ -41,7 +41,7 @@ public class ClassType
     @Deprecated
     public ClassType( String name )
     {
-        this.setName( name );
+        this( name, null );
     }
 
     /**
@@ -52,7 +52,8 @@ public class ClassType
      */
     public ClassType( String name, String filename )
     {
-        this.setName( name );
+        super( name );
+
         this.setFilename( filename );
     }
 
diff --git a/maven-jxr/src/main/java/org/apache/maven/jxr/pacman/ImportType.java b/maven-jxr/src/main/java/org/apache/maven/jxr/pacman/ImportType.java
index a8abf53..c702e41 100644
--- a/maven-jxr/src/main/java/org/apache/maven/jxr/pacman/ImportType.java
+++ b/maven-jxr/src/main/java/org/apache/maven/jxr/pacman/ImportType.java
@@ -39,7 +39,7 @@ public class ImportType
      */
     public ImportType( String name )
     {
-        this.setName( name );
+        super( name );
 
         //compute member variables
 
diff --git a/maven-jxr/src/main/java/org/apache/maven/jxr/pacman/JavaFileImpl.java b/maven-jxr/src/main/java/org/apache/maven/jxr/pacman/JavaFileImpl.java
index 0b516b9..74f2470 100644
--- a/maven-jxr/src/main/java/org/apache/maven/jxr/pacman/JavaFileImpl.java
+++ b/maven-jxr/src/main/java/org/apache/maven/jxr/pacman/JavaFileImpl.java
@@ -84,6 +84,9 @@ public class JavaFileImpl
     {
         int openBracesCount = 0;
 
+        char prevttype = Character.MIN_VALUE; // previous token type
+        boolean inTripleQuote = false; // used to toggle between inside/outside triple-quoted multi-line strings
+
         while ( stok.nextToken() != StreamTokenizer.TT_EOF )
         {
 
@@ -103,12 +106,28 @@ public class JavaFileImpl
                 }
                 continue;
             }
+            else
+            {
+                if ( '"' == stok.ttype && '"' == prevttype )
+                {
+                    inTripleQuote = !inTripleQuote;
+                }
+                prevttype = (char) stok.ttype;
+                if ( inTripleQuote )
+                {
+                    // skip content found inside triple-quoted multi-line Java 15 String
+                    continue;
+                }
+            }
 
             //set the package
             if ( "package".equals( stok.sval ) && stok.ttype != '\"' )
             {
                 stok.nextToken();
-                this.setPackageType( new PackageType( stok.sval ) );
+                if ( stok.sval != null )
+                {
+                    this.setPackageType( new PackageType( stok.sval ) );
+                }
             }
 
             //set the imports
@@ -125,23 +144,28 @@ public class JavaFileImpl
                 stripped( and become "test." ).  Here we need to test for this
                 and if necessary re-add the char.
                 */
-                if ( name.charAt( name.length() - 1 ) == '.' )
+                if ( name != null )
                 {
-                    name = name + '*';
+                    if ( name.charAt( name.length() - 1 ) == '.' )
+                    {
+                        name = name + '*';
+                    }
+                    this.addImportType( new ImportType( name ) );
                 }
-
-                this.addImportType( new ImportType( name ) );
             }
 
             // Add the class or classes. There can be several classes in one file so
             // continue with the while loop to get them all.
             if ( ( "class".equals( stok.sval ) || "interface".equals( stok.sval ) || "enum".equals( stok.sval ) )
-                    &&  stok.ttype != '\"' )
+                    &&  stok.ttype != '"' )
             {
                 stok.nextToken();
-                this.addClassType( new ClassType( nestedPrefix + stok.sval,
-                        getFilenameWithoutPathOrExtension( this.getPath() ) ) );
-                parseRecursive( nestedPrefix + stok.sval + ".", stok );
+                if ( stok.sval != null )
+                {
+                    this.addClassType( new ClassType( nestedPrefix + stok.sval,
+                            getFilenameWithoutPathOrExtension( this.getPath() ) ) );
+                    parseRecursive( nestedPrefix + stok.sval + ".", stok );
+                }
             }
 
         }
diff --git a/maven-jxr/src/main/java/org/apache/maven/jxr/pacman/PackageType.java b/maven-jxr/src/main/java/org/apache/maven/jxr/pacman/PackageType.java
index 9817a45..b8a4300 100644
--- a/maven-jxr/src/main/java/org/apache/maven/jxr/pacman/PackageType.java
+++ b/maven-jxr/src/main/java/org/apache/maven/jxr/pacman/PackageType.java
@@ -39,7 +39,7 @@ public class PackageType
      */
     public PackageType( String name )
     {
-        this.setName( name );
+        super( name );
     }
 
     /**
@@ -47,9 +47,9 @@ public class PackageType
      */
     public PackageType()
     {
+        super( "" );
     }
 
-
     /**
      * Get all the known classes
      */
diff --git a/maven-jxr/src/test/java/org/apache/maven/jxr/pacman/JavaFileImplTest.java b/maven-jxr/src/test/java/org/apache/maven/jxr/pacman/JavaFileImplTest.java
index 5c3a854..ca3f1eb 100644
--- a/maven-jxr/src/test/java/org/apache/maven/jxr/pacman/JavaFileImplTest.java
+++ b/maven-jxr/src/test/java/org/apache/maven/jxr/pacman/JavaFileImplTest.java
@@ -46,4 +46,14 @@ public class JavaFileImplTest {
         assertEquals( "NotNested", classTypes.next().getName() );
     }
 
-}
\ No newline at end of file
+    @Test
+    public void testJXR_170_multiLineString() throws IOException
+    {
+        JavaFileImpl javaFile = new JavaFileImpl( Paths.get(
+                "src/test/resources/jxr170/org/apache/maven/jxr/pacman/ClassWithMultiLineString.java" ),
+                "UTF-8" );
+        assertEquals( 1, javaFile.getClassTypes().size() );
+        assertEquals( "ClassWithMultiLineString", javaFile.getClassTypes().get(0).getName() );
+        assertEquals( "[ImportType[name=java.lang.*]]", javaFile.getImportTypes().toString() );
+    }
+}
diff --git a/maven-jxr/src/main/java/org/apache/maven/jxr/pacman/BaseType.java b/maven-jxr/src/test/resources/jxr170/org/apache/maven/jxr/pacman/ClassWithMultiLineString.java
similarity index 60%
copy from maven-jxr/src/main/java/org/apache/maven/jxr/pacman/BaseType.java
copy to maven-jxr/src/test/resources/jxr170/org/apache/maven/jxr/pacman/ClassWithMultiLineString.java
index e0485c9..e1dc937 100644
--- a/maven-jxr/src/main/java/org/apache/maven/jxr/pacman/BaseType.java
+++ b/maven-jxr/src/test/resources/jxr170/org/apache/maven/jxr/pacman/ClassWithMultiLineString.java
@@ -1,4 +1,4 @@
-package org.apache.maven.jxr.pacman;
+package org.apache.maven.jxr;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -20,38 +20,21 @@ package org.apache.maven.jxr.pacman;
  */
 
 /**
- * put your documentation comment here
+ * Test Java source of the test for JXR-170.
  *
- * @author jvanzyl
+ * @author Markus Spann
  */
-public abstract class BaseType
-{
-    private String name = null;
+public class ClassWithMultiLineString {
 
+    private final String str;
 
-    /**
-     * Get the name for this type
-     *
-     * @return The name value
-     */
-    public String getName()
-    {
-        if ( name == null )
-        {
-            return "";
-        }
-        return this.name;
+    public ClassWithMultiLineString(String _str) {
+        str = _str;
     }
 
-
-    /**
-     * Set the name for this type
-     *
-     * @param name The new name value
-     */
-    public void setName( String name )
-    {
-        this.name = name;
+    public static void main(String[] args) {
+        new ClassWithMultiLineString("""
+                import java.util.List;
+                """);
     }
 }
-