Skip to content

Commit

Permalink
RAT-322: be able to scan hidden directories
Browse files Browse the repository at this point in the history
  • Loading branch information
jbonofre committed Nov 25, 2023
1 parent c2e51ad commit 1ac5866
Show file tree
Hide file tree
Showing 12 changed files with 219 additions and 34 deletions.
14 changes: 13 additions & 1 deletion apache-rat-core/src/main/java/org/apache/rat/Report.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.HiddenFileFilter;
import org.apache.commons.io.filefilter.NameFileFilter;
import org.apache.commons.io.filefilter.NotFileFilter;
import org.apache.commons.io.filefilter.OrFileFilter;
Expand Down Expand Up @@ -95,6 +96,12 @@ public class Report {
* Do not use the default files.
*/
private static final String NO_DEFAULTS = "no-default-licenses";

/**
* Scan hidden directories
*/
private static final String SCAN_HIDDEN_DIRECTORIES = "scan-hidden-directories";

/**
* List the licenses that were used for the run.
*/
Expand Down Expand Up @@ -162,6 +169,10 @@ public static final void main(String[] args) throws Exception {
static ReportConfiguration createConfiguration(String baseDirectory, CommandLine cl) throws IOException {
final ReportConfiguration configuration = new ReportConfiguration();

if (cl.hasOption(SCAN_HIDDEN_DIRECTORIES)) {
configuration.setDirectoryFilter(null);
}

if (cl.hasOption('a') || cl.hasOption('A')) {
configuration.setAddLicenseHeaders(cl.hasOption('f') ? AddLicenseHeaders.FORCED : AddLicenseHeaders.TRUE);
configuration.setCopyrightMessage(cl.getOptionValue("c"));
Expand Down Expand Up @@ -268,6 +279,7 @@ static Options buildOptions() {
opts.addOption(null, LICENSES, true, "File names or URLs for license definitions");
opts.addOption(null, LIST_LICENSES, false, "List all active licenses");
opts.addOption(null, LIST_LICENSE_FAMILIES, false, "List all defined license families");
opts.addOption(null, SCAN_HIDDEN_DIRECTORIES, false, "Scan hidden directories");

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. "
Expand Down Expand Up @@ -356,7 +368,7 @@ private static IReportable getDirectory(String baseDirectory, ReportConfiguratio
}

if (base.isDirectory()) {
return new DirectoryWalker(base, config.getInputFileFilter());
return new DirectoryWalker(base, config.getInputFileFilter(), config.getDirectoryFilter());
}

try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@
import java.util.TreeSet;
import java.util.function.Consumer;

import org.apache.commons.io.filefilter.FalseFileFilter;
import org.apache.commons.io.filefilter.HiddenFileFilter;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.apache.commons.io.function.IOSupplier;
import org.apache.rat.config.AddLicenseHeaders;
import org.apache.rat.license.ILicense;
Expand Down Expand Up @@ -64,6 +67,7 @@ public class ReportConfiguration {
private IOSupplier<InputStream> styleSheet = null;
private IReportable reportable = null;
private FilenameFilter inputFileFilter = null;
private IOFileFilter directoryFilter = HiddenFileFilter.HIDDEN;

/**
* @return The filename filter for the potential input files.
Expand All @@ -79,6 +83,22 @@ public void setInputFileFilter(FilenameFilter inputFileFilter) {
this.inputFileFilter = inputFileFilter;
}

public IOFileFilter getDirectoryFilter() {
return directoryFilter;
}

public void setDirectoryFilter(IOFileFilter directoryFilter) {
if (directoryFilter == null) {
this.directoryFilter = FalseFileFilter.FALSE;
} else {
this.directoryFilter = directoryFilter;
}
}

public void addDirectoryFilter(IOFileFilter directoryFilter) {
this.directoryFilter = this.directoryFilter.and(directoryFilter);
}

/**
* @return the thing being reported on.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@

package org.apache.rat.walker;

import org.apache.commons.io.filefilter.HiddenFileFilter;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.apache.rat.api.Document;
import org.apache.rat.api.RatException;
import org.apache.rat.document.impl.FileDocument;
Expand All @@ -37,8 +39,10 @@ public class DirectoryWalker extends Walker implements IReportable {

protected static final FileNameComparator COMPARATOR = new FileNameComparator();

public DirectoryWalker(File file) {
this(file, (FilenameFilter) null);
private IOFileFilter directoryFilter;

public DirectoryWalker(File file, IOFileFilter directoryFilter) {
this(file, (FilenameFilter) null, directoryFilter);
}

/**
Expand All @@ -48,16 +52,14 @@ public DirectoryWalker(File file) {
* @param filter filters input files (optional),
* or null when no filtering should be performed
*/
public DirectoryWalker(File file, final FilenameFilter filter) {
public DirectoryWalker(File file, final FilenameFilter filter, IOFileFilter directoryFilter) {
super(file.getPath(), file, filter);
this.directoryFilter = directoryFilter;
}

public DirectoryWalker(File file, final Pattern ignoreNameRegex) {
public DirectoryWalker(File file, final Pattern ignoreNameRegex, IOFileFilter directoryFilter) {
super(file.getPath(), file, regexFilter(ignoreNameRegex));
}

public boolean isRestricted() {
return false;
this.directoryFilter = directoryFilter;
}

/**
Expand All @@ -68,7 +70,11 @@ public boolean isRestricted() {
* @throws RatException
*/
private void processDirectory(RatReport report, final File file) throws RatException {
if (!isRestricted(file)) {
if (directoryFilter != null) {
if (!directoryFilter.accept(file)) {
process(report, file);
}
} else {
process(report, file);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,6 @@ public boolean accept(File dir, String name) {
}
};
}

protected boolean isRestricted(File file) {
return file.getName().startsWith(".");
}

protected final boolean isNotIgnored(final File file) {
boolean result = false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,10 @@
import java.util.List;
import java.util.SortedSet;

import org.apache.commons.io.filefilter.AndFileFilter;
import org.apache.commons.io.filefilter.DirectoryFileFilter;
import org.apache.commons.io.filefilter.FalseFileFilter;
import org.apache.commons.io.filefilter.HiddenFileFilter;
import org.apache.commons.io.function.IOSupplier;
import org.apache.rat.ReportConfiguration.NoCloseOutputStream;
import org.apache.rat.config.AddLicenseHeaders;
Expand Down Expand Up @@ -189,6 +193,19 @@ public void inputFileFilterTest() {
assertEquals(filter, underTest.getInputFileFilter());
}

@Test
public void directoryFilterTest() {
assertNotNull("Directory filter should not be null by default", underTest.getDirectoryFilter());
assertTrue("Directory filter should be a HiddenFileFilter one by default", underTest.getDirectoryFilter() instanceof HiddenFileFilter);

underTest.setDirectoryFilter(DirectoryFileFilter.DIRECTORY);
underTest.addDirectoryFilter(HiddenFileFilter.HIDDEN);
assertTrue("Using addDirectoryFilter() method should create a AndFileFilter", underTest.getDirectoryFilter() instanceof AndFileFilter);

underTest.setDirectoryFilter(null);
assertTrue("When setting directory filter to null, a FalseFileFilter should be created", underTest.getDirectoryFilter() instanceof FalseFileFilter);
}

@Test
public void licenseFamiliesTest() {
assertTrue(underTest.getLicenseFamilies(LicenseFilter.all).isEmpty());
Expand Down Expand Up @@ -427,6 +444,8 @@ public static void validateDefault(ReportConfiguration config) {
assertNull("Input file filter should be null", config.getInputFileFilter());
assertTrue("Style report should be true", config.isStyleReport());
assertNotNull("Stylesheet should not be null", config.getStyleSheet());
assertNotNull("Directory filter should not be null", config.getDirectoryFilter());
assertTrue("Directory filter should be hidden filter by default", config.getDirectoryFilter() instanceof HiddenFileFilter);

validateDefaultApprovedLicenses(config);
validateDefaultLicenseFamilies(config);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;

import org.apache.commons.io.filefilter.HiddenFileFilter;
import org.apache.rat.test.utils.Resources;
import org.apache.rat.testhelpers.XmlUtils;
import org.apache.rat.walker.DirectoryWalker;
Expand All @@ -51,7 +52,7 @@ public void xmlReportTest() throws Exception {
final ReportConfiguration configuration = new ReportConfiguration();
configuration.setStyleReport(false);
configuration.setFrom(defaults);
configuration.setReportable(new DirectoryWalker(new File(elementsPath)));
configuration.setReportable(new DirectoryWalker(new File(elementsPath), HiddenFileFilter.HIDDEN));
configuration.setOut(() -> out);
Reporter.report(configuration);
Document doc = XmlUtils.toDom(new ByteArrayInputStream(out.toByteArray()));
Expand Down Expand Up @@ -91,7 +92,7 @@ public void plainReportWithArchivesAndUnapprovedLicenses() throws Exception {
final String elementsPath = Resources.getResourceDirectory("elements/Source.java");
final ReportConfiguration configuration = new ReportConfiguration();
configuration.setFrom(defaults);
configuration.setReportable(new DirectoryWalker(new File(elementsPath)));
configuration.setReportable(new DirectoryWalker(new File(elementsPath), HiddenFileFilter.HIDDEN));
configuration.setOut(() -> out);
Reporter.report(configuration);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import java.io.StringWriter;
import java.util.regex.Pattern;

import org.apache.commons.io.filefilter.HiddenFileFilter;
import org.apache.rat.ConfigurationException;
import org.apache.rat.ReportConfiguration;
import org.apache.rat.analysis.IHeaderMatcher.State;
Expand Down Expand Up @@ -76,7 +77,7 @@ public void standardReport() throws Exception {

final TestingLicense testingLicense = new TestingLicense(new TestingMatcher(true), family);

DirectoryWalker directory = new DirectoryWalker(new File(elementsPath), IGNORE_EMPTY);
DirectoryWalker directory = new DirectoryWalker(new File(elementsPath), IGNORE_EMPTY, HiddenFileFilter.HIDDEN);
final ClaimStatistic statistic = new ClaimStatistic();
final ReportConfiguration configuration = new ReportConfiguration();
configuration.addLicense(testingLicense);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathFactory;

import org.apache.commons.io.filefilter.HiddenFileFilter;
import org.apache.rat.analysis.DefaultAnalyserFactory;
import org.apache.rat.analysis.IHeaderMatcher;
import org.apache.rat.analysis.matchers.CopyrightMatcher;
Expand Down Expand Up @@ -88,7 +89,7 @@ private void report(DirectoryWalker directory) throws Exception {
@Test
public void baseReport() throws Exception {
final String elementsPath = Resources.getResourceDirectory("elements/Source.java");
DirectoryWalker directory = new DirectoryWalker(new File(elementsPath), IGNORE);
DirectoryWalker directory = new DirectoryWalker(new File(elementsPath), IGNORE, HiddenFileFilter.HIDDEN);
report.startReport();
report(directory);
report.endReport();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
/*
* 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.walker;

import org.apache.commons.io.filefilter.FalseFileFilter;
import org.apache.commons.io.filefilter.HiddenFileFilter;
import org.apache.commons.io.filefilter.TrueFileFilter;
import org.apache.commons.lang3.SystemUtils;
import org.apache.rat.api.Document;
import org.apache.rat.api.RatException;
import org.apache.rat.report.RatReport;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.attribute.DosFileAttributeView;
import java.nio.file.attribute.DosFileAttributes;
import java.util.ArrayList;
import java.util.List;

public class DirectoryWalkerTest {

@Rule
public TemporaryFolder folder = new TemporaryFolder();

@Test
public void walk() throws IOException, RatException {
File toWalk = folder.newFolder("test");
File regular = new File(toWalk, "regular");
regular.mkdir();
File regularFile = new File(regular, "test");
try (FileWriter writer = new FileWriter(regularFile)) {
writer.write("test");
writer.flush();
}

File hidden = new File(toWalk, ".hidden");
hidden.mkdir();
File hiddenFile = new File(hidden, "test");

try (FileWriter writer = new FileWriter(hiddenFile)) {
writer.write("test");
writer.flush();
}

if (SystemUtils.IS_OS_WINDOWS) {
hiddenFile = Files.setAttribute(hiddenFile.toPath(), "dos:hidden", true).toFile();
}

DirectoryWalker walker = new DirectoryWalker(toWalk, HiddenFileFilter.HIDDEN);
List<String> scanned = new ArrayList<>();
walker.run(new TestRatReport(scanned));

Assert.assertEquals(1, scanned.size());

walker = new DirectoryWalker(toWalk, FalseFileFilter.FALSE);
scanned = new ArrayList<>();
walker.run(new TestRatReport(scanned));

Assert.assertEquals(2, scanned.size());
}

class TestRatReport implements RatReport {

private List<String> scanned;

public TestRatReport(List<String> scanned) {
this.scanned = scanned;
}

@Override
public void startReport() {
// no-op
}

@Override
public void report(Document document) throws RatException {
scanned.add(document.getName());
}

@Override
public void endReport() {
// no-op
}

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,9 @@ public class RatCheckMojo extends AbstractRatMojo {
@Parameter(property = "rat.outputFile", defaultValue = "${project.build.directory}/rat.txt")
private File reportFile;

@Parameter(property = "rat.scanHiddenDirectories", defaultValue = "false")
private boolean scanHiddenDirectories;

/**
* Output style of the report. Use "plain" (the default) for a plain text report
* or "xml" for the raw XML report. Alternatively you can give the path of an
Expand Down Expand Up @@ -169,6 +172,9 @@ protected ReportConfiguration getConfiguration() throws MojoExecutionException {
if (StringUtils.isNotBlank(copyrightMessage)) {
configuration.setCopyrightMessage(copyrightMessage);
}
if (scanHiddenDirectories) {
configuration.setDirectoryFilter(null);
}
if (reportFile != null) {
if (!reportFile.exists()) {
reportFile.getParentFile().mkdirs();
Expand Down
Loading

0 comments on commit 1ac5866

Please sign in to comment.