org.geoserver.csw.response.ZipOutputFormat.java Source code

Java tutorial

Introduction

Here is the source code for org.geoserver.csw.response.ZipOutputFormat.java

Source

/* (c) 2015 Open Source Geospatial Foundation - all rights reserved
 * This code is licensed under the GPL 2.0 license, available at the root
 * application directory.
 */
package org.geoserver.csw.response;

import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Collections;
import java.util.List;
import java.util.logging.Logger;
import java.util.zip.ZipOutputStream;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.geoserver.data.util.IOUtils;
import org.geoserver.ows.Response;
import org.geoserver.platform.Operation;
import org.geoserver.platform.ServiceException;
import org.geotools.util.logging.Logging;

/**
*
* This class returns a zip encoded results of the users's query.
* 
* Currently supported type of values are instances of {@link File} or 
* {@link List} of {@link File}. 
*/
public class ZipOutputFormat extends Response {

    private static final Logger LOGGER = Logging.getLogger(ZipOutputFormat.class);

    public ZipOutputFormat() {
        super(List.class);
    }

    @Override
    public String getMimeType(Object value, Operation operation) throws ServiceException {
        return "application/zip";
    }

    @Override
    public void write(Object value, OutputStream output, Operation operation) throws IOException, ServiceException {

        File tempDir = IOUtils.createTempDirectory("ziptemp");
        if (value == null) {
            throw new ServiceException("No value to be written has been provided");
        }
        try {
            List<File> files = null;
            if (value instanceof List) {
                files = (List<File>) value;
            } else if (value instanceof File) {
                files = Collections.singletonList((File) value);
            } else {
                throw new IllegalArgumentException(value.getClass() + " type isn't supported yet");
            }

            // Copying files to the temp folder
            for (File file : files) {
                FileUtils.copyFile(file, new File(tempDir, file.getName()));
            }
            ZipOutputStream zipOut = new ZipOutputStream(output);
            IOUtils.zipDirectory(tempDir, zipOut, null);
            zipOut.finish();
        } finally {
            // make sure we remove the temp directory and its contents completely now
            try {
                FileUtils.deleteDirectory(tempDir);
            } catch (IOException e) {
                LOGGER.warning("Could not delete temp directory: " + tempDir.getAbsolutePath() + " due to: "
                        + e.getMessage());
            }
        }
    }

    @Override
    public String getAttachmentFileName(Object value, Operation operation) {
        File file = ((List<File>) value).get(0);
        // Use the first file as reference. That should be the main file name
        String filename = FilenameUtils.getBaseName(file.getAbsolutePath());
        return filename + (filename.endsWith(".zip") ? "" : ".zip");
    }

}