This is an automated email from the ASF dual-hosted git repository. rfscholte pushed a commit to branch JXR-145 in repository https://gitbox.apache.org/repos/asf/maven-jxr.git
commit 415b6351b13306ae867e2b09ffd575fc82130d9e Author: rfscholte <rfscho...@apache.org> AuthorDate: Fri Apr 16 14:09:15 2021 +0200 [JXR-145] Support custom codetransformers --- .../apache/maven/plugin/jxr/AbstractJxrReport.java | 6 +- .../org/apache/maven/plugin/jxr/JxrReport.html | 2 +- maven-jxr/pom.xml | 6 ++ .../java/org/apache/maven/jxr/CodeTransformer.java | 54 ++++++++++ .../src/main/java/org/apache/maven/jxr/JXR.java | 119 ++++++++++----------- .../org/apache/maven/jxr/JavaCodeTransform.java | 93 ++++++++-------- .../org/apache/maven/jxr/IncludeExcludeTest.java | 4 +- .../test/java/org/apache/maven/jxr/JXR141Test.java | 4 +- .../apache/maven/jxr/JavaCodeTransformTest.java | 8 +- .../java/org/apache/maven/jxr/JxrBeanTest.java | 4 +- 10 files changed, 175 insertions(+), 125 deletions(-) diff --git a/maven-jxr-plugin/src/main/java/org/apache/maven/plugin/jxr/AbstractJxrReport.java b/maven-jxr-plugin/src/main/java/org/apache/maven/plugin/jxr/AbstractJxrReport.java index 10f9467..3d9a346 100644 --- a/maven-jxr-plugin/src/main/java/org/apache/maven/plugin/jxr/AbstractJxrReport.java +++ b/maven-jxr-plugin/src/main/java/org/apache/maven/plugin/jxr/AbstractJxrReport.java @@ -32,6 +32,7 @@ import java.util.Locale; import java.util.ResourceBundle; import org.apache.maven.doxia.siterenderer.Renderer; +import org.apache.maven.jxr.CodeTransformer; import org.apache.maven.jxr.JXR; import org.apache.maven.jxr.JavaCodeTransform; import org.apache.maven.jxr.JxrException; @@ -269,9 +270,9 @@ public abstract class AbstractJxrReport { FileManager fileManager = new FileManager(); PackageManager packageManager = new PackageManager( fileManager ); - JavaCodeTransform codeTransform = new JavaCodeTransform( packageManager, fileManager ); + CodeTransformer codeTransform = new JavaCodeTransform( packageManager, fileManager ); - JXR jxr = new JXR( packageManager, codeTransform ); + JXR jxr = new JXR( packageManager, Collections.singletonMap( "java", codeTransform ) ); jxr.setDest( Paths.get( destinationDirectory ) ); if ( StringUtils.isEmpty( inputEncoding ) ) { @@ -282,7 +283,6 @@ public abstract class AbstractJxrReport jxr.setInputEncoding( inputEncoding ); jxr.setLocale( locale ); jxr.setOutputEncoding( getOutputEncoding() ); - jxr.setRevision( "HEAD" ); jxr.setJavadocLinkDir( getJavadocLocation() ); // Set include/exclude patterns on the jxr instance if ( excludes != null && !excludes.isEmpty() ) diff --git a/maven-jxr-plugin/src/site/resources/example/xref/org/apache/maven/plugin/jxr/JxrReport.html b/maven-jxr-plugin/src/site/resources/example/xref/org/apache/maven/plugin/jxr/JxrReport.html index 2e228e7..6adf638 100644 --- a/maven-jxr-plugin/src/site/resources/example/xref/org/apache/maven/plugin/jxr/JxrReport.html +++ b/maven-jxr-plugin/src/site/resources/example/xref/org/apache/maven/plugin/jxr/JxrReport.html @@ -394,7 +394,7 @@ under the License. <a name="366" href="#366">366</a> jxr.setLocale( locale ); <a name="367" href="#367">367</a> jxr.setLog( <strong>new</strong> PluginLogAdapter( getLog() ) ); <a name="368" href="#368">368</a> jxr.setOutputEncoding( outputEncoding ); -<a name="369" href="#369">369</a> jxr.setRevision( <span class="string">"HEAD"</span> ); +<a name="369" href="#369">369</a> <a name="370" href="#370">370</a> <a name="371" href="#371">371</a> jxr.xref( sourceDirs, templateDir, windowTitle, docTitle, bottom ); <a name="372" href="#372">372</a> diff --git a/maven-jxr/pom.xml b/maven-jxr/pom.xml index 7e815e5..b29ca9f 100644 --- a/maven-jxr/pom.xml +++ b/maven-jxr/pom.xml @@ -107,6 +107,12 @@ under the License. <artifactId>commons-lang3</artifactId> <version>3.8.1</version> </dependency> + <dependency> + <groupId>javax.inject</groupId> + <artifactId>javax.inject</artifactId> + <version>1</version> + <scope>provided</scope> + </dependency> <dependency> <groupId>junit</groupId> diff --git a/maven-jxr/src/main/java/org/apache/maven/jxr/CodeTransformer.java b/maven-jxr/src/main/java/org/apache/maven/jxr/CodeTransformer.java new file mode 100644 index 0000000..be79907 --- /dev/null +++ b/maven-jxr/src/main/java/org/apache/maven/jxr/CodeTransformer.java @@ -0,0 +1,54 @@ +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. + */ + +import java.io.IOException; +import java.nio.file.Path; +import java.util.Locale; +import java.util.Set; + +/** + * The code transformer, responsible to turn code into JXR documentation + * + * @author Robert Scholte + * @since 3.1.0 + */ +public interface CodeTransformer +{ + /** + * This is the public method for doing all transforms of code. + * + * @param sourcefile String + * @param destfile String + * @param locale String + * @param inputEncoding String + * @param outputEncoding String + * @param javadocLinkDir String + * @param bottom TODO + * @throws IOException + */ + void transform( Path sourcefile, Path destfile, Locale locale, String inputEncoding, String outputEncoding, + Path javadocLinkDir, String bottom ) + throws IOException; + + Set<String> getDefaultIncludes(); + + boolean canTransform( String fileExtension ); +} \ No newline at end of file diff --git a/maven-jxr/src/main/java/org/apache/maven/jxr/JXR.java b/maven-jxr/src/main/java/org/apache/maven/jxr/JXR.java index 5aeec74..ba8db99 100644 --- a/maven-jxr/src/main/java/org/apache/maven/jxr/JXR.java +++ b/maven-jxr/src/main/java/org/apache/maven/jxr/JXR.java @@ -27,8 +27,12 @@ import org.slf4j.LoggerFactory; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Locale; +import java.util.Map; +import java.util.Set; /** * Main entry point into Maven used to kick off the XReference code building. @@ -45,14 +49,9 @@ public class JXR * Handles taking .java files and changing them into html. "More than meets * the eye!" :) */ - private final JavaCodeTransform transformer; + private Map<String, CodeTransformer> transformers; /** - * The default list of include patterns to use. - */ - private static final String[] DEFAULT_INCLUDES = { "**/*.java" }; - - /** * Path to destination. */ private Path destDir; @@ -68,26 +67,20 @@ public class JXR */ private Path javadocLinkDir; - - /** - * The revision of the module currently being processed. - */ - private String revision; - /** * The list of exclude patterns to use. */ - private String[] excludes = null; + private String[] excludes; /** * The list of include patterns to use. */ - private String[] includes = DEFAULT_INCLUDES; + private String[] includes; - public JXR( PackageManager pkgmgr, JavaCodeTransform transformer ) + public JXR( PackageManager pkgmgr, Map<String, CodeTransformer> transformers ) { this.pkgmgr = pkgmgr; - this.transformer = transformer; + this.transformers = transformers; } /** @@ -98,56 +91,70 @@ public class JXR * @param bottom * @throws IOException */ - public void processPath( PackageManager packageManager, Path sourceDir, String bottom ) + public void processPath( Path sourceDir, String bottom ) throws IOException { + DirectoryScanner ds = new DirectoryScanner(); // I'm not sure why we don't use the directoryScanner in packageManager, // but since we don't we need to set includes/excludes here as well ds.setExcludes( excludes ); - ds.setIncludes( includes ); + if ( includes != null ) + { + ds.setIncludes( includes ); + } + else + { + Set<String> transformerIncludes = new HashSet<>(); + for ( CodeTransformer transformer: transformers.values() ) + { + transformerIncludes.addAll( transformer.getDefaultIncludes() ); + } + ds.setIncludes( transformerIncludes.toArray( new String[0] ) ); + } ds.addDefaultExcludes(); ds.setBasedir( sourceDir.toString() ); ds.scan(); //now get the list of included files - String[] files = ds.getIncludedFiles(); - + + Map<String, CodeTransformer> transformerForExtension = new HashMap<>(); + for ( String file : files ) { Path sourceFile = sourceDir.resolve( file ); + + String fileExtension = getExtension( sourceFile ); - if ( isJavaFile( sourceFile.toString() ) ) + CodeTransformer transformer = transformerForExtension.get( fileExtension ); + if ( !transformerForExtension.containsKey( fileExtension ) ) + { + for ( CodeTransformer ct : transformers.values() ) + { + if ( ct.canTransform( fileExtension ) ) + { + transformer = ct; + break; + } + } + transformerForExtension.put( fileExtension, transformer ); + } + + if ( transformer != null ) { - String newFileName = file.replaceFirst( ".java$", ".html" ); + String newFileName = file.replaceFirst( fileExtension + '$', ".html" ); - transform( sourceFile, this.destDir.resolve( newFileName ), bottom ); + transform( transformer, sourceFile, this.destDir.resolve( newFileName ), bottom ); } } } - - /** - * Check to see if the file is a Java source file. - * - * @param filename The name of the file to check - * @return <code>true</code> if the file is a Java file - */ - public static boolean isJavaFile( String filename ) - { - return filename.endsWith( ".java" ); - } - - /** - * Check to see if the file is an HTML file. - * - * @param filename The name of the file to check - * @return <code>true</code> if the file is an HTML file - */ - public static boolean isHtmlFile( String filename ) + + private String getExtension( Path file ) { - return filename.endsWith( ".html" ); + String fileName = file.getFileName().toString(); + return fileName.substring( fileName.indexOf( '.' ) ); } /** @@ -192,14 +199,6 @@ public class JXR } /** - * @param revision - */ - public void setRevision( String revision ) - { - this.revision = revision; - } - - /** * @param sourceDirs * @param templateDir * @param windowTitle @@ -221,7 +220,7 @@ public class JXR pkgmgr.process( path ); - processPath( pkgmgr, path, bottom ); + processPath( path, bottom ); } // once we have all the source files xref'd, create the index pages @@ -246,15 +245,14 @@ public class JXR * @param bottom The bottom footer text just as in the package pages * @throws IOException Thrown if the transform can't happen for some reason. */ - private void transform( Path sourceFile, Path destFile, String bottom ) + private void transform( CodeTransformer transformer, Path sourceFile, Path destFile, String bottom ) throws IOException { LOGGER.debug( sourceFile + " -> " + destFile ); // get a relative link to the javadocs Path javadoc = javadocLinkDir != null ? getRelativeLink( destFile.getParent(), javadocLinkDir ) : null; - transformer.transform( sourceFile, destFile, locale, inputEncoding, outputEncoding, javadoc, - this.revision, bottom ); + transformer.transform( sourceFile, destFile, locale, inputEncoding, outputEncoding, javadoc, bottom ); } /** @@ -280,17 +278,8 @@ public class JXR this.excludes = excludes; } - public void setIncludes( String[] includes ) { - if ( includes == null ) - { - // We should not include non-java files, so we use a sensible default pattern - this.includes = DEFAULT_INCLUDES; - } - else - { - this.includes = includes; - } + this.includes = includes; } } diff --git a/maven-jxr/src/main/java/org/apache/maven/jxr/JavaCodeTransform.java b/maven-jxr/src/main/java/org/apache/maven/jxr/JavaCodeTransform.java index adea5fb..d7e41d8 100644 --- a/maven-jxr/src/main/java/org/apache/maven/jxr/JavaCodeTransform.java +++ b/maven-jxr/src/main/java/org/apache/maven/jxr/JavaCodeTransform.java @@ -1,5 +1,33 @@ package org.apache.maven.jxr; +import java.io.BufferedReader; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.io.Reader; +import java.io.Serializable; +import java.io.Writer; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Collections; +import java.util.HashSet; +import java.util.Hashtable; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; + +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; + /* * CodeViewer.java * CoolServlets.com @@ -40,30 +68,6 @@ import org.apache.maven.jxr.pacman.PackageType; import org.apache.maven.jxr.util.SimpleWordTokenizer; import org.apache.maven.jxr.util.StringEntry; -import java.io.BufferedReader; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.OutputStreamWriter; -import java.io.PrintWriter; -import java.io.Reader; -import java.io.Serializable; -import java.io.Writer; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Collections; -import java.util.HashSet; -import java.util.Hashtable; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; - /** * Syntax highlights java by turning it into html. A codeviewer object is created and then keeps state as lines are * passed in. Each line passed in as java test, is returned as syntax highlighted html text. Users of the class can set @@ -91,8 +95,10 @@ import java.util.Set; * importFilter * </pre> */ +@Named( "java" ) +@Singleton public class JavaCodeTransform - implements Serializable + implements Serializable, CodeTransformer { // ---------------------------------------------------------------------- // public fields @@ -185,11 +191,6 @@ public class JavaCodeTransform private Path currentFilename = null; /** - * The current CVS revision of the currently transformed document - */ - private String revision = null; - - /** * The output encoding */ private String outputEncoding = null; @@ -278,6 +279,18 @@ public class JavaCodeTransform this.fileManager = fileManager; } + @Override + public boolean canTransform( String fileExtension ) + { + return ".java".equals( fileExtension ); + } + + @Override + public Set<String> getDefaultIncludes() + { + return Collections.singleton( "**/*.java" ); + } + // ---------------------------------------------------------------------- // public methods // ---------------------------------------------------------------------- @@ -385,18 +398,16 @@ public class JavaCodeTransform * @param locale String * @param outputEncoding String * @param javadocLinkDir String - * @param revision String * @param bottom string * @throws IOException */ private void transform( Reader sourceReader, Writer destWriter, Locale locale, - String outputEncoding, Path javadocLinkDir, String revision, String bottom ) + String outputEncoding, Path javadocLinkDir, String bottom ) throws IOException { this.locale = locale; this.outputEncoding = outputEncoding; this.javadocLinkDir = javadocLinkDir; - this.revision = revision; BufferedReader in = new BufferedReader( sourceReader ); @@ -434,12 +445,12 @@ public class JavaCodeTransform * @param inputEncoding String * @param outputEncoding String * @param javadocLinkDir String - * @param revision String * @param bottom TODO * @throws IOException */ + @Override public final void transform( Path sourcefile, Path destfile, Locale locale, String inputEncoding, - String outputEncoding, Path javadocLinkDir, String revision, String bottom ) + String outputEncoding, Path javadocLinkDir, String bottom ) throws IOException { this.setCurrentFilename( sourcefile ); @@ -449,7 +460,7 @@ public class JavaCodeTransform try ( Reader fr = getReader( sourcefile, inputEncoding ); Writer fw = getWriter( destfile, outputEncoding ) ) { - transform( fr, fw, locale, outputEncoding, javadocLinkDir, revision, bottom ); + transform( fr, fw, locale, outputEncoding, javadocLinkDir, bottom ); } catch ( RuntimeException e ) { @@ -595,16 +606,6 @@ public class JavaCodeTransform } /** - * The current revision of the CVS module - * - * @return String - */ - public final String getRevision() - { - return this.revision; - } - - /** * Cross Reference the given line with JXR returning the new content. * * @param line String diff --git a/maven-jxr/src/test/java/org/apache/maven/jxr/IncludeExcludeTest.java b/maven-jxr/src/test/java/org/apache/maven/jxr/IncludeExcludeTest.java index 02e07f1..d333777 100644 --- a/maven-jxr/src/test/java/org/apache/maven/jxr/IncludeExcludeTest.java +++ b/maven-jxr/src/test/java/org/apache/maven/jxr/IncludeExcludeTest.java @@ -47,9 +47,9 @@ public class IncludeExcludeTest { FileManager fileManager = new FileManager(); PackageManager packageManager = new PackageManager( fileManager ); - JavaCodeTransform codeTransform = new JavaCodeTransform( packageManager, fileManager ); + CodeTransformer codeTransform = new JavaCodeTransform( packageManager, fileManager ); - jxr = new JXR( packageManager, codeTransform ); + jxr = new JXR( packageManager, Collections.singletonMap( "java", codeTransform ) ); jxr.setDest( Paths.get( "target" ) ); jxr.setInputEncoding( "ISO-8859-1" ); jxr.setOutputEncoding( "ISO-8859-1" ); diff --git a/maven-jxr/src/test/java/org/apache/maven/jxr/JXR141Test.java b/maven-jxr/src/test/java/org/apache/maven/jxr/JXR141Test.java index 6b04be3..9c9180f 100644 --- a/maven-jxr/src/test/java/org/apache/maven/jxr/JXR141Test.java +++ b/maven-jxr/src/test/java/org/apache/maven/jxr/JXR141Test.java @@ -46,9 +46,9 @@ public class JXR141Test { FileManager fileManager = new FileManager(); PackageManager packageManager = new PackageManager( fileManager ); - JavaCodeTransform codeTransform = new JavaCodeTransform( packageManager, fileManager ); + CodeTransformer codeTransform = new JavaCodeTransform( packageManager, fileManager ); - jxr = new JXR( packageManager, codeTransform ); + jxr = new JXR( packageManager, Collections.singletonMap( "java", codeTransform ) ); } @Test diff --git a/maven-jxr/src/test/java/org/apache/maven/jxr/JavaCodeTransformTest.java b/maven-jxr/src/test/java/org/apache/maven/jxr/JavaCodeTransformTest.java index e2f661c..a186b62 100644 --- a/maven-jxr/src/test/java/org/apache/maven/jxr/JavaCodeTransformTest.java +++ b/maven-jxr/src/test/java/org/apache/maven/jxr/JavaCodeTransformTest.java @@ -38,7 +38,7 @@ import org.junit.Test; public class JavaCodeTransformTest { /** JavaCodeTransform object under test */ - private JavaCodeTransform codeTransform; + private CodeTransformer codeTransform; /** * Set up this test. @@ -64,7 +64,7 @@ public class JavaCodeTransformTest multiline comment text */ codeTransform.transform( sourceFile, Paths.get( "target/JavaCodeTransformTest.html" ) // additional comment - , Locale.ENGLISH, "ISO-8859-1", "ISO-8859-1", Paths.get( "." ), "", "" ); + , Locale.ENGLISH, "ISO-8859-1", "ISO-8859-1", Paths.get( "." ), "" ); assertTrue( /**/ Files.exists( Paths.get( "target/JavaCodeTransformTest.html" ) ) ); } @@ -79,7 +79,7 @@ public class JavaCodeTransformTest assertTrue( Files.exists( sourceFile ) ); codeTransform.transform( sourceFile, Paths.get( "target/EmptyClass.html" ) - , Locale.ENGLISH, "ISO-8859-1", "ISO-8859-1", Paths.get( "." ), "", "" ); + , Locale.ENGLISH, "ISO-8859-1", "ISO-8859-1", Paths.get( "." ), "" ); assertTrue( Files.exists( Paths.get( "target/EmptyClass.html" ) ) ); } @@ -94,7 +94,7 @@ public class JavaCodeTransformTest assertTrue( Files.exists( sourceFile ) ); codeTransform.transform( sourceFile, Paths.get( "target/ClassWithLink.html" ) - , Locale.ENGLISH, "ISO-8859-1", "ISO-8859-1", Paths.get( "." ), "", "" ); + , Locale.ENGLISH, "ISO-8859-1", "ISO-8859-1", Paths.get( "." ), "" ); assertTrue( Files.exists( Paths.get( "target/ClassWithLink.html" ) ) ); byte[] bytes = Files.readAllBytes( Paths.get( "target/ClassWithLink.html" ) ); diff --git a/maven-jxr/src/test/java/org/apache/maven/jxr/JxrBeanTest.java b/maven-jxr/src/test/java/org/apache/maven/jxr/JxrBeanTest.java index 10c7549..8ab6e21 100644 --- a/maven-jxr/src/test/java/org/apache/maven/jxr/JxrBeanTest.java +++ b/maven-jxr/src/test/java/org/apache/maven/jxr/JxrBeanTest.java @@ -35,8 +35,8 @@ public class JxrBeanTest public void setUp() { FileManager fileManager = new FileManager(); PackageManager packageManager = new PackageManager( fileManager ); - JavaCodeTransform codeTransform = new JavaCodeTransform( packageManager, fileManager ); - jxrBean = new JXR( packageManager, codeTransform ); + CodeTransformer codeTransform = new JavaCodeTransform( packageManager, fileManager ); + jxrBean = new JXR( packageManager, Collections.singletonMap( "java", codeTransform ) ); jxrBean.setDest( Paths.get( "target" ) ); jxrBean.setInputEncoding( "ISO-8859-1" ); jxrBean.setOutputEncoding( "ISO-8859-1" );