You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@creadur.apache.org by po...@apache.org on 2019/10/29 21:27:32 UTC
[creadur-rat] branch feature/RAT-259 created (now c695ca5)
This is an automated email from the ASF dual-hosted git repository.
pottlinger pushed a change to branch feature/RAT-259
in repository https://gitbox.apache.org/repos/asf/creadur-rat.git.
at c695ca5 RAT-259: Extract CLI class
This branch includes the following new commits:
new c695ca5 RAT-259: Extract CLI class
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
[creadur-rat] 01/01: RAT-259: Extract CLI class
Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
pottlinger pushed a commit to branch feature/RAT-259
in repository https://gitbox.apache.org/repos/asf/creadur-rat.git
commit c695ca5e49761bca62c824b05207f01f809b14af
Author: Hugo Hirsch <gi...@hugo-hirsch.de>
AuthorDate: Tue Oct 29 22:27:21 2019 +0100
RAT-259: Extract CLI class
---
.../src/main/java/org/apache/rat/Report.java | 227 +--------------------
.../rat/{Report.java => cli/RatCommandLine.java} | 198 +-----------------
.../src/test/java/org/apache/rat/ReportTest.java | 5 -
.../org/apache/rat/cli/RatCommandLineTest.java | 36 ++++
apache-rat/pom.xml | 4 +-
5 files changed, 55 insertions(+), 415 deletions(-)
diff --git a/apache-rat-core/src/main/java/org/apache/rat/Report.java b/apache-rat-core/src/main/java/org/apache/rat/Report.java
index 66fd24d..c0c1e23 100644
--- a/apache-rat-core/src/main/java/org/apache/rat/Report.java
+++ b/apache-rat-core/src/main/java/org/apache/rat/Report.java
@@ -18,10 +18,6 @@
*/
package org.apache.rat;
-import org.apache.commons.cli.*;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.filefilter.*;
-import org.apache.commons.lang3.StringUtils;
import org.apache.rat.api.RatException;
import org.apache.rat.report.IReportable;
import org.apache.rat.report.RatReport;
@@ -34,222 +30,14 @@ import org.apache.rat.walker.DirectoryWalker;
import javax.xml.transform.TransformerConfigurationException;
import java.io.*;
-import java.nio.charset.Charset;
-import java.util.Arrays;
-import java.util.List;
-import java.util.regex.PatternSyntaxException;
-
public class Report {
- private static final String EXCLUDE_CLI = "e";
- private static final String EXCLUDE_FILE_CLI = "E";
- private static final String STYLESHEET_CLI = "s";
- private static final String HELP = "h";
-
- public static final void main(String[] args) throws Exception {
- final ReportConfiguration configuration = new ReportConfiguration();
- configuration.setHeaderMatcher(Defaults.createDefaultMatcher());
- configuration.setApproveDefaultLicenses(true);
- Options opts = buildOptions();
-
- CommandLine cl = null;
- try {
- cl = new DefaultParser().parse(opts, args);
- } catch (ParseException e) {
- System.err.println("Please use the \"--help\" option to see a list of valid commands and options");
- System.exit(1);
- return; // dummy return (won't be reached) to avoid Eclipse complaint about possible NPE for "cl"
- }
-
- if (cl.hasOption(HELP)) {
- printUsage(opts);
- }
-
- args = cl.getArgs();
- if (args == null || args.length != 1) {
- printUsage(opts);
- } else {
- Report report = new Report(args[0]);
-
- if (cl.hasOption('a') || cl.hasOption('A')) {
- configuration.setAddingLicenses(true);
- configuration.setAddingLicensesForced(cl.hasOption('f'));
- configuration.setCopyrightMessage(cl.getOptionValue("c"));
- }
-
- if (cl.hasOption(EXCLUDE_CLI)) {
- String[] excludes = cl.getOptionValues(EXCLUDE_CLI);
- if (excludes != null) {
- final FilenameFilter filter = parseExclusions(Arrays.asList(excludes));
- report.setInputFileFilter(filter);
- }
- } else if (cl.hasOption(EXCLUDE_FILE_CLI)) {
- String excludeFileName = cl.getOptionValue(EXCLUDE_FILE_CLI);
- if (excludeFileName != null) {
- final FilenameFilter filter = parseExclusions(FileUtils.readLines(new File(excludeFileName), Charset.forName("UTF-8")));
- report.setInputFileFilter(filter);
- }
- }
- if (cl.hasOption('x')) {
- report.report(System.out, configuration);
- } else {
- if (!cl.hasOption(STYLESHEET_CLI)) {
- report.styleReport(System.out, configuration);
- } else {
- String[] style = cl.getOptionValues(STYLESHEET_CLI);
- if (style.length != 1) {
- System.err.println("please specify a single stylesheet");
- System.exit(1);
- }
- try {
- report(System.out,
- report.getDirectory(System.out),
- new FileInputStream(style[0]),
- configuration);
- } catch (FileNotFoundException fnfe) {
- System.err.println("stylesheet " + style[0]
- + " doesn't exist");
- System.exit(1);
- }
- }
- }
- }
- }
-
- static FilenameFilter parseExclusions(List<String> excludes) throws IOException {
- final OrFileFilter orFilter = new OrFileFilter();
- int ignoredLines = 0;
- for (String exclude : excludes) {
- try {
- // skip comments
- if(exclude.startsWith("#") || StringUtils.isEmpty(exclude)) {
- ignoredLines++;
- continue;
- }
-
- String exclusion = exclude.trim();
- // interpret given patterns as regular expression, direct file names or wildcards to give users more choices to configure exclusions
- orFilter.addFileFilter(new RegexFileFilter(exclusion));
- orFilter.addFileFilter(new NameFileFilter(exclusion));
- orFilter.addFileFilter(new WildcardFileFilter(exclusion));
- } catch(PatternSyntaxException e) {
- System.err.println("Will skip given exclusion '" + exclude + "' due to " + e);
- }
- }
- System.out.println("Ignored " + ignoredLines + " lines in your exclusion files as comments or empty lines.");
- return new NotFileFilter(orFilter);
- }
-
- private static Options buildOptions() {
- Options opts = new Options();
-
- Option help = new Option(HELP, "help", false,
- "Print help for the RAT command line interface and exit");
- opts.addOption(help);
-
- OptionGroup addLicenseGroup = new OptionGroup();
- String addLicenseDesc = "Add the default license header to any file with an unknown license that is not in the exclusion list. " +
- "By default new files will be created with the license header, " +
- "to force the modification of existing files use the --force option.";
-
- // RAT-85/RAT-203: Deprecated! added only for convenience and for backwards compatibility
- Option addLicence = new Option(
- "a",
- "addLicence",
- false,
- addLicenseDesc);
- addLicenseGroup.addOption(addLicence);
- Option addLicense = new Option(
- "A",
- "addLicense",
- false,
- addLicenseDesc);
- addLicenseGroup.addOption(addLicense);
- opts.addOptionGroup(addLicenseGroup);
-
- Option write = new Option(
- "f",
- "force",
- false,
- "Forces any changes in files to be written directly to the source files (i.e. new files are not created)");
- opts.addOption(write);
-
- Option copyright = new Option(
- "c",
- "copyright",
- true,
- "The copyright message to use in the license headers, usually in the form of \"Copyright 2008 Foo\"");
- opts.addOption(copyright);
-
- final Option exclude = Option.builder(EXCLUDE_CLI)
- .argName("expression")
- .longOpt("exclude")
- .hasArgs()
- .desc("Excludes files matching wildcard <expression>. " +
- "Note that --dir is required when using this parameter. " +
- "Allows multiple arguments.")
- .build();
- opts.addOption(exclude);
-
- final Option excludeFile = Option.builder(EXCLUDE_FILE_CLI)
- .argName("fileName")
- .longOpt("exclude-file")
- .hasArgs()
- .desc("Excludes files matching regular expression in <file> " +
- "Note that --dir is required when using this parameter. ")
- .build();
- opts.addOption(excludeFile);
-
- Option dir = new Option(
- "d",
- "dir",
- false,
- "Used to indicate source when using --exclude");
- opts.addOption(dir);
-
- OptionGroup outputType = new OptionGroup();
-
- Option xml = new Option(
- "x",
- "xml",
- false,
- "Output the report in raw XML format. Not compatible with -s");
- outputType.addOption(xml);
-
- Option xslt = new Option(STYLESHEET_CLI,
- "stylesheet",
- true,
- "XSLT stylesheet to use when creating the"
- + " report. Not compatible with -x");
- outputType.addOption(xslt);
- opts.addOptionGroup(outputType);
-
- return opts;
- }
-
- private static void printUsage(Options opts) {
- HelpFormatter f = new HelpFormatter();
- String header = "\nAvailable options";
-
- String footer = "\nNOTE:\n" +
- "Rat is really little more than a grep ATM\n" +
- "Rat is also rather memory hungry ATM\n" +
- "Rat is very basic ATM\n" +
- "Rat highlights possible issues\n" +
- "Rat reports require interpretation\n" +
- "Rat often requires some tuning before it runs well against a project\n" +
- "Rat relies on heuristics: it may miss issues\n";
-
- f.printHelp("java -jar apache-rat/target/apache-rat-CURRENT-VERSION.jar [options] [DIR|TARBALL]",
- header, opts, footer, false);
- System.exit(0);
- }
- private final String baseDirectory;
+ private final File baseDirectory;
private FilenameFilter inputFileFilter = null;
- private Report(String baseDirectory) {
+ public Report(File baseDirectory) {
this.baseDirectory = baseDirectory;
}
@@ -293,21 +81,20 @@ public class Report {
return null;
}
- private IReportable getDirectory(PrintStream out) {
- File base = new File(baseDirectory);
- if (!base.exists()) {
+ public IReportable getDirectory(PrintStream out) {
+ if (!baseDirectory.exists()) {
out.print("ERROR: ");
out.print(baseDirectory);
out.print(" does not exist.\n");
return null;
}
- if (base.isDirectory()) {
- return new DirectoryWalker(base, inputFileFilter);
+ if (baseDirectory.isDirectory()) {
+ return new DirectoryWalker(baseDirectory, inputFileFilter);
}
try {
- return new ArchiveWalker(base, inputFileFilter);
+ return new ArchiveWalker(baseDirectory, inputFileFilter);
} catch (IOException ex) {
out.print("ERROR: ");
out.print(baseDirectory);
diff --git a/apache-rat-core/src/main/java/org/apache/rat/Report.java b/apache-rat-core/src/main/java/org/apache/rat/cli/RatCommandLine.java
similarity index 55%
copy from apache-rat-core/src/main/java/org/apache/rat/Report.java
copy to apache-rat-core/src/main/java/org/apache/rat/cli/RatCommandLine.java
index 66fd24d..05da1a9 100644
--- a/apache-rat-core/src/main/java/org/apache/rat/Report.java
+++ b/apache-rat-core/src/main/java/org/apache/rat/cli/RatCommandLine.java
@@ -16,31 +16,23 @@
* specific language governing permissions and limitations *
* under the License. *
*/
-package org.apache.rat;
+package org.apache.rat.cli;
import org.apache.commons.cli.*;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.*;
import org.apache.commons.lang3.StringUtils;
-import org.apache.rat.api.RatException;
-import org.apache.rat.report.IReportable;
-import org.apache.rat.report.RatReport;
-import org.apache.rat.report.claim.ClaimStatistic;
-import org.apache.rat.report.xml.XmlReportFactory;
-import org.apache.rat.report.xml.writer.IXmlWriter;
-import org.apache.rat.report.xml.writer.impl.base.XmlWriter;
-import org.apache.rat.walker.ArchiveWalker;
-import org.apache.rat.walker.DirectoryWalker;
+import org.apache.rat.Defaults;
+import org.apache.rat.Report;
+import org.apache.rat.ReportConfiguration;
-import javax.xml.transform.TransformerConfigurationException;
import java.io.*;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.List;
import java.util.regex.PatternSyntaxException;
-
-public class Report {
+public class RatCommandLine {
private static final String EXCLUDE_CLI = "e";
private static final String EXCLUDE_FILE_CLI = "E";
private static final String STYLESHEET_CLI = "s";
@@ -69,7 +61,7 @@ public class Report {
if (args == null || args.length != 1) {
printUsage(opts);
} else {
- Report report = new Report(args[0]);
+ Report report = new Report(new File(args[0]));
if (cl.hasOption('a') || cl.hasOption('A')) {
configuration.setAddingLicenses(true);
@@ -102,7 +94,7 @@ public class Report {
System.exit(1);
}
try {
- report(System.out,
+ report.report(System.out,
report.getDirectory(System.out),
new FileInputStream(style[0]),
configuration);
@@ -122,7 +114,7 @@ public class Report {
for (String exclude : excludes) {
try {
// skip comments
- if(exclude.startsWith("#") || StringUtils.isEmpty(exclude)) {
+ if (exclude.startsWith("#") || StringUtils.isEmpty(exclude)) {
ignoredLines++;
continue;
}
@@ -132,7 +124,7 @@ public class Report {
orFilter.addFileFilter(new RegexFileFilter(exclusion));
orFilter.addFileFilter(new NameFileFilter(exclusion));
orFilter.addFileFilter(new WildcardFileFilter(exclusion));
- } catch(PatternSyntaxException e) {
+ } catch (PatternSyntaxException e) {
System.err.println("Will skip given exclusion '" + exclude + "' due to " + e);
}
}
@@ -140,6 +132,7 @@ public class Report {
return new NotFileFilter(orFilter);
}
+
private static Options buildOptions() {
Options opts = new Options();
@@ -245,175 +238,4 @@ public class Report {
System.exit(0);
}
- private final String baseDirectory;
-
- private FilenameFilter inputFileFilter = null;
-
- private Report(String baseDirectory) {
- this.baseDirectory = baseDirectory;
- }
-
- /**
- * Sets the current filter used to select files.
- *
- * @param inputFileFilter filter, or null when no filter has been set
- */
- public void setInputFileFilter(FilenameFilter inputFileFilter) {
- this.inputFileFilter = inputFileFilter;
- }
-
- /**
- * @param out - the output stream to receive the styled report
- * @return the currently collected numerical statistics.
- * @throws Exception in case of errors.
- * @deprecated use {@link #report(PrintStream, ReportConfiguration)} instead
- */
- @Deprecated
- public ClaimStatistic report(PrintStream out) throws Exception {
- final ReportConfiguration configuration = new ReportConfiguration();
- configuration.setHeaderMatcher(Defaults.createDefaultMatcher());
- configuration.setApproveDefaultLicenses(true);
- return report(out, configuration);
- }
-
- /**
- * @param out - the output stream to receive the styled report
- * @param configuration - current configuration options.
- * @return the currently collected numerical statistics.
- * @throws Exception in case of errors.
- * @since Rat 0.8
- */
- public ClaimStatistic report(PrintStream out,
- ReportConfiguration configuration)
- throws Exception {
- final IReportable base = getDirectory(out);
- if (base != null) {
- return report(base, new OutputStreamWriter(out), configuration);
- }
- return null;
- }
-
- private IReportable getDirectory(PrintStream out) {
- File base = new File(baseDirectory);
- if (!base.exists()) {
- out.print("ERROR: ");
- out.print(baseDirectory);
- out.print(" does not exist.\n");
- return null;
- }
-
- if (base.isDirectory()) {
- return new DirectoryWalker(base, inputFileFilter);
- }
-
- try {
- return new ArchiveWalker(base, inputFileFilter);
- } catch (IOException ex) {
- out.print("ERROR: ");
- out.print(baseDirectory);
- out.print(" is not valid gzip data.\n");
- return null;
- }
- }
-
- /**
- * Output a report in the default style and default license
- * header matcher.
- *
- * @param out - the output stream to receive the styled report
- * @throws Exception in case of errors.
- * @deprecated use {@link #styleReport(PrintStream, ReportConfiguration)} instead
- */
- @Deprecated
- public void styleReport(PrintStream out) throws Exception {
- final ReportConfiguration configuration = new ReportConfiguration();
- configuration.setHeaderMatcher(Defaults.createDefaultMatcher());
- configuration.setApproveDefaultLicenses(true);
- styleReport(out, configuration);
- }
-
- /**
- * Output a report in the default style and default license
- * header matcher.
- *
- * @param out - the output stream to receive the styled report
- * @param configuration the configuration to use
- * @throws Exception in case of errors.
- * @since Rat 0.8
- */
- public void styleReport(PrintStream out,
- ReportConfiguration configuration)
- throws Exception {
- final IReportable base = getDirectory(out);
- if (base != null) {
- InputStream style = Defaults.getDefaultStyleSheet();
- report(out, base, style, configuration);
- }
- }
-
- /**
- * Output a report that is styled using a defined stylesheet.
- *
- * @param out the stream to write the report to
- * @param base the files or directories to report on
- * @param style an input stream representing the stylesheet to use for styling the report
- * @param pConfiguration current report configuration.
- * @throws IOException in case of I/O errors.
- * @throws TransformerConfigurationException in case of XML errors.
- * @throws InterruptedException in case of threading errors.
- * @throws RatException in case of internal errors.
- */
- public static void report(PrintStream out, IReportable base, final InputStream style,
- ReportConfiguration pConfiguration)
- throws IOException, TransformerConfigurationException, InterruptedException, RatException {
- report(new OutputStreamWriter(out), base, style, pConfiguration);
- }
-
- /**
- * Output a report that is styled using a defined stylesheet.
- *
- * @param out the writer to write the report to
- * @param base the files or directories to report on
- * @param style an input stream representing the stylesheet to use for styling the report
- * @param pConfiguration current report configuration.
- * @return the currently collected numerical statistics.
- * @throws IOException in case of I/O errors.
- * @throws TransformerConfigurationException in case of XML errors.
- * @throws InterruptedException in case of threading errors.
- * @throws RatException in case of internal errors.
- */
- public static ClaimStatistic report(Writer out, IReportable base, final InputStream style,
- ReportConfiguration pConfiguration)
- throws IOException, TransformerConfigurationException, InterruptedException, RatException {
- PipedReader reader = new PipedReader();
- PipedWriter writer = new PipedWriter(reader);
- ReportTransformer transformer = new ReportTransformer(out, style, reader);
- Thread transformerThread = new Thread(transformer);
- transformerThread.start();
- final ClaimStatistic statistic = report(base, writer, pConfiguration);
- writer.flush();
- writer.close();
- transformerThread.join();
- return statistic;
- }
-
- /**
- * @param container the files or directories to report on
- * @param out the writer to write the report to
- * @param pConfiguration current report configuration.
- * @return the currently collected numerical statistics.
- * @throws IOException in case of I/O errors.
- * @throws RatException in case of internal errors.
- */
- public static ClaimStatistic report(final IReportable container, final Writer out,
- ReportConfiguration pConfiguration) throws IOException, RatException {
- IXmlWriter writer = new XmlWriter(out);
- final ClaimStatistic statistic = new ClaimStatistic();
- RatReport report = XmlReportFactory.createStandardReport(writer, statistic, pConfiguration);
- report.startReport();
- container.run(report);
- report.endReport();
- writer.closeDocument();
- return statistic;
- }
}
diff --git a/apache-rat-core/src/test/java/org/apache/rat/ReportTest.java b/apache-rat-core/src/test/java/org/apache/rat/ReportTest.java
index e69a79d..5ecdf5c 100644
--- a/apache-rat-core/src/test/java/org/apache/rat/ReportTest.java
+++ b/apache-rat-core/src/test/java/org/apache/rat/ReportTest.java
@@ -136,9 +136,4 @@ public class ReportTest {
result.substring(generatedAtLineEnd + NL.length()));
}
- @Test
- public void parseExclusionsForCLIUsage() throws IOException {
- final FilenameFilter filter = Report.parseExclusions(Arrays.asList("", " # foo/bar", "foo", "##", " ./foo/bar"));
- assertNotNull(filter);
- }
}
diff --git a/apache-rat-core/src/test/java/org/apache/rat/cli/RatCommandLineTest.java b/apache-rat-core/src/test/java/org/apache/rat/cli/RatCommandLineTest.java
new file mode 100644
index 0000000..1b09ac9
--- /dev/null
+++ b/apache-rat-core/src/test/java/org/apache/rat/cli/RatCommandLineTest.java
@@ -0,0 +1,36 @@
+/*
+ * 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. *
+ */
+package org.apache.rat.cli;
+
+import org.junit.Test;
+
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.util.Arrays;
+
+import static org.junit.Assert.assertNotNull;
+
+public class RatCommandLineTest {
+ @Test
+ public void parseExclusionsForCLIUsage() throws IOException {
+ final FilenameFilter filter = RatCommandLine.parseExclusions(Arrays.asList("", " # foo/bar", "foo", "##", " ./foo/bar"));
+ assertNotNull(filter);
+ }
+
+}
diff --git a/apache-rat/pom.xml b/apache-rat/pom.xml
index 138a994..8b0f4f4 100644
--- a/apache-rat/pom.xml
+++ b/apache-rat/pom.xml
@@ -92,13 +92,13 @@
</excludes>
<archive>
<manifestEntries>
- <Main-Class>org.apache.rat.Report</Main-Class>
+ <Main-Class>org.apache.rat.cli.RatCommandLine</Main-Class>
<Extension-Name>rat</Extension-Name>
<Specification-Title>Apache Rat</Specification-Title>
<Specification-Vendor>apache.org</Specification-Vendor>
<Specification-Version>${project.version}</Specification-Version>
<Implementation-Vendor-Id>apache.org</Implementation-Vendor-Id>
- <Implementation-Title>Apache Rat</Implementation-Title>
+ <Implementation-Title>Apache Creadur RAT</Implementation-Title>
<Implementation-Vendor>Apache Software Foundation</Implementation-Vendor>
<Implementation-Version>${project.version}</Implementation-Version>
</manifestEntries>