diff options
author | Julien Lancelot <julien.lancelot@sonarsource.com> | 2015-09-21 14:57:16 +0200 |
---|---|---|
committer | Julien Lancelot <julien.lancelot@sonarsource.com> | 2015-09-22 17:05:11 +0200 |
commit | 9b9827ed18a6d3d379c20279c002bd311d53dc06 (patch) | |
tree | a0db9435bf8a47b3792364e8c31a985d495efaaf | |
parent | ddc14ab698df614fa1e310136d0008ea0ad6d0da (diff) | |
download | sonarqube-9b9827ed18a6d3d379c20279c002bd311d53dc06.tar.gz sonarqube-9b9827ed18a6d3d379c20279c002bd311d53dc06.zip |
SONAR-6843 Not fail when file has no source
6 files changed, 38 insertions, 21 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/batch/BatchReportReader.java b/server/sonar-server/src/main/java/org/sonar/server/computation/batch/BatchReportReader.java index 301821d186b..fec1660d8ab 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/batch/BatchReportReader.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/batch/BatchReportReader.java @@ -19,6 +19,7 @@ */ package org.sonar.server.computation.batch; +import com.google.common.base.Optional; import javax.annotation.CheckForNull; import org.sonar.batch.protocol.output.BatchReport; import org.sonar.core.util.CloseableIterator; @@ -46,10 +47,9 @@ public interface BatchReportReader { CloseableIterator<BatchReport.Coverage> readComponentCoverage(int fileRef); /** - * Reads file source line by line. Throws an exception if the ref does not relate - * to a file + * Reads file source line by line. Return an absent optional if the file doest not exist */ - CloseableIterator<String> readFileSource(int fileRef); + Optional<CloseableIterator<String>> readFileSource(int fileRef); CloseableIterator<BatchReport.Test> readTests(int testFileRef); diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/batch/BatchReportReaderImpl.java b/server/sonar-server/src/main/java/org/sonar/server/computation/batch/BatchReportReaderImpl.java index 68796705733..c2dee4402bb 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/batch/BatchReportReaderImpl.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/batch/BatchReportReaderImpl.java @@ -19,6 +19,7 @@ */ package org.sonar.server.computation.batch; +import com.google.common.base.Optional; import com.google.common.base.Throwables; import com.google.protobuf.InvalidProtocolBufferException; import com.google.protobuf.Parser; @@ -98,14 +99,14 @@ public class BatchReportReaderImpl implements BatchReportReader { } @Override - public CloseableIterator<String> readFileSource(int fileRef) { + public Optional<CloseableIterator<String>> readFileSource(int fileRef) { File file = delegate.readFileSource(fileRef); if (file == null) { - throw new IllegalStateException("Unable to find source for file #" + fileRef); + return Optional.absent(); } try { - return new CloseableLineIterator(IOUtils.lineIterator(FileUtils.openInputStream(file), StandardCharsets.UTF_8)); + return Optional.<CloseableIterator<String>>of(new CloseableLineIterator(IOUtils.lineIterator(FileUtils.openInputStream(file), StandardCharsets.UTF_8))); } catch (IOException e) { throw new IllegalStateException("Fail to traverse file: " + file, e); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/batch/BatchReportReaderImplTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/batch/BatchReportReaderImplTest.java index a652c597e1b..d30f27b9e69 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/batch/BatchReportReaderImplTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/batch/BatchReportReaderImplTest.java @@ -21,7 +21,6 @@ package org.sonar.server.computation.batch; import java.io.File; import java.io.IOException; -import java.util.List; import org.apache.commons.io.FileUtils; import org.junit.Before; import org.junit.Rule; @@ -29,15 +28,14 @@ import org.junit.Test; import org.sonar.api.utils.internal.JUnitTempFolder; import org.sonar.batch.protocol.output.BatchReport; import org.sonar.batch.protocol.output.BatchReportWriter; -import org.sonar.batch.protocol.output.FileStructure; import org.sonar.core.util.CloseableIterator; import static com.google.common.collect.ImmutableList.of; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.guava.api.Assertions.assertThat; public class BatchReportReaderImplTest { private static final int COMPONENT_REF = 1; - private static final String COMPONENT_UUID = "uuid"; private static final BatchReport.Changesets CHANGESETS = BatchReport.Changesets.newBuilder().setComponentRef(COMPONENT_REF).build(); private static final BatchReport.Measure MEASURE = BatchReport.Measure.newBuilder().build(); private static final BatchReport.Component COMPONENT = BatchReport.Component.newBuilder().setRef(COMPONENT_REF).build(); @@ -58,14 +56,12 @@ public class BatchReportReaderImplTest { private BatchReportWriter writer; private BatchReportReaderImpl underTest; - private FileStructure fileStructure; @Before public void setUp() { BatchReportDirectoryHolder holder = new ImmutableBatchReportDirectoryHolder(tempFolder.newDir()); underTest = new BatchReportReaderImpl(holder); writer = new BatchReportWriter(holder.getDirectory()); - fileStructure = new FileStructure(holder.getDirectory()); } @Test(expected = IllegalStateException.class) @@ -239,9 +235,9 @@ public class BatchReportReaderImplTest { res.close(); } - @Test(expected = IllegalStateException.class) - public void readFileSource_throws_ISE_when_file_does_not_exist() { - underTest.readFileSource(COMPONENT_REF); + @Test + public void readFileSource_returns_absent_optional_when_file_does_not_exist() { + assertThat(underTest.readFileSource(COMPONENT_REF)).isAbsent(); } @Test @@ -249,7 +245,7 @@ public class BatchReportReaderImplTest { File file = writer.getSourceFile(COMPONENT_REF); FileUtils.writeLines(file, of("1", "2", "3")); - CloseableIterator<String> res = underTest.readFileSource(COMPONENT_REF); + CloseableIterator<String> res = underTest.readFileSource(COMPONENT_REF).get(); assertThat(res).containsExactly("1", "2", "3"); res.close(); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/batch/BatchReportReaderRule.java b/server/sonar-server/src/test/java/org/sonar/server/computation/batch/BatchReportReaderRule.java index 04adf2322af..ea65d2c1cdc 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/batch/BatchReportReaderRule.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/batch/BatchReportReaderRule.java @@ -19,6 +19,7 @@ */ package org.sonar.server.computation.batch; +import com.google.common.base.Optional; import com.google.common.base.Preconditions; import java.util.ArrayList; import java.util.Arrays; @@ -193,13 +194,13 @@ public class BatchReportReaderRule implements TestRule, BatchReportReader { } @Override - public CloseableIterator<String> readFileSource(int fileRef) { + public Optional<CloseableIterator<String>> readFileSource(int fileRef) { List<String> lines = fileSources.get(fileRef); if (lines == null) { - throw new IllegalStateException("Unable to find source for file #" + fileRef + ". File does not exist: " + lines); + return Optional.absent(); } - return CloseableIterator.from(lines.iterator()); + return Optional.of(CloseableIterator.from(lines.iterator())); } public void putFileSourceLines(int fileRef, @Nullable String... lines) { diff --git a/sonar-batch-protocol/src/main/java/org/sonar/batch/protocol/output/BatchReportReader.java b/sonar-batch-protocol/src/main/java/org/sonar/batch/protocol/output/BatchReportReader.java index 4846bb0e1e9..7a650438204 100644 --- a/sonar-batch-protocol/src/main/java/org/sonar/batch/protocol/output/BatchReportReader.java +++ b/sonar-batch-protocol/src/main/java/org/sonar/batch/protocol/output/BatchReportReader.java @@ -120,12 +120,13 @@ public class BatchReportReader { return emptyCloseableIterator(); } + @CheckForNull public File readFileSource(int fileRef) { File file = fileStructure.fileFor(FileStructure.Domain.SOURCE, fileRef); - if (!fileExists(file)) { - throw new IllegalStateException("Unable to find source for file #" + fileRef + ". File does not exist: " + file); + if (fileExists(file)) { + return file; } - return file; + return null; } @CheckForNull diff --git a/sonar-batch-protocol/src/test/java/org/sonar/batch/protocol/output/BatchReportReaderTest.java b/sonar-batch-protocol/src/test/java/org/sonar/batch/protocol/output/BatchReportReaderTest.java index 19b29fb5f03..c1545c9aae9 100644 --- a/sonar-batch-protocol/src/test/java/org/sonar/batch/protocol/output/BatchReportReaderTest.java +++ b/sonar-batch-protocol/src/test/java/org/sonar/batch/protocol/output/BatchReportReaderTest.java @@ -21,9 +21,11 @@ package org.sonar.batch.protocol.output; import com.google.common.collect.Lists; import java.io.File; +import java.io.FileOutputStream; import java.io.InputStream; import java.util.Arrays; import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -339,4 +341,20 @@ public class BatchReportReaderTest { assertThat(underTest.readCoverageDetails(UNKNOWN_COMPONENT_REF)).isNull(); } + @Test + public void read_file_source() throws Exception { + BatchReportWriter writer = new BatchReportWriter(dir); + try (FileOutputStream outputStream = new FileOutputStream(writer.getSourceFile(1))) { + IOUtils.write("line1\nline2", outputStream); + } + + try (InputStream inputStream = FileUtils.openInputStream(underTest.readFileSource(1))) { + assertThat(IOUtils.readLines(inputStream)).containsOnly("line1", "line2"); + } + } + + @Test + public void return_null_when_no_file_source() throws Exception { + assertThat(underTest.readFileSource(UNKNOWN_COMPONENT_REF)).isNull(); + } } |