From: Duarte Meneses Date: Fri, 4 May 2018 08:13:43 +0000 (+0200) Subject: SONAR-10647 Apply feedback X-Git-Tag: 7.5~1244 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=bcc7e60fb6f54662c40d152fb9a72d564f2b5d8c;p=sonarqube.git SONAR-10647 Apply feedback --- diff --git a/server/sonar-db-core/src/main/resources/org/sonar/db/version/schema-h2.ddl b/server/sonar-db-core/src/main/resources/org/sonar/db/version/schema-h2.ddl index 8e879dc8a7a..ee63fd3464e 100644 --- a/server/sonar-db-core/src/main/resources/org/sonar/db/version/schema-h2.ddl +++ b/server/sonar-db-core/src/main/resources/org/sonar/db/version/schema-h2.ddl @@ -615,14 +615,14 @@ CREATE TABLE "FILE_SOURCES" ( "PROJECT_UUID" VARCHAR(50) NOT NULL, "FILE_UUID" VARCHAR(50) NOT NULL, "LINE_HASHES" CLOB, + "LINE_HASHES_VERSION" INTEGER, "BINARY_DATA" BLOB, "DATA_TYPE" VARCHAR(20), "DATA_HASH" VARCHAR(50), "SRC_HASH" VARCHAR(50), "REVISION" VARCHAR(100), "CREATED_AT" BIGINT NOT NULL, - "UPDATED_AT" BIGINT NOT NULL, - "LINE_HASHES_VERSION" INTEGER + "UPDATED_AT" BIGINT NOT NULL ); CREATE INDEX "FILE_SOURCES_PROJECT_UUID" ON "FILE_SOURCES" ("PROJECT_UUID"); CREATE UNIQUE INDEX "FILE_SOURCES_UUID_TYPE" ON "FILE_SOURCES" ("FILE_UUID", "DATA_TYPE"); diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/source/FileSourceDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/source/FileSourceDao.java index faf0471d474..dcdafcbc251 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/source/FileSourceDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/source/FileSourceDao.java @@ -51,23 +51,8 @@ public class FileSourceDao implements Dao { @CheckForNull public LineHashVersion selectLineHashesVersion(DbSession dbSession, String fileUuid) { - Connection connection = dbSession.getConnection(); - PreparedStatement pstmt = null; - ResultSet rs = null; - try { - pstmt = connection.prepareStatement("SELECT line_hashes_version FROM file_sources WHERE file_uuid=? AND data_type=?"); - pstmt.setString(1, fileUuid); - pstmt.setString(2, Type.SOURCE); - rs = pstmt.executeQuery(); - if (rs.next()) { - return LineHashVersion.valueOf(rs.getInt(1)); - } - return null; - } catch (SQLException e) { - throw new IllegalStateException("Fail to read FILE_SOURCES.LINE_HASHES_VERSION of file " + fileUuid, e); - } finally { - DbUtils.closeQuietly(connection, pstmt, rs); - } + Integer version = mapper(dbSession).selectLineHashesVersion(fileUuid, Type.SOURCE); + return version == null ? LineHashVersion.WITHOUT_SIGNIFICANT_CODE : LineHashVersion.valueOf(version); } @CheckForNull diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/source/FileSourceDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/source/FileSourceDto.java index c8623847451..0e30488e1d7 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/source/FileSourceDto.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/source/FileSourceDto.java @@ -58,7 +58,7 @@ public class FileSourceDto { return lineHashesVersion != null ? lineHashesVersion : LineHashVersion.WITHOUT_SIGNIFICANT_CODE.getDbValue(); } - public FileSourceDto setLineHashesVersion(@Nullable Integer lineHashesVersion) { + public FileSourceDto setLineHashesVersion(int lineHashesVersion) { this.lineHashesVersion = lineHashesVersion; return this; } diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/source/FileSourceMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/source/FileSourceMapper.java index df139dd6523..38deb679be0 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/source/FileSourceMapper.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/source/FileSourceMapper.java @@ -30,6 +30,9 @@ public interface FileSourceMapper { @CheckForNull FileSourceDto select(@Param("fileUuid") String fileUuid, @Param("dataType") String dataType); + @CheckForNull + Integer selectLineHashesVersion(@Param("fileUuid") String fileUuid, @Param("dataType") String dataType); + void insert(FileSourceDto dto); void update(FileSourceDto dto); diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/source/LineHashVersion.java b/server/sonar-db-dao/src/main/java/org/sonar/db/source/LineHashVersion.java index b327c0b0ba6..58460832468 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/source/LineHashVersion.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/source/LineHashVersion.java @@ -19,8 +19,6 @@ */ package org.sonar.db.source; -import javax.annotation.Nullable; - public enum LineHashVersion { WITHOUT_SIGNIFICANT_CODE(0), WITH_SIGNIFICANT_CODE(1); @@ -34,10 +32,7 @@ public enum LineHashVersion { return value; } - public static LineHashVersion valueOf(@Nullable Integer version) { - if (version == null) { - return LineHashVersion.WITHOUT_SIGNIFICANT_CODE; - } + public static LineHashVersion valueOf(int version) { if (version > 1 || version < 0) { throw new IllegalArgumentException("Unknown line hash version: " + version); } diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/source/FileSourceMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/source/FileSourceMapper.xml index 26b3b5779a0..2fc4b3f6bc2 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/source/FileSourceMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/source/FileSourceMapper.xml @@ -18,6 +18,12 @@ WHERE project_uuid = #{projectUuid} and data_type=#{dataType} + + INSERT INTO file_sources (project_uuid, file_uuid, created_at, updated_at, binary_data, line_hashes, data_hash, src_hash, data_type, revision, line_hashes_version) diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/source/FileSourceDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/source/FileSourceDaoTest.java index 1bcb3107689..c8fd1b8a734 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/source/FileSourceDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/source/FileSourceDaoTest.java @@ -105,7 +105,7 @@ public class FileSourceDaoTest { .setDataType(Type.SOURCE) .setCreatedAt(1500000000000L) .setUpdatedAt(1500000000001L) - .setLineHashesVersion(2) + .setLineHashesVersion(1) .setRevision("123456789")); session.commit(); @@ -133,9 +133,7 @@ public class FileSourceDaoTest { } @Test - public void selectLineHashesVersion_returns_by_default() { - dbTester.prepareDbUnit(getClass(), "shared.xml"); - + public void selectLineHashesVersion_returns_without_significant_code_by_default() { underTest.insert(session, new FileSourceDto() .setProjectUuid("PRJ_UUID") .setFileUuid("FILE2_UUID") @@ -154,8 +152,6 @@ public class FileSourceDaoTest { @Test public void selectLineHashesVersion_succeeds() { - dbTester.prepareDbUnit(getClass(), "shared.xml"); - underTest.insert(session, new FileSourceDto() .setProjectUuid("PRJ_UUID") .setFileUuid("FILE2_UUID") @@ -214,7 +210,7 @@ public class FileSourceDaoTest { .setLineHashes("NEW_LINE_HASHES") .setDataType(Type.SOURCE) .setUpdatedAt(1500000000002L) - .setLineHashesVersion(4) + .setLineHashesVersion(1) .setRevision("987654321")); session.commit(); diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/source/LineHashVersionTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/source/LineHashVersionTest.java index d8b27dc4c36..cbd0598abcd 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/source/LineHashVersionTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/source/LineHashVersionTest.java @@ -31,16 +31,21 @@ public class LineHashVersionTest { @Test public void should_create_from_int() { - assertThat(LineHashVersion.valueOf((Integer) null)).isEqualTo(LineHashVersion.WITHOUT_SIGNIFICANT_CODE); assertThat(LineHashVersion.valueOf(0)).isEqualTo(LineHashVersion.WITHOUT_SIGNIFICANT_CODE); assertThat(LineHashVersion.valueOf(1)).isEqualTo(LineHashVersion.WITH_SIGNIFICANT_CODE); } @Test - public void should_throw_exception_if_version_is_unknown() { + public void should_throw_exception_if_version_is_too_high() { exception.expect(IllegalArgumentException.class); exception.expectMessage("Unknown line hash version: 2"); LineHashVersion.valueOf(2); + } + @Test + public void should_throw_exception_if_version_is_too_low() { + exception.expect(IllegalArgumentException.class); + exception.expectMessage("Unknown line hash version: -1"); + LineHashVersion.valueOf(-1); } } diff --git a/server/sonar-db-dao/src/test/resources/org/sonar/db/source/FileSourceDaoTest/insert-result.xml b/server/sonar-db-dao/src/test/resources/org/sonar/db/source/FileSourceDaoTest/insert-result.xml index b1f280de794..5aec962e987 100644 --- a/server/sonar-db-dao/src/test/resources/org/sonar/db/source/FileSourceDaoTest/insert-result.xml +++ b/server/sonar-db-dao/src/test/resources/org/sonar/db/source/FileSourceDaoTest/insert-result.xml @@ -14,6 +14,6 @@ line_hashes="LINE1_HASH\nLINE2_HASH" src_hash="FILE2_HASH" revision="123456789" created_at="1500000000000" updated_at="1500000000001" data_type="SOURCE" - line_hashes_version="2" /> + line_hashes_version="1" /> diff --git a/server/sonar-db-dao/src/test/resources/org/sonar/db/source/FileSourceDaoTest/update-result.xml b/server/sonar-db-dao/src/test/resources/org/sonar/db/source/FileSourceDaoTest/update-result.xml index 204974d7ab0..f57da523a84 100644 --- a/server/sonar-db-dao/src/test/resources/org/sonar/db/source/FileSourceDaoTest/update-result.xml +++ b/server/sonar-db-dao/src/test/resources/org/sonar/db/source/FileSourceDaoTest/update-result.xml @@ -6,7 +6,7 @@ line_hashes="NEW_LINE_HASHES" src_hash="NEW_FILE_HASH" revision="987654321" created_at="1500000000000" updated_at="1500000000002" data_type="SOURCE" - line_hashes_version="4" /> + line_hashes_version="1" /> diff --git a/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v72/AddLineHashesVersionToFileSourcesTest/fileSources.sql b/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v72/AddLineHashesVersionToFileSourcesTest/fileSources.sql index ed2564fe528..48ceb31c0a1 100644 --- a/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v72/AddLineHashesVersionToFileSourcesTest/fileSources.sql +++ b/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v72/AddLineHashesVersionToFileSourcesTest/fileSources.sql @@ -13,4 +13,5 @@ CREATE TABLE "FILE_SOURCES" ( ); CREATE INDEX "FILE_SOURCES_PROJECT_UUID" ON "FILE_SOURCES" ("PROJECT_UUID"); CREATE UNIQUE INDEX "FILE_SOURCES_UUID_TYPE" ON "FILE_SOURCES" ("FILE_UUID", "DATA_TYPE"); -CREATE INDEX "FILE_SOURCES_UPDATED_AT" ON "FILE_SOURCES" ("UPDATED_AT"); \ No newline at end of file +CREATE INDEX "FILE_SOURCES_UPDATED_AT" ON "FILE_SOURCES" ("UPDATED_AT"); + diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/filemove/FileMoveDetectionStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/filemove/FileMoveDetectionStep.java index e018f77d0a4..3a622ac7680 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/filemove/FileMoveDetectionStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/filemove/FileMoveDetectionStep.java @@ -178,7 +178,7 @@ public class FileMoveDetectionStep implements ComputationStep { ImmutableMap.Builder builder = ImmutableMap.builder(); for (String fileKey : addedFileKeys) { Component component = reportFilesByKey.get(fileKey); - List lineHashes = sourceLinesHash.getMatchingDB(component); + List lineHashes = sourceLinesHash.getLineHashesMatchingDBVersion(component); builder.put(fileKey, new File(component.getReportAttributes().getPath(), lineHashes)); } return builder.build(); diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/issue/TrackerRawInputFactory.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/issue/TrackerRawInputFactory.java index e2e5fbdf432..878651b2c00 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/issue/TrackerRawInputFactory.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/issue/TrackerRawInputFactory.java @@ -80,7 +80,7 @@ public class TrackerRawInputFactory { @Override protected LineHashSequence loadLineHashSequence() { if (component.getType() == Component.Type.FILE) { - return new LineHashSequence(sourceLinesHash.getMatchingDB(component)); + return new LineHashSequence(sourceLinesHash.getLineHashesMatchingDBVersion(component)); } else { return new LineHashSequence(Collections.emptyList()); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/source/SignificantCodeRepository.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/source/SignificantCodeRepository.java index 10d16755bcb..d97bca8d168 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/source/SignificantCodeRepository.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/source/SignificantCodeRepository.java @@ -52,7 +52,7 @@ public class SignificantCodeRepository { currentLine = lineRanges.next(); } - if (currentLine.getLine() == i+1) { + if (currentLine.getLine() == i + 1) { ranges[i] = new LineRange(currentLine.getStartOffset(), currentLine.getEndOffset()); currentLine = null; } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/source/SourceLinesDiffImpl.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/source/SourceLinesDiffImpl.java index dcf587c0763..b881e85c373 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/source/SourceLinesDiffImpl.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/source/SourceLinesDiffImpl.java @@ -57,7 +57,7 @@ public class SourceLinesDiffImpl implements SourceLinesDiff { } private List getReportLines(Component component) { - return sourceLinesHash.getMatchingDB(component); + return sourceLinesHash.getLineHashesMatchingDBVersion(component); } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/source/SourceLinesHashRepository.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/source/SourceLinesHashRepository.java index 8c616407a4e..be0ef67b44e 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/source/SourceLinesHashRepository.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/source/SourceLinesHashRepository.java @@ -23,22 +23,31 @@ import java.util.List; import org.sonar.server.computation.task.projectanalysis.component.Component; import org.sonar.server.computation.task.projectanalysis.source.SourceLinesHashRepositoryImpl.LineHashesComputer; +/** + * Generates line hashes from source code included in the report. + * Line hashes are versioned. Currently there are 2 possible versions: Hashes created using the entire line, or hashes created using + * only the "significant code" part of the line. The "significant code" can be optionally provided by code analyzers, meaning that + * the line hash for a given file can be of either versions. + * We always persist line hashes taking into account "significant code", if it's provided. + * When the line hashes are used for comparison with line hashes stored in the DB, we try to generate them using the same version + * as the ones in the DB. This ensures that the line hashes are actually comparable. + */ public interface SourceLinesHashRepository { /** - * Get line hashes from the report matching the version of the line hashes existing in the report, if possible. - * The line hashes are cached. + * Read from the report the line hashes for a file. + * The line hashes will have the version matching the version of the line hashes existing in the report, if possible. */ - List getMatchingDB(Component component); + List getLineHashesMatchingDBVersion(Component component); /** - * The line computer will compute line hashes taking into account significant code (if it was provided by a code analyzer). - * It will use a cached value, if possible. If it's generated, it's not cached since it's assumed that it won't be - * needed again after it is persisted. + * Get a line hash computer that can be used when persisting the line hashes in the DB. + * The version of the line hashes that are generated by the computer will be the one that takes into account significant code, + * if it was provided by a code analyzer. */ - LineHashesComputer getLineProcessorToPersist(Component component); + LineHashesComputer getLineHashesComputerToPersist(Component component); /** - * Get the version of line hashes in the report + * Get the version of the line hashes for a given component in the report */ - Integer getLineHashesVersion(Component component); + int getLineHashesVersion(Component component); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/source/SourceLinesHashRepositoryImpl.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/source/SourceLinesHashRepositoryImpl.java index fb56b853a80..6e8ba5e7268 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/source/SourceLinesHashRepositoryImpl.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/source/SourceLinesHashRepositoryImpl.java @@ -43,12 +43,12 @@ public class SourceLinesHashRepositoryImpl implements SourceLinesHashRepository } @Override - public List getMatchingDB(Component component) { + public List getLineHashesMatchingDBVersion(Component component) { return cache.computeIfAbsent(component, this::createLineHashesMatchingDBVersion); } @Override - public Integer getLineHashesVersion(Component component) { + public int getLineHashesVersion(Component component) { if (significantCodeRepository.getRangesPerLine(component).isPresent()) { return LineHashVersion.WITH_SIGNIFICANT_CODE.getDbValue(); } else { @@ -57,7 +57,7 @@ public class SourceLinesHashRepositoryImpl implements SourceLinesHashRepository } @Override - public LineHashesComputer getLineProcessorToPersist(Component component) { + public LineHashesComputer getLineHashesComputerToPersist(Component component) { boolean cacheHit = cache.contains(component); // check if line hashes are cached and if we can use it diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/PersistFileSourcesStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/PersistFileSourcesStep.java index 0e0427510fa..1773bf03bc2 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/PersistFileSourcesStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/PersistFileSourcesStep.java @@ -120,7 +120,7 @@ public class PersistFileSourcesStep implements ComputationStep { public void visitFile(Component file) { try (CloseableIterator linesIterator = sourceLinesRepository.readLines(file); LineReaders lineReaders = new LineReaders(reportReader, scmInfoRepository, duplicationRepository, file)) { - LineHashesComputer lineHashesComputer = sourceLinesHash.getLineProcessorToPersist(file); + LineHashesComputer lineHashesComputer = sourceLinesHash.getLineHashesComputerToPersist(file); ComputeFileSourceData computeFileSourceData = new ComputeFileSourceData(linesIterator, lineReaders.readers(), lineHashesComputer); ComputeFileSourceData.Data fileSourceData = computeFileSourceData.compute(); persistSource(fileSourceData, file, lineReaders.getLatestChangeWithRevision()); diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/filemove/FileMoveDetectionStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/filemove/FileMoveDetectionStepTest.java index 8d7226141a6..f630dd11e42 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/filemove/FileMoveDetectionStepTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/filemove/FileMoveDetectionStepTest.java @@ -509,7 +509,7 @@ public class FileMoveDetectionStepTest { for (String line : content) { computer.addLine(line); } - when(sourceLinesHash.getMatchingDB(file)).thenReturn(computer.getLineHashes()); + when(sourceLinesHash.getLineHashesMatchingDBVersion(file)).thenReturn(computer.getLineHashes()); } private void mockContentOfFileInDb(String key, @Nullable String[] content) { diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/issue/TrackerRawInputFactoryTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/issue/TrackerRawInputFactoryTest.java index 651557e3bc9..e04d2981788 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/issue/TrackerRawInputFactoryTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/issue/TrackerRawInputFactoryTest.java @@ -72,7 +72,7 @@ public class TrackerRawInputFactoryTest { @Test public void load_source_hash_sequences() { - when(sourceLinesHash.getMatchingDB(FILE)).thenReturn(Collections.singletonList("line")); + when(sourceLinesHash.getLineHashesMatchingDBVersion(FILE)).thenReturn(Collections.singletonList("line")); Input input = underTest.create(FILE); assertThat(input.getLineHashSequence()).isNotNull(); @@ -94,7 +94,7 @@ public class TrackerRawInputFactoryTest { @Test public void load_issues_from_report() { when(issueFilter.accept(any(DefaultIssue.class), eq(FILE))).thenReturn(true); - when(sourceLinesHash.getMatchingDB(FILE)).thenReturn(Collections.singletonList("line")); + when(sourceLinesHash.getLineHashesMatchingDBVersion(FILE)).thenReturn(Collections.singletonList("line")); ScannerReport.Issue reportIssue = ScannerReport.Issue.newBuilder() .setTextRange(TextRange.newBuilder().setStartLine(2).build()) .setMsg("the message") @@ -127,7 +127,7 @@ public class TrackerRawInputFactoryTest { @Test public void load_external_issues_from_report() { - when(sourceLinesHash.getMatchingDB(FILE)).thenReturn(Collections.singletonList("line")); + when(sourceLinesHash.getLineHashesMatchingDBVersion(FILE)).thenReturn(Collections.singletonList("line")); ScannerReport.ExternalIssue reportIssue = ScannerReport.ExternalIssue.newBuilder() .setTextRange(TextRange.newBuilder().setStartLine(2).build()) .setMsg("the message") @@ -158,7 +158,7 @@ public class TrackerRawInputFactoryTest { @Test public void load_external_issues_from_report_with_default_effort() { - when(sourceLinesHash.getMatchingDB(FILE)).thenReturn(Collections.singletonList("line")); + when(sourceLinesHash.getLineHashesMatchingDBVersion(FILE)).thenReturn(Collections.singletonList("line")); ScannerReport.ExternalIssue reportIssue = ScannerReport.ExternalIssue.newBuilder() .setTextRange(TextRange.newBuilder().setStartLine(2).build()) .setMsg("the message") @@ -189,7 +189,7 @@ public class TrackerRawInputFactoryTest { @Test public void ignore_issue_from_report() { when(issueFilter.accept(any(DefaultIssue.class), eq(FILE))).thenReturn(false); - when(sourceLinesHash.getMatchingDB(FILE)).thenReturn(Collections.singletonList("line")); + when(sourceLinesHash.getLineHashesMatchingDBVersion(FILE)).thenReturn(Collections.singletonList("line")); ScannerReport.Issue reportIssue = ScannerReport.Issue.newBuilder() .setTextRange(TextRange.newBuilder().setStartLine(2).build()) .setMsg("the message") @@ -207,7 +207,7 @@ public class TrackerRawInputFactoryTest { @Test public void ignore_report_issues_on_common_rules() { - when(sourceLinesHash.getMatchingDB(FILE)).thenReturn(Collections.singletonList("line")); + when(sourceLinesHash.getLineHashesMatchingDBVersion(FILE)).thenReturn(Collections.singletonList("line")); ScannerReport.Issue reportIssue = ScannerReport.Issue.newBuilder() .setMsg("the message") .setRuleRepository(CommonRuleKeys.commonRepositoryForLang("java")) @@ -224,7 +224,7 @@ public class TrackerRawInputFactoryTest { @Test public void load_issues_of_compute_engine_common_rules() { when(issueFilter.accept(any(DefaultIssue.class), eq(FILE))).thenReturn(true); - when(sourceLinesHash.getMatchingDB(FILE)).thenReturn(Collections.singletonList("line")); + when(sourceLinesHash.getLineHashesMatchingDBVersion(FILE)).thenReturn(Collections.singletonList("line")); DefaultIssue ceIssue = new DefaultIssue() .setRuleKey(RuleKey.of(CommonRuleKeys.commonRepositoryForLang("java"), "InsufficientCoverage")) .setMessage("not enough coverage") @@ -240,7 +240,7 @@ public class TrackerRawInputFactoryTest { @Test public void ignore_issue_from_common_rule() { when(issueFilter.accept(any(DefaultIssue.class), eq(FILE))).thenReturn(false); - when(sourceLinesHash.getMatchingDB(FILE)).thenReturn(Collections.singletonList("line")); + when(sourceLinesHash.getLineHashesMatchingDBVersion(FILE)).thenReturn(Collections.singletonList("line")); DefaultIssue ceIssue = new DefaultIssue() .setRuleKey(RuleKey.of(CommonRuleKeys.commonRepositoryForLang("java"), "InsufficientCoverage")) .setMessage("not enough coverage") diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/source/SourceLinesDiffImplTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/source/SourceLinesDiffImplTest.java index 7af8b9553a8..364b76756ba 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/source/SourceLinesDiffImplTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/source/SourceLinesDiffImplTest.java @@ -94,6 +94,6 @@ public class SourceLinesDiffImplTest { } private void setLineHashesInReport(Component component, String[] content) { - when(sourceLinesHash.getMatchingDB(component)).thenReturn(Arrays.asList(content)); + when(sourceLinesHash.getLineHashesMatchingDBVersion(component)).thenReturn(Arrays.asList(content)); } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/source/SourceLinesHashImplTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/source/SourceLinesHashImplTest.java index fb51eb512be..d541c8702d1 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/source/SourceLinesHashImplTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/source/SourceLinesHashImplTest.java @@ -42,7 +42,7 @@ public class SourceLinesHashImplTest { public void should_generate_correct_version_of_line_hashes() { Component component = createComponent(1); - underTest.getMatchingDB(component); + underTest.getLineHashesMatchingDBVersion(component); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/source/SourceLinesHashRepositoryImplTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/source/SourceLinesHashRepositoryImplTest.java index 78e5e3aaa74..0b607c689db 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/source/SourceLinesHashRepositoryImplTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/source/SourceLinesHashRepositoryImplTest.java @@ -89,7 +89,7 @@ public class SourceLinesHashRepositoryImplTest { @Test public void should_create_hash_without_significant_code_if_db_has_no_significant_code() { when(dbLineHashVersion.hasLineHashesWithSignificantCode(file)).thenReturn(false); - List lineHashes = underTest.getMatchingDB(file); + List lineHashes = underTest.getLineHashesMatchingDBVersion(file); assertLineHashes(lineHashes, "line1", "line2", "line3"); verify(dbLineHashVersion).hasLineHashesWithSignificantCode(file); @@ -102,7 +102,7 @@ public class SourceLinesHashRepositoryImplTest { when(dbLineHashVersion.hasLineHashesWithSignificantCode(file)).thenReturn(true); when(significantCodeRepository.getRangesPerLine(file)).thenReturn(Optional.empty()); - List lineHashes = underTest.getMatchingDB(file); + List lineHashes = underTest.getLineHashesMatchingDBVersion(file); assertLineHashes(lineHashes, "line1", "line2", "line3"); verify(dbLineHashVersion).hasLineHashesWithSignificantCode(file); @@ -118,7 +118,7 @@ public class SourceLinesHashRepositoryImplTest { when(dbLineHashVersion.hasLineHashesWithSignificantCode(file)).thenReturn(true); when(significantCodeRepository.getRangesPerLine(file)).thenReturn(Optional.of(lineRanges)); - List lineHashes = underTest.getMatchingDB(file); + List lineHashes = underTest.getLineHashesMatchingDBVersion(file); assertLineHashes(lineHashes, "l", "", "ine3"); verify(dbLineHashVersion).hasLineHashesWithSignificantCode(file); @@ -157,7 +157,7 @@ public class SourceLinesHashRepositoryImplTest { when(dbLineHashVersion.hasLineHashesWithSignificantCode(file)).thenReturn(true); when(significantCodeRepository.getRangesPerLine(file)).thenReturn(Optional.of(lineRanges)); - LineHashesComputer hashesComputer = underTest.getLineProcessorToPersist(file); + LineHashesComputer hashesComputer = underTest.getLineHashesComputerToPersist(file); assertThat(hashesComputer).isInstanceOf(CachedLineHashesComputer.class); assertThat(hashesComputer.getResult()).isEqualTo(lineHashes); @@ -171,7 +171,7 @@ public class SourceLinesHashRepositoryImplTest { when(dbLineHashVersion.hasLineHashesWithSignificantCode(file)).thenReturn(false); when(significantCodeRepository.getRangesPerLine(file)).thenReturn(Optional.empty()); - LineHashesComputer hashesComputer = underTest.getLineProcessorToPersist(file); + LineHashesComputer hashesComputer = underTest.getLineHashesComputerToPersist(file); assertThat(hashesComputer).isInstanceOf(CachedLineHashesComputer.class); assertThat(hashesComputer.getResult()).isEqualTo(lineHashes); @@ -188,7 +188,7 @@ public class SourceLinesHashRepositoryImplTest { when(dbLineHashVersion.hasLineHashesWithSignificantCode(file)).thenReturn(false); when(significantCodeRepository.getRangesPerLine(file)).thenReturn(Optional.of(lineRanges)); - LineHashesComputer hashesComputer = underTest.getLineProcessorToPersist(file); + LineHashesComputer hashesComputer = underTest.getLineHashesComputerToPersist(file); assertThat(hashesComputer).isInstanceOf(SignificantCodeLineHashesComputer.class); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/PersistFileSourcesStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/PersistFileSourcesStepTest.java index 9db2571b9c2..ab910b36ac2 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/PersistFileSourcesStepTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/PersistFileSourcesStepTest.java @@ -94,7 +94,7 @@ public class PersistFileSourcesStepTest extends BaseStepTest { @Before public void setup() { when(system2.now()).thenReturn(NOW); - when(sourceLinesHashRepository.getLineProcessorToPersist(Mockito.any(Component.class))).thenReturn(lineHashesComputer); + when(sourceLinesHashRepository.getLineHashesComputerToPersist(Mockito.any(Component.class))).thenReturn(lineHashesComputer); underTest = new PersistFileSourcesStep(dbClient, system2, treeRootHolder, reportReader, fileSourceRepository, scmInfoRepository, duplicationRepository, sourceLinesHashRepository); } diff --git a/sonar-core/src/main/java/org/sonar/core/hash/LineRange.java b/sonar-core/src/main/java/org/sonar/core/hash/LineRange.java index 7eb1592a16d..43829882514 100644 --- a/sonar-core/src/main/java/org/sonar/core/hash/LineRange.java +++ b/sonar-core/src/main/java/org/sonar/core/hash/LineRange.java @@ -26,6 +26,7 @@ public class LineRange { private final int endOffset; public LineRange(int startOffset, int endOffset) { + Preconditions.checkArgument(startOffset >= 0, "Start offset not valid: %s", startOffset); Preconditions.checkArgument(startOffset <= endOffset, "Line range is not valid: %s must be greater or equal than %s", endOffset, startOffset); this.startOffset = startOffset; this.endOffset = endOffset; diff --git a/sonar-core/src/test/java/org/sonar/core/hash/LineRangeTest.java b/sonar-core/src/test/java/org/sonar/core/hash/LineRangeTest.java index 07cc5fe6bdd..2e1b5146d4f 100644 --- a/sonar-core/src/test/java/org/sonar/core/hash/LineRangeTest.java +++ b/sonar-core/src/test/java/org/sonar/core/hash/LineRangeTest.java @@ -35,6 +35,13 @@ public class LineRangeTest { exception.expectMessage("Line range is not valid: 1 must be greater or equal than 2"); new LineRange(2, 1); } + + @Test + public void should_throw_ISE_if_startOffset_is_invalid() { + exception.expect(IllegalArgumentException.class); + exception.expectMessage("Start offset not valid: -1"); + new LineRange(-1, 1); + } @Test public void check_getters() {