From 4149bcb700a85338effe3d9efe94354467af7207 Mon Sep 17 00:00:00 2001 From: Simon Brandhof Date: Fri, 14 Mar 2014 11:12:39 +0100 Subject: [PATCH] SONAR-4790 replace static factory FilePredicates by FileSystem#predicates() Conflicts: sonar-plugin-api/src/test/java/org/sonar/api/batch/fs/FilePredicatesTest.java --- .../sonar/plugins/cpd/SonarBridgeEngine.java | 8 +- .../org/sonar/plugins/cpd/SonarEngine.java | 8 +- .../batch/index/ResourceKeyMigration.java | 2 +- .../ignore/scanner/IssueExclusionsLoader.java | 3 +- .../scan/filesystem/ComponentIndexer.java | 10 +- .../filesystem/DefaultModuleFileSystem.java | 38 +-- .../scan/filesystem/ModuleInputFileCache.java | 2 +- .../filesystem/ProjectFileSystemAdapter.java | 42 ++-- .../DefaultModuleFileSystemTest.java | 10 +- .../sonar/api/batch/fs/FilePredicates.java | 161 ++++--------- .../org/sonar/api/batch/fs/FileSystem.java | 39 +++- .../{ => internal}/AbsolutePathPredicate.java | 4 +- .../batch/fs/{ => internal}/AndPredicate.java | 5 +- .../fs/internal/DefaultFilePredicates.java | 160 +++++++++++++ .../batch/fs/internal/DefaultFileSystem.java | 13 +- .../api/batch/fs/internal/FalsePredicate.java | 33 +++ .../fs/{ => internal}/LanguagePredicate.java | 5 +- .../batch/fs/{ => internal}/NotPredicate.java | 5 +- .../batch/fs/{ => internal}/OrPredicate.java | 8 +- .../{ => internal}/PathPatternPredicate.java | 4 +- .../{ => internal}/RelativePathPredicate.java | 5 +- .../fs/{ => internal}/StatusPredicate.java | 5 +- .../api/batch/fs/internal/TruePredicate.java | 33 +++ .../fs/{ => internal}/TypePredicate.java | 5 +- .../{ => internal}/UniqueIndexPredicate.java | 2 +- .../api/batch/fs/FilePredicatesTest.java | 213 ----------------- .../internal/DefaultFilePredicatesTest.java | 217 ++++++++++++++++++ .../fs/internal/DefaultFileSystemTest.java | 34 +-- 28 files changed, 641 insertions(+), 433 deletions(-) rename sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/{ => internal}/AbsolutePathPredicate.java (90%) rename sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/{ => internal}/AndPredicate.java (91%) create mode 100644 sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/DefaultFilePredicates.java create mode 100644 sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/FalsePredicate.java rename sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/{ => internal}/LanguagePredicate.java (90%) rename sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/{ => internal}/NotPredicate.java (90%) rename sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/{ => internal}/OrPredicate.java (85%) rename sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/{ => internal}/PathPatternPredicate.java (90%) rename sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/{ => internal}/RelativePathPredicate.java (91%) rename sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/{ => internal}/StatusPredicate.java (90%) create mode 100644 sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/TruePredicate.java rename sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/{ => internal}/TypePredicate.java (89%) rename sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/{ => internal}/UniqueIndexPredicate.java (96%) delete mode 100644 sonar-plugin-api/src/test/java/org/sonar/api/batch/fs/FilePredicatesTest.java create mode 100644 sonar-plugin-api/src/test/java/org/sonar/api/batch/fs/internal/DefaultFilePredicatesTest.java diff --git a/plugins/sonar-cpd-plugin/src/main/java/org/sonar/plugins/cpd/SonarBridgeEngine.java b/plugins/sonar-cpd-plugin/src/main/java/org/sonar/plugins/cpd/SonarBridgeEngine.java index dec0a7d1b07..9fbe470b280 100644 --- a/plugins/sonar-cpd-plugin/src/main/java/org/sonar/plugins/cpd/SonarBridgeEngine.java +++ b/plugins/sonar-cpd-plugin/src/main/java/org/sonar/plugins/cpd/SonarBridgeEngine.java @@ -81,10 +81,10 @@ public class SonarBridgeEngine extends CpdEngine { public void analyse(Project project, String languageKey, SensorContext context) { String[] cpdExclusions = settings.getStringArray(CoreProperties.CPD_EXCLUSIONS); logExclusions(cpdExclusions, LOG); - List sourceFiles = Lists.newArrayList(fs.inputFiles(FilePredicates.and( - FilePredicates.hasType(InputFile.Type.MAIN), - FilePredicates.hasLanguage(languageKey), - FilePredicates.doesNotMatchPathPatterns(cpdExclusions) + List sourceFiles = Lists.newArrayList(fs.inputFiles(fs.predicates().and( + fs.predicates().hasType(InputFile.Type.MAIN), + fs.predicates().hasLanguage(languageKey), + fs.predicates().doesNotMatchPathPatterns(cpdExclusions) ))); if (sourceFiles.isEmpty()) { return; diff --git a/plugins/sonar-cpd-plugin/src/main/java/org/sonar/plugins/cpd/SonarEngine.java b/plugins/sonar-cpd-plugin/src/main/java/org/sonar/plugins/cpd/SonarEngine.java index f01761fbfb3..671cebb77da 100644 --- a/plugins/sonar-cpd-plugin/src/main/java/org/sonar/plugins/cpd/SonarEngine.java +++ b/plugins/sonar-cpd-plugin/src/main/java/org/sonar/plugins/cpd/SonarEngine.java @@ -93,10 +93,10 @@ public class SonarEngine extends CpdEngine { public void analyse(Project project, String languageKey, SensorContext context) { String[] cpdExclusions = settings.getStringArray(CoreProperties.CPD_EXCLUSIONS); logExclusions(cpdExclusions, LOG); - List sourceFiles = Lists.newArrayList(fs.inputFiles(FilePredicates.and( - FilePredicates.hasType(InputFile.Type.MAIN), - FilePredicates.hasLanguage(languageKey), - FilePredicates.doesNotMatchPathPatterns(cpdExclusions) + List sourceFiles = Lists.newArrayList(fs.inputFiles(fs.predicates().and( + fs.predicates().hasType(InputFile.Type.MAIN), + fs.predicates().hasLanguage(languageKey), + fs.predicates().doesNotMatchPathPatterns(cpdExclusions) ))); if (sourceFiles.isEmpty()) { return; diff --git a/sonar-batch/src/main/java/org/sonar/batch/index/ResourceKeyMigration.java b/sonar-batch/src/main/java/org/sonar/batch/index/ResourceKeyMigration.java index 7c59d4f310f..3647287bb3e 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/index/ResourceKeyMigration.java +++ b/sonar-batch/src/main/java/org/sonar/batch/index/ResourceKeyMigration.java @@ -63,7 +63,7 @@ public class ResourceKeyMigration implements BatchComponent { public void migrateIfNeeded(Project module, FileSystem fs) { if (migrationNeeded) { - migrateIfNeeded(module, fs.inputFiles(FilePredicates.all())); + migrateIfNeeded(module, fs.inputFiles(fs.predicates().all())); } } diff --git a/sonar-batch/src/main/java/org/sonar/batch/issue/ignore/scanner/IssueExclusionsLoader.java b/sonar-batch/src/main/java/org/sonar/batch/issue/ignore/scanner/IssueExclusionsLoader.java index 17731fdb553..1dad68550bb 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/issue/ignore/scanner/IssueExclusionsLoader.java +++ b/sonar-batch/src/main/java/org/sonar/batch/issue/ignore/scanner/IssueExclusionsLoader.java @@ -20,7 +20,6 @@ package org.sonar.batch.issue.ignore.scanner; -import org.sonar.api.batch.fs.FilePredicates; import org.sonar.api.batch.fs.FileSystem; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.fs.internal.DefaultInputFile; @@ -58,7 +57,7 @@ public final class IssueExclusionsLoader { public void execute() { Charset sourcesEncoding = fileSystem.encoding(); - for (InputFile inputFile : fileSystem.inputFiles(FilePredicates.all())) { + for (InputFile inputFile : fileSystem.inputFiles(fileSystem.predicates().all())) { try { String componentEffectiveKey = ((DefaultInputFile) inputFile).key(); if (componentEffectiveKey != null) { diff --git a/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/ComponentIndexer.java b/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/ComponentIndexer.java index 2acf6ce31f9..8d31f3b5a39 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/ComponentIndexer.java +++ b/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/ComponentIndexer.java @@ -25,17 +25,21 @@ import com.google.common.io.Files; import org.sonar.api.BatchComponent; import org.sonar.api.CoreProperties; import org.sonar.api.batch.SonarIndex; -import org.sonar.api.batch.fs.FilePredicates; import org.sonar.api.batch.fs.FileSystem; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.fs.internal.DefaultInputFile; import org.sonar.api.config.Settings; -import org.sonar.api.resources.*; +import org.sonar.api.resources.File; +import org.sonar.api.resources.JavaFile; +import org.sonar.api.resources.Languages; +import org.sonar.api.resources.Project; +import org.sonar.api.resources.Resource; import org.sonar.api.utils.SonarException; import org.sonar.batch.index.ResourceKeyMigration; /** * Index all files/directories of the module in SQ database and importing source code. + * * @since 4.2 */ public class ComponentIndexer implements BatchComponent { @@ -61,7 +65,7 @@ public class ComponentIndexer implements BatchComponent { migration.migrateIfNeeded(module, fs); boolean shouldImportSource = settings.getBoolean(CoreProperties.CORE_IMPORT_SOURCES_PROPERTY); - for (InputFile inputFile : fs.inputFiles(FilePredicates.all())) { + for (InputFile inputFile : fs.inputFiles(fs.predicates().all())) { String languageKey = inputFile.language(); boolean unitTest = InputFile.Type.TEST == inputFile.type(); String pathFromSourceDir = ((DefaultInputFile) inputFile).pathRelativeToSourceDir(); diff --git a/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/DefaultModuleFileSystem.java b/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/DefaultModuleFileSystem.java index 56c812ae8f3..1ffaa77bf29 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/DefaultModuleFileSystem.java +++ b/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/DefaultModuleFileSystem.java @@ -28,7 +28,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.sonar.api.CoreProperties; import org.sonar.api.batch.fs.FilePredicate; -import org.sonar.api.batch.fs.FilePredicates; import org.sonar.api.batch.fs.internal.DefaultFileSystem; import org.sonar.api.config.Settings; import org.sonar.api.resources.Project; @@ -38,7 +37,6 @@ import org.sonar.api.utils.SonarException; import javax.annotation.CheckForNull; import javax.annotation.Nullable; - import java.io.File; import java.nio.charset.Charset; import java.util.Arrays; @@ -69,7 +67,7 @@ public class DefaultModuleFileSystem extends DefaultFileSystem implements Module private boolean initialized; public DefaultModuleFileSystem(ModuleInputFileCache moduleInputFileCache, Project module, Settings settings, FileIndexer indexer, ModuleFileSystemInitializer initializer, - ComponentIndexer componentIndexer) { + ComponentIndexer componentIndexer) { super(moduleInputFileCache); this.componentIndexer = componentIndexer; this.moduleKey = module.getKey(); @@ -147,6 +145,7 @@ public class DefaultModuleFileSystem extends DefaultFileSystem implements Module /** * Should not be used - only for old plugins + * * @deprecated since 4.0 */ @Deprecated @@ -156,6 +155,7 @@ public class DefaultModuleFileSystem extends DefaultFileSystem implements Module /** * Should not be used - only for old plugins + * * @deprecated since 4.0 */ @Deprecated @@ -189,7 +189,7 @@ public class DefaultModuleFileSystem extends DefaultFileSystem implements Module for (Map.Entry> entry : query.attributes().entrySet()) { predicates.add(fromDeprecatedAttribute(entry.getKey(), entry.getValue())); } - return ImmutableList.copyOf(files(FilePredicates.and(predicates))); + return ImmutableList.copyOf(files(predicates().and(predicates))); } @Override @@ -230,60 +230,60 @@ public class DefaultModuleFileSystem extends DefaultFileSystem implements Module return builder.build(); } - static FilePredicate fromDeprecatedAttribute(String key, Collection value) { + private FilePredicate fromDeprecatedAttribute(String key, Collection value) { if ("TYPE".equals(key)) { - return FilePredicates.or(Collections2.transform(value, new Function() { + return predicates().or(Collections2.transform(value, new Function() { @Override public FilePredicate apply(@Nullable String s) { - return s == null ? FilePredicates.all() : FilePredicates.hasType(org.sonar.api.batch.fs.InputFile.Type.valueOf(s)); + return s == null ? predicates().all() : predicates().hasType(org.sonar.api.batch.fs.InputFile.Type.valueOf(s)); } })); } if ("STATUS".equals(key)) { - return FilePredicates.or(Collections2.transform(value, new Function() { + return predicates().or(Collections2.transform(value, new Function() { @Override public FilePredicate apply(@Nullable String s) { - return s == null ? FilePredicates.all() : FilePredicates.hasStatus(org.sonar.api.batch.fs.InputFile.Status.valueOf(s)); + return s == null ? predicates().all() : predicates().hasStatus(org.sonar.api.batch.fs.InputFile.Status.valueOf(s)); } })); } if ("LANG".equals(key)) { - return FilePredicates.or(Collections2.transform(value, new Function() { + return predicates().or(Collections2.transform(value, new Function() { @Override public FilePredicate apply(@Nullable String s) { - return s == null ? FilePredicates.all() : FilePredicates.hasLanguage(s); + return s == null ? predicates().all() : predicates().hasLanguage(s); } })); } if ("CMP_KEY".equals(key)) { - return FilePredicates.or(Collections2.transform(value, new Function() { + return predicates().or(Collections2.transform(value, new Function() { @Override public FilePredicate apply(@Nullable String s) { - return s == null ? FilePredicates.all() : new AdditionalFilePredicates.KeyPredicate(s); + return s == null ? predicates().all() : new AdditionalFilePredicates.KeyPredicate(s); } })); } if ("CMP_DEPRECATED_KEY".equals(key)) { - return FilePredicates.or(Collections2.transform(value, new Function() { + return predicates().or(Collections2.transform(value, new Function() { @Override public FilePredicate apply(@Nullable String s) { - return s == null ? FilePredicates.all() : new AdditionalFilePredicates.DeprecatedKeyPredicate(s); + return s == null ? predicates().all() : new AdditionalFilePredicates.DeprecatedKeyPredicate(s); } })); } if ("SRC_REL_PATH".equals(key)) { - return FilePredicates.or(Collections2.transform(value, new Function() { + return predicates().or(Collections2.transform(value, new Function() { @Override public FilePredicate apply(@Nullable String s) { - return s == null ? FilePredicates.all() : new AdditionalFilePredicates.SourceRelativePathPredicate(s); + return s == null ? predicates().all() : new AdditionalFilePredicates.SourceRelativePathPredicate(s); } })); } if ("SRC_DIR_PATH".equals(key)) { - return FilePredicates.or(Collections2.transform(value, new Function() { + return predicates().or(Collections2.transform(value, new Function() { @Override public FilePredicate apply(@Nullable String s) { - return s == null ? FilePredicates.all() : new AdditionalFilePredicates.SourceDirPredicate(s); + return s == null ? predicates().all() : new AdditionalFilePredicates.SourceDirPredicate(s); } })); } diff --git a/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/ModuleInputFileCache.java b/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/ModuleInputFileCache.java index a4c5776070f..4a909f29cf4 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/ModuleInputFileCache.java +++ b/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/ModuleInputFileCache.java @@ -21,7 +21,7 @@ package org.sonar.batch.scan.filesystem; import org.sonar.api.BatchComponent; import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.batch.fs.UniqueIndexPredicate; +import org.sonar.api.batch.fs.internal.UniqueIndexPredicate; import org.sonar.api.batch.fs.internal.DefaultFileSystem; import org.sonar.api.resources.Project; diff --git a/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/ProjectFileSystemAdapter.java b/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/ProjectFileSystemAdapter.java index f606206df25..c42c1d75fac 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/ProjectFileSystemAdapter.java +++ b/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/ProjectFileSystemAdapter.java @@ -21,13 +21,16 @@ package org.sonar.batch.scan.filesystem; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; -import java.util.Arrays; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.CharEncoding; import org.apache.maven.project.MavenProject; import org.sonar.api.batch.fs.FilePredicate; -import org.sonar.api.batch.fs.FilePredicates; -import org.sonar.api.resources.*; +import org.sonar.api.resources.InputFile; +import org.sonar.api.resources.Java; +import org.sonar.api.resources.Language; +import org.sonar.api.resources.Project; +import org.sonar.api.resources.ProjectFileSystem; +import org.sonar.api.resources.Resource; import org.sonar.api.scan.filesystem.PathResolver; import org.sonar.api.utils.SonarException; @@ -35,6 +38,7 @@ import javax.annotation.Nullable; import java.io.File; import java.io.IOException; import java.nio.charset.Charset; +import java.util.Arrays; import java.util.List; /** @@ -135,8 +139,8 @@ public class ProjectFileSystemAdapter implements ProjectFileSystem { } public List getSourceFiles(Language... langs) { - return Lists.newArrayList(target.files(FilePredicates.and( - FilePredicates.hasType(org.sonar.api.batch.fs.InputFile.Type.MAIN), + return Lists.newArrayList(target.files(target.predicates().and( + target.predicates().hasType(org.sonar.api.batch.fs.InputFile.Type.MAIN), newHasLanguagesPredicate(langs)))); } @@ -149,15 +153,15 @@ public class ProjectFileSystemAdapter implements ProjectFileSystem { } public List getTestFiles(Language... langs) { - return Lists.newArrayList(target.files(FilePredicates.and( - FilePredicates.hasType(org.sonar.api.batch.fs.InputFile.Type.TEST), + return Lists.newArrayList(target.files(target.predicates().and( + target.predicates().hasType(org.sonar.api.batch.fs.InputFile.Type.TEST), newHasLanguagesPredicate(langs)))); } public boolean hasTestFiles(Language lang) { - return target.hasFiles(FilePredicates.and( - FilePredicates.hasType(org.sonar.api.batch.fs.InputFile.Type.TEST), - FilePredicates.hasLanguage(lang.getKey()))); + return target.hasFiles(target.predicates().and( + target.predicates().hasType(org.sonar.api.batch.fs.InputFile.Type.TEST), + target.predicates().hasLanguage(lang.getKey()))); } public File writeToWorkingDirectory(String content, String fileName) throws IOException { @@ -183,25 +187,25 @@ public class ProjectFileSystemAdapter implements ProjectFileSystem { } public List mainFiles(String... langs) { - return Lists.newArrayList((Iterable) target.inputFiles(FilePredicates.and( - FilePredicates.hasType(org.sonar.api.batch.fs.InputFile.Type.MAIN), - FilePredicates.hasLanguages(Arrays.asList(langs)) + return Lists.newArrayList((Iterable) target.inputFiles(target.predicates().and( + target.predicates().hasType(org.sonar.api.batch.fs.InputFile.Type.MAIN), + target.predicates().hasLanguages(Arrays.asList(langs)) ))); } public List testFiles(String... langs) { - return Lists.newArrayList((Iterable) target.inputFiles(FilePredicates.and( - FilePredicates.hasType(org.sonar.api.batch.fs.InputFile.Type.TEST), - FilePredicates.hasLanguages(Arrays.asList(langs)) + return Lists.newArrayList((Iterable) target.inputFiles(target.predicates().and( + target.predicates().hasType(org.sonar.api.batch.fs.InputFile.Type.TEST), + target.predicates().hasLanguages(Arrays.asList(langs)) ))); } - private static FilePredicate newHasLanguagesPredicate(Language... languages) { + private FilePredicate newHasLanguagesPredicate(Language... languages) { List list = Lists.newArrayList(); for (Language language : languages) { - list.add(FilePredicates.hasLanguage(language.getKey())); + list.add(target.predicates().hasLanguage(language.getKey())); } - return FilePredicates.or(list); + return target.predicates().or(list); } } diff --git a/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/DefaultModuleFileSystemTest.java b/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/DefaultModuleFileSystemTest.java index 4c477cdc6f1..594a777095d 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/DefaultModuleFileSystemTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/DefaultModuleFileSystemTest.java @@ -26,7 +26,6 @@ import org.junit.rules.ExpectedException; import org.junit.rules.TemporaryFolder; import org.mockito.Mockito; import org.sonar.api.CoreProperties; -import org.sonar.api.batch.fs.FilePredicates; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.fs.internal.DefaultInputFile; import org.sonar.api.config.Settings; @@ -38,7 +37,10 @@ import java.nio.charset.Charset; import java.util.Arrays; import static org.fest.assertions.Assertions.assertThat; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.when; public class DefaultModuleFileSystemTest { @@ -163,10 +165,10 @@ public class DefaultModuleFileSystemTest { when(moduleInputFileCache.inputFiles()).thenReturn(Lists.newArrayList(mainInput, testInput)); fs.index(); - Iterable inputFiles = fs.inputFiles(FilePredicates.hasType(InputFile.Type.MAIN)); + Iterable inputFiles = fs.inputFiles(fs.predicates().hasType(InputFile.Type.MAIN)); assertThat(inputFiles).containsOnly(mainInput); - Iterable files = fs.files(FilePredicates.hasType(InputFile.Type.MAIN)); + Iterable files = fs.files(fs.predicates().hasType(InputFile.Type.MAIN)); assertThat(files).containsOnly(mainFile); } diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/FilePredicates.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/FilePredicates.java index 10d3bf4a77b..dd9f14833ca 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/FilePredicates.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/FilePredicates.java @@ -19,148 +19,67 @@ */ package org.sonar.api.batch.fs; -import com.google.common.collect.Lists; -import org.sonar.api.batch.fs.internal.PathPattern; - import java.io.File; -import java.util.Arrays; import java.util.Collection; -import java.util.List; /** * Factory of {@link org.sonar.api.batch.fs.FilePredicate} * * @since 4.2 */ -public class FilePredicates { - private static final FilePredicate ALWAYS_TRUE = new AlwaysTruePredicate(); - private static final FilePredicate ALWAYS_FALSE = not(ALWAYS_TRUE); - - private FilePredicates() { - // only static stuff - } - +public interface FilePredicates { /** * Returns a predicate that always evaluates to true */ - public static FilePredicate all() { - return ALWAYS_TRUE; - } + FilePredicate all(); /** * Returns a predicate that always evaluates to false */ - public static FilePredicate none() { - return ALWAYS_FALSE; - } + FilePredicate none(); /** * Warning - not efficient because absolute path is not indexed yet. */ - public static FilePredicate hasAbsolutePath(String s) { - return new AbsolutePathPredicate(s); - } + FilePredicate hasAbsolutePath(String s); /** * TODO document that non-normalized path and Windows-style path are supported */ - public static FilePredicate hasRelativePath(String s) { - return new RelativePathPredicate(s); - } - - public static FilePredicate matchesPathPattern(String inclusionPattern) { - return new PathPatternPredicate(PathPattern.create(inclusionPattern)); - } - - public static FilePredicate matchesPathPatterns(String[] inclusionPatterns) { - if (inclusionPatterns.length == 0) { - return ALWAYS_TRUE; - } - FilePredicate[] predicates = new FilePredicate[inclusionPatterns.length]; - for (int i = 0; i < inclusionPatterns.length; i++) { - predicates[i] = new PathPatternPredicate(PathPattern.create(inclusionPatterns[i])); - } - return or(predicates); - } - - public static FilePredicate doesNotMatchPathPattern(String exclusionPattern) { - return not(matchesPathPattern(exclusionPattern)); - } - - public static FilePredicate doesNotMatchPathPatterns(String[] exclusionPatterns) { - if (exclusionPatterns.length == 0) { - return ALWAYS_TRUE; - } - return not(matchesPathPatterns(exclusionPatterns)); - } - - public static FilePredicate hasPath(String s) { - File file = new File(s); - if (file.isAbsolute()) { - return hasAbsolutePath(s); - } - return hasRelativePath(s); - } - - public static FilePredicate is(File ioFile) { - if (ioFile.isAbsolute()) { - return hasAbsolutePath(ioFile.getAbsolutePath()); - } - return hasRelativePath(ioFile.getPath()); - } - - public static FilePredicate hasLanguage(String language) { - return new LanguagePredicate(language); - } - - public static FilePredicate hasLanguages(Collection languages) { - List list = Lists.newArrayList(); - for (String language : languages) { - list.add(hasLanguage(language)); - } - return or(list); - } - - public static FilePredicate hasStatus(InputFile.Status status) { - return new StatusPredicate(status); - } - - public static FilePredicate hasType(InputFile.Type type) { - return new TypePredicate(type); - } - - public static FilePredicate not(FilePredicate p) { - return new NotPredicate(p); - } - - public static FilePredicate or(Collection or) { - return new OrPredicate(or); - } - - public static FilePredicate or(FilePredicate... or) { - return new OrPredicate(Arrays.asList(or)); - } - - public static FilePredicate or(FilePredicate first, FilePredicate second) { - return new OrPredicate(Arrays.asList(first, second)); - } - - public static FilePredicate and(Collection and) { - return new AndPredicate(and); - } - - public static FilePredicate and(FilePredicate... and) { - return new AndPredicate(Arrays.asList(and)); - } - - public static FilePredicate and(FilePredicate first, FilePredicate second) { - return new AndPredicate(Arrays.asList(first, second)); - } - - private static class AlwaysTruePredicate implements FilePredicate { - @Override - public boolean apply(InputFile inputFile) { - return true; - } - } + FilePredicate hasRelativePath(String s); + + FilePredicate matchesPathPattern(String inclusionPattern); + + FilePredicate matchesPathPatterns(String[] inclusionPatterns); + + FilePredicate doesNotMatchPathPattern(String exclusionPattern); + + FilePredicate doesNotMatchPathPatterns(String[] exclusionPatterns); + + FilePredicate hasPath(String s); + + FilePredicate is(File ioFile); + + FilePredicate hasLanguage(String language); + + FilePredicate hasLanguages(Collection languages); + + FilePredicate hasStatus(InputFile.Status status); + + FilePredicate hasType(InputFile.Type type); + + FilePredicate not(FilePredicate p); + + FilePredicate or(Collection or); + + FilePredicate or(FilePredicate... or); + + FilePredicate or(FilePredicate first, FilePredicate second); + + FilePredicate and(Collection and); + + FilePredicate and(FilePredicate... and); + + FilePredicate and(FilePredicate first, FilePredicate second); + } diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/FileSystem.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/FileSystem.java index 6cd38b22911..b362d151206 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/FileSystem.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/FileSystem.java @@ -27,11 +27,27 @@ import java.nio.charset.Charset; import java.util.SortedSet; /** - *

