public DefaultInputFile build() { Path absolutePath = moduleBaseDir.resolve(relativePath); if (projectBaseDir == null) { projectBaseDir = moduleBaseDir; } String projectRelativePath = projectBaseDir.relativize(absolutePath).toString(); DefaultIndexedFile indexedFile = new DefaultIndexedFile(absolutePath, projectKey, projectRelativePath, relativePath, type, language, id, new SensorStrategy()); DefaultInputFile inputFile = new DefaultInputFile(indexedFile, f -> f.setMetadata(new Metadata(lines, nonBlankLines, hash, originalLineStartOffsets, originalLineEndOffsets, lastValidOffset)), contents); inputFile.setStatus(status); inputFile.setCharset(charset); inputFile.setPublished(publish); return inputFile; }
@Test public void test_content() throws IOException { Path testFile = baseDir.resolve(PROJECT_RELATIVE_PATH); Files.createDirectories(testFile.getParent()); String content = "test é string"; Files.write(testFile, content.getBytes(StandardCharsets.ISO_8859_1)); assertThat(Files.readAllLines(testFile, StandardCharsets.ISO_8859_1).get(0)).hasSize(content.length()); Metadata metadata = new Metadata(42, 30, "", new int[0], new int[0], 10); DefaultInputFile inputFile = new DefaultInputFile(indexedFile, f -> f.setMetadata(metadata)) .setStatus(InputFile.Status.ADDED) .setCharset(StandardCharsets.ISO_8859_1); assertThat(inputFile.contents()).isEqualTo(content); try (InputStream inputStream = inputFile.inputStream()) { String result = new BufferedReader(new InputStreamReader(inputStream, inputFile.charset())).lines().collect(Collectors.joining()); assertThat(result).isEqualTo(content); } }
@Test public void testRoundtrip() { Metadata metadata = new Metadata(10, 20, "hash", new int[] {1, 3}, new int[] {2, 4}, 5); assertThat(metadata.isEmpty()).isFalse(); assertThat(metadata.lines()).isEqualTo(10); assertThat(metadata.nonBlankLines()).isEqualTo(20); assertThat(metadata.originalLineStartOffsets()).isEqualTo(new int[] {1, 3}); assertThat(metadata.originalLineEndOffsets()).isEqualTo(new int[] {2, 4}); assertThat(metadata.lastValidOffset()).isEqualTo(5); assertThat(metadata.hash()).isEqualTo("hash"); } }
@Test public void test_content_exclude_bom() throws IOException { Path testFile = baseDir.resolve(PROJECT_RELATIVE_PATH); Files.createDirectories(testFile.getParent()); try (BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(testFile.toFile()), StandardCharsets.UTF_8))) { out.write('\ufeff'); } String content = "test é string €"; Files.write(testFile, content.getBytes(StandardCharsets.UTF_8), StandardOpenOption.APPEND); assertThat(Files.readAllLines(testFile, StandardCharsets.UTF_8).get(0)).hasSize(content.length() + 1); Metadata metadata = new Metadata(42, 30, "", new int[0], new int[0], 10); DefaultInputFile inputFile = new DefaultInputFile(indexedFile, f -> f.setMetadata(metadata)) .setStatus(InputFile.Status.ADDED) .setCharset(StandardCharsets.UTF_8); assertThat(inputFile.contents()).isEqualTo(content); try (InputStream inputStream = inputFile.inputStream()) { String result = new BufferedReader(new InputStreamReader(inputStream, inputFile.charset())).lines().collect(Collectors.joining()); assertThat(result).isEqualTo(content); } }
@Test public void checkValidRangeUsingGlobalOffset() { Metadata metadata = new Metadata(2, 2, "", new int[] {0, 10}, new int[] {9, 15}, 16); DefaultInputFile file = new DefaultInputFile(new DefaultIndexedFile("ABCDE", Paths.get("module"), MODULE_RELATIVE_PATH, null), f -> f.setMetadata(metadata)); TextRange newRange = file.newRange(10, 13); assertThat(newRange.start().line()).isEqualTo(2); assertThat(newRange.start().lineOffset()).isEqualTo(0); assertThat(newRange.end().line()).isEqualTo(2); assertThat(newRange.end().lineOffset()).isEqualTo(3); }
@Test public void test() throws Exception { Metadata metadata = new Metadata(42, 42, "", new int[0], new int[0], 10); DefaultInputFile inputFile = new DefaultInputFile(indexedFile, (f) -> f.setMetadata(metadata)) .setStatus(InputFile.Status.ADDED) .setCharset(StandardCharsets.ISO_8859_1); assertThat(inputFile.absolutePath()).endsWith("Foo.php"); assertThat(inputFile.filename()).isEqualTo("Foo.php"); assertThat(inputFile.uri()).hasPath(baseDir.resolve(PROJECT_RELATIVE_PATH).toUri().getPath()); assertThat(new File(inputFile.absolutePath())).isAbsolute(); assertThat(inputFile.language()).isEqualTo("php"); assertThat(inputFile.status()).isEqualTo(InputFile.Status.ADDED); assertThat(inputFile.type()).isEqualTo(InputFile.Type.TEST); assertThat(inputFile.lines()).isEqualTo(42); assertThat(inputFile.charset()).isEqualTo(StandardCharsets.ISO_8859_1); assertThat(inputFile.getModuleRelativePath()).isEqualTo(MODULE_RELATIVE_PATH); assertThat(inputFile.getProjectRelativePath()).isEqualTo(PROJECT_RELATIVE_PATH); sensorStrategy.setGlobal(false); assertThat(inputFile.relativePath()).isEqualTo(MODULE_RELATIVE_PATH); assertThat(new File(inputFile.relativePath())).isRelative(); sensorStrategy.setGlobal(true); assertThat(inputFile.relativePath()).isEqualTo(PROJECT_RELATIVE_PATH); assertThat(new File(inputFile.relativePath())).isRelative(); }
/** * For testing purpose */ public Metadata readMetadata(Reader reader) { LineCounter lineCounter = new LineCounter("fromString", StandardCharsets.UTF_16); FileHashComputer fileHashComputer = new FileHashComputer("fromString"); LineOffsetCounter lineOffsetCounter = new LineOffsetCounter(); CharHandler[] handlers = {lineCounter, fileHashComputer, lineOffsetCounter}; try { read(reader, handlers); } catch (IOException e) { throw new IllegalStateException("Should never occur", e); } return new Metadata(lineCounter.lines(), lineCounter.nonBlankLines(), fileHashComputer.getHash(), lineOffsetCounter.getOriginalLineStartOffsets(), lineOffsetCounter.getOriginalLineEndOffsets(), lineOffsetCounter.getLastValidOffset()); }
/** * Compute hash of a file ignoring line ends differences. * Maximum performance is needed. */ public Metadata readMetadata(InputStream stream, Charset encoding, String filePath, @Nullable CharHandler otherHandler) { LineCounter lineCounter = new LineCounter(filePath, encoding); FileHashComputer fileHashComputer = new FileHashComputer(filePath); LineOffsetCounter lineOffsetCounter = new LineOffsetCounter(); if (otherHandler != null) { CharHandler[] handlers = {lineCounter, fileHashComputer, lineOffsetCounter, otherHandler}; readFile(stream, encoding, filePath, handlers); } else { CharHandler[] handlers = {lineCounter, fileHashComputer, lineOffsetCounter}; readFile(stream, encoding, filePath, handlers); } return new Metadata(lineCounter.lines(), lineCounter.nonBlankLines(), fileHashComputer.getHash(), lineOffsetCounter.getOriginalLineStartOffsets(), lineOffsetCounter.getOriginalLineEndOffsets(), lineOffsetCounter.getLastValidOffset()); }
@Test public void checkValidPointerUsingGlobalOffset() { Metadata metadata = new Metadata(2, 2, "", new int[] {0, 10}, new int[] {8, 15}, 16); DefaultInputFile file = new DefaultInputFile(new DefaultIndexedFile("ABCDE", Paths.get("module"), MODULE_RELATIVE_PATH, null), f -> f.setMetadata(metadata)); assertThat(file.newPointer(0).line()).isEqualTo(1); assertThat(file.newPointer(0).lineOffset()).isEqualTo(0); assertThat(file.newPointer(9).line()).isEqualTo(1); // Ignore eol characters assertThat(file.newPointer(9).lineOffset()).isEqualTo(8); assertThat(file.newPointer(10).line()).isEqualTo(2); assertThat(file.newPointer(10).lineOffset()).isEqualTo(0); assertThat(file.newPointer(15).line()).isEqualTo(2); assertThat(file.newPointer(15).lineOffset()).isEqualTo(5); assertThat(file.newPointer(16).line()).isEqualTo(2); // Ignore eol characters assertThat(file.newPointer(16).lineOffset()).isEqualTo(5); try { file.newPointer(-1); fail(); } catch (Exception e) { assertThat(e).hasMessage("-1 is not a valid offset for a file"); } try { file.newPointer(17); fail(); } catch (Exception e) { assertThat(e).hasMessage("17 is not a valid offset for file src/Foo.php. Max offset is 16"); } }
@Test public void checkValidPointer() { Metadata metadata = new Metadata(2, 2, "", new int[] {0, 10}, new int[] {9, 15}, 16); DefaultInputFile file = new DefaultInputFile(new DefaultIndexedFile("ABCDE", Paths.get("module"), MODULE_RELATIVE_PATH, null), f -> f.setMetadata(metadata)); assertThat(file.newPointer(1, 0).line()).isEqualTo(1);
@Test public void testRangeOverlap() { Metadata metadata = new Metadata(2, 2, "", new int[] {0, 10}, new int[] {9, 15}, 16); DefaultInputFile file = new DefaultInputFile(new DefaultIndexedFile("ABCDE", Paths.get("module"), MODULE_RELATIVE_PATH, null), f -> f.setMetadata(metadata)); // Don't fail assertThat(file.newRange(file.newPointer(1, 0), file.newPointer(1, 1)).overlap(file.newRange(file.newPointer(1, 0), file.newPointer(1, 1)))).isTrue(); assertThat(file.newRange(file.newPointer(1, 0), file.newPointer(1, 1)).overlap(file.newRange(file.newPointer(1, 0), file.newPointer(1, 2)))).isTrue(); assertThat(file.newRange(file.newPointer(1, 0), file.newPointer(1, 1)).overlap(file.newRange(file.newPointer(1, 1), file.newPointer(1, 2)))).isFalse(); assertThat(file.newRange(file.newPointer(1, 2), file.newPointer(1, 3)).overlap(file.newRange(file.newPointer(1, 0), file.newPointer(1, 2)))).isFalse(); } }
public DefaultInputFile build() { Path absolutePath = moduleBaseDir.resolve(relativePath); if (projectBaseDir == null) { projectBaseDir = moduleBaseDir; } String projectRelativePath = projectBaseDir.relativize(absolutePath).toString(); DefaultIndexedFile indexedFile = new DefaultIndexedFile(absolutePath, projectKey, projectRelativePath, relativePath, type, language, id, new SensorStrategy()); DefaultInputFile inputFile = new DefaultInputFile(indexedFile, f -> f.setMetadata(new Metadata(lines, nonBlankLines, hash, originalLineStartOffsets, originalLineEndOffsets, lastValidOffset)), contents); inputFile.setStatus(status); inputFile.setCharset(charset); inputFile.setPublished(publish); return inputFile; }
/** * For testing purpose */ public Metadata readMetadata(Reader reader) { LineCounter lineCounter = new LineCounter("fromString", StandardCharsets.UTF_16); FileHashComputer fileHashComputer = new FileHashComputer("fromString"); LineOffsetCounter lineOffsetCounter = new LineOffsetCounter(); CharHandler[] handlers = {lineCounter, fileHashComputer, lineOffsetCounter}; try { read(reader, handlers); } catch (IOException e) { throw new IllegalStateException("Should never occur", e); } return new Metadata(lineCounter.lines(), lineCounter.nonBlankLines(), fileHashComputer.getHash(), lineOffsetCounter.getOriginalLineStartOffsets(), lineOffsetCounter.getOriginalLineEndOffsets(), lineOffsetCounter.getLastValidOffset()); }
/** * Compute hash of a file ignoring line ends differences. * Maximum performance is needed. */ public Metadata readMetadata(InputStream stream, Charset encoding, String filePath, @Nullable CharHandler otherHandler) { LineCounter lineCounter = new LineCounter(filePath, encoding); FileHashComputer fileHashComputer = new FileHashComputer(filePath); LineOffsetCounter lineOffsetCounter = new LineOffsetCounter(); if (otherHandler != null) { CharHandler[] handlers = {lineCounter, fileHashComputer, lineOffsetCounter, otherHandler}; readFile(stream, encoding, filePath, handlers); } else { CharHandler[] handlers = {lineCounter, fileHashComputer, lineOffsetCounter}; readFile(stream, encoding, filePath, handlers); } return new Metadata(lineCounter.lines(), lineCounter.nonBlankLines(), fileHashComputer.getHash(), lineOffsetCounter.getOriginalLineStartOffsets(), lineOffsetCounter.getOriginalLineEndOffsets(), lineOffsetCounter.getLastValidOffset()); }