aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJulien Lancelot <julien.lancelot@sonarsource.com>2015-09-21 14:57:16 +0200
committerJulien Lancelot <julien.lancelot@sonarsource.com>2015-09-22 17:05:11 +0200
commit9b9827ed18a6d3d379c20279c002bd311d53dc06 (patch)
treea0db9435bf8a47b3792364e8c31a985d495efaaf
parentddc14ab698df614fa1e310136d0008ea0ad6d0da (diff)
downloadsonarqube-9b9827ed18a6d3d379c20279c002bd311d53dc06.tar.gz
sonarqube-9b9827ed18a6d3d379c20279c002bd311d53dc06.zip
SONAR-6843 Not fail when file has no source
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/batch/BatchReportReader.java6
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/batch/BatchReportReaderImpl.java7
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/batch/BatchReportReaderImplTest.java14
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/batch/BatchReportReaderRule.java7
-rw-r--r--sonar-batch-protocol/src/main/java/org/sonar/batch/protocol/output/BatchReportReader.java7
-rw-r--r--sonar-batch-protocol/src/test/java/org/sonar/batch/protocol/output/BatchReportReaderTest.java18
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();
+ }
}