import org.sonar.api.CoreProperties;
import org.sonar.api.batch.bootstrap.ProjectDefinition;
import org.sonar.api.batch.bootstrap.ProjectReactor;
+import org.sonar.api.batch.fs.InputFile;
import org.sonar.api.resources.Language;
import org.sonar.api.resources.Resource;
import org.sonar.api.resources.ResourceUtils;
}
if (ResourceUtils.isFile(r)) {
builder.setIsTest(ResourceUtils.isUnitTestClass(r));
+ builder.setLines(((InputFile) batchResource.inputPath()).lines());
}
String name = getName(r);
if (name != null) {
import org.sonar.api.batch.fs.FileSystem;
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.sensor.Sensor;
import org.sonar.api.batch.sensor.SensorContext;
import org.sonar.api.batch.sensor.SensorDescriptor;
List<InputFile> filesToBlame = new LinkedList<InputFile>();
for (InputFile f : fs.inputFiles(fs.predicates().all())) {
if (configuration.forceReloadAll()) {
- addIfNotEmpty(filesToBlame, (DefaultInputFile) f);
+ addIfNotEmpty(filesToBlame, f);
} else {
FileData fileData = projectReferentials.fileData(projectDefinition.getKeyWithBranch(), f.relativePath());
if (f.status() != Status.SAME || fileData == null || fileData.needBlame()) {
- addIfNotEmpty(filesToBlame, (DefaultInputFile) f);
+ addIfNotEmpty(filesToBlame, f);
}
}
}
return filesToBlame;
}
- private void addIfNotEmpty(List<InputFile> filesToBlame, DefaultInputFile f) {
- if (!f.isEmpty()) {
+ private void addIfNotEmpty(List<InputFile> filesToBlame, InputFile f) {
+ if (f.lines() > 0) {
filesToBlame.add(f);
}
}
import org.sonar.api.CoreProperties;
import org.sonar.api.batch.bootstrap.ProjectDefinition;
import org.sonar.api.batch.bootstrap.ProjectReactor;
+import org.sonar.api.batch.fs.internal.DefaultInputFile;
import org.sonar.api.database.model.Snapshot;
import org.sonar.api.resources.Directory;
import org.sonar.api.resources.Java;
import org.sonar.batch.protocol.Constants.EventCategory;
import org.sonar.batch.protocol.output.BatchReport.Component;
import org.sonar.batch.protocol.output.BatchReport.Event;
-import org.sonar.batch.protocol.output.BatchReportReader;
-import org.sonar.batch.protocol.output.BatchReportWriter;
-import org.sonar.batch.protocol.output.FileStructure;
+import org.sonar.batch.protocol.output.*;
import java.io.File;
import java.util.Arrays;
org.sonar.api.resources.File file = org.sonar.api.resources.File.create("src/Foo.java", Java.INSTANCE, false);
file.setEffectiveKey("module1:src/Foo.java");
file.setId(4).setUuid("FILE_UUID");
- resourceCache.add(file, dir).setSnapshot(new Snapshot().setId(14));
+ resourceCache.add(file, dir).setSnapshot(new Snapshot().setId(14)).setInputPath(new DefaultInputFile("module1", "src/Foo.java").setLines(2));
org.sonar.api.resources.File fileWithoutLang = org.sonar.api.resources.File.create("src/make", null, false);
fileWithoutLang.setEffectiveKey("module1:src/make");
fileWithoutLang.setId(5).setUuid("FILE_WITHOUT_LANG_UUID");
- resourceCache.add(fileWithoutLang, dir).setSnapshot(new Snapshot().setId(15));
+ resourceCache.add(fileWithoutLang, dir).setSnapshot(new Snapshot().setId(15)).setInputPath(new DefaultInputFile("module1", "src/make").setLines(10));
org.sonar.api.resources.File testFile = org.sonar.api.resources.File.create("test/FooTest.java", Java.INSTANCE, true);
testFile.setEffectiveKey("module1:test/FooTest.java");
testFile.setId(6).setUuid("TEST_FILE_UUID");
- resourceCache.add(testFile, dir).setSnapshot(new Snapshot().setId(16));
+ resourceCache.add(testFile, dir).setSnapshot(new Snapshot().setId(16)).setInputPath(new DefaultInputFile("module1", "test/FooTest.java").setLines(4));
File outputDir = temp.newFolder();
BatchReportWriter writer = new BatchReportWriter(outputDir);
org.sonar.api.resources.File file = org.sonar.api.resources.File.create("src/Foo.java", Java.INSTANCE, false);
file.setEffectiveKey("module1:my_branch:my_branch:src/Foo.java");
file.setId(4).setUuid("FILE_UUID");
- resourceCache.add(file, dir).setSnapshot(new Snapshot().setId(14));
+ resourceCache.add(file, dir).setSnapshot(new Snapshot().setId(14)).setInputPath(new DefaultInputFile("module1", "src/Foo.java").setLines(2));
File outputDir = temp.newFolder();
BatchReportWriter writer = new BatchReportWriter(outputDir);
private String hash;
private int nonBlankLines;
private int[] originalLineOffsets;
- private boolean empty;
public DefaultInputFile(String moduleKey, String relativePath) {
this.moduleKey = moduleKey;
return this;
}
- public boolean isEmpty() {
- return this.empty;
- }
-
- public DefaultInputFile setEmpty(boolean empty) {
- this.empty = empty;
- return this;
- }
-
@Override
public TextPointer newPointer(int line, int lineOffset) {
DefaultTextPointer textPointer = new DefaultTextPointer(line, lineOffset);
this.setNonBlankLines(metadata.nonBlankLines);
this.setHash(metadata.hash);
this.setOriginalLineOffsets(metadata.originalLineOffsets);
- this.setEmpty(metadata.empty);
return this;
}
}
private static class LineCounter extends CharHandler {
- private boolean empty = true;
- private int lines = 1;
+ private int lines = 0;
private int nonBlankLines = 0;
private boolean blankLine = true;
boolean alreadyLoggedInvalidCharacter = false;
@Override
void handleAll(char c) {
- this.empty = false;
+ if (this.lines == 0) {
+ this.lines = 1;
+ }
if (!alreadyLoggedInvalidCharacter && c == '\ufffd') {
LOG.warn("Invalid character encountered in file {} at line {} for encoding {}. Please fix file content or configure the encoding to be used using property '{}'.", file,
lines, encoding, CoreProperties.ENCODING_PROPERTY);
return nonBlankLines;
}
- public boolean isEmpty() {
- return empty;
- }
}
private static class FileHashComputer extends CharHandler {
LineOffsetCounter lineOffsetCounter = new LineOffsetCounter();
readFile(file, encoding, lineCounter, fileHashComputer, lineOffsetCounter);
return new Metadata(lineCounter.lines(), lineCounter.nonBlankLines(), fileHashComputer.getHash(), lineOffsetCounter.getOriginalLineOffsets(),
- lineOffsetCounter.getLastValidOffset(),
- lineCounter.isEmpty());
+ lineOffsetCounter.getLastValidOffset());
}
/**
throw new IllegalStateException("Should never occurs", e);
}
return new Metadata(lineCounter.lines(), lineCounter.nonBlankLines(), fileHashComputer.getHash(), lineOffsetCounter.getOriginalLineOffsets(),
- lineOffsetCounter.getLastValidOffset(),
- lineCounter.isEmpty());
+ lineOffsetCounter.getLastValidOffset());
}
private static void readFile(File file, Charset encoding, CharHandler... handlers) {
final String hash;
final int[] originalLineOffsets;
final int lastValidOffset;
- final boolean empty;
- private Metadata(int lines, int nonBlankLines, String hash, List<Integer> originalLineOffsets, int lastValidOffset, boolean empty) {
+ private Metadata(int lines, int nonBlankLines, String hash, List<Integer> originalLineOffsets, int lastValidOffset) {
this.lines = lines;
this.nonBlankLines = nonBlankLines;
this.hash = hash;
- this.empty = empty;
this.originalLineOffsets = Ints.toArray(originalLineOffsets);
this.lastValidOffset = lastValidOffset;
}
FileUtils.touch(tempFile);
FileMetadata.Metadata metadata = new FileMetadata().readMetadata(tempFile, Charsets.UTF_8);
- assertThat(metadata.lines).isEqualTo(1);
+ assertThat(metadata.lines).isEqualTo(0);
assertThat(metadata.nonBlankLines).isEqualTo(0);
assertThat(metadata.hash).isNotEmpty();
assertThat(metadata.originalLineOffsets).containsOnly(0);
assertThat(metadata.lastValidOffset).isEqualTo(0);
- assertThat(metadata.empty).isTrue();
}
@Test
assertThat(metadata.hash).isEqualTo(md5Hex("foo\nbar\nbaz"));
assertThat(metadata.originalLineOffsets).containsOnly(0, 5, 10);
assertThat(metadata.lastValidOffset).isEqualTo(13);
- assertThat(metadata.empty).isFalse();
}
@Test
assertThat(metadata.lines).isEqualTo(135);
assertThat(metadata.nonBlankLines).isEqualTo(134);
assertThat(metadata.hash).isNotEmpty();
- assertThat(metadata.empty).isFalse();
assertThat(logTester.logs(LoggerLevel.WARN).get(0)).contains("Invalid character encountered in file");
assertThat(logTester.logs(LoggerLevel.WARN).get(0)).contains(