diff --git a/src/main/java/com/bartek/esa/file/di/FileModule.java b/src/main/java/com/bartek/esa/file/di/FileModule.java index adcbd99..5201de1 100644 --- a/src/main/java/com/bartek/esa/file/di/FileModule.java +++ b/src/main/java/com/bartek/esa/file/di/FileModule.java @@ -1,5 +1,6 @@ package com.bartek.esa.file.di; +import com.bartek.esa.file.provider.FileContentProvider; import com.bartek.esa.file.provider.FileProvider; import dagger.Module; import dagger.Provides; @@ -11,4 +12,9 @@ public class FileModule { public FileProvider fileProvider() { return new FileProvider(); } + + @Provides + public FileContentProvider fileContentProvider() { + return new FileContentProvider(); + } } diff --git a/src/main/java/com/bartek/esa/file/model/FoundLine.java b/src/main/java/com/bartek/esa/file/model/FoundLine.java new file mode 100644 index 0000000..05cd59a --- /dev/null +++ b/src/main/java/com/bartek/esa/file/model/FoundLine.java @@ -0,0 +1,12 @@ +package com.bartek.esa.file.model; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class FoundLine { + private int number; + private String line; + private int position; +} diff --git a/src/main/java/com/bartek/esa/file/provider/FileContentProvider.java b/src/main/java/com/bartek/esa/file/provider/FileContentProvider.java new file mode 100644 index 0000000..195d908 --- /dev/null +++ b/src/main/java/com/bartek/esa/file/provider/FileContentProvider.java @@ -0,0 +1,63 @@ +package com.bartek.esa.file.provider; + +import com.bartek.esa.error.EsaException; +import com.bartek.esa.file.model.FoundLine; +import io.vavr.control.Try; + +import javax.inject.Inject; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.io.LineNumberReader; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Pattern; + +public class FileContentProvider { + + @Inject + public FileContentProvider() { + + } + + public List findPhraseByLines(File file, String regex) { + try { + return tryToFindPhraseByLines(file, regex); + } catch (IOException e) { + throw new EsaException(e); + } + } + + private List tryToFindPhraseByLines(File file, String regex) throws IOException { + LineNumberReader lineNumberReader = readForLines(file); + List foundLines = new ArrayList<>(); + + String line; + Pattern pattern = Pattern.compile(regex); + while ((line = lineNumberReader.readLine()) != null) { + if (pattern.matcher(line).find()) { + foundLines.add(FoundLine.builder() + .line(line) + .number(lineNumberReader.getLineNumber()) + .build()); + } + } + + return foundLines; + } + + private LineNumberReader readForLines(File file) { + return Try.of(() -> new LineNumberReader(new FileReader(file))) + .getOrElseThrow(EsaException::new); + } + + public String readFile(File file) { + StringBuilder content = new StringBuilder(); + Try.run(() -> Files.lines(file.toPath()) + .map(line -> line + "\n") + .forEach(content::append)); + + return content.toString(); + } +} diff --git a/src/main/java/com/bartek/esa/file/provider/FileProvider.java b/src/main/java/com/bartek/esa/file/provider/FileProvider.java index b3cbd3e..ceedf6a 100644 --- a/src/main/java/com/bartek/esa/file/provider/FileProvider.java +++ b/src/main/java/com/bartek/esa/file/provider/FileProvider.java @@ -24,15 +24,6 @@ public class FileProvider { .toFile(); } - public String readFile(File file) { - StringBuilder content = new StringBuilder(); - Try.run(() -> Files.lines(file.toPath()) - .map(line -> line + "\n") - .forEach(content::append)); - - return content.toString(); - } - public Set findFilesRecursively(String path, String globPattern) { return findFilesRecursivelyInSubpath(path, "", globPattern); }