The unit tests needing an instance of FileSystem can use the implementation - * {@link org.sonar.api.batch.fs.internal.DefaultFileSystem} and the related {@link org.sonar.api.scan.filesystem.internal.DefaultInputFile}:

+ * The {@link FileSystem} manages all the source files to be analyzed. + *

+ * This is not an extension point so it must not be implemented by plugins. It must be injected as a + * constructor parameter : *

- *   DefaultFileSystem fs = new DefaultFileSystem();
- *   fs.add(new DefaultInputFile("src/foo/bar.php"));
+ * public class MySensor implements Sensor {
+ *   private final FileSystem fs;
+ *
+ *   public MySensor(FileSystem fs) {
+ *     this.fs = fs;
+ *   }
+ * }
+ * 
+ * + *

How to use in unit tests

+ * The unit tests needing an instance of FileSystem can use the implementation + * {@link org.sonar.api.batch.fs.internal.DefaultFileSystem} and the related {@link org.sonar.api.batch.fs.internal.DefaultInputFile}, + * for example : + *
+ * DefaultFileSystem fs = new DefaultFileSystem();
+ * fs.add(new DefaultInputFile("src/foo/bar.php"));
  * 
* * @since 4.2 @@ -57,11 +73,16 @@ public interface FileSystem extends BatchComponent { */ File workDir(); + /** + * Factory of {@link FilePredicate} + */ + FilePredicates predicates(); + /** * Returns the single element matching the predicate. If more than one elements match * the predicate, then {@link IllegalArgumentException} is thrown. Returns {@code null} * if no files match. - * @see org.sonar.api.batch.fs.FilePredicates + * @see #predicates() */ @CheckForNull InputFile inputFile(FilePredicate predicate); @@ -73,21 +94,21 @@ public interface FileSystem extends BatchComponent { * Important - result is an {@link java.lang.Iterable} to benefit from streaming and decreasing * memory consumption. It should be iterated only once, else copy it into a list : * {@code com.google.common.collect.Lists.newArrayList(inputFiles(predicate))} - * @see org.sonar.api.batch.fs.FilePredicates + * @see #predicates() */ Iterable inputFiles(FilePredicate predicate); /** * Returns true if at least one {@link org.sonar.api.batch.fs.InputFile} matches - * the given predicate. This method can be faster than checking if {@link #inputFiles(org.sonar.api.batch.fs.FilePredicate...)} + * the given predicate. This method can be faster than checking if {@link #inputFiles(org.sonar.api.batch.fs.FilePredicate)} * has elements. - * @see org.sonar.api.batch.fs.FilePredicates + * @see #predicates() */ boolean hasFiles(FilePredicate predicate); /** * Files matching the given predicate. - * @see org.sonar.api.batch.fs.FilePredicates + * @see #predicates() */ Iterable files(FilePredicate predicate); diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/AbsolutePathPredicate.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/AbsolutePathPredicate.java similarity index 90% rename from sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/AbsolutePathPredicate.java rename to sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/AbsolutePathPredicate.java index 35044ace5a9..8e943a0f5f8 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/AbsolutePathPredicate.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/AbsolutePathPredicate.java @@ -17,9 +17,11 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -package org.sonar.api.batch.fs; +package org.sonar.api.batch.fs.internal; import org.apache.commons.io.FilenameUtils; +import org.sonar.api.batch.fs.FilePredicate; +import org.sonar.api.batch.fs.InputFile; /** * @since 4.2 diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/AndPredicate.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/AndPredicate.java similarity index 91% rename from sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/AndPredicate.java rename to sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/AndPredicate.java index 43039ef1ca1..0494ed524dc 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/AndPredicate.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/AndPredicate.java @@ -17,7 +17,10 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -package org.sonar.api.batch.fs; +package org.sonar.api.batch.fs.internal; + +import org.sonar.api.batch.fs.FilePredicate; +import org.sonar.api.batch.fs.InputFile; import java.util.Collection; diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/DefaultFilePredicates.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/DefaultFilePredicates.java new file mode 100644 index 00000000000..8eba3dd53c4 --- /dev/null +++ b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/DefaultFilePredicates.java @@ -0,0 +1,160 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2013 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * SonarQube is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.api.batch.fs.internal; + +import com.google.common.collect.Lists; +import org.sonar.api.batch.fs.FilePredicate; +import org.sonar.api.batch.fs.FilePredicates; +import org.sonar.api.batch.fs.InputFile; + +import java.io.File; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +/** + * Factory of {@link org.sonar.api.batch.fs.FilePredicate} + * + * @since 4.2 + */ +public class DefaultFilePredicates implements FilePredicates { + /** + * Client code should use {@link org.sonar.api.batch.fs.FileSystem#predicates()} to get an instance + */ + DefaultFilePredicates() { + } + + /** + * Returns a predicate that always evaluates to true + */ + public FilePredicate all() { + return TruePredicate.TRUE; + } + + /** + * Returns a predicate that always evaluates to false + */ + public FilePredicate none() { + return FalsePredicate.FALSE; + } + + /** + * Warning - not efficient because absolute path is not indexed yet. + */ + public FilePredicate hasAbsolutePath(String s) { + return new AbsolutePathPredicate(s); + } + + /** + * TODO document that non-normalized path and Windows-style path are supported + */ + public FilePredicate hasRelativePath(String s) { + return new RelativePathPredicate(s); + } + + public FilePredicate matchesPathPattern(String inclusionPattern) { + return new PathPatternPredicate(PathPattern.create(inclusionPattern)); + } + + public FilePredicate matchesPathPatterns(String[] inclusionPatterns) { + if (inclusionPatterns.length == 0) { + return TruePredicate.TRUE; + } + FilePredicate[] predicates = new FilePredicate[inclusionPatterns.length]; + for (int i = 0; i < inclusionPatterns.length; i++) { + predicates[i] = new PathPatternPredicate(PathPattern.create(inclusionPatterns[i])); + } + return or(predicates); + } + + public FilePredicate doesNotMatchPathPattern(String exclusionPattern) { + return not(matchesPathPattern(exclusionPattern)); + } + + public FilePredicate doesNotMatchPathPatterns(String[] exclusionPatterns) { + if (exclusionPatterns.length == 0) { + return TruePredicate.TRUE; + } + return not(matchesPathPatterns(exclusionPatterns)); + } + + public FilePredicate hasPath(String s) { + File file = new File(s); + if (file.isAbsolute()) { + return hasAbsolutePath(s); + } + return hasRelativePath(s); + } + + public FilePredicate is(File ioFile) { + if (ioFile.isAbsolute()) { + return hasAbsolutePath(ioFile.getAbsolutePath()); + } + return hasRelativePath(ioFile.getPath()); + } + + public FilePredicate hasLanguage(String language) { + return new LanguagePredicate(language); + } + + public FilePredicate hasLanguages(Collection languages) { + List list = Lists.newArrayList(); + for (String language : languages) { + list.add(hasLanguage(language)); + } + return or(list); + } + + public FilePredicate hasStatus(InputFile.Status status) { + return new StatusPredicate(status); + } + + public FilePredicate hasType(InputFile.Type type) { + return new TypePredicate(type); + } + + public FilePredicate not(FilePredicate p) { + return new NotPredicate(p); + } + + public FilePredicate or(Collection or) { + return new OrPredicate(or); + } + + public FilePredicate or(FilePredicate... or) { + return new OrPredicate(Arrays.asList(or)); + } + + public FilePredicate or(FilePredicate first, FilePredicate second) { + return new OrPredicate(Arrays.asList(first, second)); + } + + public FilePredicate and(Collection and) { + return new AndPredicate(and); + } + + public FilePredicate and(FilePredicate... and) { + return new AndPredicate(Arrays.asList(and)); + } + + public FilePredicate and(FilePredicate first, FilePredicate second) { + return new AndPredicate(Arrays.asList(first, second)); + } +} diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/DefaultFileSystem.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/DefaultFileSystem.java index f1f80bb93c8..3a97f46f757 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/DefaultFileSystem.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/DefaultFileSystem.java @@ -27,14 +27,15 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import org.sonar.api.batch.fs.FilePredicate; +import org.sonar.api.batch.fs.FilePredicates; import org.sonar.api.batch.fs.FileSystem; import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.batch.fs.UniqueIndexPredicate; import javax.annotation.CheckForNull; import javax.annotation.Nullable; import java.io.File; import java.nio.charset.Charset; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.NoSuchElementException; @@ -49,6 +50,7 @@ public class DefaultFileSystem implements FileSystem { private final SortedSet languages = Sets.newTreeSet(); private File baseDir, workDir; private Charset encoding; + private final FilePredicates predicates = new DefaultFilePredicates(); /** * Only for testing @@ -151,9 +153,7 @@ public class DefaultFileSystem implements FileSystem { */ public DefaultFileSystem addLanguages(String language, String... others) { languages.add(language); - for (String other : others) { - languages.add(other); - } + Collections.addAll(languages, others); return this; } @@ -163,6 +163,11 @@ public class DefaultFileSystem implements FileSystem { return languages; } + @Override + public FilePredicates predicates() { + return predicates; + } + /** * This method is called before each search of files. */ diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/FalsePredicate.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/FalsePredicate.java new file mode 100644 index 00000000000..f495049961e --- /dev/null +++ b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/FalsePredicate.java @@ -0,0 +1,33 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2013 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * SonarQube is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.api.batch.fs.internal; + +import org.sonar.api.batch.fs.FilePredicate; +import org.sonar.api.batch.fs.InputFile; + +class FalsePredicate implements FilePredicate { + + static final FilePredicate FALSE = new FalsePredicate(); + + @Override + public boolean apply(InputFile inputFile) { + return false; + } +} \ No newline at end of file diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/LanguagePredicate.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/LanguagePredicate.java similarity index 90% rename from sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/LanguagePredicate.java rename to sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/LanguagePredicate.java index 2483ba03aa2..77d2f74887a 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/LanguagePredicate.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/LanguagePredicate.java @@ -17,7 +17,10 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -package org.sonar.api.batch.fs; +package org.sonar.api.batch.fs.internal; + +import org.sonar.api.batch.fs.FilePredicate; +import org.sonar.api.batch.fs.InputFile; /** * @since 4.2 diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/NotPredicate.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/NotPredicate.java similarity index 90% rename from sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/NotPredicate.java rename to sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/NotPredicate.java index e875ca19ea3..5f2359ee166 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/NotPredicate.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/NotPredicate.java @@ -17,7 +17,10 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -package org.sonar.api.batch.fs; +package org.sonar.api.batch.fs.internal; + +import org.sonar.api.batch.fs.FilePredicate; +import org.sonar.api.batch.fs.InputFile; /** * @since 4.2 diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/OrPredicate.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/OrPredicate.java similarity index 85% rename from sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/OrPredicate.java rename to sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/OrPredicate.java index e80f9cd16ee..aa442fbb3b8 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/OrPredicate.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/OrPredicate.java @@ -17,7 +17,11 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -package org.sonar.api.batch.fs; +package org.sonar.api.batch.fs.internal; + +import org.sonar.api.batch.fs.FilePredicate; +import org.sonar.api.batch.fs.FilePredicates; +import org.sonar.api.batch.fs.InputFile; import java.util.Arrays; import java.util.Collection; @@ -31,7 +35,7 @@ class OrPredicate implements FilePredicate { OrPredicate(Collection predicates) { if (predicates.isEmpty()) { - this.predicates = Arrays.asList(FilePredicates.all()); + this.predicates = Arrays.asList(TruePredicate.TRUE); } else { this.predicates = predicates; } diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/PathPatternPredicate.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/PathPatternPredicate.java similarity index 90% rename from sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/PathPatternPredicate.java rename to sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/PathPatternPredicate.java index c01c8db94d7..c2402a43cfe 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/PathPatternPredicate.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/PathPatternPredicate.java @@ -17,8 +17,10 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -package org.sonar.api.batch.fs; +package org.sonar.api.batch.fs.internal; +import org.sonar.api.batch.fs.FilePredicate; +import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.fs.internal.PathPattern; /** diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/RelativePathPredicate.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/RelativePathPredicate.java similarity index 91% rename from sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/RelativePathPredicate.java rename to sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/RelativePathPredicate.java index fb224f65933..22aed6e09a5 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/RelativePathPredicate.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/RelativePathPredicate.java @@ -17,10 +17,11 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -package org.sonar.api.batch.fs; +package org.sonar.api.batch.fs.internal; import org.apache.commons.io.FilenameUtils; -import org.sonar.api.batch.fs.internal.RelativePathIndex; +import org.sonar.api.batch.fs.FilePredicate; +import org.sonar.api.batch.fs.InputFile; /** * @since 4.2 diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/StatusPredicate.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/StatusPredicate.java similarity index 90% rename from sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/StatusPredicate.java rename to sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/StatusPredicate.java index fd0400cd9b5..fe7c934071e 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/StatusPredicate.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/StatusPredicate.java @@ -17,7 +17,10 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -package org.sonar.api.batch.fs; +package org.sonar.api.batch.fs.internal; + +import org.sonar.api.batch.fs.FilePredicate; +import org.sonar.api.batch.fs.InputFile; /** * @since 4.2 diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/TruePredicate.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/TruePredicate.java new file mode 100644 index 00000000000..b8d9ef30dbf --- /dev/null +++ b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/TruePredicate.java @@ -0,0 +1,33 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2013 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * SonarQube is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.api.batch.fs.internal; + +import org.sonar.api.batch.fs.FilePredicate; +import org.sonar.api.batch.fs.InputFile; + +class TruePredicate implements FilePredicate { + + static final FilePredicate TRUE = new TruePredicate(); + + @Override + public boolean apply(InputFile inputFile) { + return true; + } +} \ No newline at end of file diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/TypePredicate.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/TypePredicate.java similarity index 89% rename from sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/TypePredicate.java rename to sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/TypePredicate.java index cb7297dcd9a..ac8b6d5fe8d 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/TypePredicate.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/TypePredicate.java @@ -17,7 +17,10 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -package org.sonar.api.batch.fs; +package org.sonar.api.batch.fs.internal; + +import org.sonar.api.batch.fs.FilePredicate; +import org.sonar.api.batch.fs.InputFile; /** * @since 4.2 diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/UniqueIndexPredicate.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/UniqueIndexPredicate.java similarity index 96% rename from sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/UniqueIndexPredicate.java rename to sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/UniqueIndexPredicate.java index 7dd9bf38034..8b7404d2571 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/UniqueIndexPredicate.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/UniqueIndexPredicate.java @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -package org.sonar.api.batch.fs; +package org.sonar.api.batch.fs.internal; /** * @since 4.2 diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/batch/fs/FilePredicatesTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/batch/fs/FilePredicatesTest.java deleted file mode 100644 index 8ed8c4e97d0..00000000000 --- a/sonar-plugin-api/src/test/java/org/sonar/api/batch/fs/FilePredicatesTest.java +++ /dev/null @@ -1,213 +0,0 @@ -/* - * SonarQube, open source software quality management tool. - * Copyright (C) 2008-2014 SonarSource - * mailto:contact AT sonarsource DOT com - * - * SonarQube is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * SonarQube is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.api.batch.fs; - -import org.apache.commons.io.FilenameUtils; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; -import org.sonar.api.batch.fs.internal.DefaultInputFile; - -import java.io.File; -import java.io.IOException; -import java.util.Arrays; -import java.util.Collections; - -import static org.fest.assertions.Assertions.assertThat; - -public class FilePredicatesTest { - - @Rule - public TemporaryFolder temp = new TemporaryFolder(); - - DefaultInputFile javaFile; - - @Before - public void before() throws IOException { - javaFile = new DefaultInputFile("src/main/java/struts/Action.java") - .setFile(temp.newFile("Action.java")) - .setLanguage("java") - .setStatus(InputFile.Status.ADDED); - } - - @Test - public void all() throws Exception { - assertThat(FilePredicates.all().apply(javaFile)).isTrue(); - } - - @Test - public void none() throws Exception { - assertThat(FilePredicates.none().apply(javaFile)).isFalse(); - } - - @Test - public void matches_inclusion_pattern() throws Exception { - assertThat(FilePredicates.matchesPathPattern("src/main/**/Action.java").apply(javaFile)).isTrue(); - assertThat(FilePredicates.matchesPathPattern("Action.java").apply(javaFile)).isFalse(); - assertThat(FilePredicates.matchesPathPattern("src/**/*.php").apply(javaFile)).isFalse(); - } - - @Test - public void matches_inclusion_patterns() throws Exception { - assertThat(FilePredicates.matchesPathPatterns(new String[]{"src/other/**.java", "src/main/**/Action.java"}).apply(javaFile)).isTrue(); - assertThat(FilePredicates.matchesPathPatterns(new String[]{}).apply(javaFile)).isTrue(); - assertThat(FilePredicates.matchesPathPatterns(new String[]{"src/other/**.java", "src/**/*.php"}).apply(javaFile)).isFalse(); - } - - @Test - public void does_not_match_exclusion_pattern() throws Exception { - assertThat(FilePredicates.doesNotMatchPathPattern("src/main/**/Action.java").apply(javaFile)).isFalse(); - assertThat(FilePredicates.doesNotMatchPathPattern("Action.java").apply(javaFile)).isTrue(); - assertThat(FilePredicates.doesNotMatchPathPattern("src/**/*.php").apply(javaFile)).isTrue(); - } - - @Test - public void does_not_match_exclusion_patterns() throws Exception { - assertThat(FilePredicates.doesNotMatchPathPatterns(new String[]{}).apply(javaFile)).isTrue(); - assertThat(FilePredicates.doesNotMatchPathPatterns(new String[]{"src/other/**.java", "src/**/*.php"}).apply(javaFile)).isTrue(); - assertThat(FilePredicates.doesNotMatchPathPatterns(new String[]{"src/other/**.java", "src/main/**/Action.java"}).apply(javaFile)).isFalse(); - } - - @Test - public void has_relative_path() throws Exception { - assertThat(FilePredicates.hasRelativePath("src/main/java/struts/Action.java").apply(javaFile)).isTrue(); - assertThat(FilePredicates.hasRelativePath("src/main/java/struts/Other.java").apply(javaFile)).isFalse(); - - // path is normalized - assertThat(FilePredicates.hasRelativePath("src/main/java/../java/struts/Action.java").apply(javaFile)).isTrue(); - - assertThat(FilePredicates.hasRelativePath("src\\main\\java\\struts\\Action.java").apply(javaFile)).isTrue(); - assertThat(FilePredicates.hasRelativePath("src\\main\\java\\struts\\Other.java").apply(javaFile)).isFalse(); - assertThat(FilePredicates.hasRelativePath("src\\main\\java\\struts\\..\\struts\\Action.java").apply(javaFile)).isTrue(); - } - - @Test - public void has_absolute_path() throws Exception { - String path = javaFile.file().getAbsolutePath(); - assertThat(FilePredicates.hasAbsolutePath(path).apply(javaFile)).isTrue(); - assertThat(FilePredicates.hasAbsolutePath(FilenameUtils.separatorsToWindows(path)).apply(javaFile)).isTrue(); - - assertThat(FilePredicates.hasAbsolutePath(temp.newFile().getAbsolutePath()).apply(javaFile)).isFalse(); - assertThat(FilePredicates.hasAbsolutePath("src/main/java/struts/Action.java").apply(javaFile)).isFalse(); - } - - @Test - public void has_path() throws Exception { - // is relative path - assertThat(FilePredicates.hasPath("src/main/java/struts/Action.java").apply(javaFile)).isTrue(); - assertThat(FilePredicates.hasPath("src/main/java/struts/Other.java").apply(javaFile)).isFalse(); - - // is absolute path - String path = javaFile.file().getAbsolutePath(); - assertThat(FilePredicates.hasAbsolutePath(path).apply(javaFile)).isTrue(); - assertThat(FilePredicates.hasPath(temp.newFile().getAbsolutePath()).apply(javaFile)).isFalse(); - } - - @Test - public void is_file() throws Exception { - // relative file - assertThat(FilePredicates.is(new File(javaFile.relativePath())).apply(javaFile)).isTrue(); - - - // absolute file - assertThat(FilePredicates.is(javaFile.file()).apply(javaFile)).isTrue(); - assertThat(FilePredicates.is(javaFile.file().getAbsoluteFile()).apply(javaFile)).isTrue(); - assertThat(FilePredicates.is(javaFile.file().getCanonicalFile()).apply(javaFile)).isTrue(); - assertThat(FilePredicates.is(new File(javaFile.file().toURI())).apply(javaFile)).isTrue(); - assertThat(FilePredicates.is(temp.newFile()).apply(javaFile)).isFalse(); - } - - @Test - public void has_language() throws Exception { - assertThat(FilePredicates.hasLanguage("java").apply(javaFile)).isTrue(); - assertThat(FilePredicates.hasLanguage("php").apply(javaFile)).isFalse(); - } - - @Test - public void has_languages() throws Exception { - assertThat(FilePredicates.hasLanguages(Arrays.asList("java", "php")).apply(javaFile)).isTrue(); - assertThat(FilePredicates.hasLanguages(Arrays.asList("cobol", "php")).apply(javaFile)).isFalse(); - assertThat(FilePredicates.hasLanguages(Collections.emptyList()).apply(javaFile)).isTrue(); - } - - @Test - public void has_status() throws Exception { - assertThat(FilePredicates.hasStatus(InputFile.Status.ADDED).apply(javaFile)).isTrue(); - assertThat(FilePredicates.hasStatus(InputFile.Status.CHANGED).apply(javaFile)).isFalse(); - } - - @Test - public void has_type() throws Exception { - assertThat(FilePredicates.hasType(InputFile.Type.MAIN).apply(javaFile)).isTrue(); - assertThat(FilePredicates.hasType(InputFile.Type.TEST).apply(javaFile)).isFalse(); - } - - @Test - public void not() throws Exception { - assertThat(FilePredicates.not(FilePredicates.hasType(InputFile.Type.MAIN)).apply(javaFile)).isFalse(); - assertThat(FilePredicates.not(FilePredicates.hasType(InputFile.Type.TEST)).apply(javaFile)).isTrue(); - } - - @Test - public void and() throws Exception { - // empty - assertThat(FilePredicates.and().apply(javaFile)).isTrue(); - assertThat(FilePredicates.and(new FilePredicate[0]).apply(javaFile)).isTrue(); - assertThat(FilePredicates.and(Collections.emptyList()).apply(javaFile)).isTrue(); - - // two arguments - assertThat(FilePredicates.and(FilePredicates.all(), FilePredicates.all()).apply(javaFile)).isTrue(); - assertThat(FilePredicates.and(FilePredicates.all(), FilePredicates.none()).apply(javaFile)).isFalse(); - assertThat(FilePredicates.and(FilePredicates.none(), FilePredicates.all()).apply(javaFile)).isFalse(); - - // collection - assertThat(FilePredicates.and(Arrays.asList(FilePredicates.all(), FilePredicates.all())).apply(javaFile)).isTrue(); - assertThat(FilePredicates.and(Arrays.asList(FilePredicates.all(), FilePredicates.none())).apply(javaFile)).isFalse(); - - // array - assertThat(FilePredicates.and(new FilePredicate[]{FilePredicates.all(), FilePredicates.all()}).apply(javaFile)).isTrue(); - assertThat(FilePredicates.and(new FilePredicate[]{FilePredicates.all(), FilePredicates.none()}).apply(javaFile)).isFalse(); - } - - @Test - public void or() throws Exception { - // empty - assertThat(FilePredicates.or().apply(javaFile)).isTrue(); - assertThat(FilePredicates.or(new FilePredicate[0]).apply(javaFile)).isTrue(); - assertThat(FilePredicates.or(Collections.emptyList()).apply(javaFile)).isTrue(); - - // two arguments - assertThat(FilePredicates.or(FilePredicates.all(), FilePredicates.all()).apply(javaFile)).isTrue(); - assertThat(FilePredicates.or(FilePredicates.all(), FilePredicates.none()).apply(javaFile)).isTrue(); - assertThat(FilePredicates.or(FilePredicates.none(), FilePredicates.all()).apply(javaFile)).isTrue(); - assertThat(FilePredicates.or(FilePredicates.none(), FilePredicates.none()).apply(javaFile)).isFalse(); - - // collection - assertThat(FilePredicates.or(Arrays.asList(FilePredicates.all(), FilePredicates.all())).apply(javaFile)).isTrue(); - assertThat(FilePredicates.or(Arrays.asList(FilePredicates.all(), FilePredicates.none())).apply(javaFile)).isTrue(); - assertThat(FilePredicates.or(Arrays.asList(FilePredicates.none(), FilePredicates.none())).apply(javaFile)).isFalse(); - - // array - assertThat(FilePredicates.or(new FilePredicate[]{FilePredicates.all(), FilePredicates.all()}).apply(javaFile)).isTrue(); - assertThat(FilePredicates.or(new FilePredicate[]{FilePredicates.all(), FilePredicates.none()}).apply(javaFile)).isTrue(); - assertThat(FilePredicates.or(new FilePredicate[]{FilePredicates.none(), FilePredicates.none()}).apply(javaFile)).isFalse(); - } -} diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/batch/fs/internal/DefaultFilePredicatesTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/batch/fs/internal/DefaultFilePredicatesTest.java new file mode 100644 index 00000000000..d2ad8211f0a --- /dev/null +++ b/sonar-plugin-api/src/test/java/org/sonar/api/batch/fs/internal/DefaultFilePredicatesTest.java @@ -0,0 +1,217 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2013 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * SonarQube is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.api.batch.fs.internal; + +import org.apache.commons.io.FilenameUtils; +import org.fest.assertions.Assertions; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.sonar.api.batch.fs.FilePredicate; +import org.sonar.api.batch.fs.FilePredicates; +import org.sonar.api.batch.fs.InputFile; + +import java.io.File; +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; + +import static org.fest.assertions.Assertions.assertThat; + +public class DefaultFilePredicatesTest { + + @Rule + public TemporaryFolder temp = new TemporaryFolder(); + + DefaultInputFile javaFile; + FilePredicates predicates = new DefaultFilePredicates(); + + @Before + public void before() throws IOException { + javaFile = new DefaultInputFile("src/main/java/struts/Action.java") + .setFile(temp.newFile("Action.java")) + .setLanguage("java") + .setStatus(InputFile.Status.ADDED); + } + + @Test + public void all() throws Exception { + Assertions.assertThat(predicates.all().apply(javaFile)).isTrue(); + } + + @Test + public void none() throws Exception { + assertThat(predicates.none().apply(javaFile)).isFalse(); + } + + @Test + public void matches_inclusion_pattern() throws Exception { + assertThat(predicates.matchesPathPattern("src/main/**/Action.java").apply(javaFile)).isTrue(); + assertThat(predicates.matchesPathPattern("Action.java").apply(javaFile)).isFalse(); + assertThat(predicates.matchesPathPattern("src/**/*.php").apply(javaFile)).isFalse(); + } + + @Test + public void matches_inclusion_patterns() throws Exception { + assertThat(predicates.matchesPathPatterns(new String[]{"src/other/**.java", "src/main/**/Action.java"}).apply(javaFile)).isTrue(); + assertThat(predicates.matchesPathPatterns(new String[]{}).apply(javaFile)).isTrue(); + assertThat(predicates.matchesPathPatterns(new String[]{"src/other/**.java", "src/**/*.php"}).apply(javaFile)).isFalse(); + } + + @Test + public void does_not_match_exclusion_pattern() throws Exception { + assertThat(predicates.doesNotMatchPathPattern("src/main/**/Action.java").apply(javaFile)).isFalse(); + assertThat(predicates.doesNotMatchPathPattern("Action.java").apply(javaFile)).isTrue(); + assertThat(predicates.doesNotMatchPathPattern("src/**/*.php").apply(javaFile)).isTrue(); + } + + @Test + public void does_not_match_exclusion_patterns() throws Exception { + assertThat(predicates.doesNotMatchPathPatterns(new String[]{}).apply(javaFile)).isTrue(); + assertThat(predicates.doesNotMatchPathPatterns(new String[]{"src/other/**.java", "src/**/*.php"}).apply(javaFile)).isTrue(); + assertThat(predicates.doesNotMatchPathPatterns(new String[]{"src/other/**.java", "src/main/**/Action.java"}).apply(javaFile)).isFalse(); + } + + @Test + public void has_relative_path() throws Exception { + assertThat(predicates.hasRelativePath("src/main/java/struts/Action.java").apply(javaFile)).isTrue(); + assertThat(predicates.hasRelativePath("src/main/java/struts/Other.java").apply(javaFile)).isFalse(); + + // path is normalized + assertThat(predicates.hasRelativePath("src/main/java/../java/struts/Action.java").apply(javaFile)).isTrue(); + + assertThat(predicates.hasRelativePath("src\\main\\java\\struts\\Action.java").apply(javaFile)).isTrue(); + assertThat(predicates.hasRelativePath("src\\main\\java\\struts\\Other.java").apply(javaFile)).isFalse(); + assertThat(predicates.hasRelativePath("src\\main\\java\\struts\\..\\struts\\Action.java").apply(javaFile)).isTrue(); + } + + @Test + public void has_absolute_path() throws Exception { + String path = javaFile.file().getAbsolutePath(); + assertThat(predicates.hasAbsolutePath(path).apply(javaFile)).isTrue(); + assertThat(predicates.hasAbsolutePath(FilenameUtils.separatorsToWindows(path)).apply(javaFile)).isTrue(); + + assertThat(predicates.hasAbsolutePath(temp.newFile().getAbsolutePath()).apply(javaFile)).isFalse(); + assertThat(predicates.hasAbsolutePath("src/main/java/struts/Action.java").apply(javaFile)).isFalse(); + } + + @Test + public void has_path() throws Exception { + // is relative path + assertThat(predicates.hasPath("src/main/java/struts/Action.java").apply(javaFile)).isTrue(); + assertThat(predicates.hasPath("src/main/java/struts/Other.java").apply(javaFile)).isFalse(); + + // is absolute path + String path = javaFile.file().getAbsolutePath(); + assertThat(predicates.hasAbsolutePath(path).apply(javaFile)).isTrue(); + assertThat(predicates.hasPath(temp.newFile().getAbsolutePath()).apply(javaFile)).isFalse(); + } + + @Test + public void is_file() throws Exception { + // relative file + assertThat(predicates.is(new File(javaFile.relativePath())).apply(javaFile)).isTrue(); + + + // absolute file + assertThat(predicates.is(javaFile.file()).apply(javaFile)).isTrue(); + assertThat(predicates.is(javaFile.file().getAbsoluteFile()).apply(javaFile)).isTrue(); + assertThat(predicates.is(javaFile.file().getCanonicalFile()).apply(javaFile)).isTrue(); + assertThat(predicates.is(new File(javaFile.file().toURI())).apply(javaFile)).isTrue(); + assertThat(predicates.is(temp.newFile()).apply(javaFile)).isFalse(); + } + + @Test + public void has_language() throws Exception { + assertThat(predicates.hasLanguage("java").apply(javaFile)).isTrue(); + assertThat(predicates.hasLanguage("php").apply(javaFile)).isFalse(); + } + + @Test + public void has_languages() throws Exception { + assertThat(predicates.hasLanguages(Arrays.asList("java", "php")).apply(javaFile)).isTrue(); + assertThat(predicates.hasLanguages(Arrays.asList("cobol", "php")).apply(javaFile)).isFalse(); + assertThat(predicates.hasLanguages(Collections.emptyList()).apply(javaFile)).isTrue(); + } + + @Test + public void has_status() throws Exception { + assertThat(predicates.hasStatus(InputFile.Status.ADDED).apply(javaFile)).isTrue(); + assertThat(predicates.hasStatus(InputFile.Status.CHANGED).apply(javaFile)).isFalse(); + } + + @Test + public void has_type() throws Exception { + assertThat(predicates.hasType(InputFile.Type.MAIN).apply(javaFile)).isTrue(); + assertThat(predicates.hasType(InputFile.Type.TEST).apply(javaFile)).isFalse(); + } + + @Test + public void not() throws Exception { + assertThat(predicates.not(predicates.hasType(InputFile.Type.MAIN)).apply(javaFile)).isFalse(); + assertThat(predicates.not(predicates.hasType(InputFile.Type.TEST)).apply(javaFile)).isTrue(); + } + + @Test + public void and() throws Exception { + // empty + assertThat(predicates.and().apply(javaFile)).isTrue(); + assertThat(predicates.and(new FilePredicate[0]).apply(javaFile)).isTrue(); + assertThat(predicates.and(Collections.emptyList()).apply(javaFile)).isTrue(); + + // two arguments + assertThat(predicates.and(predicates.all(), predicates.all()).apply(javaFile)).isTrue(); + assertThat(predicates.and(predicates.all(), predicates.none()).apply(javaFile)).isFalse(); + assertThat(predicates.and(predicates.none(), predicates.all()).apply(javaFile)).isFalse(); + + // collection + assertThat(predicates.and(Arrays.asList(predicates.all(), predicates.all())).apply(javaFile)).isTrue(); + assertThat(predicates.and(Arrays.asList(predicates.all(), predicates.none())).apply(javaFile)).isFalse(); + + // array + assertThat(predicates.and(new FilePredicate[]{predicates.all(), predicates.all()}).apply(javaFile)).isTrue(); + assertThat(predicates.and(new FilePredicate[]{predicates.all(), predicates.none()}).apply(javaFile)).isFalse(); + } + + @Test + public void or() throws Exception { + // empty + assertThat(predicates.or().apply(javaFile)).isTrue(); + assertThat(predicates.or(new FilePredicate[0]).apply(javaFile)).isTrue(); + assertThat(predicates.or(Collections.emptyList()).apply(javaFile)).isTrue(); + + // two arguments + assertThat(predicates.or(predicates.all(), predicates.all()).apply(javaFile)).isTrue(); + assertThat(predicates.or(predicates.all(), predicates.none()).apply(javaFile)).isTrue(); + assertThat(predicates.or(predicates.none(), predicates.all()).apply(javaFile)).isTrue(); + assertThat(predicates.or(predicates.none(), predicates.none()).apply(javaFile)).isFalse(); + + // collection + assertThat(predicates.or(Arrays.asList(predicates.all(), predicates.all())).apply(javaFile)).isTrue(); + assertThat(predicates.or(Arrays.asList(predicates.all(), predicates.none())).apply(javaFile)).isTrue(); + assertThat(predicates.or(Arrays.asList(predicates.none(), predicates.none())).apply(javaFile)).isFalse(); + + // array + assertThat(predicates.or(new FilePredicate[]{predicates.all(), predicates.all()}).apply(javaFile)).isTrue(); + assertThat(predicates.or(new FilePredicate[]{predicates.all(), predicates.none()}).apply(javaFile)).isTrue(); + assertThat(predicates.or(new FilePredicate[]{predicates.none(), predicates.none()}).apply(javaFile)).isFalse(); + } +} diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/batch/fs/internal/DefaultFileSystemTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/batch/fs/internal/DefaultFileSystemTest.java index d8debd649eb..aa898e908c5 100644 --- a/sonar-plugin-api/src/test/java/org/sonar/api/batch/fs/internal/DefaultFileSystemTest.java +++ b/sonar-plugin-api/src/test/java/org/sonar/api/batch/fs/internal/DefaultFileSystemTest.java @@ -24,7 +24,6 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.rules.TemporaryFolder; -import org.sonar.api.batch.fs.FilePredicates; import java.io.File; import java.nio.charset.Charset; @@ -80,7 +79,7 @@ public class DefaultFileSystemTest { public void files() throws Exception { DefaultFileSystem fs = new DefaultFileSystem(); - assertThat(fs.inputFiles(FilePredicates.all())).isEmpty(); + assertThat(fs.inputFiles(fs.predicates().all())).isEmpty(); fs.add(new DefaultInputFile("src/Foo.php").setLanguage("php").setFile(temp.newFile())); fs.add(new DefaultInputFile("src/Bar.java").setLanguage("java").setFile(temp.newFile())); @@ -89,21 +88,21 @@ public class DefaultFileSystemTest { // no language fs.add(new DefaultInputFile("src/readme.txt").setFile(temp.newFile())); - assertThat(fs.inputFile(FilePredicates.hasRelativePath("src/Bar.java"))).isNotNull(); - assertThat(fs.inputFile(FilePredicates.hasRelativePath("does/not/exist"))).isNull(); + assertThat(fs.inputFile(fs.predicates().hasRelativePath("src/Bar.java"))).isNotNull(); + assertThat(fs.inputFile(fs.predicates().hasRelativePath("does/not/exist"))).isNull(); - assertThat(fs.files(FilePredicates.all())).hasSize(4); - assertThat(fs.files(FilePredicates.hasLanguage("java"))).hasSize(2); - assertThat(fs.files(FilePredicates.hasLanguage("cobol"))).isEmpty(); + assertThat(fs.files(fs.predicates().all())).hasSize(4); + assertThat(fs.files(fs.predicates().hasLanguage("java"))).hasSize(2); + assertThat(fs.files(fs.predicates().hasLanguage("cobol"))).isEmpty(); - assertThat(fs.hasFiles(FilePredicates.all())).isTrue(); - assertThat(fs.hasFiles(FilePredicates.hasLanguage("java"))).isTrue(); - assertThat(fs.hasFiles(FilePredicates.hasLanguage("cobol"))).isFalse(); + assertThat(fs.hasFiles(fs.predicates().all())).isTrue(); + assertThat(fs.hasFiles(fs.predicates().hasLanguage("java"))).isTrue(); + assertThat(fs.hasFiles(fs.predicates().hasLanguage("cobol"))).isFalse(); - assertThat(fs.inputFiles(FilePredicates.all())).hasSize(4); - assertThat(fs.inputFiles(FilePredicates.hasLanguage("php"))).hasSize(1); - assertThat(fs.inputFiles(FilePredicates.hasLanguage("java"))).hasSize(2); - assertThat(fs.inputFiles(FilePredicates.hasLanguage("cobol"))).isEmpty(); + assertThat(fs.inputFiles(fs.predicates().all())).hasSize(4); + assertThat(fs.inputFiles(fs.predicates().hasLanguage("php"))).hasSize(1); + assertThat(fs.inputFiles(fs.predicates().hasLanguage("java"))).hasSize(2); + assertThat(fs.inputFiles(fs.predicates().hasLanguage("cobol"))).isEmpty(); assertThat(fs.languages()).containsOnly("java", "php"); } @@ -111,7 +110,8 @@ public class DefaultFileSystemTest { @Test public void input_file_returns_null_if_file_not_found() throws Exception { DefaultFileSystem fs = new DefaultFileSystem(); - assertThat(fs.inputFile(FilePredicates.hasRelativePath("src/Bar.java"))).isNull(); + assertThat(fs.inputFile(fs.predicates().hasRelativePath("src/Bar.java"))).isNull(); + assertThat(fs.inputFile(fs.predicates().hasLanguage("cobol"))).isNull(); } @Test @@ -123,7 +123,7 @@ public class DefaultFileSystemTest { fs.add(new DefaultInputFile("src/Bar.java").setLanguage("java").setFile(temp.newFile())); fs.add(new DefaultInputFile("src/Baz.java").setLanguage("java").setFile(temp.newFile())); - fs.inputFile(FilePredicates.all()); + fs.inputFile(fs.predicates().all()); } @Test @@ -132,6 +132,6 @@ public class DefaultFileSystemTest { fs.add(new DefaultInputFile("src/Bar.java").setLanguage("java").setFile(temp.newFile())); // it would fail if more than one java file - assertThat(fs.inputFile(FilePredicates.hasLanguage("java"))).isNotNull(); + assertThat(fs.inputFile(fs.predicates().hasLanguage("java"))).isNotNull(); } } -- 2.39.5