All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.flightstats.filesystem.LocalFileSystem Maven / Gradle / Ivy

package com.flightstats.filesystem;

import com.google.common.base.Charsets;
import com.google.common.base.Joiner;
import lombok.SneakyThrows;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Collections;
import java.util.List;
import java.util.stream.Stream;

import static java.util.stream.Collectors.toList;

public class LocalFileSystem implements FileSystem {
    private final static Logger logger = LoggerFactory.getLogger(LocalFileSystem.class);

    @Override
    @SneakyThrows
    public OutputStream outputStream(Path fileName) {
        fileName.toFile().getParentFile().mkdirs();
        return new FileOutputStream(fileName.toFile());
    }

    @Override
    @SneakyThrows
    public InputStream inputStream(Path fileName) {
        return new FileInputStream(fileName.toFile());
    }

    @Override
    @SneakyThrows
    public String readContents(Path fileName) {
        return Joiner.on('\n').join(Files.readAllLines(fileName, Charsets.UTF_8));
    }

    @Override
    public boolean exists(Path fileName) {
        return fileName.toFile().exists();
    }

    @Override
    @SneakyThrows
    public void saveContent(String content, Path fileName) {
        fileName.toFile().getParentFile().mkdirs();
        Files.write(fileName, content.getBytes(Charsets.UTF_8));
    }

    @Override
    public List listFiles(Path prefixPath) {
        //all this stuff is to make this method work like S3 does when you give it a prefix to search for.
        Path parent = prefixPath.getParent();
        String prefix = prefixPath.getFileName().toString();

        try {
            Stream directories = Files.find(parent, 1, (path, attributes) -> path.getFileName().toString().startsWith(prefix));
            Stream files = directories.flatMap(d -> {
                try {
                    return Files.find(d, 100, (path, basicFileAttributes) -> basicFileAttributes.isRegularFile());
                } catch (IOException e) {
                    logger.warn("Error listing directory: " + prefixPath, e);
                    return Stream.empty();
                }
            });
            return files.collect(toList());
        } catch (IOException e) {
            logger.warn("Error listing directory: " + prefixPath, e);
            return Collections.emptyList();
        }
    }

    @Override
    @SneakyThrows
    public void move(Path file, Path destinationDirectory) {
        Files.move(file, destinationDirectory.resolve(makeFileName(file)));
    }

    private String makeFileName(Path file) {
        return Joiner.on("/").join(file.iterator());
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy