diff options
author | Simon Brandhof <simon.brandhof@gmail.com> | 2013-10-10 01:19:57 +0200 |
---|---|---|
committer | Simon Brandhof <simon.brandhof@gmail.com> | 2013-10-10 01:19:57 +0200 |
commit | 7cdb8cbfb54bcb028300674f18ce08ea3ee35858 (patch) | |
tree | f3bffef9fac71d13c4e48553e7b4bc2c49625efc /sonar-batch | |
parent | c2a0f4f06564c1d62f08d4e20489f70f0f4ad223 (diff) | |
download | sonarqube-7cdb8cbfb54bcb028300674f18ce08ea3ee35858.tar.gz sonarqube-7cdb8cbfb54bcb028300674f18ce08ea3ee35858.zip |
SONAR-3677 refactor API
Diffstat (limited to 'sonar-batch')
16 files changed, 288 insertions, 53 deletions
diff --git a/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/AttributeFilter.java b/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/AttributeFilter.java index f2565480997..8036e81ca90 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/AttributeFilter.java +++ b/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/AttributeFilter.java @@ -19,6 +19,7 @@ */ package org.sonar.batch.scan.filesystem; +import com.google.common.annotations.VisibleForTesting; import org.sonar.api.scan.filesystem.InputFile; import org.sonar.api.scan.filesystem.InputFileFilter; @@ -38,4 +39,14 @@ class AttributeFilter implements InputFileFilter { String value = inputFile.attribute(key); return values.contains(value); } + + @VisibleForTesting + String key() { + return key; + } + + @VisibleForTesting + Collection<String> values() { + return values; + } } 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 c8dd1b3f1ec..c4d13692c3e 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 @@ -27,8 +27,8 @@ import org.sonar.api.CoreProperties; import org.sonar.api.config.Settings; import org.sonar.api.scan.filesystem.FileQuery; import org.sonar.api.scan.filesystem.InputFile; +import org.sonar.api.scan.filesystem.InputFiles; import org.sonar.api.scan.filesystem.ModuleFileSystem; -import org.sonar.api.utils.SonarException; import javax.annotation.CheckForNull; import java.io.File; @@ -155,8 +155,8 @@ public class DefaultModuleFileSystem implements ModuleFileSystem { /** * @since 4.0 - * TODO move into API */ + @Override public Iterable<InputFile> inputFiles(FileQuery query) { List<InputFile> result = Lists.newArrayList(); @@ -172,7 +172,7 @@ public class DefaultModuleFileSystem implements ModuleFileSystem { @Override // TODO deprecate public List<File> files(FileQuery query) { - return InputFile.toFiles(inputFiles(query)); + return InputFiles.toFiles(inputFiles(query)); } public void resetDirs(File basedir, File buildDir, List<File> sourceDirs, List<File> testDirs, List<File> binaryDirs) { diff --git a/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/DeprecatedFileFilters.java b/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/DeprecatedFileFilters.java index b958c2e2045..c4bbcdd9804 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/DeprecatedFileFilters.java +++ b/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/DeprecatedFileFilters.java @@ -78,7 +78,7 @@ public class DeprecatedFileFilters implements InputFileFilter { @Override public String canonicalPath() { - return inputFile.attribute(InputFile.ATTRIBUTE_CANONICAL_PATH); + return inputFile.path(); } } } diff --git a/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/FileIndexer.java b/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/FileIndexer.java index 5cd183cd57b..a2d6c383232 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/FileIndexer.java +++ b/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/FileIndexer.java @@ -33,6 +33,7 @@ import org.sonar.api.scan.filesystem.InputFile; import org.sonar.api.scan.filesystem.InputFileFilter; import org.sonar.api.scan.filesystem.ModuleFileSystem; import org.sonar.api.scan.filesystem.PathResolver; +import org.sonar.api.scan.filesystem.internal.DefaultInputFile; import javax.annotation.Nullable; import java.io.File; @@ -63,9 +64,10 @@ public class FileIndexer implements BatchComponent { this.fileHashes = fileHashes; } - public void index(ModuleFileSystem fileSystem) { + public void index(DefaultModuleFileSystem fileSystem) { Logger logger = LoggerFactory.getLogger(FileIndexer.class); logger.info("Index files"); + // TODO log configuration too (replace FileSystemLogger) cache.removeModule(fileSystem.moduleKey()); int count = 0; @@ -102,7 +104,6 @@ public class FileIndexer implements BatchComponent { String baseRelativePath = pathResolver.relativePath(fileSystem.baseDir(), file); set(attributes, InputFile.ATTRIBUTE_SOURCEDIR_PATH, FilenameUtils.normalize(sourceDir.getCanonicalPath(), true)); set(attributes, InputFile.ATTRIBUTE_SOURCE_RELATIVE_PATH, pathResolver.relativePath(sourceDir, file)); - set(attributes, InputFile.ATTRIBUTE_CANONICAL_PATH, FilenameUtils.normalize(file.getCanonicalPath(), true)); // other metadata set(attributes, InputFile.ATTRIBUTE_TYPE, type); @@ -111,7 +112,7 @@ public class FileIndexer implements BatchComponent { set(attributes, InputFile.ATTRIBUTE_LANGUAGE, languageRecognizer.ofExtension(extension)); initStatus(file, fileSystem.sourceCharset(), baseRelativePath, attributes); - return InputFile.create(file, baseRelativePath, attributes); + return DefaultInputFile.create(file, baseRelativePath, attributes); } catch (Exception e) { throw new IllegalStateException("Fail to read file: " + file.getAbsolutePath(), e); diff --git a/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/FileQueryFilter.java b/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/FileQueryFilter.java index b62694c3b6c..a273903d3cb 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/FileQueryFilter.java +++ b/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/FileQueryFilter.java @@ -19,6 +19,7 @@ */ package org.sonar.batch.scan.filesystem; +import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.Lists; import org.sonar.api.CoreProperties; import org.sonar.api.config.Settings; @@ -56,6 +57,11 @@ class FileQueryFilter { } } + @VisibleForTesting + List<InputFileFilter> filters() { + return filters; + } + boolean accept(InputFile inputFile) { for (InputFileFilter filter : filters) { if (!filter.accept(inputFile)) { diff --git a/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/LanguageRecognizer.java b/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/LanguageRecognizer.java index 61396830599..98e30d690e5 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/LanguageRecognizer.java +++ b/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/LanguageRecognizer.java @@ -21,6 +21,7 @@ package org.sonar.batch.scan.filesystem; import com.google.common.collect.Maps; import org.apache.commons.lang.StringUtils; +import org.picocontainer.Startable; import org.sonar.api.BatchComponent; import org.sonar.api.resources.Language; @@ -28,16 +29,26 @@ import javax.annotation.CheckForNull; import java.util.Map; /** - * Based on file extensions. + * Detect language of source files. Simplistic, based on file extensions. */ -public class LanguageRecognizer implements BatchComponent { +public class LanguageRecognizer implements BatchComponent, Startable { - private final Map<String, String> byExtensions = Maps.newHashMap(); + /** + * Lower-case extension -> language + */ + private Map<String, String> byExtensions = Maps.newHashMap(); + + private final Language[] languages; public LanguageRecognizer(Language[] languages) { + this.languages = languages; + } + + @Override + public void start() { for (Language language : languages) { for (String suffix : language.getFileSuffixes()) { - String extension = StringUtils.removeStart(suffix, "."); + String extension = sanitizeExtension(suffix); String s = byExtensions.get(extension); if (s != null) { @@ -50,12 +61,21 @@ public class LanguageRecognizer implements BatchComponent { } } + @Override + public void stop() { + // do nothing + } + // TODO what about cobol files without extension ? @CheckForNull String ofExtension(String fileExtension) { if (StringUtils.isNotBlank(fileExtension)) { - return byExtensions.get(fileExtension); + return byExtensions.get(StringUtils.lowerCase(fileExtension)); } return null; } + + static String sanitizeExtension(String suffix) { + return StringUtils.lowerCase(StringUtils.removeStart(suffix, ".")); + } } diff --git a/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/PathPattern.java b/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/PathPattern.java index 2df7c53e4d6..0f3240a1159 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/PathPattern.java +++ b/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/PathPattern.java @@ -61,7 +61,7 @@ abstract class PathPattern { @Override boolean match(InputFile inputFile) { - return pattern.match(inputFile.attribute(InputFile.ATTRIBUTE_CANONICAL_PATH)); + return pattern.match(inputFile.path()); } @Override diff --git a/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/AttributeFilterTest.java b/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/AttributeFilterTest.java index 1ce0a8a4019..f168c1acd6d 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/AttributeFilterTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/AttributeFilterTest.java @@ -24,7 +24,7 @@ import com.google.common.collect.Lists; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; -import org.sonar.api.scan.filesystem.InputFile; +import org.sonar.api.scan.filesystem.internal.DefaultInputFile; import static org.fest.assertions.Assertions.assertThat; @@ -37,9 +37,11 @@ public class AttributeFilterTest { public void should_check_attribute_value() throws Exception { AttributeFilter filter = new AttributeFilter("foo", Lists.newArrayList("one", "two")); - assertThat(filter.accept(InputFile.create(temp.newFile(), "Why.java", ImmutableMap.of("foo", "two")))).isTrue(); - assertThat(filter.accept(InputFile.create(temp.newFile(), "Where.java", ImmutableMap.of("foo", "three")))).isFalse(); - assertThat(filter.accept(InputFile.create(temp.newFile(), "What.java", ImmutableMap.of("bar", "one")))).isFalse(); + assertThat(filter.key()).isEqualTo("foo"); + assertThat(filter.values()).containsOnly("one", "two"); + assertThat(filter.accept(DefaultInputFile.create(temp.newFile(), "Why.java", ImmutableMap.of("foo", "two")))).isTrue(); + assertThat(filter.accept(DefaultInputFile.create(temp.newFile(), "Where.java", ImmutableMap.of("foo", "three")))).isFalse(); + assertThat(filter.accept(DefaultInputFile.create(temp.newFile(), "What.java", ImmutableMap.of("bar", "one")))).isFalse(); } } 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 c0dfddb5a7e..4536d0b64fa 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 @@ -29,6 +29,7 @@ import org.sonar.api.CoreProperties; import org.sonar.api.config.Settings; import org.sonar.api.scan.filesystem.FileQuery; import org.sonar.api.scan.filesystem.InputFile; +import org.sonar.api.scan.filesystem.internal.DefaultInputFile; import java.io.File; import java.io.IOException; @@ -151,8 +152,8 @@ public class DefaultModuleFileSystemTest { DefaultModuleFileSystem fs = new DefaultModuleFileSystem("foo", settings, fileCache, fileIndexer); File mainFile = temp.newFile(); - InputFile mainInput = InputFile.create(mainFile, "Main.java", ImmutableMap.of(InputFile.ATTRIBUTE_TYPE, InputFile.TYPE_SOURCE)); - InputFile testInput = InputFile.create(temp.newFile(), "Test.java", ImmutableMap.of(InputFile.ATTRIBUTE_TYPE, InputFile.TYPE_TEST)); + InputFile mainInput = DefaultInputFile.create(mainFile, "Main.java", ImmutableMap.of(InputFile.ATTRIBUTE_TYPE, InputFile.TYPE_SOURCE)); + InputFile testInput = DefaultInputFile.create(temp.newFile(), "Test.java", ImmutableMap.of(InputFile.ATTRIBUTE_TYPE, InputFile.TYPE_TEST)); when(fileCache.byModule("foo")).thenReturn(Lists.newArrayList(mainInput, testInput)); diff --git a/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/DeprecatedFileFiltersTest.java b/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/DeprecatedFileFiltersTest.java index a973337cfb4..399e4fdfd5b 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/DeprecatedFileFiltersTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/DeprecatedFileFiltersTest.java @@ -28,7 +28,7 @@ import org.mockito.ArgumentCaptor; import org.sonar.api.scan.filesystem.FileSystemFilter; import org.sonar.api.scan.filesystem.FileType; import org.sonar.api.scan.filesystem.InputFile; -import org.sonar.api.scan.filesystem.ModuleFileSystem; +import org.sonar.api.scan.filesystem.internal.DefaultInputFile; import java.io.File; @@ -48,7 +48,7 @@ public class DeprecatedFileFiltersTest { public void no_filters() throws Exception { DeprecatedFileFilters filters = new DeprecatedFileFilters(); - InputFile inputFile = InputFile.create(temp.newFile(), "src/main/java/Foo.java", Maps.<String, String>newHashMap()); + InputFile inputFile = DefaultInputFile.create(temp.newFile(), "src/main/java/Foo.java", Maps.<String, String>newHashMap()); assertThat(filters.accept(inputFile)).isTrue(); } @@ -58,8 +58,7 @@ public class DeprecatedFileFiltersTest { File basedir = temp.newFolder(); File file = temp.newFile(); - InputFile inputFile = InputFile.create(file, "src/main/java/Foo.java", ImmutableMap.of( - InputFile.ATTRIBUTE_CANONICAL_PATH, new File(basedir, "src/main/java/Foo.java").getAbsolutePath(), + InputFile inputFile = DefaultInputFile.create(file, "src/main/java/Foo.java", ImmutableMap.of( InputFile.ATTRIBUTE_SOURCEDIR_PATH, new File(basedir, "src/main/java").getAbsolutePath(), InputFile.ATTRIBUTE_SOURCE_RELATIVE_PATH, "Foo.java", InputFile.ATTRIBUTE_TYPE, InputFile.TYPE_TEST @@ -73,7 +72,7 @@ public class DeprecatedFileFiltersTest { verify(filter).accept(eq(file), argument.capture()); DeprecatedFileFilters.DeprecatedContext context = argument.getValue(); - assertThat(context.canonicalPath()).isEqualTo(new File(basedir, "src/main/java/Foo.java").getAbsolutePath()); + assertThat(context.canonicalPath()).isEqualTo(file.getAbsolutePath()); assertThat(context.relativeDir()).isEqualTo(new File(basedir, "src/main/java")); assertThat(context.relativePath()).isEqualTo("Foo.java"); assertThat(context.type()).isEqualTo(FileType.TEST); diff --git a/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/ExclusionFilterTest.java b/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/ExclusionFilterTest.java index 9272d2cf012..b28f1708f83 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/ExclusionFilterTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/ExclusionFilterTest.java @@ -24,9 +24,9 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.sonar.api.scan.filesystem.InputFile; +import org.sonar.api.scan.filesystem.internal.DefaultInputFile; import java.io.File; -import java.io.IOException; import static org.fest.assertions.Assertions.assertThat; @@ -40,17 +40,16 @@ public class ExclusionFilterTest { ExclusionFilter sourceRelativeFilter = new ExclusionFilter("**/*Foo.java"); ExclusionFilter absoluteFilter = new ExclusionFilter("file:**/src/main/**Foo.java"); - File file = temp.newFile(); - InputFile inputFile = InputFile.create(file, "src/main/java/org/MyFoo.java", ImmutableMap.of( - InputFile.ATTRIBUTE_CANONICAL_PATH, "/absolute/path/to/src/main/java/org/MyFoo.java", + File file = new File(temp.newFolder(), "src/main/java/org/MyFoo.java"); + InputFile inputFile = DefaultInputFile.create(file, "src/main/java/org/MyFoo.java", ImmutableMap.of( InputFile.ATTRIBUTE_SOURCE_RELATIVE_PATH, "org/MyFoo.java" )); assertThat(sourceRelativeFilter.accept(inputFile)).isFalse(); assertThat(absoluteFilter.accept(inputFile)).isFalse(); - inputFile = InputFile.create(file, "src/main/java/org/Other.java", ImmutableMap.of( - InputFile.ATTRIBUTE_CANONICAL_PATH, "/absolute/path/to/src/main/java/org/Other.java", + file = new File(temp.newFolder(), "src/main/java/org/Other.java"); + inputFile = DefaultInputFile.create(file, "src/main/java/org/Other.java", ImmutableMap.of( InputFile.ATTRIBUTE_SOURCE_RELATIVE_PATH, "org/Other.java" )); assertThat(sourceRelativeFilter.accept(inputFile)).isTrue(); diff --git a/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/ExclusionFiltersTest.java b/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/ExclusionFiltersTest.java index 05c3d065458..049c45e13e7 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/ExclusionFiltersTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/ExclusionFiltersTest.java @@ -30,6 +30,7 @@ import org.sonar.api.resources.JavaFile; import org.sonar.api.resources.Project; import org.sonar.api.scan.filesystem.FileExclusions; import org.sonar.api.scan.filesystem.InputFile; +import org.sonar.api.scan.filesystem.internal.DefaultInputFile; import java.io.IOException; @@ -47,21 +48,21 @@ public class ExclusionFiltersTest { ExclusionFilters filter = new ExclusionFilters(new FileExclusions(settings)); java.io.File file = temp.newFile(); - InputFile inputFile = InputFile.create(file, "src/main/java/com/mycompany/Foo.java", ImmutableMap.of( + InputFile inputFile = DefaultInputFile.create(file, "src/main/java/com/mycompany/Foo.java", ImmutableMap.of( InputFile.ATTRIBUTE_TYPE, InputFile.TYPE_SOURCE, InputFile.ATTRIBUTE_SOURCE_RELATIVE_PATH, "com/mycompany/Foo.java" )); assertThat(filter.accept(inputFile)).isFalse(); - inputFile = InputFile.create(file, "src/main/java/com/mycompany/FooDao.java", ImmutableMap.of( + inputFile = DefaultInputFile.create(file, "src/main/java/com/mycompany/FooDao.java", ImmutableMap.of( InputFile.ATTRIBUTE_TYPE, InputFile.TYPE_SOURCE, InputFile.ATTRIBUTE_SOURCE_RELATIVE_PATH, "com/mycompany/FooDao.java" )); assertThat(filter.accept(inputFile)).isTrue(); // source inclusions do not apply to tests - inputFile = InputFile.create(file, "src/main/java/com/mycompany/Foo.java", ImmutableMap.of( + inputFile = DefaultInputFile.create(file, "src/main/java/com/mycompany/Foo.java", ImmutableMap.of( InputFile.ATTRIBUTE_TYPE, InputFile.TYPE_TEST, InputFile.ATTRIBUTE_SOURCE_RELATIVE_PATH, "com/mycompany/Foo.java" )); @@ -75,14 +76,14 @@ public class ExclusionFiltersTest { ExclusionFilters filter = new ExclusionFilters(new FileExclusions(settings)); java.io.File file = temp.newFile(); - InputFile inputFile = InputFile.create(file, "src/main/java/com/mycompany/Foo.java", ImmutableMap.of( + InputFile inputFile = DefaultInputFile.create(file, "src/main/java/com/mycompany/Foo.java", ImmutableMap.of( InputFile.ATTRIBUTE_TYPE, InputFile.TYPE_SOURCE, InputFile.ATTRIBUTE_SOURCE_RELATIVE_PATH, "com/mycompany/Foo.java" )); assertThat(filter.accept(inputFile)).isFalse(); - inputFile = InputFile.create(file, "src/main/java/com/mycompany/FooDto.java", ImmutableMap.of( + inputFile = DefaultInputFile.create(file, "src/main/java/com/mycompany/FooDto.java", ImmutableMap.of( InputFile.ATTRIBUTE_TYPE, InputFile.TYPE_SOURCE, InputFile.ATTRIBUTE_SOURCE_RELATIVE_PATH, "com/mycompany/FooDto.java" )); @@ -96,20 +97,20 @@ public class ExclusionFiltersTest { ExclusionFilters filter = new ExclusionFilters(new FileExclusions(settings)); java.io.File file = temp.newFile(); - InputFile inputFile = InputFile.create(file, "src/main/java/com/mycompany/FooDao.java", ImmutableMap.of( + InputFile inputFile = DefaultInputFile.create(file, "src/main/java/com/mycompany/FooDao.java", ImmutableMap.of( InputFile.ATTRIBUTE_TYPE, InputFile.TYPE_SOURCE, InputFile.ATTRIBUTE_SOURCE_RELATIVE_PATH, "com/mycompany/FooDao.java" )); assertThat(filter.accept(inputFile)).isFalse(); - inputFile = InputFile.create(file, "src/main/java/com/mycompany/Foo.java", ImmutableMap.of( + inputFile = DefaultInputFile.create(file, "src/main/java/com/mycompany/Foo.java", ImmutableMap.of( InputFile.ATTRIBUTE_TYPE, InputFile.TYPE_SOURCE, InputFile.ATTRIBUTE_SOURCE_RELATIVE_PATH, "com/mycompany/Foo.java" )); assertThat(filter.accept(inputFile)).isTrue(); // source exclusions do not apply to tests - inputFile = InputFile.create(file, "src/main/java/com/mycompany/FooDao.java", ImmutableMap.of( + inputFile = DefaultInputFile.create(file, "src/main/java/com/mycompany/FooDao.java", ImmutableMap.of( InputFile.ATTRIBUTE_TYPE, InputFile.TYPE_TEST, InputFile.ATTRIBUTE_SOURCE_RELATIVE_PATH, "com/mycompany/FooDao.java" )); @@ -125,15 +126,13 @@ public class ExclusionFiltersTest { settings.setProperty(CoreProperties.PROJECT_EXCLUSIONS_PROPERTY, "file:" + excludedFile.getCanonicalPath()); ExclusionFilters filter = new ExclusionFilters(new FileExclusions(settings)); - InputFile includedInput = InputFile.create(includedFile, "src/main/java/org/bar/Foo.java", ImmutableMap.of( - InputFile.ATTRIBUTE_TYPE, InputFile.TYPE_SOURCE, - InputFile.ATTRIBUTE_CANONICAL_PATH, includedFile.getCanonicalPath() + InputFile includedInput = DefaultInputFile.create(includedFile, "src/main/java/org/bar/Foo.java", ImmutableMap.of( + InputFile.ATTRIBUTE_TYPE, InputFile.TYPE_SOURCE )); assertThat(filter.accept(includedInput)).isTrue(); - InputFile excludedInput = InputFile.create(excludedFile, "src/main/java/org/bar/Bar.java", ImmutableMap.of( - InputFile.ATTRIBUTE_TYPE, InputFile.TYPE_SOURCE, - InputFile.ATTRIBUTE_CANONICAL_PATH, excludedFile.getCanonicalPath() + InputFile excludedInput = DefaultInputFile.create(excludedFile, "src/main/java/org/bar/Bar.java", ImmutableMap.of( + InputFile.ATTRIBUTE_TYPE, InputFile.TYPE_SOURCE )); assertThat(filter.accept(excludedInput)).isFalse(); } diff --git a/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/FileQueryFilterTest.java b/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/FileQueryFilterTest.java new file mode 100644 index 00000000000..b149bbf4576 --- /dev/null +++ b/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/FileQueryFilterTest.java @@ -0,0 +1,101 @@ +/* + * 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.batch.scan.filesystem; + +import org.junit.Test; +import org.sonar.api.CoreProperties; +import org.sonar.api.config.Settings; +import org.sonar.api.scan.filesystem.FileQuery; +import org.sonar.api.scan.filesystem.InputFile; +import org.sonar.api.scan.filesystem.InputFileFilter; + +import static org.fest.assertions.Assertions.assertThat; + +public class FileQueryFilterTest { + + Settings settings = new Settings(); + + @Test + public void wrap_query_on_attributes() throws Exception { + FileQuery query = FileQuery.onSource(); + FileQueryFilter filter = new FileQueryFilter(settings, query); + + assertThat(filter.filters()).hasSize(1); + InputFileFilter typeFilter = filter.filters().get(0); + assertThat(typeFilter).isInstanceOf(AttributeFilter.class); + assertThat(((AttributeFilter) typeFilter).key()).isEqualTo(InputFile.ATTRIBUTE_TYPE); + assertThat(((AttributeFilter) typeFilter).values()).containsOnly(InputFile.TYPE_SOURCE); + } + + @Test + public void wrap_query_on_inclusions() throws Exception { + FileQuery query = FileQuery.on().withInclusions("Foo*.java"); + FileQueryFilter filter = new FileQueryFilter(settings, query); + + assertThat(filter.filters()).hasSize(1); + InputFileFilter inclusionFilter = filter.filters().get(0); + assertThat(inclusionFilter).isInstanceOf(InclusionFilter.class); + assertThat(inclusionFilter.toString()).isEqualTo("Includes: Foo*.java"); + } + + @Test + public void wrap_query_on_exclusions() throws Exception { + FileQuery query = FileQuery.on().withExclusions("Foo*.java"); + FileQueryFilter filter = new FileQueryFilter(settings, query); + + assertThat(filter.filters()).hasSize(1); + InputFileFilter exclusionFilter = filter.filters().get(0); + assertThat(exclusionFilter).isInstanceOf(ExclusionFilter.class); + assertThat(exclusionFilter.toString()).isEqualTo("Excludes: Foo*.java"); + } + + @Test + public void all_files_by_default() throws Exception { + FileQuery query = FileQuery.on(); + FileQueryFilter filter = new FileQueryFilter(settings, query); + assertThat(filter.filters()).isEmpty(); + } + + @Test + public void only_changed_files_by_default_if_incremental_mode() throws Exception { + settings.setProperty(CoreProperties.INCREMENTAL_PREVIEW, true); + + FileQuery query = FileQuery.on(); + FileQueryFilter filter = new FileQueryFilter(settings, query); + + assertThat(filter.filters()).hasSize(1); + AttributeFilter statusFilter = (AttributeFilter) filter.filters().get(0); + assertThat(statusFilter.key()).isEqualTo(InputFile.ATTRIBUTE_STATUS); + assertThat(statusFilter.values()).containsOnly(InputFile.STATUS_ADDED, InputFile.STATUS_CHANGED); + } + + @Test + public void get_all_files_even_if_incremental_mode() throws Exception { + settings.setProperty(CoreProperties.INCREMENTAL_PREVIEW, true); + + FileQuery query = FileQuery.on().on(InputFile.ATTRIBUTE_STATUS, InputFile.STATUS_SAME); + FileQueryFilter filter = new FileQueryFilter(settings, query); + + assertThat(filter.filters()).hasSize(1); + AttributeFilter statusFilter = (AttributeFilter) filter.filters().get(0); + assertThat(statusFilter.key()).isEqualTo(InputFile.ATTRIBUTE_STATUS); + assertThat(statusFilter.values()).containsOnly(InputFile.STATUS_SAME); + } +} diff --git a/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/InclusionFilterTest.java b/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/InclusionFilterTest.java index 38f391fa8ce..caf1b5b606f 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/InclusionFilterTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/InclusionFilterTest.java @@ -24,6 +24,7 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.sonar.api.scan.filesystem.InputFile; +import org.sonar.api.scan.filesystem.internal.DefaultInputFile; import java.io.File; @@ -38,18 +39,16 @@ public class InclusionFilterTest { InclusionFilter sourceRelativeFilter = new InclusionFilter("**/*Foo.java"); InclusionFilter absoluteFilter = new InclusionFilter("file:**/src/main/**Foo.java"); - - File file = temp.newFile(); - InputFile inputFile = InputFile.create(file, "src/main/java/org/MyFoo.java", ImmutableMap.of( - InputFile.ATTRIBUTE_CANONICAL_PATH, "/absolute/path/to/src/main/java/org/MyFoo.java", + File file = new File(temp.newFolder(), "src/main/java/org/MyFoo.java"); + InputFile inputFile = DefaultInputFile.create(file, "src/main/java/org/MyFoo.java", ImmutableMap.of( InputFile.ATTRIBUTE_SOURCE_RELATIVE_PATH, "org/MyFoo.java" )); assertThat(sourceRelativeFilter.accept(inputFile)).isTrue(); assertThat(absoluteFilter.accept(inputFile)).isTrue(); - inputFile = InputFile.create(file, "src/main/java/org/Other.java", ImmutableMap.of( - InputFile.ATTRIBUTE_CANONICAL_PATH, "/absolute/path/to/src/main/java/org/Other.java", + file = new File(temp.newFolder(), "src/main/java/org/Other.java"); + inputFile = DefaultInputFile.create(file, "src/main/java/org/Other.java", ImmutableMap.of( InputFile.ATTRIBUTE_SOURCE_RELATIVE_PATH, "org/Other.java" )); assertThat(sourceRelativeFilter.accept(inputFile)).isFalse(); diff --git a/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/InputFileCacheTest.java b/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/InputFileCacheTest.java index 25b82b83961..3aca556e9c1 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/InputFileCacheTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/InputFileCacheTest.java @@ -25,7 +25,7 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; -import org.sonar.api.scan.filesystem.InputFile; +import org.sonar.api.scan.filesystem.internal.DefaultInputFile; import org.sonar.batch.index.Caches; import static org.fest.assertions.Assertions.assertThat; @@ -50,8 +50,8 @@ public class InputFileCacheTest { @Test public void should_add_input_file() throws Exception { InputFileCache cache = new InputFileCache(caches); - cache.put("struts", InputFile.create(temp.newFile(), "src/main/java/Foo.java", Maps.<String, String>newHashMap())); - cache.put("struts-core", InputFile.create(temp.newFile(), "src/main/java/Foo.java", Maps.<String, String>newHashMap())); + cache.put("struts", DefaultInputFile.create(temp.newFile(), "src/main/java/Foo.java", Maps.<String, String>newHashMap())); + cache.put("struts-core", DefaultInputFile.create(temp.newFile(), "src/main/java/Foo.java", Maps.<String, String>newHashMap())); assertThat(cache.byModule("struts")).hasSize(1); assertThat(cache.byModule("struts-core")).hasSize(1); diff --git a/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/LanguageRecognizerTest.java b/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/LanguageRecognizerTest.java new file mode 100644 index 00000000000..5a53538434e --- /dev/null +++ b/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/LanguageRecognizerTest.java @@ -0,0 +1,97 @@ +/* + * 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.batch.scan.filesystem; + +import org.junit.Test; +import org.sonar.api.resources.Java; +import org.sonar.api.resources.Language; + +import static org.fest.assertions.Assertions.assertThat; +import static org.fest.assertions.Fail.fail; + +public class LanguageRecognizerTest { + + @Test + public void test_sanitizeExtension() throws Exception { + assertThat(LanguageRecognizer.sanitizeExtension(".cbl")).isEqualTo("cbl"); + assertThat(LanguageRecognizer.sanitizeExtension(".CBL")).isEqualTo("cbl"); + assertThat(LanguageRecognizer.sanitizeExtension("CBL")).isEqualTo("cbl"); + assertThat(LanguageRecognizer.sanitizeExtension("cbl")).isEqualTo("cbl"); + } + + @Test + public void search_by_file_extension() throws Exception { + Language[] languages = new Language[]{Java.INSTANCE, new Cobol()}; + LanguageRecognizer recognizer = new LanguageRecognizer(languages); + + recognizer.start(); + assertThat(recognizer.ofExtension("java")).isEqualTo(Java.KEY); + assertThat(recognizer.ofExtension("cbl")).isEqualTo("cobol"); + assertThat(recognizer.ofExtension("CBL")).isEqualTo("cobol"); + assertThat(recognizer.ofExtension("php")).isNull(); + assertThat(recognizer.ofExtension("")).isNull(); + assertThat(recognizer.ofExtension(null)).isNull(); + recognizer.stop(); + } + + @Test + public void fail_if_conflict_of_file_extensions() throws Exception { + Language[] languages = new Language[]{Java.INSTANCE, new Language() { + @Override + public String getKey() { + return "java2"; + } + + @Override + public String getName() { + return "Java2"; + } + + @Override + public String[] getFileSuffixes() { + return new String[]{"java2", "java"}; + } + }}; + + try { + new LanguageRecognizer(languages).start(); + fail(); + } catch (IllegalStateException e) { + assertThat(e.getMessage()).isEqualTo("File extension 'java' is declared by two languages: java and java2"); + } + } + + static class Cobol implements Language { + @Override + public String getKey() { + return "cobol"; + } + + @Override + public String getName() { + return "Cobol"; + } + + @Override + public String[] getFileSuffixes() { + return new String[]{"cbl", "cob"}; + } + } +} |