This is an automated email from the ASF dual-hosted git repository. rfscholte pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/maven-javadoc-plugin.git
The following commit(s) were added to refs/heads/master by this push: new b78042e [MJAVADOC-542] Unsupported class file major version 55 [MJAVADOC-534] Support element-list links from java10 dependencies b78042e is described below commit b78042eca643deb9dddb1b0a472345fce28ccb5d Author: rfscholte <rfscho...@apache.org> AuthorDate: Sat Nov 24 12:03:34 2018 +0100 [MJAVADOC-542] Unsupported class file major version 55 [MJAVADOC-534] Support element-list links from java10 dependencies --- Jenkinsfile | 2 +- pom.xml | 28 +- src/it/projects/MJAVADOC-257/invoker.properties | 2 + src/it/projects/MJAVADOC-427/verify.groovy | 2 +- src/it/projects/MJAVADOC-497/verify.bsh | 17 +- src/it/projects/MJAVADOC-538/pom.xml | 23 ++ .../plugins/javadoc/AbstractFixJavadocMojo.java | 4 +- .../maven/plugins/javadoc/AbstractJavadocMojo.java | 98 ++++-- .../apache/maven/plugins/javadoc/JavadocUtil.java | 119 ++++--- .../maven/plugins/javadoc/java-api-element-list-10 | 391 +++++++++++++++++++++ .../maven/plugins/javadoc/java-api-element-list-11 | 282 +++++++++++++++ .../javadoc/AggregatorJavadocReportTest.java | 12 +- .../maven/plugins/javadoc/JavadocJarTest.java | 6 +- .../maven/plugins/javadoc/JavadocReportTest.java | 112 ++++-- 14 files changed, 951 insertions(+), 147 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 8a16e4c..e9f05f7 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -17,4 +17,4 @@ * under the License. */ -asfMavenTlpPlgnBuild(jdk:['7','8','9']) +asfMavenTlpPlgnBuild() diff --git a/pom.xml b/pom.xml index cd6cc3b..cccd3f0 100644 --- a/pom.xml +++ b/pom.xml @@ -299,7 +299,7 @@ under the License. <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> - <version>2.12.0</version> + <version>2.23.4</version> <scope>test</scope> </dependency> <dependency> @@ -329,6 +329,7 @@ under the License. <!-- Checksum files cannot contain a license header --> <exclude>**/*.sha1</exclude> <!-- Javadoc package list files cannot contain a license header --> + <exclude>**/*element-list*</exclude> <exclude>**/*package-list*</exclude> <!-- This file is used to patch the generated Javadoc html files --> <exclude>src/main/resources/org/apache/maven/plugins/javadoc/frame-injection-fix.txt</exclude> @@ -343,31 +344,6 @@ under the License. </pluginManagement> <plugins> <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-enforcer-plugin</artifactId> - <executions> - <execution> - <id>enforce-bytecode-version</id> - <configuration> - <rules> - <enforceBytecodeVersion> - <ignoreClasses> - <ignoreClass>module-info</ignoreClass> - </ignoreClasses> - </enforceBytecodeVersion> - </rules> - </configuration> - </execution> - </executions> - <dependencies> - <dependency> - <groupId>org.codehaus.mojo</groupId> - <artifactId>extra-enforcer-rules</artifactId> - <version>1.0-beta-6</version> - </dependency> - </dependencies> - </plugin> - <plugin> <groupId>org.codehaus.modello</groupId> <artifactId>modello-maven-plugin</artifactId> <executions> diff --git a/src/it/projects/MJAVADOC-257/invoker.properties b/src/it/projects/MJAVADOC-257/invoker.properties index 08d1d7b..12cb573 100644 --- a/src/it/projects/MJAVADOC-257/invoker.properties +++ b/src/it/projects/MJAVADOC-257/invoker.properties @@ -16,3 +16,5 @@ # under the License. invoker.goals=clean site +# there are no new doclettags for plugin-tools +invoker.java.version=10- diff --git a/src/it/projects/MJAVADOC-427/verify.groovy b/src/it/projects/MJAVADOC-427/verify.groovy index 8e3c9ab..035c4d6 100644 --- a/src/it/projects/MJAVADOC-427/verify.groovy +++ b/src/it/projects/MJAVADOC-427/verify.groovy @@ -23,4 +23,4 @@ assert file.exists() // assert that javadoc of class correctly contains link, just like method details assert file.text =~ /Link to slf4j <a href=".*?".*?><code>LoggerFactory<\/code><\/a>/ -assert file.text =~ /<pre>public.*?<a href=".*?".*?>LoggerFactory<\/a>.*?getLoggerFactory.*?\(\)<\/pre>/ +assert file.text =~ /<pre[^<]*>public.*?<a href=".*?".*?>LoggerFactory<\/a>.*?getLoggerFactory.*?\(\)<\/pre>/ diff --git a/src/it/projects/MJAVADOC-497/verify.bsh b/src/it/projects/MJAVADOC-497/verify.bsh index 8f23e77..d90f357 100644 --- a/src/it/projects/MJAVADOC-497/verify.bsh +++ b/src/it/projects/MJAVADOC-497/verify.bsh @@ -21,14 +21,25 @@ import java.io.*; try { - File packageList = new File( basedir, "target/site/apidocs/package-list" ); - if ( !packageList.exists() ) + File list; + + String javaVersion = System.getProperty( "java.specification.version" ); + if ( javaVersion.startsWith( "1." ) || javaVersion.equals( "9" ) ) + { + list = new File( basedir, "target/site/apidocs/package-list" ); + } + else + { + list = new File( basedir, "target/site/apidocs/element-list" ); + } + + if ( !list.exists() ) { System.err.println( packageList + " is missing" ); return false; } - FileReader fr = new FileReader( packageList ); + FileReader fr = new FileReader( list ); BufferedReader br = new BufferedReader( fr ); String line = br.readLine(); if ( !"com.example.foo".equals( line ) || br.readLine() != null ) diff --git a/src/it/projects/MJAVADOC-538/pom.xml b/src/it/projects/MJAVADOC-538/pom.xml index e7d3ae1..ecac918 100644 --- a/src/it/projects/MJAVADOC-538/pom.xml +++ b/src/it/projects/MJAVADOC-538/pom.xml @@ -45,4 +45,27 @@ </plugins> </pluginManagement> </build> + + <profiles> + <profile> + <activation> + <jdk>10</jdk> + </activation> + <build> + <pluginManagement> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-javadoc-plugin</artifactId> + <configuration> + <additionalOptions> + <option>-html4</option> + </additionalOptions> + </configuration> + </plugin> + </plugins> + </pluginManagement> + </build> + </profile> + </profiles> </project> diff --git a/src/main/java/org/apache/maven/plugins/javadoc/AbstractFixJavadocMojo.java b/src/main/java/org/apache/maven/plugins/javadoc/AbstractFixJavadocMojo.java index 1036095..42bef47 100644 --- a/src/main/java/org/apache/maven/plugins/javadoc/AbstractFixJavadocMojo.java +++ b/src/main/java/org/apache/maven/plugins/javadoc/AbstractFixJavadocMojo.java @@ -2190,14 +2190,14 @@ public abstract class AbstractFixJavadocMojo if ( clazz != null ) { - if ( ClassUtils.isAssignable( clazz, RuntimeException.class ) ) + if ( RuntimeException.class.isAssignableFrom( clazz ) ) { sb.append( StringUtils.replace( originalJavadocTag, exceptionClassName, clazz.getName() ) ); // added qualified name javaEntityTags.putJavadocThrowsTag( clazz.getName(), originalJavadocTag ); } - else if ( ClassUtils.isAssignable( clazz, Throwable.class ) ) + else if ( Throwable.class.isAssignableFrom( clazz ) ) { getLog().debug( "Removing '" + originalJavadocTag + "'; Throwable not specified by " + getJavaMethodAsString( javaExecutable ) + " and it is not a RuntimeException." ); diff --git a/src/main/java/org/apache/maven/plugins/javadoc/AbstractJavadocMojo.java b/src/main/java/org/apache/maven/plugins/javadoc/AbstractJavadocMojo.java index 5dc3fd6..2f571d6 100644 --- a/src/main/java/org/apache/maven/plugins/javadoc/AbstractJavadocMojo.java +++ b/src/main/java/org/apache/maven/plugins/javadoc/AbstractJavadocMojo.java @@ -98,10 +98,8 @@ import org.codehaus.plexus.util.xml.Xpp3Dom; import java.io.File; import java.io.FileNotFoundException; -import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.OutputStream; import java.io.Writer; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -247,6 +245,10 @@ public abstract class AbstractJavadocMojo * Default location for css */ private static final String RESOURCE_CSS_DIR = RESOURCE_DIR + "/css"; + + private static final String PACKAGE_LIST = "package-list"; + private static final String ELEMENT_LIST = "element-list"; + /** * For Javadoc options appears since Java 1.4. @@ -1748,6 +1750,8 @@ public abstract class AbstractJavadocMojo DEFAULT_JAVA_API_LINKS.put( "api_1.7", "https://docs.oracle.com/javase/7/docs/api/" ); DEFAULT_JAVA_API_LINKS.put( "api_1.8", "https://docs.oracle.com/javase/8/docs/api/" ); DEFAULT_JAVA_API_LINKS.put( "api_9", "https://docs.oracle.com/javase/9/docs/api/" ); + DEFAULT_JAVA_API_LINKS.put( "api_10", "https://docs.oracle.com/javase/10/docs/api/" ); + DEFAULT_JAVA_API_LINKS.put( "api_11", "https://docs.oracle.com/en/java/javase/11/docs/api" ); } // ---------------------------------------------------------------------- @@ -5800,34 +5804,32 @@ public abstract class AbstractJavadocMojo return null; } - File javaApiPackageListFile = new File( getJavadocOptionsFile().getParentFile(), "package-list" ); + final Path javaApiListFile; + final String resourceName; + if ( JavaVersion.parse( apiVersion ).isAtLeast( "10" ) ) + { + javaApiListFile = getJavadocOptionsFile().getParentFile().toPath().resolve( "element-list" ); + resourceName = "java-api-element-list-" + apiVersion; + } + else + { + javaApiListFile = getJavadocOptionsFile().getParentFile().toPath().resolve( "package-list" ); + resourceName = "java-api-package-list-" + apiVersion; + } OfflineLink link = new OfflineLink(); - link.setLocation( javaApiPackageListFile.getParentFile().getAbsolutePath() ); + link.setLocation( javaApiListFile.getParent().toAbsolutePath().toString() ); link.setUrl( javaApiLink ); - InputStream in = null; - OutputStream out = null; - try + try ( InputStream in = this.getClass().getResourceAsStream( resourceName ) ) { - in = this.getClass().getResourceAsStream( "java-api-package-list-" + apiVersion ); - out = new FileOutputStream( javaApiPackageListFile ); - IOUtil.copy( in, out ); - out.close(); - out = null; - in.close(); - in = null; + Files.copy( in, javaApiListFile ); } catch ( IOException ioe ) { logError( "Can't get java-api-package-list-" + apiVersion + ": " + ioe.getMessage(), ioe ); return null; } - finally - { - IOUtil.close( in ); - IOUtil.close( out ); - } return link; } @@ -5870,12 +5872,15 @@ public abstract class AbstractJavadocMojo { try { - URI linkUri; + final URI packageListUri; + final URI elementListUri; + if ( link.trim().toLowerCase( Locale.ENGLISH ).startsWith( "http:" ) || link.trim().toLowerCase( Locale.ENGLISH ).startsWith( "https:" ) || link.trim().toLowerCase( Locale.ENGLISH ).startsWith( "ftp:" ) || link.trim().toLowerCase( Locale.ENGLISH ).startsWith( "file:" ) ) { - linkUri = new URI( link + "/package-list" ); + packageListUri = new URI( link + '/' + PACKAGE_LIST ); + elementListUri = new URI( link + '/' + ELEMENT_LIST ); } else { @@ -5896,27 +5901,44 @@ public abstract class AbstractJavadocMojo getLog().error( "The given File link: " + dir + " is not a dir." ); } } - linkUri = new File( dir, "package-list" ).toURI(); + packageListUri = new File( dir, PACKAGE_LIST ).toURI(); + elementListUri = new File( dir, ELEMENT_LIST ).toURI(); } - if ( !JavadocUtil.isValidPackageList( linkUri.toURL(), settings, validateLinks ) ) + + IOException elementListIOException = null; + try { - if ( getLog().isErrorEnabled() ) + if ( JavadocUtil.isValidElementList( elementListUri.toURL(), settings, validateLinks ) ) { - if ( detecting ) - { - getLog().warn( "Invalid link: " + link + "/package-list. Ignored it." ); - } - else - { - getLog().error( "Invalid link: " + link + "/package-list. Ignored it." ); - } + return true; } + } + catch ( IOException e ) + { + elementListIOException = e; + } + + if ( JavadocUtil.isValidPackageList( packageListUri.toURL(), settings, validateLinks ) ) + { + return true; + } - return false; + if ( getLog().isErrorEnabled() ) + { + if ( detecting ) + { + getLog().warn( "Invalid links: " + + link + " with /" + PACKAGE_LIST + " or / " + ELEMENT_LIST + ". Ignored it." ); + } + else + { + getLog().error( "Invalid links: " + + link + " with /" + PACKAGE_LIST + " or / " + ELEMENT_LIST + ". Ignored it." ); + } } - return true; + return false; } catch ( URISyntaxException e ) { @@ -5924,11 +5946,11 @@ public abstract class AbstractJavadocMojo { if ( detecting ) { - getLog().warn( "Malformed link: " + link + "/package-list. Ignored it." ); + getLog().warn( "Malformed link: " + e.getInput() + ". Ignored it." ); } else { - getLog().error( "Malformed link: " + link + "/package-list. Ignored it." ); + getLog().error( "Malformed link: " + e.getInput() + ". Ignored it." ); } } return false; @@ -5939,11 +5961,11 @@ public abstract class AbstractJavadocMojo { if ( detecting ) { - getLog().warn( "Error fetching link: " + link + "/package-list. Ignored it." ); + getLog().warn( "Error fetching link: " + link + ". Ignored it." ); } else { - getLog().error( "Error fetching link: " + link + "/package-list. Ignored it." ); + getLog().error( "Error fetching link: " + link + ". Ignored it." ); } } return false; diff --git a/src/main/java/org/apache/maven/plugins/javadoc/JavadocUtil.java b/src/main/java/org/apache/maven/plugins/javadoc/JavadocUtil.java index 380524e..42ee8cf 100644 --- a/src/main/java/org/apache/maven/plugins/javadoc/JavadocUtil.java +++ b/src/main/java/org/apache/maven/plugins/javadoc/JavadocUtil.java @@ -1689,74 +1689,107 @@ public class JavadocUtil throw new IllegalArgumentException( "The url is null" ); } - BufferedReader reader = null; - HttpGet httpMethod = null; - HttpClient httpClient = null; - - try + try ( BufferedReader reader = getReader( url, settings ) ) { - if ( "file".equals( url.getProtocol() ) ) - { - // Intentionally using the platform default encoding here since this is what Javadoc uses internally. - reader = new BufferedReader( new InputStreamReader( url.openStream() ) ); - } - else + if ( validateContent ) { - // http, https... - httpClient = createHttpClient( settings, url ); - - httpMethod = new HttpGet( url.toString() ); - HttpResponse response; - try - { - response = httpClient.execute( httpMethod ); - } - catch ( SocketTimeoutException e ) - { - // could be a sporadic failure, one more retry before we give up - response = httpClient.execute( httpMethod ); - } - - int status = response.getStatusLine().getStatusCode(); - if ( status != HttpStatus.SC_OK ) + for ( String line = reader.readLine(); line != null; line = reader.readLine() ) { - throw new FileNotFoundException( "Unexpected HTTP status code " + status + " getting resource " - + url.toExternalForm() + "." ); + if ( !isValidPackageName( line ) ) + { + return false; + } } - - // Intentionally using the platform default encoding here since this is what Javadoc uses internally. - reader = new BufferedReader( new InputStreamReader( response.getEntity().getContent() ) ); } + return true; + } + } + + protected static boolean isValidElementList( URL url, Settings settings, boolean validateContent ) + throws IOException + { + if ( url == null ) + { + throw new IllegalArgumentException( "The url is null" ); + } + try ( BufferedReader reader = getReader( url, settings ) ) + { if ( validateContent ) { for ( String line = reader.readLine(); line != null; line = reader.readLine() ) { + if ( line.startsWith( "module:" ) ) + { + continue; + } + if ( !isValidPackageName( line ) ) { return false; } } } - - reader.close(); - reader = null; - return true; } - finally + } + + private static BufferedReader getReader( URL url, Settings settings ) throws IOException + { + BufferedReader reader = null; + + if ( "file".equals( url.getProtocol() ) ) { - IOUtil.close( reader ); + // Intentionally using the platform default encoding here since this is what Javadoc uses internally. + reader = new BufferedReader( new InputStreamReader( url.openStream() ) ); + } + else + { + // http, https... + final HttpClient httpClient = createHttpClient( settings, url ); - if ( httpMethod != null ) + final HttpGet httpMethod = new HttpGet( url.toString() ); + + HttpResponse response; + try { - httpMethod.releaseConnection(); + response = httpClient.execute( httpMethod ); } - if ( httpClient != null ) + catch ( SocketTimeoutException e ) { - httpClient.getConnectionManager().shutdown(); + // could be a sporadic failure, one more retry before we give up + response = httpClient.execute( httpMethod ); } + + int status = response.getStatusLine().getStatusCode(); + if ( status != HttpStatus.SC_OK ) + { + throw new FileNotFoundException( "Unexpected HTTP status code " + status + " getting resource " + + url.toExternalForm() + "." ); + } + + // Intentionally using the platform default encoding here since this is what Javadoc uses internally. + reader = new BufferedReader( new InputStreamReader( response.getEntity().getContent() ) ) + { + @Override + public void close() + throws IOException + { + super.close(); + + if ( httpMethod != null ) + { + httpMethod.releaseConnection(); + } + if ( httpClient != null ) + { + httpClient.getConnectionManager().shutdown(); + } + } + }; } + + return reader; } private static boolean isValidPackageName( String str ) diff --git a/src/main/resources/org/apache/maven/plugins/javadoc/java-api-element-list-10 b/src/main/resources/org/apache/maven/plugins/javadoc/java-api-element-list-10 new file mode 100644 index 0000000..8c46f3d --- /dev/null +++ b/src/main/resources/org/apache/maven/plugins/javadoc/java-api-element-list-10 @@ -0,0 +1,391 @@ +module:java.activation +javax.activation +module:java.base +java.io +java.lang +java.lang.annotation +java.lang.invoke +java.lang.module +java.lang.ref +java.lang.reflect +java.math +java.net +java.net.spi +java.nio +java.nio.channels +java.nio.channels.spi +java.nio.charset +java.nio.charset.spi +java.nio.file +java.nio.file.attribute +java.nio.file.spi +java.security +java.security.acl +java.security.cert +java.security.interfaces +java.security.spec +java.text +java.text.spi +java.time +java.time.chrono +java.time.format +java.time.temporal +java.time.zone +java.util +java.util.concurrent +java.util.concurrent.atomic +java.util.concurrent.locks +java.util.function +java.util.jar +java.util.regex +java.util.spi +java.util.stream +java.util.zip +javax.crypto +javax.crypto.interfaces +javax.crypto.spec +javax.net +javax.net.ssl +javax.security.auth +javax.security.auth.callback +javax.security.auth.login +javax.security.auth.spi +javax.security.auth.x500 +javax.security.cert +module:java.compiler +javax.annotation.processing +javax.lang.model +javax.lang.model.element +javax.lang.model.type +javax.lang.model.util +javax.tools +module:java.corba +javax.activity +javax.rmi +javax.rmi.CORBA +org.omg.CORBA +org.omg.CORBA_2_3 +org.omg.CORBA_2_3.portable +org.omg.CORBA.DynAnyPackage +org.omg.CORBA.ORBPackage +org.omg.CORBA.portable +org.omg.CORBA.TypeCodePackage +org.omg.CosNaming +org.omg.CosNaming.NamingContextExtPackage +org.omg.CosNaming.NamingContextPackage +org.omg.Dynamic +org.omg.DynamicAny +org.omg.DynamicAny.DynAnyFactoryPackage +org.omg.DynamicAny.DynAnyPackage +org.omg.IOP +org.omg.IOP.CodecFactoryPackage +org.omg.IOP.CodecPackage +org.omg.Messaging +org.omg.PortableInterceptor +org.omg.PortableInterceptor.ORBInitInfoPackage +org.omg.PortableServer +org.omg.PortableServer.CurrentPackage +org.omg.PortableServer.POAManagerPackage +org.omg.PortableServer.POAPackage +org.omg.PortableServer.portable +org.omg.PortableServer.ServantLocatorPackage +org.omg.SendingContext +org.omg.stub.java.rmi +module:java.datatransfer +java.awt.datatransfer +module:java.desktop +java.applet +java.awt +java.awt.color +java.awt.desktop +java.awt.dnd +java.awt.event +java.awt.font +java.awt.geom +java.awt.im +java.awt.im.spi +java.awt.image +java.awt.image.renderable +java.awt.print +java.beans +java.beans.beancontext +javax.accessibility +javax.imageio +javax.imageio.event +javax.imageio.metadata +javax.imageio.plugins.bmp +javax.imageio.plugins.jpeg +javax.imageio.plugins.tiff +javax.imageio.spi +javax.imageio.stream +javax.print +javax.print.attribute +javax.print.attribute.standard +javax.print.event +javax.sound.midi +javax.sound.midi.spi +javax.sound.sampled +javax.sound.sampled.spi +javax.swing +javax.swing.border +javax.swing.colorchooser +javax.swing.event +javax.swing.filechooser +javax.swing.plaf +javax.swing.plaf.basic +javax.swing.plaf.metal +javax.swing.plaf.multi +javax.swing.plaf.nimbus +javax.swing.plaf.synth +javax.swing.table +javax.swing.text +javax.swing.text.html +javax.swing.text.html.parser +javax.swing.text.rtf +javax.swing.tree +javax.swing.undo +module:java.instrument +java.lang.instrument +module:java.jnlp +javax.jnlp +module:java.logging +java.util.logging +module:java.management +java.lang.management +javax.management +javax.management.loading +javax.management.modelmbean +javax.management.monitor +javax.management.openmbean +javax.management.relation +javax.management.remote +javax.management.timer +module:java.management.rmi +javax.management.remote.rmi +module:java.naming +javax.naming +javax.naming.directory +javax.naming.event +javax.naming.ldap +javax.naming.spi +module:java.prefs +java.util.prefs +module:java.rmi +java.rmi +java.rmi.activation +java.rmi.dgc +java.rmi.registry +java.rmi.server +javax.rmi.ssl +module:java.scripting +javax.script +module:java.se +module:java.se.ee +module:java.security.jgss +javax.security.auth.kerberos +org.ietf.jgss +module:java.security.sasl +javax.security.sasl +module:java.smartcardio +javax.smartcardio +module:java.sql +java.sql +javax.sql +javax.transaction.xa +module:java.sql.rowset +javax.sql.rowset +javax.sql.rowset.serial +javax.sql.rowset.spi +module:java.transaction +javax.transaction +module:java.xml +javax.xml +javax.xml.catalog +javax.xml.datatype +javax.xml.namespace +javax.xml.parsers +javax.xml.stream +javax.xml.stream.events +javax.xml.stream.util +javax.xml.transform +javax.xml.transform.dom +javax.xml.transform.sax +javax.xml.transform.stax +javax.xml.transform.stream +javax.xml.validation +javax.xml.xpath +org.w3c.dom +org.w3c.dom.bootstrap +org.w3c.dom.events +org.w3c.dom.ls +org.w3c.dom.ranges +org.w3c.dom.traversal +org.w3c.dom.views +org.xml.sax +org.xml.sax.ext +org.xml.sax.helpers +module:java.xml.bind +javax.xml.bind +javax.xml.bind.annotation +javax.xml.bind.annotation.adapters +javax.xml.bind.attachment +javax.xml.bind.helpers +javax.xml.bind.util +module:java.xml.crypto +javax.xml.crypto +javax.xml.crypto.dom +javax.xml.crypto.dsig +javax.xml.crypto.dsig.dom +javax.xml.crypto.dsig.keyinfo +javax.xml.crypto.dsig.spec +module:java.xml.ws +javax.jws +javax.jws.soap +javax.xml.soap +javax.xml.ws +javax.xml.ws.handler +javax.xml.ws.handler.soap +javax.xml.ws.http +javax.xml.ws.soap +javax.xml.ws.spi +javax.xml.ws.spi.http +javax.xml.ws.wsaddressing +module:java.xml.ws.annotation +javax.annotation +module:javafx.base +javafx.beans +javafx.beans.binding +javafx.beans.property +javafx.beans.property.adapter +javafx.beans.value +javafx.collections +javafx.collections.transformation +javafx.event +javafx.util +javafx.util.converter +module:javafx.controls +javafx.scene.chart +javafx.scene.control +javafx.scene.control.cell +javafx.scene.control.skin +module:javafx.fxml +javafx.fxml +module:javafx.graphics +javafx.animation +javafx.application +javafx.concurrent +javafx.css +javafx.css.converter +javafx.geometry +javafx.print +javafx.scene +javafx.scene.canvas +javafx.scene.effect +javafx.scene.image +javafx.scene.input +javafx.scene.layout +javafx.scene.paint +javafx.scene.shape +javafx.scene.text +javafx.scene.transform +javafx.stage +module:javafx.media +javafx.scene.media +module:javafx.swing +javafx.embed.swing +module:javafx.web +javafx.scene.web +module:jdk.accessibility +com.sun.java.accessibility.util +module:jdk.attach +com.sun.tools.attach +com.sun.tools.attach.spi +module:jdk.charsets +module:jdk.compiler +com.sun.source.doctree +com.sun.source.tree +com.sun.source.util +com.sun.tools.javac +module:jdk.crypto.cryptoki +module:jdk.crypto.ec +module:jdk.dynalink +jdk.dynalink +jdk.dynalink.beans +jdk.dynalink.linker +jdk.dynalink.linker.support +jdk.dynalink.support +module:jdk.editpad +module:jdk.hotspot.agent +module:jdk.httpserver +com.sun.net.httpserver +com.sun.net.httpserver.spi +module:jdk.incubator.httpclient +jdk.incubator.http +module:jdk.jartool +com.sun.jarsigner +jdk.security.jarsigner +module:jdk.javadoc +com.sun.javadoc +com.sun.tools.javadoc +jdk.javadoc.doclet +module:jdk.jcmd +module:jdk.jconsole +com.sun.tools.jconsole +module:jdk.jdeps +module:jdk.jdi +com.sun.jdi +com.sun.jdi.connect +com.sun.jdi.connect.spi +com.sun.jdi.event +com.sun.jdi.request +module:jdk.jdwp.agent +module:jdk.jfr +jdk.jfr +jdk.jfr.consumer +module:jdk.jlink +module:jdk.jshell +jdk.jshell +jdk.jshell.execution +jdk.jshell.spi +jdk.jshell.tool +module:jdk.jsobject +netscape.javascript +module:jdk.jstatd +module:jdk.localedata +module:jdk.management +com.sun.management +module:jdk.management.agent +module:jdk.management.cmm +jdk.management.cmm +module:jdk.management.jfr +jdk.management.jfr +module:jdk.management.resource +jdk.management.resource +module:jdk.naming.dns +module:jdk.naming.rmi +module:jdk.net +jdk.net +module:jdk.pack +module:jdk.packager.services +jdk.packager.services +jdk.packager.services.singleton +module:jdk.rmic +module:jdk.scripting.nashorn +jdk.nashorn.api.scripting +jdk.nashorn.api.tree +module:jdk.sctp +com.sun.nio.sctp +module:jdk.security.auth +com.sun.security.auth +com.sun.security.auth.callback +com.sun.security.auth.login +com.sun.security.auth.module +module:jdk.security.jgss +com.sun.security.jgss +module:jdk.snmp +module:jdk.xml.dom +org.w3c.dom.css +org.w3c.dom.html +org.w3c.dom.stylesheets +org.w3c.dom.xpath +module:jdk.zipfs \ No newline at end of file diff --git a/src/main/resources/org/apache/maven/plugins/javadoc/java-api-element-list-11 b/src/main/resources/org/apache/maven/plugins/javadoc/java-api-element-list-11 new file mode 100644 index 0000000..bfb4f01 --- /dev/null +++ b/src/main/resources/org/apache/maven/plugins/javadoc/java-api-element-list-11 @@ -0,0 +1,282 @@ +module:java.base +java.io +java.lang +java.lang.annotation +java.lang.invoke +java.lang.module +java.lang.ref +java.lang.reflect +java.math +java.net +java.net.spi +java.nio +java.nio.channels +java.nio.channels.spi +java.nio.charset +java.nio.charset.spi +java.nio.file +java.nio.file.attribute +java.nio.file.spi +java.security +java.security.acl +java.security.cert +java.security.interfaces +java.security.spec +java.text +java.text.spi +java.time +java.time.chrono +java.time.format +java.time.temporal +java.time.zone +java.util +java.util.concurrent +java.util.concurrent.atomic +java.util.concurrent.locks +java.util.function +java.util.jar +java.util.regex +java.util.spi +java.util.stream +java.util.zip +javax.crypto +javax.crypto.interfaces +javax.crypto.spec +javax.net +javax.net.ssl +javax.security.auth +javax.security.auth.callback +javax.security.auth.login +javax.security.auth.spi +javax.security.auth.x500 +javax.security.cert +module:java.compiler +javax.annotation.processing +javax.lang.model +javax.lang.model.element +javax.lang.model.type +javax.lang.model.util +javax.tools +module:java.datatransfer +java.awt.datatransfer +module:java.desktop +java.applet +java.awt +java.awt.color +java.awt.desktop +java.awt.dnd +java.awt.event +java.awt.font +java.awt.geom +java.awt.im +java.awt.im.spi +java.awt.image +java.awt.image.renderable +java.awt.print +java.beans +java.beans.beancontext +javax.accessibility +javax.imageio +javax.imageio.event +javax.imageio.metadata +javax.imageio.plugins.bmp +javax.imageio.plugins.jpeg +javax.imageio.plugins.tiff +javax.imageio.spi +javax.imageio.stream +javax.print +javax.print.attribute +javax.print.attribute.standard +javax.print.event +javax.sound.midi +javax.sound.midi.spi +javax.sound.sampled +javax.sound.sampled.spi +javax.swing +javax.swing.border +javax.swing.colorchooser +javax.swing.event +javax.swing.filechooser +javax.swing.plaf +javax.swing.plaf.basic +javax.swing.plaf.metal +javax.swing.plaf.multi +javax.swing.plaf.nimbus +javax.swing.plaf.synth +javax.swing.table +javax.swing.text +javax.swing.text.html +javax.swing.text.html.parser +javax.swing.text.rtf +javax.swing.tree +javax.swing.undo +module:java.instrument +java.lang.instrument +module:java.logging +java.util.logging +module:java.management +java.lang.management +javax.management +javax.management.loading +javax.management.modelmbean +javax.management.monitor +javax.management.openmbean +javax.management.relation +javax.management.remote +javax.management.timer +module:java.management.rmi +javax.management.remote.rmi +module:java.naming +javax.naming +javax.naming.directory +javax.naming.event +javax.naming.ldap +javax.naming.spi +module:java.net.http +java.net.http +module:java.prefs +java.util.prefs +module:java.rmi +java.rmi +java.rmi.activation +java.rmi.dgc +java.rmi.registry +java.rmi.server +javax.rmi.ssl +module:java.scripting +javax.script +module:java.se +module:java.security.jgss +javax.security.auth.kerberos +org.ietf.jgss +module:java.security.sasl +javax.security.sasl +module:java.smartcardio +javax.smartcardio +module:java.sql +java.sql +javax.sql +module:java.sql.rowset +javax.sql.rowset +javax.sql.rowset.serial +javax.sql.rowset.spi +module:java.transaction.xa +javax.transaction.xa +module:java.xml +javax.xml +javax.xml.catalog +javax.xml.datatype +javax.xml.namespace +javax.xml.parsers +javax.xml.stream +javax.xml.stream.events +javax.xml.stream.util +javax.xml.transform +javax.xml.transform.dom +javax.xml.transform.sax +javax.xml.transform.stax +javax.xml.transform.stream +javax.xml.validation +javax.xml.xpath +org.w3c.dom +org.w3c.dom.bootstrap +org.w3c.dom.events +org.w3c.dom.ls +org.w3c.dom.ranges +org.w3c.dom.traversal +org.w3c.dom.views +org.xml.sax +org.xml.sax.ext +org.xml.sax.helpers +module:java.xml.crypto +javax.xml.crypto +javax.xml.crypto.dom +javax.xml.crypto.dsig +javax.xml.crypto.dsig.dom +javax.xml.crypto.dsig.keyinfo +javax.xml.crypto.dsig.spec +module:jdk.accessibility +com.sun.java.accessibility.util +module:jdk.attach +com.sun.tools.attach +com.sun.tools.attach.spi +module:jdk.charsets +module:jdk.compiler +com.sun.source.doctree +com.sun.source.tree +com.sun.source.util +com.sun.tools.javac +module:jdk.crypto.cryptoki +module:jdk.crypto.ec +module:jdk.dynalink +jdk.dynalink +jdk.dynalink.beans +jdk.dynalink.linker +jdk.dynalink.linker.support +jdk.dynalink.support +module:jdk.editpad +module:jdk.hotspot.agent +module:jdk.httpserver +com.sun.net.httpserver +com.sun.net.httpserver.spi +module:jdk.jartool +com.sun.jarsigner +jdk.security.jarsigner +module:jdk.javadoc +com.sun.javadoc +com.sun.tools.javadoc +jdk.javadoc.doclet +module:jdk.jcmd +module:jdk.jconsole +com.sun.tools.jconsole +module:jdk.jdeps +module:jdk.jdi +com.sun.jdi +com.sun.jdi.connect +com.sun.jdi.connect.spi +com.sun.jdi.event +com.sun.jdi.request +module:jdk.jdwp.agent +module:jdk.jfr +jdk.jfr +jdk.jfr.consumer +module:jdk.jlink +module:jdk.jshell +jdk.jshell +jdk.jshell.execution +jdk.jshell.spi +jdk.jshell.tool +module:jdk.jsobject +netscape.javascript +module:jdk.jstatd +module:jdk.localedata +module:jdk.management +com.sun.management +module:jdk.management.agent +module:jdk.management.jfr +jdk.management.jfr +module:jdk.naming.dns +module:jdk.naming.rmi +module:jdk.net +jdk.net +jdk.nio +module:jdk.pack +module:jdk.rmic +module:jdk.scripting.nashorn +jdk.nashorn.api.scripting +jdk.nashorn.api.tree +module:jdk.sctp +com.sun.nio.sctp +module:jdk.security.auth +com.sun.security.auth +com.sun.security.auth.callback +com.sun.security.auth.login +com.sun.security.auth.module +module:jdk.security.jgss +com.sun.security.jgss +module:jdk.xml.dom +org.w3c.dom.css +org.w3c.dom.html +org.w3c.dom.stylesheets +org.w3c.dom.xpath +module:jdk.zipfs \ No newline at end of file diff --git a/src/test/java/org/apache/maven/plugins/javadoc/AggregatorJavadocReportTest.java b/src/test/java/org/apache/maven/plugins/javadoc/AggregatorJavadocReportTest.java index 706b26e..1bfad67 100644 --- a/src/test/java/org/apache/maven/plugins/javadoc/AggregatorJavadocReportTest.java +++ b/src/test/java/org/apache/maven/plugins/javadoc/AggregatorJavadocReportTest.java @@ -31,6 +31,7 @@ import org.apache.maven.plugin.MojoExecution; import org.apache.maven.plugin.testing.AbstractMojoTestCase; import org.apache.maven.plugin.testing.stubs.MavenProjectStub; import org.apache.maven.project.MavenProject; +import org.codehaus.plexus.languages.java.version.JavaVersion; import org.codehaus.plexus.util.FileUtils; import org.sonatype.aether.impl.internal.SimpleLocalRepositoryManager; import org.sonatype.aether.util.DefaultRepositorySystemSession; @@ -231,7 +232,16 @@ public class AggregatorJavadocReportTest File apidocs = new File( getBasedir(), "target/test/unit/aggregate-resources-test/target/site/apidocs" ); // Test overview - File overviewSummary = new File( apidocs, "overview-summary.html" ); + File overviewSummary; + if ( JavaVersion.JAVA_SPECIFICATION_VERSION.isBefore( "11" ) ) + { + overviewSummary = new File( apidocs, "overview-summary.html" ); + } + else + { + overviewSummary = new File( apidocs, "index.html" ); + } + assertTrue( overviewSummary.exists() ); String overview = readFile( overviewSummary ).toLowerCase(); assertTrue( overview.contains( "<a href=\"resources/test/package-summary.html\">resources.test</a>" ) ); diff --git a/src/test/java/org/apache/maven/plugins/javadoc/JavadocJarTest.java b/src/test/java/org/apache/maven/plugins/javadoc/JavadocJarTest.java index 18e71cc..16d7a4e 100644 --- a/src/test/java/org/apache/maven/plugins/javadoc/JavadocJarTest.java +++ b/src/test/java/org/apache/maven/plugins/javadoc/JavadocJarTest.java @@ -112,7 +112,11 @@ public class JavadocJarTest assertTrue( set.contains( "javadocjar/def/package-use.html" ) ); assertTrue( set.contains( "javadocjar/def/package-tree.html" ) ); assertTrue( set.contains( "javadocjar/def/package-summary.html" ) ); - assertTrue( set.contains( "javadocjar/def/package-frame.html" ) ); + // package frame not generated anymore since Java 11 + if ( JavaVersion.JAVA_SPECIFICATION_VERSION.isBefore( "11" ) ) + { + assertTrue( set.contains( "javadocjar/def/package-frame.html" ) ); + } assertTrue( set.contains( "javadocjar/def/class-use/AppSample.html" ) ); assertTrue( set.contains( "index.html" ) ); assertTrue( set.contains( "javadocjar/def/App.html" ) ); diff --git a/src/test/java/org/apache/maven/plugins/javadoc/JavadocReportTest.java b/src/test/java/org/apache/maven/plugins/javadoc/JavadocReportTest.java index f21e063..c4d66b9 100644 --- a/src/test/java/org/apache/maven/plugins/javadoc/JavadocReportTest.java +++ b/src/test/java/org/apache/maven/plugins/javadoc/JavadocReportTest.java @@ -22,13 +22,13 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; -import java.io.BufferedReader; import java.io.File; -import java.io.FileReader; import java.io.IOException; import java.io.Reader; import java.net.HttpURLConnection; import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -193,21 +193,12 @@ public class JavadocReportTest private static String readFile( File file ) throws IOException { - String strTmp; StringBuilder str = new StringBuilder( (int) file.length() ); - BufferedReader in = new BufferedReader( new FileReader( file ) ); - try + for ( String strTmp : Files.readAllLines( file.toPath(), StandardCharsets.UTF_8 ) ) { - while ( ( strTmp = in.readLine() ) != null ) - { - str.append( LINE_SEPARATOR ); - str.append( strTmp ); - } - } - finally - { - in.close(); + str.append( LINE_SEPARATOR); + str.append( strTmp ); } return str.toString(); @@ -241,26 +232,39 @@ public class JavadocReportTest } assertTrue( new File( apidocs, "def/configuration/AppSample.html" ).exists() ); - assertTrue( new File( apidocs, "def/configuration/package-frame.html" ).exists() ); assertTrue( new File( apidocs, "def/configuration/package-summary.html" ).exists() ); assertTrue( new File( apidocs, "def/configuration/package-tree.html" ).exists() ); assertTrue( new File( apidocs, "def/configuration/package-use.html" ).exists() ); + // package-frame and allclasses-(no)frame not generated anymore since Java 11 + if ( JavaVersion.JAVA_SPECIFICATION_VERSION.isBefore( "11" ) ) + { + assertTrue( new File( apidocs, "def/configuration/package-frame.html" ).exists() ); + assertTrue( new File( apidocs, "allclasses-frame.html" ).exists() ); + assertTrue( new File( apidocs, "allclasses-noframe.html" ).exists() ); + } + // class level generated javadoc files assertTrue( new File( apidocs, "def/configuration/class-use/App.html" ).exists() ); assertTrue( new File( apidocs, "def/configuration/class-use/AppSample.html" ).exists() ); // project level generated javadoc files - assertTrue( new File( apidocs, "allclasses-frame.html" ).exists() ); - assertTrue( new File( apidocs, "allclasses-noframe.html" ).exists() ); assertTrue( new File( apidocs, "constant-values.html" ).exists() ); assertTrue( new File( apidocs, "deprecated-list.html" ).exists() ); assertTrue( new File( apidocs, "help-doc.html" ).exists() ); assertTrue( new File( apidocs, "index-all.html" ).exists() ); assertTrue( new File( apidocs, "index.html" ).exists() ); assertTrue( new File( apidocs, "overview-tree.html" ).exists() ); - assertTrue( new File( apidocs, "package-list" ).exists() ); assertTrue( new File( apidocs, "stylesheet.css" ).exists() ); + + if ( JavaVersion.JAVA_VERSION.isAtLeast( "10" ) ) + { + assertTrue( new File( apidocs, "element-list" ).exists() ); + } + else + { + assertTrue( new File( apidocs, "package-list" ).exists() ); + } } /** @@ -314,8 +318,8 @@ public class JavadocReportTest throws Exception { // Should be an assumption, but not supported by TestCase - // Seems like a bug in Javadoc 9 - if ( JavaVersion.JAVA_SPECIFICATION_VERSION.compareTo( JavaVersion.parse( "9" ) ) == 0 ) + // Seems like a bug in Javadoc 9 and above + if ( JavaVersion.JAVA_SPECIFICATION_VERSION.isAtLeast( "9" ) ) { return; } @@ -495,8 +499,16 @@ public class JavadocReportTest assertTrue( new File( apidocs, "index-all.html" ).exists() ); assertTrue( new File( apidocs, "index.html" ).exists() ); assertTrue( new File( apidocs, "overview-tree.html" ).exists() ); - assertTrue( new File( apidocs, "package-list" ).exists() ); assertTrue( new File( apidocs, "stylesheet.css" ).exists() ); + + if ( JavaVersion.JAVA_VERSION.isBefore( "10" ) ) + { + assertTrue( new File( apidocs, "package-list" ).exists() ); + } + else + { + assertTrue( new File( apidocs, "element-list" ).exists() ); + } } /** @@ -539,7 +551,15 @@ public class JavadocReportTest // ---------------------------------------------------------------------- // taglet-test: check if a taglet is used // ---------------------------------------------------------------------- - + + // Should be an assumption, but not supported by TestCase + // com.sun.tools.doclets.Taglet not supported by Java9 anymore + // Should be refactored with jdk.javadoc.doclet.Taglet + if ( JavaVersion.JAVA_SPECIFICATION_VERSION.isAtLeast( "10" ) ) + { + return; + } + File testPom = new File( unit, "taglet-test/taglet-test-plugin-config.xml" ); JavadocReport mojo = lookupMojo( testPom ); @@ -661,7 +681,7 @@ public class JavadocReportTest assertTrue( content.contains( "<img src=\"doc-files/maven-feather.png\" alt=\"Maven\">" ) ); JavaVersion javadocVersion = (JavaVersion) getVariableValueFromObject( mojo, "javadocRuntimeVersion" ); - if( javadocVersion.isAtLeast( "1.8" ) && javadocVersion.isBefore( "10" ) ) + if( javadocVersion.isAtLeast( "1.8" ) && javadocVersion.isBefore( "12" ) ) { // https://bugs.openjdk.java.net/browse/JDK-8032205 assertTrue( "Javadoc runtime version: " + javadocVersion @@ -713,9 +733,15 @@ public class JavadocReportTest String readed = readFile( app ); assertTrue( readed.contains( ">To do something:</" ) ); assertTrue( readed.contains( ">Generator Class:</" ) ); - assertTrue( readed.contains( ">Version:</" ) ); - assertTrue( readed.toLowerCase().contains( "</dt>" + LINE_SEPARATOR + " <dd>1.0</dd>" ) - || readed.toLowerCase().contains( "</dt>" + LINE_SEPARATOR + "<dd>1.0</dd>" /* JDK 8 */) ); + + // In javadoc-options-javadoc-resources.xml tag 'version' has only a name, + // which is not enough for Java 11 anymore + if ( JavaVersion.JAVA_SPECIFICATION_VERSION.isBefore( "11" ) ) + { + assertTrue( readed.contains( ">Version:</" ) ); + assertTrue( readed.toLowerCase().contains( "</dt>" + LINE_SEPARATOR + " <dd>1.0</dd>" ) + || readed.toLowerCase().contains( "</dt>" + LINE_SEPARATOR + "<dd>1.0</dd>" /* JDK 8 */) ); + } } /** @@ -775,12 +801,20 @@ public class JavadocReportTest mojo.execute(); File apidocs = new File( getBasedir(), "target/test/unit/jdk6-test/target/site/apidocs" ); - assertTrue( new File( apidocs, "index.html" ).exists() ); - File overviewSummary = new File( apidocs, "overview-summary.html" ); - assertTrue( overviewSummary.exists() ); - String content = readFile( overviewSummary ); + File overview; + if ( JavaVersion.JAVA_SPECIFICATION_VERSION.isBefore( "11" ) ) + { + overview = new File( apidocs, "overview-summary.html" ); + } + else + { + overview = new File( apidocs, "index.html" ); + } + + assertTrue( overview.exists() ); + String content = readFile( overview ); assertTrue( content.contains( "Top - Copyright © All rights reserved." ) ); assertTrue( content.contains( "Header - Copyright © All rights reserved." ) ); assertTrue( content.contains( "Footer - Copyright © All rights reserved." ) ); @@ -1020,6 +1054,13 @@ public class JavadocReportTest public void testTagletArtifacts() throws Exception { + // Should be an assumption, but not supported by TestCase + // com.sun.tools.doclets.Taglet not supported by Java 10 anymore + if ( JavaVersion.JAVA_SPECIFICATION_VERSION.isAtLeast( "10" ) ) + { + return; + } + File testPom = new File( unit, "tagletArtifacts-test/tagletArtifacts-test-plugin-config.xml" ); JavadocReport mojo = lookupMojo( testPom ); @@ -1112,7 +1153,16 @@ public class JavadocReportTest mojo.execute(); String content = readFile( stylesheetfile ); - assertTrue( content.contains( "/* Javadoc style sheet */" ) ); + if ( JavaVersion.JAVA_VERSION.isAtLeast( "10" ) ) + { + assertTrue( content.contains( "/* " + LINE_SEPARATOR + + " * Javadoc style sheet" + LINE_SEPARATOR + + " */" ) ); + } + else + { + assertTrue( content.contains( "/* Javadoc style sheet */" ) ); + } String optionsContent = readFile( options ); assertFalse( optionsContent.contains( "-stylesheetfile" ) );