com.epam.wilma.message.search.web.support.FileZipper.java Source code

Java tutorial

Introduction

Here is the source code for com.epam.wilma.message.search.web.support.FileZipper.java

Source

package com.epam.wilma.message.search.web.support;

/*==========================================================================
Copyright 2013-2016 EPAM Systems
    
This file is part of Wilma.
    
Wilma is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
    
Wilma is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
    
You should have received a copy of the GNU General Public License
along with Wilma.  If not, see <http://www.gnu.org/licenses/>.
===========================================================================*/

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipOutputStream;

import org.apache.commons.compress.utils.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * Class for compressing files into one file using ZIP.
 * @author Tamas_Bihari
 *
 */
@Component
public class FileZipper {
    private final Logger logger = LoggerFactory.getLogger(FileZipper.class);
    @Autowired
    private ZipOutputStreamFactory zipOutputStreamFactory;
    @Autowired
    private ZipEntryFactory entryFactory;

    /**
     * Compress files which is specicified in the filePaths parameter
     * and write the zipped result into the given {@link OutputStream}.
     * @param filePaths are the path of the files which will be compressed into the result
     * @param result is the compressed file which contains the files
     */
    public void createZipWithFiles(final List<List<String>> filePaths, final OutputStream result) {
        ZipOutputStream zipStream = zipOutputStreamFactory.createZipOutputStream(result);
        zipFiles(filePaths, zipStream);
        closeZipStream(zipStream);
    }

    private void zipFiles(final List<List<String>> filePaths, final ZipOutputStream zipStream) {
        for (List<String> actualPair : filePaths) {
            for (String filePath : actualPair) {
                try {
                    String fileName = getFileName(filePath);
                    InputStream file = new FileInputStream(filePath);
                    addFileToZipStream(zipStream, fileName, file);
                    file.close();
                } catch (IOException ex) {
                    logger.warn("Reading or zipping is failed with file: " + filePath, ex);
                }
            }
        }
    }

    private void addFileToZipStream(final ZipOutputStream zipStream, final String fileName, final InputStream file)
            throws IOException {
        putZipEntryToStream(zipStream, fileName);
        IOUtils.copy(file, zipStream);
        zipStream.closeEntry();
    }

    private void putZipEntryToStream(final ZipOutputStream zipStream, final String fileName) throws IOException {
        try {
            ZipEntry zipEntry = entryFactory.createZipEntry(fileName);
            zipStream.putNextEntry(zipEntry);
        } catch (ZipException e) {
            logger.warn("Exception occurred while creating zip stream from file: " + fileName, e);
            putZipEntryToStream(zipStream, "1_" + fileName);
        }

    }

    private String getFileName(final String filePath) {
        String result = "";
        if (filePath.contains("/")) {
            result = filePath.substring(filePath.lastIndexOf("/") + 1);
        } else if (filePath.contains("\\")) {
            result = filePath.substring(filePath.lastIndexOf("\\") + 1);
        }
        return result;
    }

    private void closeZipStream(final ZipOutputStream zipStream) {
        try {
            zipStream.close();
        } catch (IOException e) {
            logger.warn("Zipping search result failed", e);
        }
    }
}