--- /dev/null
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.sonar.server.computation.source;
+
+import com.google.common.collect.ImmutableMap;
+import org.sonar.batch.protocol.Constants;
+import org.sonar.batch.protocol.output.BatchReport;
+import org.sonar.server.source.db.FileSourceDb;
+
+import javax.annotation.CheckForNull;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import static com.google.common.collect.Lists.newArrayList;
+
+public class HighlightingLineReader implements LineReader {
+
+ private static final String OFFSET_SEPARATOR = ",";
+ private static final String ITEM_SEPARATOR = ";";
+
+ private static final Map<Constants.HighlightingType, String> cssClassByType = ImmutableMap.<Constants.HighlightingType, String>builder()
+ .put(Constants.HighlightingType.ANNOTATION, "a")
+ .put(Constants.HighlightingType.CONSTANT, "c")
+ .put(Constants.HighlightingType.COMMENT, "cd")
+ .put(Constants.HighlightingType.STRUCTURED_COMMENT, "j")
+ .put(Constants.HighlightingType.KEYWORD, "k")
+ .put(Constants.HighlightingType.KEYWORD_LIGHT, "h")
+ .put(Constants.HighlightingType.HIGHLIGHTING_STRING, "s")
+ .put(Constants.HighlightingType.PREPROCESS_DIRECTIVE, "p")
+ .build();
+
+ private final Iterator<BatchReport.SyntaxHighlighting> lineHighlightingIterator;
+
+ private BatchReport.SyntaxHighlighting currentItem;
+ private List<BatchReport.SyntaxHighlighting> highlightingList;
+
+ public HighlightingLineReader(Iterator<BatchReport.SyntaxHighlighting> lineHighlightingIterator) {
+ this.lineHighlightingIterator = lineHighlightingIterator;
+ this.highlightingList = newArrayList();
+ }
+
+ @Override
+ public void read(FileSourceDb.Line.Builder lineBuilder) {
+ int line = lineBuilder.getLine();
+ StringBuilder highlighting = new StringBuilder();
+
+ incrementHighlightingListMatchingLine(line);
+ for (Iterator<BatchReport.SyntaxHighlighting> syntaxHighlightingIterator = highlightingList.iterator(); syntaxHighlightingIterator.hasNext(); ) {
+ BatchReport.SyntaxHighlighting syntaxHighlighting = syntaxHighlightingIterator.next();
+ BatchReport.Range range = syntaxHighlighting.getRange();
+ if (range.getStartLine() <= line) {
+ if (highlighting.length() > 0) {
+ highlighting.append(ITEM_SEPARATOR);
+ }
+ highlighting.append(convertHighlightingToString(syntaxHighlighting, line, lineBuilder.getSource()));
+ if (range.getEndLine() == line) {
+ syntaxHighlightingIterator.remove();
+ }
+ }
+ }
+ if (highlighting.length() > 0) {
+ lineBuilder.setHighlighting(highlighting.toString());
+ }
+ }
+
+ private String convertHighlightingToString(BatchReport.SyntaxHighlighting syntaxHighlighting, int line, String sourceLine){
+ BatchReport.Range range = syntaxHighlighting.getRange();
+ validateStartAndEndOffset(range, line);
+
+ StringBuilder symbolLine = new StringBuilder();
+ if (range.getStartLine() == line) {
+ validateStartOffsetNotGreaterThanLineLength(range, sourceLine, line);
+ symbolLine.append(range.getStartOffset()).append(OFFSET_SEPARATOR);
+ } else if (range.getStartLine() < line) {
+ symbolLine.append(0).append(OFFSET_SEPARATOR);
+ }
+
+ if (range.getEndLine() == line) {
+ validateEndOffsetNotGreaterThanLineLength(range, sourceLine, line);
+ symbolLine.append(range.getEndOffset()).append(OFFSET_SEPARATOR);
+ } else if (range.getEndLine() > line) {
+ symbolLine.append(sourceLine.length() - 1).append(OFFSET_SEPARATOR);
+ }
+
+ symbolLine.append(getCssClass(syntaxHighlighting.getType()));
+ return symbolLine.toString();
+ }
+
+ private static String getCssClass(Constants.HighlightingType type) {
+ String cssClass = cssClassByType.get(type);
+ if (cssClass != null) {
+ return cssClass;
+ } else {
+ throw new IllegalArgumentException(String.format("Unknown type %s ", type.toString()));
+ }
+ }
+
+ private void incrementHighlightingListMatchingLine(int line) {
+ BatchReport.SyntaxHighlighting syntaxHighlighting = getNextHighlightingMatchingLine(line);
+ while (syntaxHighlighting != null) {
+ highlightingList.add(syntaxHighlighting);
+ this.currentItem = null;
+ syntaxHighlighting = getNextHighlightingMatchingLine(line);
+ }
+ }
+
+ @CheckForNull
+ private BatchReport.SyntaxHighlighting getNextHighlightingMatchingLine(int line) {
+ // Get next element (if exists)
+ if (currentItem == null && lineHighlightingIterator.hasNext()) {
+ currentItem = lineHighlightingIterator.next();
+ }
+ // Return current element if lines match
+ if (currentItem != null && currentItem.getRange().getStartLine() == line) {
+ return currentItem;
+ }
+ return null;
+ }
+
+ private static void validateStartAndEndOffset(BatchReport.Range range, int line){
+ if (range.getStartLine() == range.getEndLine() && range.getStartOffset() > range.getEndOffset()) {
+ throw new IllegalArgumentException(String.format("End offset %s cannot be defined before start offset %s on line %s", range.getEndOffset(), range.getStartOffset(), line));
+ }
+ }
+
+ private static void validateStartOffsetNotGreaterThanLineLength(BatchReport.Range range, String sourceLine, int line){
+ if (range.getStartOffset() > sourceLine.length()) {
+ throw new IllegalArgumentException(String.format("Start offset %s is defined outside the length (%s) of the line %s", range.getStartOffset(), sourceLine.length(), line));
+ }
+ }
+
+ private static void validateEndOffsetNotGreaterThanLineLength(BatchReport.Range range, String sourceLine, int line){
+ if (range.getEndOffset() > sourceLine.length()) {
+ throw new IllegalArgumentException(String.format("End offset %s is defined outside the length (%s) of the line %s", range.getEndOffset(), sourceLine.length(), line));
+ }
+ }
+
+}
package org.sonar.server.computation.step;
+import com.google.common.base.Predicates;
+import com.google.common.collect.Iterables;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.io.Charsets;
import org.apache.commons.io.FileUtils;
private List<LineReader> dataLineReaders(BatchReportReader reportReader, int componentRef) {
List<LineReader> lineReaders = newArrayList();
+
File coverageFile = reportReader.readComponentCoverage(componentRef);
- if (coverageFile != null) {
- lineReaders.add(new CoverageLineReader(new ReportIterator<>(coverageFile, BatchReport.Coverage.PARSER)));
- }
BatchReport.Scm scmReport = reportReader.readComponentScm(componentRef);
- if (scmReport != null) {
- lineReaders.add(new ScmLineReader(scmReport));
- }
+ File highlightingFile = reportReader.readComponentSyntaxHighlighting(componentRef);
+
+ lineReaders.add(coverageFile != null ? new CoverageLineReader(new ReportIterator<>(coverageFile, BatchReport.Coverage.PARSER)) : null);
+ lineReaders.add(scmReport != null ? new ScmLineReader(scmReport) : null);
+ lineReaders.add(highlightingFile != null ? new HighlightingLineReader(new ReportIterator<>(highlightingFile, BatchReport.SyntaxHighlighting.PARSER)) : null);
+
+ Iterables.removeIf(lineReaders, Predicates.isNull());
return lineReaders;
}
--- /dev/null
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.sonar.server.computation.source;
+
+import org.junit.Test;
+import org.sonar.batch.protocol.Constants;
+import org.sonar.batch.protocol.output.BatchReport;
+import org.sonar.server.source.db.FileSourceDb;
+
+import java.util.Collections;
+
+import static com.google.common.collect.Lists.newArrayList;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.failBecauseExceptionWasNotThrown;
+
+public class HighlightingLineReaderTest {
+
+ @Test
+ public void nothing_to_read() {
+ HighlightingLineReader highlightingLineReader = new HighlightingLineReader(Collections.<BatchReport.SyntaxHighlighting>emptyList().iterator());
+
+ FileSourceDb.Line.Builder lineBuilder = FileSourceDb.Data.newBuilder().addLinesBuilder().setLine(1);
+ highlightingLineReader.read(lineBuilder);
+
+ assertThat(lineBuilder.hasHighlighting()).isFalse();
+ }
+
+ @Test
+ public void read_one_line() {
+ HighlightingLineReader highlightingLineReader = new HighlightingLineReader(newArrayList(
+ BatchReport.SyntaxHighlighting.newBuilder()
+ .setRange(BatchReport.Range.newBuilder()
+ .setStartLine(1).setEndLine(1)
+ .setStartOffset(2).setEndOffset(4)
+ .build())
+ .setType(Constants.HighlightingType.ANNOTATION)
+ .build()
+ ).iterator());
+
+ FileSourceDb.Line.Builder lineBuilder = FileSourceDb.Data.newBuilder().addLinesBuilder().setSource("line1").setLine(1);
+ highlightingLineReader.read(lineBuilder);
+
+ assertThat(lineBuilder.getHighlighting()).isEqualTo("2,4,a");
+ }
+
+ @Test
+ public void read_many_lines() {
+ HighlightingLineReader highlightingLineReader = new HighlightingLineReader(newArrayList(
+ BatchReport.SyntaxHighlighting.newBuilder()
+ .setRange(BatchReport.Range.newBuilder()
+ .setStartLine(1).setEndLine(1)
+ .setStartOffset(0).setEndOffset(4)
+ .build())
+ .setType(Constants.HighlightingType.ANNOTATION)
+ .build(),
+ BatchReport.SyntaxHighlighting.newBuilder()
+ .setRange(BatchReport.Range.newBuilder()
+ .setStartLine(2).setEndLine(2)
+ .setStartOffset(0).setEndOffset(1)
+ .build())
+ .setType(Constants.HighlightingType.COMMENT)
+ .build(),
+ BatchReport.SyntaxHighlighting.newBuilder()
+ .setRange(BatchReport.Range.newBuilder()
+ .setStartLine(4).setEndLine(4)
+ .setStartOffset(1).setEndOffset(2)
+ .build())
+ .setType(Constants.HighlightingType.CONSTANT)
+ .build()
+ ).iterator());
+
+ FileSourceDb.Line.Builder line1 = FileSourceDb.Data.newBuilder().addLinesBuilder().setSource("line1").setLine(1);
+ highlightingLineReader.read(line1);
+ FileSourceDb.Line.Builder line2 = FileSourceDb.Data.newBuilder().addLinesBuilder().setSource("line2").setLine(2);
+ highlightingLineReader.read(line2);
+ highlightingLineReader.read(FileSourceDb.Data.newBuilder().addLinesBuilder().setSource("line3").setLine(3));
+ FileSourceDb.Line.Builder line4 = FileSourceDb.Data.newBuilder().addLinesBuilder().setSource("line4").setLine(4);
+ highlightingLineReader.read(line4);
+
+ assertThat(line1.getHighlighting()).isEqualTo("0,4,a");
+ assertThat(line2.getHighlighting()).isEqualTo("0,1,cd");
+ assertThat(line4.getHighlighting()).isEqualTo("1,2,c");
+ }
+
+ @Test
+ public void read_many_syntax_highlighting_on_same_line() {
+ HighlightingLineReader highlightingLineReader = new HighlightingLineReader(newArrayList(
+ BatchReport.SyntaxHighlighting.newBuilder()
+ .setRange(BatchReport.Range.newBuilder()
+ .setStartLine(1).setEndLine(1)
+ .setStartOffset(2).setEndOffset(3)
+ .build())
+ .setType(Constants.HighlightingType.ANNOTATION)
+ .build(),
+ BatchReport.SyntaxHighlighting.newBuilder()
+ .setRange(BatchReport.Range.newBuilder()
+ .setStartLine(1).setEndLine(1)
+ .setStartOffset(4).setEndOffset(5)
+ .build())
+ .setType(Constants.HighlightingType.COMMENT)
+ .build()
+ ).iterator());
+
+ FileSourceDb.Line.Builder lineBuilder = FileSourceDb.Data.newBuilder().addLinesBuilder().setSource("line1").setLine(1);
+ highlightingLineReader.read(lineBuilder);
+
+ assertThat(lineBuilder.getHighlighting()).isEqualTo("2,3,a;4,5,cd");
+ }
+
+ @Test
+ public void read_nested_syntax_highlighting_on_same_line() {
+ HighlightingLineReader highlightingLineReader = new HighlightingLineReader(newArrayList(
+ BatchReport.SyntaxHighlighting.newBuilder()
+ .setRange(BatchReport.Range.newBuilder()
+ .setStartLine(1).setEndLine(1)
+ .setStartOffset(0).setEndOffset(4)
+ .build())
+ .setType(Constants.HighlightingType.CONSTANT)
+ .build(),
+ // This highlighting is nested in previous one
+ BatchReport.SyntaxHighlighting.newBuilder()
+ .setRange(BatchReport.Range.newBuilder()
+ .setStartLine(1).setEndLine(1)
+ .setStartOffset(2).setEndOffset(3)
+ .build())
+ .setType(Constants.HighlightingType.KEYWORD)
+ .build()
+ ).iterator());
+
+ FileSourceDb.Line.Builder lineBuilder = FileSourceDb.Data.newBuilder().addLinesBuilder().setSource("line1").setLine(1);
+ highlightingLineReader.read(lineBuilder);
+
+ assertThat(lineBuilder.getHighlighting()).isEqualTo("0,4,c;2,3,k");
+ }
+
+ @Test
+ public void read_one_syntax_highlighting_on_many_lines() {
+ HighlightingLineReader highlightingLineReader = new HighlightingLineReader(newArrayList(
+ // This highlighting begin on line 1 and finish on line 3
+ BatchReport.SyntaxHighlighting.newBuilder()
+ .setRange(BatchReport.Range.newBuilder()
+ .setStartLine(1).setEndLine(3)
+ .setStartOffset(3).setEndOffset(2)
+ .build())
+ .setType(Constants.HighlightingType.ANNOTATION)
+ .build()
+ ).iterator());
+
+ FileSourceDb.Line.Builder line1 = FileSourceDb.Data.newBuilder().addLinesBuilder().setSource("line1").setLine(1);
+ highlightingLineReader.read(line1);
+ FileSourceDb.Line.Builder line2 = FileSourceDb.Data.newBuilder().addLinesBuilder().setSource("line 2").setLine(2);
+ highlightingLineReader.read(line2);
+ FileSourceDb.Line.Builder line3 = FileSourceDb.Data.newBuilder().addLinesBuilder().setSource("line3").setLine(3);
+ highlightingLineReader.read(line3);
+
+ assertThat(line1.getHighlighting()).isEqualTo("3,4,a");
+ assertThat(line2.getHighlighting()).isEqualTo("0,5,a");
+ assertThat(line3.getHighlighting()).isEqualTo("0,2,a");
+ }
+
+ // TODO
+ @Test
+ public void read_many_syntax_highlighting_on_many_lines() {
+ HighlightingLineReader highlightingLineReader = new HighlightingLineReader(newArrayList(
+ BatchReport.SyntaxHighlighting.newBuilder()
+ .setRange(BatchReport.Range.newBuilder()
+ .setStartLine(1).setEndLine(3)
+ .setStartOffset(3).setEndOffset(2)
+ .build())
+ .setType(Constants.HighlightingType.ANNOTATION)
+ .build(),
+ BatchReport.SyntaxHighlighting.newBuilder()
+ .setRange(BatchReport.Range.newBuilder()
+ .setStartLine(2).setEndLine(4)
+ .setStartOffset(0).setEndOffset(3)
+ .build())
+ .setType(Constants.HighlightingType.HIGHLIGHTING_STRING)
+ .build(),
+ BatchReport.SyntaxHighlighting.newBuilder()
+ .setRange(BatchReport.Range.newBuilder()
+ .setStartLine(2).setEndLine(2)
+ .setStartOffset(1).setEndOffset(2)
+ .build())
+ .setType(Constants.HighlightingType.COMMENT)
+ .build()
+ ).iterator());
+
+ FileSourceDb.Line.Builder line1 = FileSourceDb.Data.newBuilder().addLinesBuilder().setSource("line1").setLine(1);
+ highlightingLineReader.read(line1);
+ FileSourceDb.Line.Builder line2 = FileSourceDb.Data.newBuilder().addLinesBuilder().setSource("line2").setLine(2);
+ highlightingLineReader.read(line2);
+ FileSourceDb.Line.Builder line3 = FileSourceDb.Data.newBuilder().addLinesBuilder().setSource("line3").setLine(3);
+ highlightingLineReader.read(line3);
+ FileSourceDb.Line.Builder line4 = FileSourceDb.Data.newBuilder().addLinesBuilder().setSource("line4").setLine(4);
+ highlightingLineReader.read(line4);
+
+ assertThat(line1.getHighlighting()).isEqualTo("3,4,a");
+ assertThat(line2.getHighlighting()).isEqualTo("0,4,a;0,4,s;1,2,cd");
+ assertThat(line3.getHighlighting()).isEqualTo("0,2,a;0,4,s");
+ assertThat(line4.getHighlighting()).isEqualTo("0,3,s");
+ }
+
+ @Test
+ public void fail_when_end_offset_is_before_start_offset() {
+ HighlightingLineReader highlightingLineReader = new HighlightingLineReader(newArrayList(
+ BatchReport.SyntaxHighlighting.newBuilder()
+ .setRange(BatchReport.Range.newBuilder()
+ .setStartLine(1).setEndLine(1)
+ .setStartOffset(4).setEndOffset(2)
+ .build())
+ .setType(Constants.HighlightingType.ANNOTATION)
+ .build()
+ ).iterator());
+
+ try {
+ highlightingLineReader.read(FileSourceDb.Data.newBuilder().addLinesBuilder().setSource("line1").setLine(1));
+ failBecauseExceptionWasNotThrown(IllegalArgumentException.class);
+ } catch (IllegalArgumentException e) {
+ assertThat(e).hasMessage("End offset 2 cannot be defined before start offset 4 on line 1");
+ }
+ }
+
+ @Test
+ public void fail_when_end_offset_is_higher_than_line_length() {
+ HighlightingLineReader highlightingLineReader = new HighlightingLineReader(newArrayList(
+ BatchReport.SyntaxHighlighting.newBuilder()
+ .setRange(BatchReport.Range.newBuilder()
+ .setStartLine(1).setEndLine(1)
+ .setStartOffset(2).setEndOffset(10)
+ .build())
+ .setType(Constants.HighlightingType.ANNOTATION)
+ .build()
+ ).iterator());
+
+ try {
+ highlightingLineReader.read(FileSourceDb.Data.newBuilder().addLinesBuilder().setSource("line1").setLine(1));
+ failBecauseExceptionWasNotThrown(IllegalArgumentException.class);
+ } catch (IllegalArgumentException e) {
+ assertThat(e).hasMessage("End offset 10 is defined outside the length (5) of the line 1");
+ }
+ }
+
+ @Test
+ public void fail_when_start_offset_is_higher_than_line_length() {
+ HighlightingLineReader highlightingLineReader = new HighlightingLineReader(newArrayList(
+ BatchReport.SyntaxHighlighting.newBuilder()
+ .setRange(BatchReport.Range.newBuilder()
+ .setStartLine(1).setEndLine(1)
+ .setStartOffset(10).setEndOffset(11)
+ .build())
+ .setType(Constants.HighlightingType.ANNOTATION)
+ .build()
+ ).iterator());
+
+ try {
+ highlightingLineReader.read(FileSourceDb.Data.newBuilder().addLinesBuilder().setSource("line1").setLine(1));
+ failBecauseExceptionWasNotThrown(IllegalArgumentException.class);
+ } catch (IllegalArgumentException e) {
+ assertThat(e).hasMessage("Start offset 10 is defined outside the length (5) of the line 1");
+ }
+ }
+
+}
import java.io.File;
import java.io.IOException;
+import java.util.List;
import static com.google.common.collect.Lists.newArrayList;
import static org.assertj.core.api.Assertions.assertThat;
@Test
public void persist_sources() throws Exception {
- BatchReportWriter writer = initReport();
- writer.writeComponent(BatchReport.Component.newBuilder()
- .setRef(FILE_REF)
- .setType(Constants.ComponentType.FILE)
- .setUuid(FILE_UUID)
- .setLines(2)
- .build());
-
- File sourceFile = writer.getFileStructure().fileFor(FileStructure.Domain.SOURCE, FILE_REF);
- FileUtils.writeLines(sourceFile, Lists.newArrayList("line1", "line2"));
+ initBasicReport(2);
sut.execute(new ComputationContext(new BatchReportReader(reportDir), ComponentTesting.newProjectDto(PROJECT_UUID)));
@Test
public void persist_last_line() throws Exception {
- BatchReportWriter writer = initReport();
+ BatchReportWriter writer = new BatchReportWriter(reportDir);
+ FileUtils.writeLines(writer.getFileStructure().fileFor(FileStructure.Domain.SOURCE, FILE_REF), Lists.newArrayList("line1", "line2"));
+ writer.writeMetadata(BatchReport.Metadata.newBuilder()
+ .setRootComponentRef(1)
+ .setProjectKey("PROJECT_KEY")
+ .build());
+ writer.writeComponent(BatchReport.Component.newBuilder()
+ .setRef(1)
+ .setType(Constants.ComponentType.PROJECT)
+ .setUuid(PROJECT_UUID)
+ .addChildRef(FILE_REF)
+ .build());
writer.writeComponent(BatchReport.Component.newBuilder()
.setRef(FILE_REF)
.setType(Constants.ComponentType.FILE)
.setLines(3)
.build());
- File sourceFile = writer.getFileStructure().fileFor(FileStructure.Domain.SOURCE, FILE_REF);
- FileUtils.writeLines(sourceFile, Lists.newArrayList("line1", "line2"));
-
sut.execute(new ComputationContext(new BatchReportReader(reportDir), ComponentTesting.newProjectDto(PROJECT_UUID)));
assertThat(dbTester.countRowsOfTable("file_sources")).isEqualTo(1);
@Test
public void persist_source_hashes() throws Exception {
- BatchReportWriter writer = initReport();
- writer.writeComponent(BatchReport.Component.newBuilder()
- .setRef(FILE_REF)
- .setType(Constants.ComponentType.FILE)
- .setUuid(FILE_UUID)
- .setLines(2)
- .build());
-
- File sourceFile = writer.getFileStructure().fileFor(FileStructure.Domain.SOURCE, FILE_REF);
- FileUtils.writeLines(sourceFile, Lists.newArrayList("line\t1", "line2"));
+ initBasicReport(2);
sut.execute(new ComputationContext(new BatchReportReader(reportDir), ComponentTesting.newProjectDto(PROJECT_UUID)));
assertThat(dbTester.countRowsOfTable("file_sources")).isEqualTo(1);
FileSourceDto fileSourceDto = dbClient.fileSourceDao().select("FILE");
assertThat(fileSourceDto.getLineHashes()).isEqualTo("137f72c3708c6bd0de00a0e5a69c699b\ne6251bcf1a7dc3ba5e7933e325bbe605\n");
- assertThat(fileSourceDto.getSrcHash()).isEqualTo("fe1ac2747e8393015698f2724d8d2835");
+ assertThat(fileSourceDto.getSrcHash()).isEqualTo("4fcc82a88ee38e0aa16c17f512c685c9");
}
@Test
public void persist_coverage() throws Exception {
- BatchReportWriter writer = initReport();
- writer.writeComponent(BatchReport.Component.newBuilder()
- .setRef(FILE_REF)
- .setType(Constants.ComponentType.FILE)
- .setUuid(FILE_UUID)
- .setLines(1)
- .build());
+ BatchReportWriter writer = initBasicReport(1);
writer.writeComponentCoverage(FILE_REF, newArrayList(BatchReport.Coverage.newBuilder()
.setLine(1)
.setOverallCoveredConditions(4)
.build()));
- File sourceFile = writer.getFileStructure().fileFor(FileStructure.Domain.SOURCE, FILE_REF);
- FileUtils.writeLines(sourceFile, Lists.newArrayList("line1"));
-
sut.execute(new ComputationContext(new BatchReportReader(reportDir), ComponentTesting.newProjectDto(PROJECT_UUID)));
assertThat(dbTester.countRowsOfTable("file_sources")).isEqualTo(1);
@Test
public void persist_scm() throws Exception {
- BatchReportWriter writer = initReport();
- writer.writeComponent(BatchReport.Component.newBuilder()
- .setRef(FILE_REF)
- .setType(Constants.ComponentType.FILE)
- .setUuid(FILE_UUID)
- .setLines(1)
- .build());
+ BatchReportWriter writer = initBasicReport(1);
writer.writeComponentScm(BatchReport.Scm.newBuilder()
.setComponentRef(FILE_REF)
.build()
);
- File sourceFile = writer.getFileStructure().fileFor(FileStructure.Domain.SOURCE, FILE_REF);
- FileUtils.writeLines(sourceFile, Lists.newArrayList("line1"));
-
sut.execute(new ComputationContext(new BatchReportReader(reportDir), ComponentTesting.newProjectDto(PROJECT_UUID)));
assertThat(dbTester.countRowsOfTable("file_sources")).isEqualTo(1);
assertThat(data.getLines(0).getScmRevision()).isEqualTo("rev-1");
}
+ @Test
+ public void persist_highlighting() throws Exception {
+ BatchReportWriter writer = initBasicReport(1);
+
+ writer.writeComponentSyntaxHighlighting(FILE_REF, newArrayList(BatchReport.SyntaxHighlighting.newBuilder()
+ .setRange(BatchReport.Range.newBuilder()
+ .setStartLine(1).setEndLine(1)
+ .setStartOffset(2).setEndOffset(4)
+ .build())
+ .setType(Constants.HighlightingType.ANNOTATION)
+ .build())
+ );
+
+ sut.execute(new ComputationContext(new BatchReportReader(reportDir), ComponentTesting.newProjectDto(PROJECT_UUID)));
+
+ assertThat(dbTester.countRowsOfTable("file_sources")).isEqualTo(1);
+ FileSourceDto fileSourceDto = dbClient.fileSourceDao().select(FILE_UUID);
+ FileSourceDb.Data data = FileSourceDto.decodeData(fileSourceDto.getBinaryData());
+
+ assertThat(data.getLinesList()).hasSize(1);
+
+ assertThat(data.getLines(0).getHighlighting()).isEqualTo("2,4,a");
+ }
+
@Test
public void not_update_sources_when_nothing_has_changed() throws Exception {
// Existing sources
long past = 150000L;
- String srcHash = "5b4bd9815cdb17b8ceae19eb1810c34c";
- String lineHashes = "6438c669e0d0de98e6929c2cc0fac474\n";
- String dataHash = "6cad150e3d065976c230cddc5a09efaa";
+ String srcHash = "1ddab9058a07abc0db2605ab02a61a00";
+ String lineHashes = "137f72c3708c6bd0de00a0e5a69c699b\n";
+ String dataHash = "29f25900140c94db38035128cb6de6a2";
dbClient.fileSourceDao().insert(session, new FileSourceDto()
.setProjectUuid(PROJECT_UUID)
.setBinaryData(FileSourceDto.encodeData(FileSourceDb.Data.newBuilder()
.addLines(FileSourceDb.Line.newBuilder()
.setLine(1)
- .setSource("line")
+ .setSource("line1")
.build())
.build()))
.setCreatedAt(past)
session.commit();
// Sources from the report
- BatchReportWriter writer = initReport();
- writer.writeComponent(BatchReport.Component.newBuilder()
- .setRef(FILE_REF)
- .setType(Constants.ComponentType.FILE)
- .setUuid(FILE_UUID)
- .setLines(1)
- .build());
-
- File sourceFile = writer.getFileStructure().fileFor(FileStructure.Domain.SOURCE, FILE_REF);
- FileUtils.writeLines(sourceFile, Lists.newArrayList("line"));
+ initBasicReport(1);
sut.execute(new ComputationContext(new BatchReportReader(reportDir), ComponentTesting.newProjectDto(PROJECT_UUID)));
.setBinaryData(FileSourceDto.encodeData(FileSourceDb.Data.newBuilder()
.addLines(FileSourceDb.Line.newBuilder()
.setLine(1)
- .setSource("line")
+ .setSource("old line")
.build())
.build()))
.setCreatedAt(past)
.setUpdatedAt(past));
session.commit();
- // New sources from the report
- BatchReportWriter writer = initReport();
- writer.writeComponent(BatchReport.Component.newBuilder()
- .setRef(FILE_REF)
- .setType(Constants.ComponentType.FILE)
- .setUuid(FILE_UUID)
- .setLines(1)
- .build());
-
- File sourceFile = writer.getFileStructure().fileFor(FileStructure.Domain.SOURCE, FILE_REF);
- FileUtils.writeLines(sourceFile, Lists.newArrayList("new line"));
+ initBasicReport(1);
sut.execute(new ComputationContext(new BatchReportReader(reportDir), ComponentTesting.newProjectDto(PROJECT_UUID)));
dbClient.fileSourceDao().insert(session, new FileSourceDto()
.setProjectUuid(PROJECT_UUID)
.setFileUuid(FILE_UUID)
- // Source hash is missing, udate will be made
- .setLineHashes("6438c669e0d0de98e6929c2cc0fac474\n")
- .setDataHash("6cad150e3d065976c230cddc5a09efaa")
+ // Source hash is missing, update will be made
+ .setLineHashes("137f72c3708c6bd0de00a0e5a69c699b\n")
+ .setDataHash("29f25900140c94db38035128cb6de6a2")
.setBinaryData(FileSourceDto.encodeData(FileSourceDb.Data.newBuilder()
.addLines(FileSourceDb.Line.newBuilder()
.setLine(1)
.setUpdatedAt(past));
session.commit();
- // New sources from the report
- BatchReportWriter writer = initReport();
- writer.writeComponent(BatchReport.Component.newBuilder()
- .setRef(FILE_REF)
- .setType(Constants.ComponentType.FILE)
- .setUuid(FILE_UUID)
- .setLines(1)
- .build());
-
- File sourceFile = writer.getFileStructure().fileFor(FileStructure.Domain.SOURCE, FILE_REF);
- FileUtils.writeLines(sourceFile, Lists.newArrayList("line"));
+ initBasicReport(1);
sut.execute(new ComputationContext(new BatchReportReader(reportDir), ComponentTesting.newProjectDto(PROJECT_UUID)));
assertThat(fileSourceDto.getCreatedAt()).isEqualTo(past);
// Updated at is not updated to not reindex the file source in E/S as the src hash is not indexed
assertThat(fileSourceDto.getUpdatedAt()).isEqualTo(past);
- assertThat(fileSourceDto.getSrcHash()).isEqualTo("5b4bd9815cdb17b8ceae19eb1810c34c");
+ assertThat(fileSourceDto.getSrcHash()).isEqualTo("1ddab9058a07abc0db2605ab02a61a00");
}
- private BatchReportWriter initReport() throws IOException {
+ private BatchReportWriter initBasicReport(int numberOfLines) throws IOException {
BatchReportWriter writer = new BatchReportWriter(reportDir);
writer.writeMetadata(BatchReport.Metadata.newBuilder()
.setRootComponentRef(1)
.setUuid("MODULE")
.addChildRef(FILE_REF)
.build());
+ writer.writeComponent(BatchReport.Component.newBuilder()
+ .setRef(FILE_REF)
+ .setType(Constants.ComponentType.FILE)
+ .setUuid(FILE_UUID)
+ .setLines(numberOfLines)
+ .build());
+
+ List<String> lines = newArrayList();
+ for (int i=1; i<=numberOfLines; i++) {
+ lines.add("line" + i);
+ }
+ FileUtils.writeLines(writer.getFileStructure().fileFor(FileStructure.Domain.SOURCE, FILE_REF), lines);
return writer;
}