This is an automated email from the ASF dual-hosted git repository. claude pushed a commit to branch feature/restructure in repository https://gitbox.apache.org/repos/asf/creadur-rat.git
commit 083ae42b30ad74b2304b1ebd92f929518d1e6251 Author: Claude Warren <[email protected]> AuthorDate: Sat Mar 7 15:06:01 2026 +0000 cleaned up tests --- .../rat/ant/ResourceCollectionContainer.java | 2 +- apache-rat-core/pom.xml | 2 +- .../main/java/org/apache/rat/commandline/Arg.java | 4 +- .../apache/rat/report/claim/ClaimStatistic.java | 11 ++- .../java/org/apache/rat/ui/ArgumentTracker.java | 5 +- apache-rat-maven-parent/plugin/pom.xml | 50 ++++++---- .../java/org/apache/rat/maven/AbstractRatMojo.java | 25 ++--- .../java/org/apache/rat/maven/RatCheckMojo.java | 17 +++- .../java/org/apache/rat/maven/RatReportMojo.java | 20 ++-- apache-rat-maven-parent/pom.xml | 22 ++++- apache-rat-maven-parent/spotbugs-ignore.xml | 5 +- apache-rat-maven-parent/tools/pom.xml | 2 +- .../java/org/apache/rat/maven/MavenOption.java | 105 +++++---------------- .../apache/rat/maven/MavenOptionCollection.java | 79 +++++++++++++++- .../java/org/apache/rat/maven/PropertyReader.java | 17 +++- .../java/org/apache/rat/maven/package-info.java | 2 +- .../org/apache/rat/maven/tools/CodeGenerator.java | 71 ++++++++------ .../org/apache/rat/maven/tools/TestGenerator.java | 91 +++++++++++------- .../org/apache/rat/maven/tools/AbstractMaven.vm | 10 +- .../apache/rat/maven/tools/AbstractMavenFunc.vm | 4 +- .../rat/maven/MavenOptionCollectionTest.java | 49 +++++++++- .../org/apache/rat/maven/PropertyReaderTest.java | 13 +++ .../apache/rat/maven/tools/CodeGeneratorTest.java | 34 +++++++ .../apache/rat/maven/tools/TestGeneratorTest.java | 48 ++++++++++ 24 files changed, 474 insertions(+), 214 deletions(-) diff --git a/apache-rat-ant-parent/apache-rat-tasks/src/main/java/org/apache/rat/ant/ResourceCollectionContainer.java b/apache-rat-ant-parent/apache-rat-tasks/src/main/java/org/apache/rat/ant/ResourceCollectionContainer.java index 7d5b237b..c1521994 100644 --- a/apache-rat-ant-parent/apache-rat-tasks/src/main/java/org/apache/rat/ant/ResourceCollectionContainer.java +++ b/apache-rat-ant-parent/apache-rat-tasks/src/main/java/org/apache/rat/ant/ResourceCollectionContainer.java @@ -59,7 +59,7 @@ class ResourceCollectionContainer implements IReportable { } @Override - public DocumentName getName() { + public DocumentName name() { return name; } } diff --git a/apache-rat-core/pom.xml b/apache-rat-core/pom.xml index 79861a25..fb952f78 100644 --- a/apache-rat-core/pom.xml +++ b/apache-rat-core/pom.xml @@ -128,7 +128,7 @@ <artifactId>spotbugs-maven-plugin</artifactId> <configuration> <excludeFilterFile>spotbugs-ignore.xml</excludeFilterFile> - <maxAllowedViolations>47</maxAllowedViolations> + <maxAllowedViolations>90</maxAllowedViolations> </configuration> </plugin> <plugin> diff --git a/apache-rat-core/src/main/java/org/apache/rat/commandline/Arg.java b/apache-rat-core/src/main/java/org/apache/rat/commandline/Arg.java index 6f382ea0..7789ad8c 100644 --- a/apache-rat-core/src/main/java/org/apache/rat/commandline/Arg.java +++ b/apache-rat-core/src/main/java/org/apache/rat/commandline/Arg.java @@ -21,7 +21,6 @@ package org.apache.rat.commandline; import java.io.File; import java.io.IOException; import java.io.InputStream; -import java.io.OutputStream; import java.lang.reflect.Array; import java.nio.charset.StandardCharsets; import java.nio.file.Files; @@ -40,7 +39,6 @@ import org.apache.commons.cli.OptionGroup; import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; import org.apache.commons.io.IOUtils; -import org.apache.commons.io.function.IOSupplier; import org.apache.commons.lang3.tuple.Pair; import org.apache.rat.ConfigurationException; import org.apache.rat.Defaults; @@ -876,7 +874,7 @@ public enum Arg { context.getConfiguration().setOut(file); } catch (ParseException e) { context.logParseException(e, OUTPUT_FILE.getSelected(), "System.out"); - context.getConfiguration().setOut((IOSupplier<OutputStream>) null); + context.getConfiguration().setOut(ReportConfiguration.SYSTEM_OUT); } } diff --git a/apache-rat-core/src/main/java/org/apache/rat/report/claim/ClaimStatistic.java b/apache-rat-core/src/main/java/org/apache/rat/report/claim/ClaimStatistic.java index 4237586f..d47f2e5b 100644 --- a/apache-rat-core/src/main/java/org/apache/rat/report/claim/ClaimStatistic.java +++ b/apache-rat-core/src/main/java/org/apache/rat/report/claim/ClaimStatistic.java @@ -156,6 +156,15 @@ public class ClaimStatistic { counterMap.compute(counter, (k, v) -> v == null ? new IntCounter().increment(value) : v.increment(value)); } + /** + * Increments the counts for the counter. + * @param counter the counter to increment. + * @param value the value to increment the counter by. + */ + public void setCounter(final Counter counter, final int value) { + counterMap.put(counter, new IntCounter().increment(value)); + } + /** * Gets the counts for the Document.Type. * @param documentType the Document.Type to get the counter for. @@ -391,7 +400,7 @@ public class ClaimStatistic { XMLConfigurationReader.nodeListConsumer(document.getElementsByTagName("counter"), node -> { Map<String, String> attributes = XMLConfigurationReader.attributes(node); Counter type = Counter.valueOf(attributes.get("name")); - incCounter(type, Integer.parseInt(attributes.get("count"))); + setCounter(type, Integer.parseInt(attributes.get("count"))); }); } } diff --git a/apache-rat-core/src/main/java/org/apache/rat/ui/ArgumentTracker.java b/apache-rat-core/src/main/java/org/apache/rat/ui/ArgumentTracker.java index 1e320690..460b1030 100644 --- a/apache-rat-core/src/main/java/org/apache/rat/ui/ArgumentTracker.java +++ b/apache-rat-core/src/main/java/org/apache/rat/ui/ArgumentTracker.java @@ -24,6 +24,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; import java.util.function.BiConsumer; import java.util.stream.Collectors; @@ -154,8 +155,8 @@ public final class ArgumentTracker { * @param key the key for the map. * @return the list of values for the key or {@code null} if not set. */ - public List<String> getArg(final String key) { - return args.get(key); + public Optional<List<String>> getArg(final String key) { + return Optional.ofNullable(args.get(key)); } /** diff --git a/apache-rat-maven-parent/plugin/pom.xml b/apache-rat-maven-parent/plugin/pom.xml index 0a660b3e..91907c97 100644 --- a/apache-rat-maven-parent/plugin/pom.xml +++ b/apache-rat-maven-parent/plugin/pom.xml @@ -32,6 +32,7 @@ <maven>${mavenMinVersion}</maven> </prerequisites> <properties> + <coreVersion>1.0.0-SNAPSHOT</coreVersion> <currentVersion>${project.version}</currentVersion> <doxiaVersion>2.0.0</doxiaVersion> </properties> @@ -189,32 +190,32 @@ </goals> <phase>generate-sources</phase> <configuration> - <mainClass>org.apache.rat.maven.CodeGenerator</mainClass> + <mainClass>org.apache.rat.maven.tools.CodeGenerator</mainClass> <arguments> <argument>-p</argument> <argument>${project.build.sourceDirectory}</argument> </arguments> </configuration> </execution> - <execution> - <id>generate-rat-tests</id> - <goals> - <goal>java</goal> - </goals> - <phase>generate-test-sources</phase> - <configuration> - <skip>true</skip> - <mainClass>org.apache.rat.maven.TestGenerator</mainClass> - <arguments> - <argument>-t</argument> - <argument>${project.build.testSourceDirectory}</argument> - <argument>-r</argument> - <argument>${project.build.testSourceDirectory}/../resources</argument> - <argument>-p</argument> - <argument>org.apache.rat.maven</argument> - </arguments> - </configuration> - </execution> +<!-- <execution>--> +<!-- <id>generate-rat-tests</id>--> +<!-- <goals>--> +<!-- <goal>java</goal>--> +<!-- </goals>--> +<!-- <phase>generate-test-sources</phase>--> +<!-- <configuration>--> +<!-- <skip>true</skip>--> +<!-- <mainClass>org.apache.rat.maven.tools.TestGenerator</mainClass>--> +<!-- <arguments>--> +<!-- <argument>-t</argument>--> +<!-- <argument>${project.build.testSourceDirectory}</argument>--> +<!-- <argument>-r</argument>--> +<!-- <argument>${project.build.testSourceDirectory}/../resources</argument>--> +<!-- <argument>-p</argument>--> +<!-- <argument>org.apache.rat.maven</argument>--> +<!-- </arguments>--> +<!-- </configuration>--> +<!-- </execution>--> <execution> <id>Initial site generation</id> <phase>pre-site</phase> @@ -249,6 +250,8 @@ <cloneProjectsTo>${project.build.directory}/invoker_target</cloneProjectsTo> <localRepositoryPath>${project.build.directory}/local-repo</localRepositoryPath> <addTestClassPath>true</addTestClassPath> +<!-- <extraArtifacts>org.apache.rat:apache-rat-core-tests:${coreVerson}:jar--> +<!-- </extraArtifacts>--> <settingsFile>src/it/settings.xml</settingsFile> <postBuildHookScript>verify</postBuildHookScript> </configuration> @@ -329,6 +332,7 @@ <dependency> <groupId>org.apache.rat</groupId> <artifactId>apache-rat-core</artifactId> + <version>${coreVersion}</version> </dependency> <!-- rat tools in test scope so that it does not get bundled into the plugin --> <!-- <dependency>--> @@ -339,6 +343,7 @@ <dependency> <groupId>org.apache.rat</groupId> <artifactId>apache-rat-core-tests</artifactId> + <version>${coreVersion}</version> <scope>compile</scope> </dependency> <dependency> @@ -361,6 +366,11 @@ <artifactId>junit-jupiter-params</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>org.apache.maven.shared</groupId> + <artifactId>maven-invoker</artifactId> + <version>3.3.0</version> + </dependency> <dependency> <groupId>org.apache.maven.plugin-tools</groupId> <artifactId>maven-plugin-annotations</artifactId> diff --git a/apache-rat-maven-parent/plugin/src/main/java/org/apache/rat/maven/AbstractRatMojo.java b/apache-rat-maven-parent/plugin/src/main/java/org/apache/rat/maven/AbstractRatMojo.java index 1f28ad31..24d59339 100644 --- a/apache-rat-maven-parent/plugin/src/main/java/org/apache/rat/maven/AbstractRatMojo.java +++ b/apache-rat-maven-parent/plugin/src/main/java/org/apache/rat/maven/AbstractRatMojo.java @@ -24,20 +24,20 @@ import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.Map; import org.apache.commons.cli.Option; import org.apache.commons.cli.ParseException; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.project.MavenProject; -import org.apache.rat.OptionCollection; +import org.apache.rat.OptionCollectionParser; import org.apache.rat.ReportConfiguration; import org.apache.rat.commandline.Arg; import org.apache.rat.commandline.ArgumentContext; import org.apache.rat.document.DocumentName; import org.apache.rat.document.FileDocument; import org.apache.rat.license.ILicense; +import org.apache.rat.ui.ArgumentTracker; import org.apache.rat.utils.DefaultLog; import org.apache.rat.utils.Log; import org.apache.rat.walker.DirectoryWalker; @@ -121,12 +121,7 @@ public abstract class AbstractRatMojo extends AbstractMaven { protected List<String> getValues(final Arg arg) { List<String> result = new ArrayList<>(); for (Option option : arg.group().getOptions()) { - if (option.getLongOpt() != null) { - List<String> args = argumentTracker.getArg(option.getLongOpt()); - if (args != null) { - result.addAll(args); - } - } + argumentTracker.getArg(ArgumentTracker.extractKey(option)).ifPresent(result::addAll); } return result; } @@ -236,13 +231,12 @@ public abstract class AbstractRatMojo extends AbstractMaven { protected ReportConfiguration getConfiguration() throws MojoExecutionException { Log log = DefaultLog.getInstance(); + OptionCollectionParser optionParser = new OptionCollectionParser(mavenOptionCollection); if (reportConfiguration == null) { try { if (getLog().isDebugEnabled()) { log.debug("Start BaseRatMojo Configuration options"); - for (Map.Entry<String, List<String>> entry : argumentTracker.entrySet()) { - log.debug(format(" * %s %s", entry.getKey(), String.join(", ", entry.getValue()))); - } + argumentTracker.apply((k, v) -> log.debug(format(" * %s %s", k, String.join(", ", v)))); log.debug("End BaseRatMojo Configuration options"); } @@ -250,11 +244,12 @@ public abstract class AbstractRatMojo extends AbstractMaven { removeKey(Arg.HELP_LICENSES); setIncludeExclude(); - ArgumentContext ctxt = OptionCollection.parseCommands(basedir, argumentTracker.args().toArray(new String[0])); + ArgumentContext ctxt = optionParser.parseCommands(basedir, argumentTracker.args().toArray(new String[0])); DocumentName dirName = DocumentName.builder(basedir).build(); - ctxt.getConfiguration().addSource(new DirectoryWalker(new FileDocument(dirName, basedir, - ctxt.getConfiguration().getDocumentExcluder(dirName)))); - + if (argumentTracker.getArg(ArgumentTracker.extractKey(Arg.SOURCE.option())).isEmpty()) { + ctxt.getConfiguration().addSource(new DirectoryWalker(new FileDocument(dirName, basedir, + ctxt.getConfiguration().getDocumentExcluder(dirName)))); + } if (helpLicenses) { new org.apache.rat.help.Licenses(ctxt.getConfiguration(), new PrintWriter(log.asWriter())).printHelp(); } diff --git a/apache-rat-maven-parent/plugin/src/main/java/org/apache/rat/maven/RatCheckMojo.java b/apache-rat-maven-parent/plugin/src/main/java/org/apache/rat/maven/RatCheckMojo.java index af49134d..ed2345bf 100644 --- a/apache-rat-maven-parent/plugin/src/main/java/org/apache/rat/maven/RatCheckMojo.java +++ b/apache-rat-maven-parent/plugin/src/main/java/org/apache/rat/maven/RatCheckMojo.java @@ -41,12 +41,15 @@ import org.apache.rat.Reporter; import org.apache.rat.api.RatException; import org.apache.rat.commandline.Arg; import org.apache.rat.commandline.StyleSheets; +import org.apache.rat.document.DocumentName; import org.apache.rat.license.LicenseSetFactory.LicenseFilter; import org.apache.rat.report.claim.ClaimStatistic; import org.apache.rat.ui.ArgumentTracker; import org.apache.rat.utils.DefaultLog; import org.apache.rat.utils.FileUtils; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; + import static java.lang.String.format; /** @@ -67,6 +70,7 @@ public final class RatCheckMojo extends AbstractRatMojo { super(); } + @SuppressFBWarnings("EI_EXPOSE_REP") public Reporter.Output getOutput() { return output; } @@ -103,6 +107,12 @@ public final class RatCheckMojo extends AbstractRatMojo { return; } + if (getLog().isDebugEnabled()) { + getLog().debug("ARG list -->"); + argumentTracker.args().forEach(getLog()::debug); + getLog().debug("<-- ARG list"); + } + if (getValues(Arg.OUTPUT_FILE).isEmpty()) { argumentTracker.setArg(ArgumentTracker.extractKey(Arg.OUTPUT_FILE.option()), "target/rat.txt"); } @@ -143,7 +153,7 @@ public final class RatCheckMojo extends AbstractRatMojo { FileUtils.mkDir(ratPath.toFile()); Path xmlPath = ratPath.resolve("rat.xml"); IOSupplier<OutputStream> outputStream = () -> Files.newOutputStream(xmlPath); - final IOSupplier<InputStream> stylesheet = StyleSheets.XML.getStyleSheet(); + final IOSupplier<InputStream> stylesheet = StyleSheets.XML.getStyleSheet().ioSupplier(); try { output.format(stylesheet, outputStream); } catch (RatException e) { @@ -169,7 +179,7 @@ public final class RatCheckMojo extends AbstractRatMojo { !config.getClaimValidator().isValid(ClaimStatistic.Counter.UNAPPROVED, statistics.getCounter(ClaimStatistic.Counter.UNAPPROVED))) { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); - output.format(StyleSheets.UNAPPROVED_LICENSES.getStyleSheet(), () -> baos); + output.format(StyleSheets.UNAPPROVED_LICENSES.getStyleSheet().ioSupplier(), () -> baos); getLog().warn(baos.toString(StandardCharsets.UTF_8)); } catch (RuntimeException rte) { throw rte; @@ -202,7 +212,8 @@ public final class RatCheckMojo extends AbstractRatMojo { public File getRatTxtFile() throws MojoFailureException { List<String> args = getValues(Arg.OUTPUT_FILE); if (args != null) { - return new File(args.get(0)); + DocumentName workDir = DocumentName.builder(basedir).build(); + return workDir.resolve(args.get(0)).asFile(); } throw new MojoFailureException("No output file specified"); } diff --git a/apache-rat-maven-parent/plugin/src/main/java/org/apache/rat/maven/RatReportMojo.java b/apache-rat-maven-parent/plugin/src/main/java/org/apache/rat/maven/RatReportMojo.java index 0b971b75..6cbb2482 100644 --- a/apache-rat-maven-parent/plugin/src/main/java/org/apache/rat/maven/RatReportMojo.java +++ b/apache-rat-maven-parent/plugin/src/main/java/org/apache/rat/maven/RatReportMojo.java @@ -68,6 +68,8 @@ import org.eclipse.aether.repository.ArtifactRepository; import org.eclipse.aether.repository.RemoteRepository; import org.xml.sax.SAXException; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; + import static org.apache.maven.shared.utils.logging.MessageUtils.buffer; /** @@ -139,6 +141,7 @@ public class RatReportMojo extends AbstractRatMojo implements MavenMultiPageRepo * @throws MojoExecutionException if an error occurs when generating the report * @see org.apache.maven.plugin.Mojo#execute() */ + @SuppressFBWarnings("PATH_TRAVERSAL_IN") @Override public void execute() throws MojoExecutionException { if (!canGenerateReport()) { @@ -245,6 +248,7 @@ public class RatReportMojo extends AbstractRatMojo implements MavenMultiPageRepo * @param locale the wanted locale to generate the report, could be null. * @throws MavenReportException if any */ + @SuppressFBWarnings("EI_EXPOSE_REP2") @Override public void generate(final Sink sink, final SinkFactory sinkFactory, final Locale locale) throws MavenReportException { if (!canGenerateReport()) { @@ -266,6 +270,7 @@ public class RatReportMojo extends AbstractRatMojo implements MavenMultiPageRepo } } + @SuppressFBWarnings("PATH_TRAVERSAL_IN") private void generateReportManually(final Locale locale) throws MavenReportException { try { File outputDir = new File(getOutputDirectory()); @@ -319,12 +324,12 @@ public class RatReportMojo extends AbstractRatMojo implements MavenMultiPageRepo return CATEGORY_PROJECT_REPORTS; } + @SuppressFBWarnings("PATH_TRAVERSAL_IN") @Override public File getReportOutputDirectory() { if (reportOutputDirectory == null) { reportOutputDirectory = new File(getOutputDirectory()); } - return reportOutputDirectory; } @@ -334,6 +339,7 @@ public class RatReportMojo extends AbstractRatMojo implements MavenMultiPageRepo this.outputDirectory = reportOutputDirectory; } + @SuppressFBWarnings("PATH_TRAVERSAL_IN") protected String getOutputDirectory() { if (outputDirectory == null) { outputDirectory = new File(getProject().getModel().getReporting().getOutputDirectory()); @@ -369,14 +375,7 @@ public class RatReportMojo extends AbstractRatMojo implements MavenMultiPageRepo * Actions when closing the report. */ protected void closeReport() { - getSink().close(); - } - - /** - * @return the sink used - */ - public Sink getSink() { - return sink; + sink.close(); } /** @@ -400,6 +399,7 @@ public class RatReportMojo extends AbstractRatMojo implements MavenMultiPageRepo return !skip; } + @SuppressFBWarnings("XXE_DOCUMENT") Reporter.Output readReportFile() throws MavenReportException { File f = new File(outputDirectory, "RAT/rat.xml"); try (InputStream inputStream = new FileInputStream(f)) { @@ -440,7 +440,7 @@ public class RatReportMojo extends AbstractRatMojo implements MavenMultiPageRepo sink.link_(); File f = new File(outputDirectory, ".rat.xhtml5"); try { - readReportFile().format(StyleSheets.XHTML5.getStyleSheet(), () -> Files.newOutputStream(f.toPath())); + readReportFile().format(StyleSheets.XHTML5.getStyleSheet().ioSupplier(), () -> Files.newOutputStream(f.toPath())); try (Reader reader = new InputStreamReader(Files.newInputStream(f.toPath()), StandardCharsets.UTF_8)) { new Xhtml5Parser().parse(reader, sink); } diff --git a/apache-rat-maven-parent/pom.xml b/apache-rat-maven-parent/pom.xml index ae5451f3..50315421 100644 --- a/apache-rat-maven-parent/pom.xml +++ b/apache-rat-maven-parent/pom.xml @@ -35,7 +35,7 @@ </prerequisites> <properties> <rat.version>1.0.0-SNAPSHOT</rat.version> - <currentVersion>${project.version}</currentVersion> + <rat.plugin.version>${project.version}</rat.plugin.version> <doxiaVersion>2.0.0</doxiaVersion> <mavenVersion>3.9.12</mavenVersion> <mavenPluginTestingVersion>3.4.0</mavenPluginTestingVersion> @@ -43,7 +43,7 @@ </properties> <modules> <module>tools</module> - <module>impl</module> + <module>plugin</module> </modules> <dependencyManagement> <dependencies> @@ -80,6 +80,24 @@ </dependencyManagement> <build> <plugins> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>properties-maven-plugin</artifactId> + <version>1.3.0</version> + <executions> + <execution> + <phase>generate-resources</phase> + <goals> + <goal>write-project-properties</goal> + </goals> + <configuration> + <outputFile> + ${project.build.outputDirectory}/app.properties + </outputFile> + </configuration> + </execution> + </executions> + </plugin> <plugin> <groupId>com.github.spotbugs</groupId> <artifactId>spotbugs-maven-plugin</artifactId> diff --git a/apache-rat-maven-parent/spotbugs-ignore.xml b/apache-rat-maven-parent/spotbugs-ignore.xml index 39e672f5..1ffa7308 100644 --- a/apache-rat-maven-parent/spotbugs-ignore.xml +++ b/apache-rat-maven-parent/spotbugs-ignore.xml @@ -16,5 +16,8 @@ limitations under the License. --> <FindBugsFilter> - + <Match> + <Class name="org.apache.rat.plugin.HelpMojo"/> + <Bug pattern='XXE_DOCUMENT'/> + </Match> </FindBugsFilter> diff --git a/apache-rat-maven-parent/tools/pom.xml b/apache-rat-maven-parent/tools/pom.xml index 83e3c977..440e35cd 100644 --- a/apache-rat-maven-parent/tools/pom.xml +++ b/apache-rat-maven-parent/tools/pom.xml @@ -104,7 +104,7 @@ <dependency> <groupId>org.apache.rat</groupId> <artifactId>apache-rat-core-tests</artifactId> - <scope>compile</scope> + <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.velocity.tools</groupId> diff --git a/apache-rat-maven-parent/tools/src/main/java/org/apache/rat/maven/MavenOption.java b/apache-rat-maven-parent/tools/src/main/java/org/apache/rat/maven/MavenOption.java index 3766ce66..33c08df9 100644 --- a/apache-rat-maven-parent/tools/src/main/java/org/apache/rat/maven/MavenOption.java +++ b/apache-rat-maven-parent/tools/src/main/java/org/apache/rat/maven/MavenOption.java @@ -18,20 +18,9 @@ */ package org.apache.rat.maven; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Locale; -import java.util.Set; -import java.util.function.Predicate; - import org.apache.commons.cli.Option; -import org.apache.commons.cli.Options; -import org.apache.commons.collections4.map.UnmodifiableMap; -import org.apache.commons.collections4.set.UnmodifiableSet; -import org.apache.commons.lang3.StringUtils; -import org.apache.rat.commandline.Arg; +import org.apache.commons.text.WordUtils; import org.apache.rat.ui.AbstractOption; -import org.apache.rat.ui.OptionFactory; import org.apache.rat.utils.CasedString; import static java.lang.String.format; @@ -40,60 +29,34 @@ import static java.lang.String.format; * A representation of a CLI option as a Maven option */ public final class MavenOption extends AbstractOption<MavenOption> { - - /** Default values for CLI options */ - public static final UnmodifiableMap<Arg, String> DEFAULT_VALUES; - /** Set of CLI options that are not supported by Maven. */ - public static final UnmodifiableSet<Option> UNSUPPORTED_SET; - /** A mapping of external name to internal name if not standard. */ - public static final UnmodifiableMap<String, String> RENAME_MAP; - /** The additional options for the maven plugin */ - static final Options ADDITIONAL_OPTIONS = new Options(); - /** Filter to remove options not supported by Maven. */ - static final Predicate<Option> MAVEN_FILTER; - /** The OptionFactory configuration for MavenOptions. */ - public static final OptionFactory.Config<MavenOption> FACTORY_CONFIG; - - static { - HashMap<String, String> map = new HashMap<>(); - map.put("addLicense", "add-license"); - RENAME_MAP = (UnmodifiableMap<String, String>) UnmodifiableMap.unmodifiableMap(map); - HashMap<Arg, String> values = new HashMap<>(); - values.put(Arg.OUTPUT_FILE, "${project.build.directory}/rat.txt"); - DEFAULT_VALUES = (UnmodifiableMap<Arg, String>) UnmodifiableMap.unmodifiableMap(values); - - Set<Option> unsupportedOptions = new HashSet<>(); - unsupportedOptions.addAll(Arg.DIR.group().getOptions()); - unsupportedOptions.addAll(Arg.LOG_LEVEL.group().getOptions()); - UNSUPPORTED_SET = (UnmodifiableSet<Option>) UnmodifiableSet.unmodifiableSet(unsupportedOptions); - - MAVEN_FILTER = option -> !(UNSUPPORTED_SET.contains(option) || option.getLongOpt() == null); - FACTORY_CONFIG = new OptionFactory.Config<>(MavenOption.MAVEN_FILTER, MavenOption::new, MavenOption.ADDITIONAL_OPTIONS); - } + /** The cased string version of the name */ + private final CasedString casedName; /** * Constructor. * * @param option The CLI option */ - public MavenOption(final Option option) { - super(option, createName(option)); + MavenOption(final MavenOptionCollection collection, final Option option, final CasedString casedName) { + super(collection, option, casedName.toCase(CasedString.StringCase.CAMEL)); + this.casedName = casedName; } - /** - * Creates the Maven element name for the specified option. - * @param option The option to process. - * @return the Maven based name in camel-case syntax. - */ - static String createName(final Option option) { - String name = StringUtils.defaultIfEmpty(option.getLongOpt(), option.getOpt()); - name = StringUtils.defaultIfEmpty(RENAME_MAP.get(name), name).toLowerCase(Locale.ROOT); - return new CasedString(CasedString.StringCase.KEBAB, name).toCase(CasedString.StringCase.CAMEL); + @Override + public String toString() { + return getName(); + } + + public String getMethodName() { + return "set" + casedName.toCase(CasedString.StringCase.PASCAL); } @Override protected String cleanupName(final Option option) { - return format("<%s>", createName(option)); + if (option == this.option) { + return format("<%s>", this.name); + } + return format("<%s>", ((MavenOptionCollection) getOptionCollection()).createName(option)); } @Override @@ -101,49 +64,33 @@ public final class MavenOption extends AbstractOption<MavenOption> { return cleanupName(option); } - @Override - public Options getAdditionalOptions() { - return ADDITIONAL_OPTIONS; - } - - @Override - public String getDefaultValue() { - Arg arg = Arg.findArg(option); - String result = DEFAULT_VALUES.get(arg); - if (result == null) { - result = arg.defaultValue(); - } - return result; - } @Override public String getExample() { - if (UNSUPPORTED_SET.contains(option)) { - return "-- not supported --"; + if (hasArgs()) { + return getExample(new String[]{getArgName() + "1", getArgName() + "2"}); } if (hasArg()) { - return format("<%1$s>%2$s</%1$s>", getName(), getArgName()); - } else { - return format("<%s />", getName()); + return getExample(getArgName()); } + return getExample(""); } - public String getExample(final String[] args) { - StringBuilder sb = new StringBuilder("<").append(getName()); + public String getExample(final String... args) { + StringBuilder sb = new StringBuilder(String.format("<%s>", getName())); if (hasArg()) { - sb.append(">"); if (hasArgs()) { sb.append(System.lineSeparator()); for (String arg : args) { - sb.append(String.format(" <%1$s>%2$s</%1$s>%n", getArgName(), arg)); + sb.append(String.format(" <%1$s>%2$s</%1$s>%n", WordUtils.uncapitalize(getArgName()), arg)); } } else { sb.append(args[0]); } - sb.append("</").append(getName()).append(">"); } else { - sb.append("/>"); + sb.append(Boolean.TRUE); } + sb.append("</").append(getName()).append(">"); return sb.toString(); } } diff --git a/apache-rat-maven-parent/tools/src/main/java/org/apache/rat/maven/MavenOptionCollection.java b/apache-rat-maven-parent/tools/src/main/java/org/apache/rat/maven/MavenOptionCollection.java index 7af662d8..eb36976f 100644 --- a/apache-rat-maven-parent/tools/src/main/java/org/apache/rat/maven/MavenOptionCollection.java +++ b/apache-rat-maven-parent/tools/src/main/java/org/apache/rat/maven/MavenOptionCollection.java @@ -1,4 +1,81 @@ package org.apache.rat.maven; -public class MavenOptionCollection { +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Function; + +import org.apache.commons.cli.Option; +import org.apache.commons.cli.Options; +import org.apache.commons.collections4.map.UnmodifiableMap; +import org.apache.commons.collections4.set.UnmodifiableSet; +import org.apache.commons.lang3.StringUtils; +import org.apache.rat.commandline.Arg; +import org.apache.rat.ui.AbstractOptionCollection; +import org.apache.rat.ui.ArgumentTracker; +import org.apache.rat.utils.CasedString; + +public class MavenOptionCollection extends AbstractOptionCollection<MavenOption> { + /** Set of CLI options that are not supported by Maven. */ + private static final UnmodifiableSet<Option> UNSUPPORTED_OPTIONS; + /** Set of Additional options defined for Maven */ + private static final Options ADDITIONAL_OPTIONS; + /** mapping of standard name to non-conflicting name. */ + private static final Map<String, String> RENAME_MAP; + /** mapping of option to default values */ + private final Map<Option, String> defaultOverride; + + static { + Map<String, String> map = new HashMap<>(); + map.put("addLicense", "add-license"); + RENAME_MAP = (UnmodifiableMap<String, String>) UnmodifiableMap.unmodifiableMap(map); + Set<Option> unsupportedOptions = new HashSet<>(); + unsupportedOptions.addAll(Arg.DIR.group().getOptions()); + unsupportedOptions.addAll(Arg.LOG_LEVEL.group().getOptions()); + UNSUPPORTED_OPTIONS = (UnmodifiableSet<Option>) UnmodifiableSet.unmodifiableSet(unsupportedOptions); + ADDITIONAL_OPTIONS = new Options(); + } + /** + * Create an Instance. + */ + public MavenOptionCollection() { + super(UNSUPPORTED_OPTIONS, new Options().addOptions(ADDITIONAL_OPTIONS)); + defaultOverride = new HashMap<>(); + } + + static String rename(final String name) { + return StringUtils.defaultIfEmpty(RENAME_MAP.get(name), name); + } + + CasedString createName(final Option option) { + List<String> pluralEndings = List.of("approved", "denied"); + String name = rename(ArgumentTracker.extractKey(option)); + CasedString casedName = new CasedString(CasedString.StringCase.KEBAB, name); + String[] segments = casedName.getSegments(); + String lastSegment = segments[segments.length - 1]; + if (option.hasArgs()) { + if (!lastSegment.endsWith("s") && !pluralEndings.contains(lastSegment)) { + segments[segments.length - 1] += "s"; + casedName = new CasedString(CasedString.StringCase.KEBAB, segments); + } + } + return casedName.as(CasedString.StringCase.CAMEL); + } + + @Override + protected Function<Option, MavenOption> getMapper() { + return option -> new MavenOption(this, option, createName(option)); + } + + @Override + protected Map<Option, String> defaultOverrides() { + return defaultOverride; + } + + @Override + public void addOverride(final Option option, final String value) { + defaultOverride.put(option, value); + } } diff --git a/apache-rat-maven-parent/tools/src/main/java/org/apache/rat/maven/PropertyReader.java b/apache-rat-maven-parent/tools/src/main/java/org/apache/rat/maven/PropertyReader.java index 2e3cea96..aa64b5f4 100644 --- a/apache-rat-maven-parent/tools/src/main/java/org/apache/rat/maven/PropertyReader.java +++ b/apache-rat-maven-parent/tools/src/main/java/org/apache/rat/maven/PropertyReader.java @@ -1,4 +1,19 @@ package org.apache.rat.maven; -public class PropertyReader { +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +public final class PropertyReader { + private PropertyReader() { + // do not instantiate + } + public static Properties read(final String propertyFileName) throws IOException { + try (InputStream is = PropertyReader.class.getClassLoader() + .getResourceAsStream(propertyFileName)) { + Properties properties = new Properties(); + properties.load(is); + return properties; + } + } } diff --git a/apache-rat-maven-parent/tools/src/main/java/org/apache/rat/maven/package-info.java b/apache-rat-maven-parent/tools/src/main/java/org/apache/rat/maven/package-info.java index 6be482b3..78f53094 100644 --- a/apache-rat-maven-parent/tools/src/main/java/org/apache/rat/maven/package-info.java +++ b/apache-rat-maven-parent/tools/src/main/java/org/apache/rat/maven/package-info.java @@ -17,6 +17,6 @@ * under the License. */ /** - * RAT Maven plugin tools. + * RAT Maven plugin and tools shared files. */ package org.apache.rat.maven; diff --git a/apache-rat-maven-parent/tools/src/main/java/org/apache/rat/maven/tools/CodeGenerator.java b/apache-rat-maven-parent/tools/src/main/java/org/apache/rat/maven/tools/CodeGenerator.java index 1f8b957f..4b6beacf 100644 --- a/apache-rat-maven-parent/tools/src/main/java/org/apache/rat/maven/tools/CodeGenerator.java +++ b/apache-rat-maven-parent/tools/src/main/java/org/apache/rat/maven/tools/CodeGenerator.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.rat.maven; +package org.apache.rat.maven.tools; import java.io.File; import java.io.FileWriter; @@ -25,6 +25,9 @@ import java.io.StringWriter; import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.util.Arrays; +import java.util.Comparator; +import java.util.Map; +import java.util.TreeMap; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.DefaultParser; @@ -35,16 +38,17 @@ import org.apache.commons.cli.ParseException; import org.apache.commons.lang3.StringUtils; import org.apache.commons.text.WordUtils; import org.apache.rat.DeprecationReporter; -import org.apache.rat.testhelpers.FileUtils; -import org.apache.rat.ui.OptionFactory; +import org.apache.rat.OptionCollectionParser; +import org.apache.rat.maven.MavenOption; +import org.apache.rat.maven.MavenOptionCollection; import org.apache.rat.utils.CasedString; +import org.apache.rat.utils.FileUtils; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.VelocityEngine; import org.apache.velocity.runtime.RuntimeConstants; import static java.lang.String.format; -import static org.apache.rat.OptionCollection.ArgumentType.NONE; /** * Generates the ${code org.apache.rat.maven.AbstractMaven} source code. @@ -54,6 +58,8 @@ public final class CodeGenerator { private static final String SYNTAX = String.format("java -cp ... %s [options]", CodeGenerator.class.getName()); /** The package name for this AbstractMaven file */ private final CasedString packageName = new CasedString(CasedString.StringCase.DOT, "org.apache.rat.maven"); + /** The maven option collection */ + private final MavenOptionCollection mavenOptionCollection = new MavenOptionCollection(); /** The base source directory */ private final String baseDirectory; /** The template for the methods within {@code AbstractMaven}. */ @@ -65,7 +71,7 @@ public final class CodeGenerator { * private constructor. * @param baseDirectory The base source directory. */ - private CodeGenerator(final String baseDirectory) { + CodeGenerator(final String baseDirectory) { this.baseDirectory = baseDirectory; final VelocityEngine velocityEngine = new VelocityEngine(); @@ -120,9 +126,9 @@ public final class CodeGenerator { * @throws IOException on IO error */ private void execute() throws IOException { - final String methods = gatherMethods(); + final Map<MavenOption, String> methods = gatherMethods(); final VelocityContext context = new VelocityContext(); - context.put("methods", methods); + context.put("methods", String.join("\n\n", methods.values())); File javaFile = Path.of(baseDirectory).resolve(packageName.toCase(CasedString.StringCase.SLASH)) .resolve("AbstractMaven.java").toFile(); FileUtils.mkDir(javaFile.getParentFile()); @@ -139,12 +145,16 @@ public final class CodeGenerator { private String createDesc(final MavenOption mavenOption) { String desc = mavenOption.getDescription(); if (desc == null) { - throw new IllegalStateException(format("Description for %s may not be null", mavenOption.getName())); - } - if (!desc.contains(".")) { - throw new IllegalStateException(format("First sentence of description for %s must end with a '.'", mavenOption.getName())); + if (!mavenOption.isDeprecated()) { + throw new IllegalStateException(format("Description for %s may not be null", mavenOption.getName())); + } + desc = ""; + } else { + if (!desc.contains(".")) { + throw new IllegalStateException(format("First sentence of description for %s must end with a '.'", mavenOption.getName())); + } } - if (mavenOption.getArgType() != NONE) { + if (mavenOption.getArgType() != OptionCollectionParser.ArgumentType.NONE) { desc = format("%s Argument%s should be %s%s. (See Argument Types for clarification)", desc, mavenOption.hasArgs() ? "s" : "", mavenOption.hasArgs() ? "" : "a ", mavenOption.getArgName()); } @@ -166,16 +176,16 @@ public final class CodeGenerator { } } - /** - * Gets method name for the method in {@code AbstractMaven.java}. - * @param mavenOption the maven option generating the method. - * @return the method name description for the method in {@code AbstractMaven.java}. - */ - private String createMethodName(final MavenOption mavenOption) { - String fname = WordUtils.capitalize(mavenOption.getName()); - return (mavenOption.hasArgs() && !(fname.endsWith("s") || fname.endsWith("Approved") || fname.endsWith("Denied"))) ? - fname + "s" : fname; - } +// /** +// * Gets method name for the method in {@code AbstractMaven.java}. +// * @param mavenOption the maven option generating the method. +// * @return the method name description for the method in {@code AbstractMaven.java}. +// */ +// private String createMethodName(final MavenOption mavenOption) { +// String fname = mavenOption.getMethodName(); +// return (mavenOption.hasArgs() && !(fname.endsWith("s") || fname.endsWith("Approved") || fname.endsWith("Denied"))) ? +// fname + "s" : fname; +// } /** * Gets parameter annotation for the method in {@code AbstractMaven.java}. @@ -204,21 +214,22 @@ public final class CodeGenerator { * Gathers all method definitions into a single string. * @return the definition of all the methods. */ - private String gatherMethods() { + Map<MavenOption, String> gatherMethods() { + final Map<MavenOption, String> methods = new TreeMap<>(Comparator.comparing(MavenOption::getName)); final VelocityContext context = new VelocityContext(); - final StringWriter methodWriter = new StringWriter(); - for (MavenOption mavenOption : OptionFactory.getOptions(MavenOption.FACTORY_CONFIG).toList()) { + mavenOptionCollection.getMappedOptions().forEach(mavenOption -> { + final StringWriter methodWriter = new StringWriter(); context.put("option", mavenOption); String desc = createDesc(mavenOption); context.put("desc", desc); context.put("argDesc", createArgDesc(mavenOption, desc)); - String functionName = createMethodName(mavenOption); - context.put("fname", functionName); + context.put("fname", mavenOption.getMethodName()); context.put("parameterAnnotation", createParameterAnnotation(mavenOption, mavenOption.getName())); context.put("args", (mavenOption.hasArg() ? "String" : "boolean") + (mavenOption.hasArgs() ? "[]" : "")); - methodTemplate.merge(context, methodWriter); - } - return methodWriter.toString(); + + methods.put(mavenOption, methodWriter.toString()); + }); + return methods; } } diff --git a/apache-rat-maven-parent/tools/src/main/java/org/apache/rat/maven/tools/TestGenerator.java b/apache-rat-maven-parent/tools/src/main/java/org/apache/rat/maven/tools/TestGenerator.java index 41df233e..400eaa4f 100644 --- a/apache-rat-maven-parent/tools/src/main/java/org/apache/rat/maven/tools/TestGenerator.java +++ b/apache-rat-maven-parent/tools/src/main/java/org/apache/rat/maven/tools/TestGenerator.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.rat.maven; +package org.apache.rat.maven.tools; import java.io.File; import java.io.FileWriter; @@ -27,6 +27,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.Arrays; import java.util.Locale; +import java.util.Properties; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.DefaultParser; @@ -35,13 +36,15 @@ import org.apache.commons.cli.Option; import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; import org.apache.commons.lang3.tuple.Pair; -import org.apache.commons.text.WordUtils; import org.apache.rat.DeprecationReporter; import org.apache.rat.VersionInfo; -import org.apache.rat.testhelpers.FileUtils; +import org.apache.rat.maven.MavenOption; +import org.apache.rat.maven.MavenOptionCollection; +import org.apache.rat.maven.PropertyReader; import org.apache.rat.testhelpers.data.ReportTestDataProvider; import org.apache.rat.testhelpers.data.TestData; import org.apache.rat.utils.CasedString; +import org.apache.rat.utils.FileUtils; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.VelocityEngine; @@ -56,25 +59,22 @@ public final class TestGenerator { /** They syntax for this command */ private static final String SYNTAX = String.format("java -cp ... %s [options]", TestGenerator.class.getName()); /** The package name as a cased string */ - private final CasedString packageName; + private CasedString packageName; /** The resource directory where the test resources will be written */ - private final Path resourceDirectory; + private Path resourceDirectory; /** The directory where the test classes will be written*/ - private final Path testDirectory; + private Path testDirectory; /** The template for the pom.xml files */ private final Template pomTemplate; /** The template for the test class file */ private final Template javaTemplate; /** The template for the methods within the test class */ private final Template methodTemplate; + /** The Maven properties */ + private final Properties properties; - - @SuppressFBWarnings("PATH_TRAVERSAL_IN") - private TestGenerator(final String packageName, final String resourceDirectory, final String testDirectory) { - this.packageName = new CasedString(CasedString.StringCase.DOT, packageName); - this.resourceDirectory = Paths.get(resourceDirectory); - this.testDirectory = Paths.get(testDirectory).resolve(this.packageName.toCase(CasedString.StringCase.SLASH)); - + public TestGenerator() throws IOException { + properties = PropertyReader.read("app.properties"); VelocityEngine velocityEngine = new VelocityEngine(); velocityEngine.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath"); velocityEngine.setProperty("classpath.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); @@ -91,6 +91,14 @@ public final class TestGenerator { methodTemplate = velocityEngine.getTemplate(CasedString.StringCase.SLASH.assemble(nameParts)); } + @SuppressFBWarnings("PATH_TRAVERSAL_IN") + TestGenerator(final String packageName, final String resourceDirectory, final String testDirectory) throws IOException { + this(); + this.packageName = new CasedString(CasedString.StringCase.DOT, packageName); + this.resourceDirectory = Paths.get(resourceDirectory); + this.testDirectory = Paths.get(testDirectory).resolve(this.packageName.toCase(CasedString.StringCase.SLASH)); + } + /** * Gets the resource path. * @return the resource path. @@ -146,17 +154,25 @@ public final class TestGenerator { * Execute the generation. * @throws IOException on IO error. */ - private void execute() throws IOException { + void execute() throws IOException { VelocityContext context = new VelocityContext(); context.put("packageName", packageName.toString()); final VersionInfo versionInfo = new VersionInfo(TestGenerator.class); - context.put("rat_version", versionInfo.getSpecVersion()); + context.put("rat_version", ratVersion()); context.put("plugin_version", versionInfo.getVersion()); context.put("tests", writeTestPoms(context)); writeTestFiles(context); } + public String ratVersion() { + return properties.getProperty("rat.version"); + } + + public String pluginVersion() { + return properties.getProperty("rat.plugin.version"); + } + /** * Write the {@code MavenTest.java} file * @param context The velocity context to write the test file with. @@ -170,6 +186,26 @@ public final class TestGenerator { } } + public String buildPom(final MavenOptionCollection optionCollection, final TestData testData) { + final VelocityContext context = new VelocityContext(); + CasedString casedTestName = new CasedString(CasedString.StringCase.CAMEL, testData.getClassName()); + context.put("artifactId", casedTestName.toCase(CasedString.StringCase.KEBAB).toLowerCase(Locale.ROOT)); + context.put("testName", testData.getTestName()); + context.put("rat_version", ratVersion()); + context.put("plugin_version", pluginVersion()); + StringBuilder configuration = new StringBuilder(); + for (Pair<Option, String[]> pair : testData.getArgs()) { + if (pair.getKey() != null) { + MavenOption option = optionCollection.getMappedOption(pair.getKey()); + configuration.append(option.getExample(pair.getRight())).append(System.lineSeparator()); + } + } + context.put("rat_configuration", configuration.toString()); + StringWriter writer = new StringWriter(); + pomTemplate.merge(context, writer); + return writer.toString(); + } + /** * Write the test poms for all the supported options. * Generates method definitions (one for each pom file) to be included in {@code MavenTest.java}. @@ -178,11 +214,12 @@ public final class TestGenerator { * @throws IOException on IO error */ private String writeTestPoms(final VelocityContext context) throws IOException { - + MavenOptionCollection optionCollection = new MavenOptionCollection(); StringWriter funcCode = new StringWriter(); - for (final TestData testData : new ReportTestDataProvider().getOptionTests(MavenOption.UNSUPPORTED_SET)) { - context.put("option", testData.getOption()); + for (final TestData testData : new ReportTestDataProvider().getOptionTests(optionCollection)) { + String config = buildPom(optionCollection, testData); + //context.put("option", testData.getOption()); // relative directory to test resources. Path testDir = Paths.get("src/test/resources").resolve(packageName.toCase(CasedString.StringCase.SLASH)) .resolve("stubs").resolve(testData.getTestName()); @@ -194,26 +231,14 @@ public final class TestGenerator { Path testPath = resourcePath().resolve(testData.getTestName()); context.put("baseDir", testPath.toFile().getAbsolutePath()); FileUtils.mkDir(testPath.toFile()); - CasedString casedTestName = new CasedString(CasedString.StringCase.CAMEL, testData.getClassName()); - context.put("artifactId", casedTestName.toCase(CasedString.StringCase.KEBAB).toLowerCase(Locale.ROOT)); + //CasedString casedTestName = new CasedString(CasedString.StringCase.CAMEL, testData.getClassName()); context.put("testName", testData.getTestName()); - context.put("stubName", testData.getClassName()); - context.put("funcName", WordUtils.uncapitalize(testData.getClassName())); - - StringBuilder configuration = new StringBuilder(); - for (Pair<Option, String[]> pair : testData.getArgs()) { - if (pair.getKey() != null) { - MavenOption option = new MavenOption(pair.getKey()); - configuration.append(option.getExample(pair.getRight())).append(System.lineSeparator()); - } - } - context.put("rat_configuration", configuration.toString()); + methodTemplate.merge(context, funcCode); File pomFile = testPath.resolve("pom.xml").toFile(); try (FileWriter writer = new FileWriter(pomFile, StandardCharsets.UTF_8)) { - pomTemplate.merge(context, writer); + writer.append(buildPom(optionCollection, testData)); } - methodTemplate.merge(context, funcCode); } return funcCode.toString(); } diff --git a/apache-rat-maven-parent/tools/src/main/resources/org/apache/rat/maven/tools/AbstractMaven.vm b/apache-rat-maven-parent/tools/src/main/resources/org/apache/rat/maven/tools/AbstractMaven.vm index 1f0cad12..b0935c5a 100644 --- a/apache-rat-maven-parent/tools/src/main/resources/org/apache/rat/maven/tools/AbstractMaven.vm +++ b/apache-rat-maven-parent/tools/src/main/resources/org/apache/rat/maven/tools/AbstractMaven.vm @@ -19,15 +19,11 @@ package org.apache.rat.maven; -import java.util.List; -import java.util.stream.Collectors; - import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugins.annotations.Parameter; import org.apache.rat.commandline.Arg; import org.apache.rat.config.exclusion.StandardCollection; import org.apache.rat.ui.ArgumentTracker; -import org.apache.rat.ui.OptionFactory; /** * Generated class to provide Maven support for standard RAT command line options @@ -37,10 +33,12 @@ import org.apache.rat.ui.OptionFactory; public abstract class AbstractMaven extends AbstractMojo { /** The arguments that have been set */ protected final ArgumentTracker argumentTracker; + /** The collection of Maven options */ + protected final MavenOptionCollection mavenOptionCollection; protected AbstractMaven() { - List<MavenOption> mavenList = OptionFactory.getOptions(MavenOption.FACTORY_CONFIG).collect(Collectors.toList()); - argumentTracker = new ArgumentTracker(mavenList); + mavenOptionCollection = new MavenOptionCollection(); + argumentTracker = new ArgumentTracker(mavenOptionCollection.getMappedOptions().toList()); argumentTracker.addArg(ArgumentTracker.extractKey(Arg.EXCLUDE_STD.option()), StandardCollection.MAVEN.name()); } diff --git a/apache-rat-maven-parent/tools/src/main/resources/org/apache/rat/maven/tools/AbstractMavenFunc.vm b/apache-rat-maven-parent/tools/src/main/resources/org/apache/rat/maven/tools/AbstractMavenFunc.vm index 0ff12218..a3c20f6c 100644 --- a/apache-rat-maven-parent/tools/src/main/resources/org/apache/rat/maven/tools/AbstractMavenFunc.vm +++ b/apache-rat-maven-parent/tools/src/main/resources/org/apache/rat/maven/tools/AbstractMavenFunc.vm @@ -17,7 +17,9 @@ * under the License. *# /** +#if (${desc} != "") * ${desc} +#end * @param ${option.getName} ${argDesc} #if (${option.isDeprecated}) * @deprecated ${option.getDeprecated} @@ -27,7 +29,7 @@ @Deprecated #end ${parameterAnnotation} - public void set${fname}(final ${args} ${option.getName}) { + public void ${fname}(final ${args} ${option.getName}) { #if (${option.hasArg}) #if (${option.hasArgs}) argumentTracker.addArg("${option.keyValue}", ${option.getName}); diff --git a/apache-rat-maven-parent/tools/src/test/java/org/apache/rat/maven/MavenOptionCollectionTest.java b/apache-rat-maven-parent/tools/src/test/java/org/apache/rat/maven/MavenOptionCollectionTest.java index 3eaf0667..5bad43ec 100644 --- a/apache-rat-maven-parent/tools/src/test/java/org/apache/rat/maven/MavenOptionCollectionTest.java +++ b/apache-rat-maven-parent/tools/src/test/java/org/apache/rat/maven/MavenOptionCollectionTest.java @@ -1,17 +1,23 @@ package org.apache.rat.maven; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; +import java.util.stream.Stream; import org.apache.commons.cli.DeprecatedAttributes; import org.apache.commons.cli.Option; import org.apache.rat.commandline.Arg; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import static org.assertj.core.api.Assertions.assertThat; -public class MavenOptionTest { +public class MavenOptionCollectionTest { @Test - void deprecatedTest() { + void deprecatedOptionTest() { final MavenOptionCollection mavenOptionCollection = new MavenOptionCollection(); MavenOption opt = mavenOptionCollection.getMappedOption(Arg.EDIT_COPYRIGHT.find("copyright")); @@ -47,6 +53,45 @@ public class MavenOptionTest { } finally { assertThat(new MavenOptionCollection().additionalOptions().getOptions()).isEmpty(); } + } + + @ParameterizedTest + @MethodSource("namingTestData") + public void namingTest(String expectedName, Option option) { + MavenOptionCollection collection = new MavenOptionCollection(); + MavenOption mavenOption = collection.getMappedOption(option); + assertThat(mavenOption.getName()).isEqualTo(expectedName); + } + + static Stream<Arguments> namingTestData() { + List<Arguments> lst = new ArrayList<>(); + Option option = Option.builder().longOpt("multiple-args").hasArgs().build(); + lst.add(Arguments.of("multipleArgs", option)); + option = Option.builder().longOpt("multiple-arg-single-name").hasArgs().build(); + lst.add(Arguments.of("multipleArgSingleNames", option)); + option = Option.builder().longOpt("multiple-args-approved").hasArgs().build(); + lst.add(Arguments.of("multipleArgsApproved", option)); + option = Option.builder().longOpt("multiple-args-denied").hasArgs().build(); + lst.add(Arguments.of("multipleArgsDenied", option)); + + option = Option.builder().longOpt("single-args").hasArg().build(); + lst.add(Arguments.of("singleArgs", option)); + option = Option.builder().longOpt("single-arg-single-name").hasArg().build(); + lst.add(Arguments.of("singleArgSingleName", option)); + option = Option.builder().longOpt("single-arg-approved").hasArg().build(); + lst.add(Arguments.of("singleArgApproved", option)); + option = Option.builder().longOpt("single-args-denied").hasArg().build(); + lst.add(Arguments.of("singleArgsDenied", option)); + + option = Option.builder().longOpt("no-args").build(); + lst.add(Arguments.of("noArgs", option)); + option = Option.builder().longOpt("no-arg-single-name").build(); + lst.add(Arguments.of("noArgSingleName", option)); + option = Option.builder().longOpt("no-args-approved").build(); + lst.add(Arguments.of("noArgsApproved", option)); + option = Option.builder().longOpt("no-args-denied").build(); + lst.add(Arguments.of("noArgsDenied", option)); + return lst.stream(); } } diff --git a/apache-rat-maven-parent/tools/src/test/java/org/apache/rat/maven/PropertyReaderTest.java b/apache-rat-maven-parent/tools/src/test/java/org/apache/rat/maven/PropertyReaderTest.java index fc7f65dd..f1827230 100644 --- a/apache-rat-maven-parent/tools/src/test/java/org/apache/rat/maven/PropertyReaderTest.java +++ b/apache-rat-maven-parent/tools/src/test/java/org/apache/rat/maven/PropertyReaderTest.java @@ -1,4 +1,17 @@ package org.apache.rat.maven; +import java.io.IOException; +import java.util.Properties; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + public class PropertyReaderTest { + @Test + public void testReadProperties() throws IOException { + Properties properties = PropertyReader.read("app.properties"); + assertThat(properties).isNotEmpty(); + assertThat(properties.getProperty("rat.version")).isNotEmpty(); + assertThat(properties.getProperty("rat.plugin.version")).isNotEmpty(); + } } diff --git a/apache-rat-maven-parent/tools/src/test/java/org/apache/rat/maven/tools/CodeGeneratorTest.java b/apache-rat-maven-parent/tools/src/test/java/org/apache/rat/maven/tools/CodeGeneratorTest.java index 980049f9..93132026 100644 --- a/apache-rat-maven-parent/tools/src/test/java/org/apache/rat/maven/tools/CodeGeneratorTest.java +++ b/apache-rat-maven-parent/tools/src/test/java/org/apache/rat/maven/tools/CodeGeneratorTest.java @@ -1,4 +1,38 @@ package org.apache.rat.maven.tools; +import java.nio.file.Path; +import java.util.Map; +import org.apache.rat.commandline.Arg; +import org.apache.rat.maven.MavenOption; +import org.apache.rat.maven.MavenOptionCollection; +import org.apache.rat.testhelpers.TextUtils; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + public class CodeGeneratorTest { + @TempDir + private Path testPath; + private CodeGenerator codeGenerator; + + CodeGeneratorTest() {} + + @BeforeEach + void setup() { + codeGenerator = new CodeGenerator(testPath.toString()); + } + + @Test + public void testGenerateMethods() throws Exception { + MavenOptionCollection mavenOptionCollection = new MavenOptionCollection(); + Map<MavenOption, String> methods = codeGenerator.gatherMethods(); + MavenOption mavenOption = mavenOptionCollection.getMappedOption(Arg.EXCLUDE.option()); + String methodText = methods.get(mavenOption); + TextUtils.assertContains("public void setInputExcludes(final String[] inputExcludes) {", methodText); + + mavenOption = mavenOptionCollection.getMappedOption(Arg.FAMILIES_APPROVED.option()); + methodText = methods.get(mavenOption); + TextUtils.assertContains("public void setLicenseFamiliesApproved(final String licenseFamiliesApproved) {", methodText); + TextUtils.assertContainsExactly(1, "public void set", methodText); + } } diff --git a/apache-rat-maven-parent/tools/src/test/java/org/apache/rat/maven/tools/TestGeneratorTest.java b/apache-rat-maven-parent/tools/src/test/java/org/apache/rat/maven/tools/TestGeneratorTest.java index bb3dae66..0f6fef57 100644 --- a/apache-rat-maven-parent/tools/src/test/java/org/apache/rat/maven/tools/TestGeneratorTest.java +++ b/apache-rat-maven-parent/tools/src/test/java/org/apache/rat/maven/tools/TestGeneratorTest.java @@ -1,4 +1,52 @@ package org.apache.rat.maven.tools; +import java.io.IOException; +import java.nio.file.Path; +import java.util.Collection; +import java.util.List; +import java.util.Set; +import org.apache.commons.cli.Option; +import org.apache.rat.commandline.Arg; +import org.apache.rat.maven.MavenOption; +import org.apache.rat.maven.MavenOptionCollection; +import org.apache.rat.testhelpers.TextUtils; +import org.apache.rat.testhelpers.data.ReportTestDataProvider; +import org.apache.rat.testhelpers.data.TestData; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + public class TestGeneratorTest { + + @TempDir + private Path testPath; + private TestGenerator testGenerator; + private MavenOptionCollection optionCollection = new MavenOptionCollection(); + TestGeneratorTest() {} + + @BeforeEach + void setup() throws IOException { + testGenerator = new TestGenerator("package.name", testPath.resolve("resources").toString(), testPath.resolve("source").toString()); + } + + private List<TestData> testsFor(Option option) { + Set<TestData> testDataList = new ReportTestDataProvider().getOptionTests(optionCollection); + return testDataList.stream().filter(td -> td.getOption() == null ? option == null : td.getOption().equals(option)).toList(); + } + + @ParameterizedTest + @MethodSource("optionsSource") + void test(MavenOption mavenOption) throws IOException { + List<TestData> testDataList = testsFor(mavenOption.getOption()); + for (final TestData testData : testDataList) { + String pomText = testGenerator.buildPom(optionCollection, testData); + TextUtils.assertContains("<" + mavenOption.getName(), pomText); + } + } + + static List<MavenOption> optionsSource() { + return new MavenOptionCollection().getMappedOptions().toList(); + } }
