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

com.crabshue.commons.archive.filesystem.FileSystemArchiveService Maven / Gradle / Ivy

package com.crabshue.commons.archive.filesystem;

import java.io.File;
import java.io.InputStream;
import java.util.Collection;
import java.util.stream.Collectors;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOCase;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.lang3.Validate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.crabshue.commons.archive.Archivable;
import com.crabshue.commons.archive.ArchiveService;
import com.crabshue.commons.archive.exceptions.ArchiveErrorContext;
import com.crabshue.commons.archive.exceptions.ArchiveErrorType;
import com.crabshue.commons.exceptions.ApplicationException;
import com.crabshue.commons.file.FileIOUtils;
import com.crabshue.commons.file.FileSystemUtils;

public abstract class FileSystemArchiveService implements ArchiveService {

    Logger logger = LoggerFactory.getLogger(FileSystemArchiveService.class);

    @Override
    public abstract String getArchiveRootPath();

    @Override
    public String getArchiveFolderPath(final T archivable) {
        Validate.notNull(archivable);

        if (archivable.getArchiveId() == null) {
            throw new IllegalArgumentException("Cannot provide archive folder for an archivable without id " + archivable);
        }

        final String folderName = archivable.getArchiveId();

        final File ret = new File(getArchiveRootPath(), folderName);
        return ret.getAbsolutePath();
    }

    @Override
    public Collection listFilesInArchive(final T archivable) {
        Validate.notNull(archivable);
        final File archiveFolder = this.provideArchiveFolder(archivable);

        final Collection ret = FileUtils.listFiles(archiveFolder,
            FileFilterUtils.trueFileFilter(), FileFilterUtils.trueFileFilter());

        return ret.stream()
            .map(File::getAbsolutePath)
            .collect(Collectors.toList());
    }


    @Override
    public File retrieveUniqueFileInArchive(final T archivable, final String filename) {
        Validate.notNull(archivable);
        Validate.notNull(filename);

        final File archiveFolder = this.provideArchiveFolder(archivable);
        final Collection candidates = FileUtils.listFiles(archiveFolder,
            FileFilterUtils.nameFileFilter(filename, IOCase.SENSITIVE), FileFilterUtils.trueFileFilter());

        if (candidates.isEmpty()) {
            throw new ApplicationException(ArchiveErrorType.ARCHIVE_FILE_NOT_FOUND, "Unexpected number of files in archive. Excepted one and only one.")
                .addContextValue(ArchiveErrorContext.FILENAME, filename);
        }

        final File ret = candidates.iterator().next();
        logger.info("Found file [{}] for archivable [{}] and filename [{}]", ret, archivable, filename);
        return ret;
    }

    @Override
    public void deleteArchiveFolder(final T archivable) {
        Validate.notNull(archivable);

        final File archiveFolder = new File(this.getArchiveFolderPath(archivable));

        if (!archiveFolder.exists()) {
            return;
        }
        FileUtils.deleteQuietly(archiveFolder);
    }

    @Override
    public void cleanArchiveFolder(final T archivable) {
        Validate.notNull(archivable);
        final File archiveFolder = this.provideArchiveFolder(archivable);

        FileSystemUtils.cleanDirectory(archiveFolder);

        logger.info("Cleaned archive folder [{}] for archivable [{}]", archiveFolder, archivable);

    }

    @Override
    public void cleanArchiveRoot() {
        final File archiveRoot = new File(this.getArchiveRootPath());

        FileSystemUtils.cleanDirectory(archiveRoot);

        logger.info("Cleaned archive root folder [{}]", archiveRoot);
    }

    @Override
    public void storeInArchive(final T archivable, final File file) {
        Validate.notNull(archivable);
        Validate.notNull(file);

        final File folder = this.provideArchiveFolder(archivable);
        final File ret = new File(folder, file.getName());

        FileSystemUtils.copyFile(file, ret);

        logger.info("Stored file [{}] for [{}]", ret, archivable);
    }

    @Override
    public void storeInArchive(final T archivable, final String filename, final InputStream inputStream) {
        Validate.notNull(archivable);
        Validate.notNull(filename);
        Validate.notNull(inputStream);

        final File archiveFile = new File(this.getArchiveFolderPath(archivable), filename);
        FileIOUtils.writeFile(inputStream, archiveFile);

        logger.info("Stored input stream into [{}] for [{}]", archiveFile, archivable);

    }

    @Override
    public void storeFolderContentInArchive(final T archivable, final File folder) {
        Validate.notNull(archivable);
        Validate.notNull(folder);

        FileSystemUtils.copyFolder(folder, this.provideArchiveFolder(archivable));
    }

    protected File provideArchiveFolder(final T archivable) {
        Validate.notNull(archivable);

        if (archivable.getArchiveId() == null) {
            throw new IllegalArgumentException("Cannot provide archive folder for an archivable without id " + archivable);
        }

        final File ret = new File(this.getArchiveFolderPath(archivable));

        if (!ret.exists()) {
            FileSystemUtils.provideFolder(ret);
        }

        return ret;

    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy