From da8a97ffaa55a47416b2eae3a85a3927f83ad693 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Pluta?= Date: Sat, 30 Mar 2019 12:41:38 +0100 Subject: [PATCH] 3: Add FileProvider --- .../com/bartek/esa/di/DependencyInjector.java | 4 +- .../com/bartek/esa/file/di/FileModule.java | 14 ++++ .../esa/file/provider/FileProvider.java | 75 +++++++++++++++++++ 3 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/bartek/esa/file/di/FileModule.java create mode 100644 src/main/java/com/bartek/esa/file/provider/FileProvider.java diff --git a/src/main/java/com/bartek/esa/di/DependencyInjector.java b/src/main/java/com/bartek/esa/di/DependencyInjector.java index 0a601fb..c005aa6 100644 --- a/src/main/java/com/bartek/esa/di/DependencyInjector.java +++ b/src/main/java/com/bartek/esa/di/DependencyInjector.java @@ -3,11 +3,13 @@ package com.bartek.esa.di; import com.bartek.esa.EsaMain; import com.bartek.esa.cli.di.CliModule; import com.bartek.esa.dispatcher.di.DispatcherModule; +import com.bartek.esa.file.di.FileModule; import dagger.Component; @Component(modules = { CliModule.class, - DispatcherModule.class + DispatcherModule.class, + FileModule.class }) public interface DependencyInjector { EsaMain esa(); diff --git a/src/main/java/com/bartek/esa/file/di/FileModule.java b/src/main/java/com/bartek/esa/file/di/FileModule.java new file mode 100644 index 0000000..adcbd99 --- /dev/null +++ b/src/main/java/com/bartek/esa/file/di/FileModule.java @@ -0,0 +1,14 @@ +package com.bartek.esa.file.di; + +import com.bartek.esa.file.provider.FileProvider; +import dagger.Module; +import dagger.Provides; + +@Module +public class FileModule { + + @Provides + public FileProvider fileProvider() { + return new FileProvider(); + } +} diff --git a/src/main/java/com/bartek/esa/file/provider/FileProvider.java b/src/main/java/com/bartek/esa/file/provider/FileProvider.java new file mode 100644 index 0000000..47997e9 --- /dev/null +++ b/src/main/java/com/bartek/esa/file/provider/FileProvider.java @@ -0,0 +1,75 @@ +package com.bartek.esa.file.provider; + +import com.bartek.esa.error.EsaException; +import io.vavr.control.Try; + +import javax.inject.Inject; +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Set; +import java.util.stream.Collectors; + +public class FileProvider { + + @Inject + public FileProvider() { + + } + + 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); + } + + public Set findFilesRecursivelyInSubpath(String path, String subpath, String globPattern) { + return Try.of(() -> Files.walk(Paths.get(path)) + .filter(p -> p.toString().contains(subpath)) + .filter(p -> matchesGlobPattern(p.getFileName().toString(), globPattern)) + .map(Path::toFile) + .collect(Collectors.toSet())) + .getOrElseThrow(EsaException::new); + } + + public boolean matchesGlobPattern(String filename, String globPattern) { + return filename.matches(createRegexFromGlob(globPattern)); + } + + private String createRegexFromGlob(String glob) { + StringBuilder out = new StringBuilder("^"); + + glob + .chars() + .mapToObj(i -> (char) i) + .map(this::globCharacterToRegexString) + .forEach(out::append); + + out.append('$'); + + return out.toString(); + } + + private String globCharacterToRegexString(char character) { + switch (character) { + case '*': + return ".*"; + case '?': + return "."; + case '.': + return "\\."; + case '\\': + return "\\\\"; + default: + return String.valueOf(character); + } + } +}