aboutsummaryrefslogtreecommitdiffstats
path: root/sonar-scanner-engine/src
diff options
context:
space:
mode:
authorMichal Duda <michalno1@gmail.com>2018-11-22 18:09:44 +0100
committersonartech <sonartech@sonarsource.com>2019-01-16 09:43:02 +0100
commitcf1c8d76184de334921362e9abd7dd64d56e5f16 (patch)
tree8daacd2319f8f93c5a0858638c040551b38ae386 /sonar-scanner-engine/src
parente4c0b858c7e6807801c6481d995ca11682c58fad (diff)
downloadsonarqube-cf1c8d76184de334921362e9abd7dd64d56e5f16.tar.gz
sonarqube-cf1c8d76184de334921362e9abd7dd64d56e5f16.zip
SONAR-11507 WS /batch/project new file structure
Diffstat (limited to 'sonar-scanner-engine/src')
-rw-r--r--sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/DefaultProjectRepositoriesLoader.java37
-rw-r--r--sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/MultiModuleProjectRepository.java45
-rw-r--r--sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/ProjectRepositories.java35
-rw-r--r--sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/SingleProjectRepository.java49
-rw-r--r--sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/StatusDetection.java9
-rw-r--r--sonar-scanner-engine/src/main/java/org/sonar/scanner/scm/ScmPublisher.java6
-rw-r--r--sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/ScannerMediumTester.java19
-rw-r--r--sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/branch/BranchMediumTest.java2
-rw-r--r--sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/issuesmode/ScanOnlyChangedTest.java4
-rw-r--r--sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/scm/ScmMediumTest.java8
-rw-r--r--sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/DefaultProjectRepositoriesLoaderTest.java7
-rw-r--r--sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/MultiModuleProjectRepositoryTest.java61
-rw-r--r--sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/ProjectRepositoriesProviderTest.java8
-rw-r--r--sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/SingleProjectRepositoryTest.java55
-rw-r--r--sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/StatusDetectionTest.java26
15 files changed, 288 insertions, 83 deletions
diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/DefaultProjectRepositoriesLoader.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/DefaultProjectRepositoriesLoader.java
index 043264de8b3..271b84bceee 100644
--- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/DefaultProjectRepositoriesLoader.java
+++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/DefaultProjectRepositoriesLoader.java
@@ -20,12 +20,11 @@
package org.sonar.scanner.repository;
import com.google.common.base.Throwables;
-import com.google.common.collect.HashBasedTable;
-import com.google.common.collect.Table;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.util.Date;
+import java.util.HashMap;
import java.util.Map;
import javax.annotation.Nullable;
import org.apache.commons.io.IOUtils;
@@ -34,9 +33,7 @@ import org.slf4j.LoggerFactory;
import org.sonar.api.utils.MessageException;
import org.sonar.scanner.bootstrap.ScannerWsClient;
import org.sonar.scanner.util.ScannerUtils;
-import org.sonarqube.ws.Batch;
import org.sonarqube.ws.Batch.WsProjectResponse;
-import org.sonarqube.ws.Batch.WsProjectResponse.FileDataByPath;
import org.sonarqube.ws.client.GetRequest;
import org.sonarqube.ws.client.HttpException;
import org.sonarqube.ws.client.WsResponse;
@@ -62,7 +59,7 @@ public class DefaultProjectRepositoriesLoader implements ProjectRepositoriesLoad
}
LOG.debug("Project repository not available - continuing without it");
- return new ProjectRepositories();
+ return new SingleProjectRepository();
}
}
@@ -97,22 +94,32 @@ public class DefaultProjectRepositoriesLoader implements ProjectRepositoriesLoad
private static ProjectRepositories processStream(InputStream is, String projectKey) {
try {
WsProjectResponse response = WsProjectResponse.parseFrom(is);
-
- Table<String, String, FileData> fileDataTable = HashBasedTable.create();
-
- Map<String, FileDataByPath> fileDataByModuleAndPath = response.getFileDataByModuleAndPath();
- for (Map.Entry<String, FileDataByPath> e1 : fileDataByModuleAndPath.entrySet()) {
- for (Map.Entry<String, Batch.WsProjectResponse.FileData> e2 : e1.getValue().getFileDataByPath().entrySet()) {
- FileData fd = new FileData(e2.getValue().getHash(), e2.getValue().getRevision());
- fileDataTable.put(e1.getKey(), e2.getKey(), fd);
- }
+ if (response.getFileDataByModuleAndPathCount() == 0) {
+ return new SingleProjectRepository(constructFileDataMap(response.getFileDataByPathMap()), new Date(response.getLastAnalysisDate()));
+ } else {
+ final Map<String, SingleProjectRepository> repositoriesPerModule = new HashMap<>();
+ response.getFileDataByModuleAndPathMap().keySet().forEach(moduleKey -> {
+ WsProjectResponse.FileDataByPath filePaths = response.getFileDataByModuleAndPathMap().get(moduleKey);
+ repositoriesPerModule.put(moduleKey, new SingleProjectRepository(
+ constructFileDataMap(filePaths.getFileDataByPathMap()), new Date(response.getLastAnalysisDate())));
+ });
+ return new MultiModuleProjectRepository(repositoriesPerModule, new Date(response.getLastAnalysisDate()));
}
- return new ProjectRepositories(fileDataTable, new Date(response.getLastAnalysisDate()));
} catch (IOException e) {
throw new IllegalStateException("Couldn't load project repository for " + projectKey, e);
} finally {
IOUtils.closeQuietly(is);
}
}
+
+ private static Map<String, FileData> constructFileDataMap(Map<String, WsProjectResponse.FileData> content) {
+ Map<String, FileData> fileDataMap = new HashMap<>();
+ content.forEach((key, value) -> {
+ FileData fd = new FileData(value.getHash(), value.getRevision());
+ fileDataMap.put(key, fd);
+ });
+
+ return fileDataMap;
+ }
}
diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/MultiModuleProjectRepository.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/MultiModuleProjectRepository.java
new file mode 100644
index 00000000000..6876d638547
--- /dev/null
+++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/MultiModuleProjectRepository.java
@@ -0,0 +1,45 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2018 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program 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.
+ *
+ * This program 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.scanner.repository;
+
+import com.google.common.collect.ImmutableMap;
+import java.util.Date;
+import java.util.Map;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
+import javax.annotation.concurrent.Immutable;
+
+@Immutable
+public class MultiModuleProjectRepository extends ProjectRepositories {
+
+ private Map<String, SingleProjectRepository> repositoriesPerModule;
+
+ public MultiModuleProjectRepository(Map<String, SingleProjectRepository> repositoriesPerModule, @Nullable Date lastAnalysisDate) {
+ super(lastAnalysisDate, true);
+ this.repositoriesPerModule = ImmutableMap.copyOf(repositoriesPerModule);
+ }
+
+ @CheckForNull
+ public FileData fileData(String moduleKeyWithBranch, String path) {
+ SingleProjectRepository repository = repositoriesPerModule.get(moduleKeyWithBranch);
+ return repository == null ? null : repository.fileData(path);
+ }
+
+}
diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/ProjectRepositories.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/ProjectRepositories.java
index bed6c1c2c34..e4cce89c392 100644
--- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/ProjectRepositories.java
+++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/ProjectRepositories.java
@@ -19,48 +19,33 @@
*/
package org.sonar.scanner.repository;
-import com.google.common.collect.ImmutableTable;
-import com.google.common.collect.Table;
import java.util.Date;
-import java.util.Map;
import javax.annotation.CheckForNull;
import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable;
+import org.sonar.api.batch.fs.internal.DefaultInputFile;
@Immutable
-public class ProjectRepositories {
- private final ImmutableTable<String, String, FileData> fileDataByModuleAndPath;
+public abstract class ProjectRepositories {
private final Date lastAnalysisDate;
private final boolean exists;
- public ProjectRepositories() {
- this.exists = false;
- this.fileDataByModuleAndPath = new ImmutableTable.Builder<String, String, FileData>().build();
- this.lastAnalysisDate = null;
- }
-
- public ProjectRepositories(Table<String, String, FileData> fileDataByModuleAndPath,
- @Nullable Date lastAnalysisDate) {
- this.fileDataByModuleAndPath = ImmutableTable.copyOf(fileDataByModuleAndPath);
+ public ProjectRepositories(@Nullable Date lastAnalysisDate, boolean exists) {
this.lastAnalysisDate = lastAnalysisDate;
- this.exists = true;
+ this.exists = exists;
}
public boolean exists() {
return exists;
}
- public Map<String, FileData> fileDataByPath(String moduleKey) {
- return fileDataByModuleAndPath.row(moduleKey);
- }
-
- public Table<String, String, FileData> fileDataByModuleAndPath() {
- return fileDataByModuleAndPath;
- }
-
@CheckForNull
- public FileData fileData(String projectKeyWithBranch, String path) {
- return fileDataByModuleAndPath.get(projectKeyWithBranch, path);
+ public FileData fileData(String moduleKeyWithBranch, DefaultInputFile inputFile) {
+ if (this instanceof SingleProjectRepository) {
+ return ((SingleProjectRepository) this).fileData(inputFile.getProjectRelativePath());
+ } else {
+ return ((MultiModuleProjectRepository) this).fileData(moduleKeyWithBranch, inputFile.getModuleRelativePath());
+ }
}
@CheckForNull
diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/SingleProjectRepository.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/SingleProjectRepository.java
new file mode 100644
index 00000000000..0d9637cf2e3
--- /dev/null
+++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/SingleProjectRepository.java
@@ -0,0 +1,49 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2018 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program 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.
+ *
+ * This program 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.scanner.repository;
+
+import com.google.common.collect.ImmutableMap;
+import java.util.Date;
+import java.util.Map;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
+import javax.annotation.concurrent.Immutable;
+
+@Immutable
+public class SingleProjectRepository extends ProjectRepositories {
+
+ private final ImmutableMap<String, FileData> fileDataByPath;
+
+ public SingleProjectRepository() {
+ super(null, false);
+ this.fileDataByPath = ImmutableMap.<String, FileData>builder().build();
+ }
+
+ public SingleProjectRepository(Map<String, FileData> fileDataByPath,
+ @Nullable Date lastAnalysisDate) {
+ super(lastAnalysisDate, true);
+ this.fileDataByPath = ImmutableMap.copyOf(fileDataByPath);
+ }
+
+ @CheckForNull
+ public FileData fileData(String path) {
+ return fileDataByPath.get(path);
+ }
+}
diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/StatusDetection.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/StatusDetection.java
index 2554bf6b2fe..dedb65043c7 100644
--- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/StatusDetection.java
+++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/StatusDetection.java
@@ -34,7 +34,6 @@ import static org.sonar.api.batch.fs.InputFile.Status.SAME;
@Immutable
public class StatusDetection {
-
private final ProjectRepositories projectRepositories;
private final ScmChangedFiles scmChangedFiles;
@@ -43,8 +42,8 @@ public class StatusDetection {
this.scmChangedFiles = scmChangedFiles;
}
- InputFile.Status status(String projectKeyWithBranch, DefaultInputFile inputFile, String hash) {
- FileData fileDataPerPath = projectRepositories.fileData(projectKeyWithBranch, inputFile.relativePath());
+ InputFile.Status status(String moduleKeyWithBranch, DefaultInputFile inputFile, String hash) {
+ FileData fileDataPerPath = projectRepositories.fileData(moduleKeyWithBranch, inputFile);
if (fileDataPerPath == null) {
return checkChanged(ADDED, inputFile);
}
@@ -64,8 +63,8 @@ public class StatusDetection {
* @return null if it was not possible to get the status without calculating metadata
*/
@CheckForNull
- public InputFile.Status getStatusWithoutMetadata(String projectKeyWithBranch, DefaultInputFile inputFile) {
- FileData fileDataPerPath = projectRepositories.fileData(projectKeyWithBranch, inputFile.relativePath());
+ public InputFile.Status getStatusWithoutMetadata(String moduleKeyWithBranch, DefaultInputFile inputFile) {
+ FileData fileDataPerPath = projectRepositories.fileData(moduleKeyWithBranch, inputFile);
if (fileDataPerPath == null) {
return checkChanged(ADDED, inputFile);
}
diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scm/ScmPublisher.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scm/ScmPublisher.java
index 78184f1dfb1..424f3ee1459 100644
--- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scm/ScmPublisher.java
+++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scm/ScmPublisher.java
@@ -27,8 +27,8 @@ import org.sonar.api.batch.InstantiationStrategy;
import org.sonar.api.batch.ScannerSide;
import org.sonar.api.batch.fs.InputFile;
import org.sonar.api.batch.fs.InputFile.Status;
-import org.sonar.api.batch.fs.internal.DefaultInputFile;
import org.sonar.api.batch.fs.internal.AbstractProjectOrModule;
+import org.sonar.api.batch.fs.internal.DefaultInputFile;
import org.sonar.api.batch.scm.ScmProvider;
import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;
@@ -57,7 +57,7 @@ public final class ScmPublisher {
private final BranchConfiguration branchConfiguration;
public ScmPublisher(AbstractProjectOrModule inputModule, ScmConfiguration configuration, ProjectRepositories projectRepositories,
- ModuleInputComponentStore componentStore, DefaultModuleFileSystem fs, ReportPublisher reportPublisher, BranchConfiguration branchConfiguration) {
+ ModuleInputComponentStore componentStore, DefaultModuleFileSystem fs, ReportPublisher reportPublisher, BranchConfiguration branchConfiguration) {
this.inputModule = inputModule;
this.configuration = configuration;
this.projectRepositories = projectRepositories;
@@ -108,7 +108,7 @@ public final class ScmPublisher {
addIfNotEmpty(filesToBlame, f);
} else if (!branchConfiguration.isShortOrPullRequest()) {
// File status is SAME so that mean fileData exists
- FileData fileData = projectRepositories.fileData(inputModule.definition().getKeyWithBranch(), inputFile.getModuleRelativePath());
+ FileData fileData = projectRepositories.fileData(inputModule.definition().getKeyWithBranch(), inputFile);
if (StringUtils.isEmpty(fileData.revision())) {
addIfNotEmpty(filesToBlame, f);
} else {
diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/ScannerMediumTester.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/ScannerMediumTester.java
index eee733bc972..75111308e82 100644
--- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/ScannerMediumTester.java
+++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/ScannerMediumTester.java
@@ -20,6 +20,7 @@
package org.sonar.scanner.mediumtest;
import com.google.common.collect.HashBasedTable;
+import com.google.common.collect.Maps;
import com.google.common.collect.Table;
import java.io.File;
import java.io.FileInputStream;
@@ -62,6 +63,7 @@ import org.sonar.scanner.repository.ProjectRepositories;
import org.sonar.scanner.repository.ProjectRepositoriesLoader;
import org.sonar.scanner.repository.QualityProfileLoader;
import org.sonar.scanner.repository.ServerIssuesLoader;
+import org.sonar.scanner.repository.SingleProjectRepository;
import org.sonar.scanner.repository.settings.SettingsLoader;
import org.sonar.scanner.rule.ActiveRulesLoader;
import org.sonar.scanner.rule.LoadedActiveRule;
@@ -199,22 +201,22 @@ public class ScannerMediumTester extends ExternalResource {
}
public ScannerMediumTester addActiveRule(String repositoryKey, String ruleKey, @Nullable String templateRuleKey, String name, @Nullable String severity,
- @Nullable String internalKey, @Nullable String languag) {
+ @Nullable String internalKey, @Nullable String language) {
LoadedActiveRule r = new LoadedActiveRule();
r.setInternalKey(internalKey);
r.setRuleKey(RuleKey.of(repositoryKey, ruleKey));
r.setName(name);
r.setTemplateRuleKey(templateRuleKey);
- r.setLanguage(languag);
+ r.setLanguage(language);
r.setSeverity(severity);
activeRules.addActiveRule(r);
return this;
}
- public ScannerMediumTester addFileData(String moduleKey, String path, FileData fileData) {
- projectRefProvider.addFileData(moduleKey, path, fileData);
+ public ScannerMediumTester addFileData(String path, FileData fileData) {
+ projectRefProvider.addFileData(path, fileData);
return this;
}
@@ -368,17 +370,16 @@ public class ScannerMediumTester extends ExternalResource {
}
private static class FakeProjectRepositoriesLoader implements ProjectRepositoriesLoader {
-
- private Table<String, String, FileData> fileDataTable = HashBasedTable.create();
+ private Map<String, FileData> fileDataMap = Maps.newHashMap();
private Date lastAnalysisDate;
@Override
public ProjectRepositories load(String projectKey, boolean isIssuesMode, @Nullable String branchBase) {
- return new ProjectRepositories(fileDataTable, lastAnalysisDate);
+ return new SingleProjectRepository(fileDataMap, lastAnalysisDate);
}
- public FakeProjectRepositoriesLoader addFileData(String moduleKey, String path, FileData fileData) {
- fileDataTable.put(moduleKey, path, fileData);
+ public FakeProjectRepositoriesLoader addFileData(String path, FileData fileData) {
+ fileDataMap.put(path, fileData);
return this;
}
diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/branch/BranchMediumTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/branch/BranchMediumTest.java
index 62899cf17f1..7c52194f8de 100644
--- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/branch/BranchMediumTest.java
+++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/branch/BranchMediumTest.java
@@ -66,7 +66,7 @@ public class BranchMediumTest {
String md5sum = new FileMetadata()
.readMetadata(Files.newInputStream(filepath), StandardCharsets.UTF_8, FILE_PATH)
.hash();
- tester.addFileData(PROJECT_KEY, FILE_PATH, new FileData(md5sum, "1.1"));
+ tester.addFileData(FILE_PATH, new FileData(md5sum, "1.1"));
}
@Test
diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/issuesmode/ScanOnlyChangedTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/issuesmode/ScanOnlyChangedTest.java
index 4f68f3040fa..1c31872a3a8 100644
--- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/issuesmode/ScanOnlyChangedTest.java
+++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/issuesmode/ScanOnlyChangedTest.java
@@ -47,9 +47,9 @@ import org.sonar.api.CoreProperties;
import org.sonar.api.batch.fs.internal.FileMetadata;
import org.sonar.api.utils.log.LogTester;
import org.sonar.scanner.issue.tracking.TrackedIssue;
+import org.sonar.scanner.mediumtest.AnalysisResult;
import org.sonar.scanner.mediumtest.ScannerMediumTester;
import org.sonar.scanner.mediumtest.ScannerMediumTester.AnalysisBuilder;
-import org.sonar.scanner.mediumtest.AnalysisResult;
import org.sonar.scanner.protocol.Constants.Severity;
import org.sonar.scanner.protocol.input.ScannerInput.ServerIssue;
import org.sonar.scanner.repository.FileData;
@@ -104,7 +104,7 @@ public class ScanOnlyChangedTest {
tester
// this will cause the file to have status==SAME
- .addFileData(projectKey, filePath, new FileData(md5sum, null))
+ .addFileData(filePath, new FileData(md5sum, null))
.setPreviousAnalysisDate(new Date())
// Existing issue that is copied
.mockServerIssue(ServerIssue.newBuilder().setKey("xyz")
diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/scm/ScmMediumTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/scm/ScmMediumTest.java
index 94f6030b3e6..42d7f836bf5 100644
--- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/scm/ScmMediumTest.java
+++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/scm/ScmMediumTest.java
@@ -69,10 +69,10 @@ public class ScmMediumTest {
.addRules(new XooRulesDefinition())
// active a rule just to be sure that xoo files are published
.addActiveRule("xoo", "xoo:OneIssuePerFile", null, "One Issue Per File", null, null, null)
- .addFileData("com.foo.project", CHANGED_CONTENT_SCM_ON_SERVER_XOO, new FileData(DigestUtils.md5Hex(SAMPLE_XOO_CONTENT), null))
- .addFileData("com.foo.project", SAME_CONTENT_NO_SCM_ON_SERVER_XOO, new FileData(DigestUtils.md5Hex(SAMPLE_XOO_CONTENT), null))
- .addFileData("com.foo.project", SAME_CONTENT_SCM_ON_SERVER_XOO, new FileData(DigestUtils.md5Hex(SAMPLE_XOO_CONTENT), "1.1"))
- .addFileData("com.foo.project", NO_BLAME_SCM_ON_SERVER_XOO, new FileData(DigestUtils.md5Hex(SAMPLE_XOO_CONTENT), "1.1"));
+ .addFileData(CHANGED_CONTENT_SCM_ON_SERVER_XOO, new FileData(DigestUtils.md5Hex(SAMPLE_XOO_CONTENT), null))
+ .addFileData(SAME_CONTENT_NO_SCM_ON_SERVER_XOO, new FileData(DigestUtils.md5Hex(SAMPLE_XOO_CONTENT), null))
+ .addFileData(SAME_CONTENT_SCM_ON_SERVER_XOO, new FileData(DigestUtils.md5Hex(SAMPLE_XOO_CONTENT), "1.1"))
+ .addFileData(NO_BLAME_SCM_ON_SERVER_XOO, new FileData(DigestUtils.md5Hex(SAMPLE_XOO_CONTENT), "1.1"));
@Test
public void testScmMeasure() throws IOException, URISyntaxException {
diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/DefaultProjectRepositoriesLoaderTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/DefaultProjectRepositoriesLoaderTest.java
index c4749d87a2b..fff3d8a7830 100644
--- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/DefaultProjectRepositoriesLoaderTest.java
+++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/DefaultProjectRepositoriesLoaderTest.java
@@ -28,6 +28,7 @@ import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
+import org.sonar.api.batch.fs.internal.DefaultInputFile;
import org.sonar.api.utils.MessageException;
import org.sonar.scanner.WsTestUtil;
import org.sonar.scanner.bootstrap.ScannerWsClient;
@@ -124,9 +125,11 @@ public class DefaultProjectRepositoriesLoaderTest {
InputStream is = getTestResource("project.protobuf");
WsTestUtil.mockStream(wsClient, "/batch/project.protobuf?key=org.sonarsource.github%3Asonar-github-plugin&issues_mode=true", is);
+ DefaultInputFile file = mock(DefaultInputFile.class);
+ when(file.getModuleRelativePath()).thenReturn("src/test/java/org/sonar/plugins/github/PullRequestIssuePostJobTest.java");
+
ProjectRepositories proj = loader.load("org.sonarsource.github:sonar-github-plugin", true, null);
- FileData fd = proj.fileData("org.sonarsource.github:sonar-github-plugin",
- "src/test/java/org/sonar/plugins/github/PullRequestIssuePostJobTest.java");
+ FileData fd = proj.fileData("org.sonarsource.github:sonar-github-plugin", file);
assertThat(fd.revision()).isEqualTo("27bf2c54633d05c5df402bbe09471fe43bd9e2e5");
assertThat(fd.hash()).isEqualTo("edb6b3b9ab92d8dc53ba90ab86cd422e");
diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/MultiModuleProjectRepositoryTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/MultiModuleProjectRepositoryTest.java
new file mode 100644
index 00000000000..4bc505ecfc2
--- /dev/null
+++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/MultiModuleProjectRepositoryTest.java
@@ -0,0 +1,61 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2018 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program 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.
+ *
+ * This program 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.scanner.repository;
+
+import java.util.Date;
+import java.util.Map;
+import org.assertj.core.util.Maps;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertNotNull;
+
+public class MultiModuleProjectRepositoryTest {
+
+ private MultiModuleProjectRepository repository;
+
+ @Before
+ public void setUp() {
+ Date lastAnalysisDate = new Date();
+ SingleProjectRepository repository1 = new SingleProjectRepository(Maps.newHashMap("/Abc.java", new FileData("123", "456")), lastAnalysisDate);
+ SingleProjectRepository repository2 = new SingleProjectRepository(Maps.newHashMap("/Def.java", new FileData("567", "321")), lastAnalysisDate);
+ Map<String, SingleProjectRepository> moduleRepositories = Maps.newHashMap("module1", repository1);
+ moduleRepositories.put("module2", repository2);
+
+ repository = new MultiModuleProjectRepository(moduleRepositories, lastAnalysisDate);
+ }
+
+ @Test
+ public void test_file_data_when_module_and_file_exist() {
+ FileData fileData = repository.fileData("module2", "/Def.java");
+
+ assertNotNull(fileData);
+ assertThat(fileData.hash()).isEqualTo("567");
+ assertThat(fileData.revision()).isEqualTo("321");
+ }
+
+ @Test
+ public void test_file_data_when_module_does_not_exist() {
+ FileData fileData = repository.fileData("unknown", "/Def.java");
+
+ assertThat(fileData).isNull();
+ }
+}
diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/ProjectRepositoriesProviderTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/ProjectRepositoriesProviderTest.java
index 515c1b3873e..9af998d5ebd 100644
--- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/ProjectRepositoriesProviderTest.java
+++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/ProjectRepositoriesProviderTest.java
@@ -19,9 +19,9 @@
*/
package org.sonar.scanner.repository;
-import com.google.common.collect.HashBasedTable;
-import com.google.common.collect.Table;
+import com.google.common.collect.Maps;
import java.util.Date;
+import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
@@ -55,9 +55,9 @@ public class ProjectRepositoriesProviderTest {
public void setUp() {
MockitoAnnotations.initMocks(this);
- Table<String, String, FileData> t2 = HashBasedTable.create();
+ Map<String, FileData> fileMap = Maps.newHashMap();
- project = new ProjectRepositories(t2, new Date());
+ project = new SingleProjectRepository(fileMap, new Date());
provider = new ProjectRepositoriesProvider();
when(props.getKeyWithBranch()).thenReturn("key");
diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/SingleProjectRepositoryTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/SingleProjectRepositoryTest.java
new file mode 100644
index 00000000000..8a92b4c746b
--- /dev/null
+++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/SingleProjectRepositoryTest.java
@@ -0,0 +1,55 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2018 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program 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.
+ *
+ * This program 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.scanner.repository;
+
+import java.util.Date;
+import org.assertj.core.util.Maps;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertNotNull;
+
+public class SingleProjectRepositoryTest {
+
+ private SingleProjectRepository repository;
+
+ @Before
+ public void setUp() {
+ Date lastAnalysisDate = new Date();
+ repository = new SingleProjectRepository(Maps.newHashMap("/Abc.java", new FileData("123", "456")), lastAnalysisDate);
+ }
+
+ @Test
+ public void test_file_data_when_file_exists() {
+ FileData fileData = repository.fileData("/Abc.java");
+
+ assertNotNull(fileData);
+ assertThat(fileData.hash()).isEqualTo("123");
+ assertThat(fileData.revision()).isEqualTo("456");
+ }
+
+ @Test
+ public void test_file_data_when_file_does_not_exist() {
+ FileData fileData = repository.fileData("/Def.java");
+
+ assertThat(fileData).isNull();
+ }
+}
diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/StatusDetectionTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/StatusDetectionTest.java
index 09dba259df9..c73f303965b 100644
--- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/StatusDetectionTest.java
+++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/StatusDetectionTest.java
@@ -19,16 +19,16 @@
*/
package org.sonar.scanner.scan.filesystem;
-import com.google.common.collect.HashBasedTable;
-import com.google.common.collect.Table;
import java.nio.file.Paths;
import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
import org.junit.Test;
import org.sonar.api.batch.fs.InputFile;
import org.sonar.api.batch.fs.internal.DefaultInputFile;
import org.sonar.api.batch.fs.internal.TestInputFileBuilder;
import org.sonar.scanner.repository.FileData;
-import org.sonar.scanner.repository.ProjectRepositories;
+import org.sonar.scanner.repository.SingleProjectRepository;
import org.sonar.scanner.scm.ScmChangedFiles;
import static org.assertj.core.api.Assertions.assertThat;
@@ -40,7 +40,7 @@ import static org.mockito.Mockito.when;
public class StatusDetectionTest {
@Test
public void detect_status() {
- ProjectRepositories ref = new ProjectRepositories(createTable(), null);
+ SingleProjectRepository ref = new SingleProjectRepository(createFileDataPerPathMap(), null);
ScmChangedFiles changedFiles = new ScmChangedFiles(null);
StatusDetection statusDetection = new StatusDetection(ref, changedFiles);
@@ -51,7 +51,7 @@ public class StatusDetectionTest {
@Test
public void detect_status_branches_exclude() {
- ProjectRepositories ref = new ProjectRepositories(createTable(), null);
+ SingleProjectRepository ref = new SingleProjectRepository(createFileDataPerPathMap(), null);
ScmChangedFiles changedFiles = new ScmChangedFiles(Collections.emptyList());
StatusDetection statusDetection = new StatusDetection(ref, changedFiles);
@@ -65,34 +65,34 @@ public class StatusDetectionTest {
@Test
public void detect_status_without_metadata() {
DefaultInputFile mockedFile = mock(DefaultInputFile.class);
- when(mockedFile.relativePath()).thenReturn("module/src/Foo.java");
+ when(mockedFile.getProjectRelativePath()).thenReturn("module/src/Foo.java");
when(mockedFile.path()).thenReturn(Paths.get("module", "src", "Foo.java"));
- ProjectRepositories ref = new ProjectRepositories(createTable(), null);
+ SingleProjectRepository ref = new SingleProjectRepository(createFileDataPerPathMap(), null);
ScmChangedFiles changedFiles = new ScmChangedFiles(Collections.singletonList(Paths.get("module", "src", "Foo.java")));
StatusDetection statusDetection = new StatusDetection(ref, changedFiles);
assertThat(statusDetection.getStatusWithoutMetadata("foo", mockedFile)).isEqualTo(InputFile.Status.ADDED);
verify(mockedFile).path();
- verify(mockedFile).relativePath();
+ verify(mockedFile).getProjectRelativePath();
verifyNoMoreInteractions(mockedFile);
}
@Test
public void detect_status_branches_confirm() {
- ProjectRepositories ref = new ProjectRepositories(createTable(), null);
+ SingleProjectRepository ref = new SingleProjectRepository(createFileDataPerPathMap(), null);
ScmChangedFiles changedFiles = new ScmChangedFiles(Collections.singletonList(Paths.get("module", "src", "Foo.java")));
StatusDetection statusDetection = new StatusDetection(ref, changedFiles);
assertThat(statusDetection.status("foo", createFile("src/Foo.java"), "XXXXX")).isEqualTo(InputFile.Status.CHANGED);
}
- private static Table<String, String, FileData> createTable() {
- Table<String, String, FileData> t = HashBasedTable.create();
+ private static Map<String, FileData> createFileDataPerPathMap() {
+ Map<String, FileData> t = new HashMap<>();
- t.put("foo", "src/Foo.java", new FileData("ABCDE", "12345789"));
- t.put("foo", "src/Bar.java", new FileData("FGHIJ", "123456789"));
+ t.put("src/Foo.java", new FileData("ABCDE", "12345789"));
+ t.put("src/Bar.java", new FileData("FGHIJ", "123456789"));
return t;
}