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 c1cf1790..d84d3142 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. org.apache.maven.plugins maven-enforcer-plugin + 3.1.0 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 e0485c95..c3094696 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 @@ * under the License. */ +import java.util.Objects; + /** * put your documentation comment here * @@ -26,8 +28,17 @@ */ 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 e5783fd0..023332e9 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 ClassType( String name ) */ 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 a8abf535..c702e416 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 0b516b99..74f2470c 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 @@ private void parseRecursive( String nestedPrefix, StreamTokenizer stok ) { 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 @@ else if ( stok.ttype == '}' ) } 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 @@ and packages that are imported with this (ex "test.*") will be 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 9817a453..b8a4300d 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 PackageType( String name ) */ 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 5c3a854a..ca3f1eb4 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 void testJXR_135_lotsOfNested() throws IOException 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/test/resources/jxr170/org/apache/maven/jxr/pacman/ClassWithMultiLineString.java b/maven-jxr/src/test/resources/jxr170/org/apache/maven/jxr/pacman/ClassWithMultiLineString.java new file mode 100644 index 00000000..e1dc937a --- /dev/null +++ b/maven-jxr/src/test/resources/jxr170/org/apache/maven/jxr/pacman/ClassWithMultiLineString.java @@ -0,0 +1,40 @@ +package org.apache.maven.jxr; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Test Java source of the test for JXR-170. + * + * @author Markus Spann + */ +public class ClassWithMultiLineString { + + private final String str; + + public ClassWithMultiLineString(String _str) { + str = _str; + } + + public static void main(String[] args) { + new ClassWithMultiLineString(""" + import java.util.List; + """); + } +}