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

org.geneweaver.io.reader.Expander Maven / Gradle / Ivy

/*-
 * 
 * Copyright 2018, 2020  The Jackson Laboratory Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * 
 * @author Matthew Gerring
 */
package org.geneweaver.io.reader;

import java.io.Closeable;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;

// TODO: Auto-generated Javadoc
/**
 * 
 * Expands files in a zip, usually to a temporary folder.
 * 
 * @author Matthew Gerring
 *
 */
public class Expander implements Closeable {

	/** The dir. */
	private final Path dir;
	
	/** The delete on exit. */
	private final boolean deleteOnExit;
	
	/**
	 * Same as calling new Expander(Files.createTempDirectory("Expand"), true)
	 * 
	 * @throws IOException - If the temporary directory cannot be created.
	 */
	public Expander() throws IOException {
		this (Files.createTempDirectory("Expand"), true);
	}
	
	/**
	 * Same as calling new Expander(dir, true);.
	 *
	 * @param dir - the directory to expand into. If it does not exist, it will be created.
	 */
	public Expander(Path dir) {
		this (dir, true);
	}
	
	/**
	 * Instantiates a new expander.
	 *
	 * @param dir - The directory to expand into. If it does not exist, it will be created.
	 * @param deleteOnExit - True to mark files created as requiring the delete on exit flag to be set.
	 */
	public Expander(Path dir, boolean deleteOnExit) {
		this.dir = dir;
		this.deleteOnExit = deleteOnExit;
	}

	/**
	 * Call to expand a zip file to a directory. Optionally
	 * the files created may be set as delete on exit.
	 * 
	 * @param zip - The zip file to expand.
	 * @return list of files expanded
	 * @throws ZipException When zip is illegal
	 * @throws IOException If the file-writing does astray
	 */
	public List expand(Path zip) throws ZipException, IOException {

		List pathsExpanded = new ArrayList<>();
		File outputDir = dir.toFile();
		outputDir.mkdirs();
		
		try (ZipFile zipFile = new ZipFile(zip.toFile())) {

			Enumeration entries = zipFile.entries();
			while (entries.hasMoreElements()) {
				ZipEntry entry = entries.nextElement();
				
				File des = new File(outputDir,  entry.getName());
				if (deleteOnExit) des.deleteOnExit();
				pathsExpanded.add(des.toPath());
				
				if (entry.isDirectory()) {
					des.mkdirs();
				} else {
					des.getParentFile().mkdirs();
					des.createNewFile();
					try (InputStream in = zipFile.getInputStream(entry);
						 OutputStream out = new FileOutputStream(des)) {
						IOUtils.copy(in, out);
					}
				}
			}
		}
		
		return pathsExpanded;
	}

	/**
	 * Call to delete the expand directory.
	 *
	 * @throws RuntimeException - If it cannot be deleted.
	 * This method is not allowed to throw a checked exception
	 * so that is wrapped in one we can throw.
	 */
	@Override
	public void close()  {
		try {
			FileUtils.deleteDirectory(dir.toFile());
		} catch (IOException e) {
			if (Files.exists(dir) && dir.toFile().list().length<1) {
				return;
			}
			throw new RuntimeException(e);
		}
	}

	/**
	 * Gets the dir.
	 *
	 * @return the dir
	 */
	public Path getDir() {
		return dir;
	}

	/**
	 * Checks if is delete on exit.
	 *
	 * @return true, if is delete on exit
	 */
	public boolean isDeleteOnExit() {
		return deleteOnExit;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy