Czesc. Napisałem prostą klaskę konfiguracyjną, która ma wczytywać adres url z pliku na classpathie i zwracac go w postaci stringa. Plik nie zawiera nic innego poza urlem.
Próbuje się wdrożyć w clean code, 'nowości' z javy 8 i biblioteke vavr. Mógłby ktoś podpowiedzieć czy tak się powinno korzystać z tych dobrodziejstw, a jeśli nie to co poprawić ? mi się wydaje, że popłynąłem z tymi Optionalami ale boje się, że nie tylko to :p
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class UrlProvider {
private static Logger logger = LoggerFactory.getLogger(UrlProvider.class);
public static UrlProvider getInstance(){
return new UrlProvider();
}
public String readUrl(String source){
return fileLocation(source)
.flatMap(this::readFile)
.orElseThrow(()-> new IncorrectResourceException(String.format("Unable to read url from file %s", source)));
}
private Optional<Path> fileLocation(String source) {
URL url = extractUrlByFileName(source);
return Try.of(()-> readPathFromUrl(url))
.map(Optional::ofNullable)
.onFailure(e-> logger.error("Unable to read path from {}", url, e))
.getOrElse(Optional.empty());
}
private URL extractUrlByFileName(String file) {
return Optional.ofNullable(getClass().getClassLoader().getResource(file))
.orElseThrow(()-> new UrlExtractionException(String.format("Could not build the resource url of %s", file)));
}
private Path readPathFromUrl(URL resource) throws URISyntaxException {
return Paths.get(resource.toURI());
}
private Optional<String> readFile(Path path) {
return Try.of(() -> streamFrom(path))
.map(chars -> chars.collect(Collectors.joining("\n")))
.filter(result -> !result.isBlank())
.map(Optional::ofNullable)
.onFailure(e-> logger.error("Unable to read the content of the file or the content is empty", e))
.getOrElse(Optional.empty());
}
private Stream<String> streamFrom(Path path) throws IOException {
return Files.lines(path);
}
}