org.ow2.proactive_grid_cloud_portal.dataspace.util.VFSZipper.java Source code

Java tutorial

Introduction

Here is the source code for org.ow2.proactive_grid_cloud_portal.dataspace.util.VFSZipper.java

Source

/*
 * ProActive Parallel Suite(TM):
 * The Open Source library for parallel and distributed
 * Workflows & Scheduling, Orchestration, Cloud Automation
 * and Big Data Analysis on Enterprise Grids & Clouds.
 *
 * Copyright (c) 2007 - 2017 ActiveEon
 * Contact: contact@activeeon.com
 *
 * This library is free software: you can redistribute it and/or
 * modify it under the terms of the GNU Affero General Public License
 * as published by the Free Software Foundation: version 3 of
 * the License.
 *
 * This program 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 Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 *
 * If needed, contact us to obtain a release under GPL Version 2 or 3
 * or a different license than the AGPL.
 */
package org.ow2.proactive_grid_cloud_portal.dataspace.util;

import static com.google.common.base.Preconditions.checkNotNull;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
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.ZipInputStream;
import java.util.zip.ZipOutputStream;

import org.apache.commons.vfs2.FileObject;
import org.apache.commons.vfs2.FileSystemException;
import org.apache.commons.vfs2.FileType;
import org.ow2.proactive_grid_cloud_portal.dataspace.FileSystem;
import org.ow2.proactive_grid_cloud_portal.scheduler.client.utils.Zipper;

import com.google.common.base.Preconditions;
import com.google.common.io.ByteStreams;
import com.google.common.io.Closer;

public class VFSZipper {

    private VFSZipper() {
    }

    public static class GZIP {

        public static void zip(FileObject fo, OutputStream os) throws FileSystemException, IOException {
            Zipper.GZIP.zip(fo.getContent().getInputStream(), os);
        }

        public static void unzip(InputStream is, FileObject outputFile) throws FileSystemException, IOException {
            Zipper.GZIP.unzip(is, outputFile.getContent().getOutputStream());
        }
    }

    public static class ZIP {

        public static void zip(FileObject root, List<FileObject> children, OutputStream os) throws IOException {
            checkNotNull(root);
            checkNotNull(children);
            checkNotNull(os);
            String basePath = root.getName().getPath();
            Closer closer = Closer.create();
            try {
                ZipOutputStream zos = new ZipOutputStream(os);
                closer.register(zos);
                if (children.size() == 1) {
                    FileObject ffo = children.get(0);
                    Zipper.ZIP.writeZipEntry(new ZipEntry(ffo.getName().getBaseName()),
                            ffo.getContent().getInputStream(), zos);
                } else {
                    for (FileObject ffo : children) {
                        Zipper.ZIP.writeZipEntry(zipEntry(basePath, ffo), ffo.getContent().getInputStream(), zos);
                    }
                }
            } catch (IOException ioe) {
                throw closer.rethrow(ioe);
            } finally {
                closer.close();
            }
        }

        private static ZipEntry zipEntry(String basePath, FileObject file) {
            String name = file.getName().getPath().substring(basePath.length() + 1);
            return new ZipEntry(name);
        }

        public static void unzip(InputStream is, FileObject outfileObj) throws FileSystemException, IOException {
            Closer closer = Closer.create();
            try {
                ZipInputStream zis = new ZipInputStream(is);
                closer.register(zis);
                ZipEntry zipEntry = zis.getNextEntry();
                while (zipEntry != null) {
                    FileObject entryFile = outfileObj.resolveFile(zipEntry.getName());

                    if (zipEntry.isDirectory()) {
                        entryFile.createFolder();
                    } else {
                        if (!entryFile.exists()) {
                            entryFile.createFile();
                        }
                        Zipper.ZIP.unzipEntry(zis, entryFile.getContent().getOutputStream());
                    }

                    zipEntry = zis.getNextEntry();
                }
            } catch (IOException ioe) {
                ioe.printStackTrace();
                throw closer.rethrow(ioe);
            } finally {
                closer.close();
            }
        }
    }

    public static void zip(FileObject file, OutputStream out) throws IOException {
        Closer closer = Closer.create();
        try {
            closer.register(out);
            InputStream in = file.getContent().getInputStream();
            closer.register(in);
            ByteStreams.copy(in, out);
        } catch (IOException ioe) {
            throw closer.rethrow(ioe);
        } finally {
            closer.close();
        }
    }

    public static void zip(FileObject root, List<FileObject> files, OutputStream out) throws IOException {
        String basePath = root.getName().getPath();
        Closer closer = Closer.create();
        try {
            ZipOutputStream zos = new ZipOutputStream(out);
            closer.register(zos);
            for (FileObject fileToCopy : files) {
                ZipEntry zipEntry = zipEntry(basePath, fileToCopy);
                zos.putNextEntry(zipEntry);
                copyFileContents(fileToCopy, zos);
                zos.flush();
                zos.closeEntry();
            }
        } catch (IOException e) {
            throw closer.rethrow(e);
        } finally {
            closer.close();
        }
    }

    public static void unzip(InputStream is, FileObject file) throws IOException {
        Closer closer = Closer.create();
        closer.register(is);
        try {
            OutputStream os = file.getContent().getOutputStream();
            ZipOutputStream zos = new ZipOutputStream(os);
            closer.register(zos);
            ByteStreams.copy(is, zos);
        } catch (IOException ioe) {
            throw closer.rethrow(ioe);
        } finally {
            closer.close();
        }
    }

    public static boolean isZipFile(FileObject fo) throws FileSystemException {
        return Zipper.isZipFile(fo.getContent().getInputStream());
    }

    private static ZipEntry zipEntry(String basePath, FileObject fo) {
        String entryPath = fo.getName().getPath().substring(basePath.length() + 1);
        return new ZipEntry(entryPath);
    }

    private static void copyFileContents(FileObject fo, ZipOutputStream zos) throws IOException {
        Closer closer = Closer.create();
        try {
            InputStream inputStream = fo.getContent().getInputStream();
            closer.register(inputStream);
            ByteStreams.copy(inputStream, zos);
        } catch (IOException ioe) {
            throw closer.rethrow(ioe);
        } finally {
            closer.close();
        }
    }

}