/**
* Licensed to Apereo under one or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information regarding copyright ownership. Apereo
* licenses this file to you 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 the
* following location:
*
* <p>http://www.apache.org/licenses/LICENSE-2.0
*
* <p>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.
*/
package org.apereo.portal.utils;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Extract a Zip File or Zip InputStream to a directory
*
* <p>Code based on: http://piotrga.wordpress.com/2008/05/07/how-to-unzip-archive-in-java/
*
*/
public final class ZipUtils {
protected static final Logger log = LoggerFactory.getLogger(ZipUtils.class);
private ZipUtils() {}
public static void extract(File archive, File outputDir) throws IOException {
final ZipFile zipfile = new ZipFile(archive);
for (final Enumeration<? extends ZipEntry> e = zipfile.entries(); e.hasMoreElements(); ) {
final ZipEntry entry = e.nextElement();
final File outputFile = checkDirectories(entry, outputDir);
if (outputFile != null) {
final InputStream is = zipfile.getInputStream(entry);
try {
writeFile(is, outputFile);
} finally {
is.close();
}
}
}
}
public static void extract(InputStream archive, File outputDir) throws IOException {
final ZipInputStream zipInputStream = new ZipInputStream(archive);
while (true) {
final ZipEntry entry = zipInputStream.getNextEntry();
if (entry == null) {
break;
}
final File outputFile = checkDirectories(entry, outputDir);
if (outputFile != null) {
writeFile(zipInputStream, outputFile);
}
}
}
/**
* Creates any required parent directories, returns the File to extract the entry to, returns
* null if there is no file to extract (such as a directory entry)
*/
protected static File checkDirectories(ZipEntry entry, File outputDir) {
final String name = entry.getName();
if (entry.isDirectory()) {
createDir(new File(outputDir, name));
return null;
}
final File outputFile = new File(outputDir, name);
if (!outputFile.getParentFile().exists()) {
createDir(outputFile.getParentFile());
}
log.debug("Extracting " + name);
return outputFile;
}
/** Writes the input stream to the File using buffered streams */
protected static void writeFile(final InputStream is, final File outputFile)
throws IOException {
final BufferedInputStream inputStream = new BufferedInputStream(is);
final BufferedOutputStream outputStream =
new BufferedOutputStream(new FileOutputStream(outputFile));
try {
IOUtils.copy(inputStream, outputStream);
} finally {
outputStream.close();
}
}
private static void createDir(File dir) {
log.debug("Creating dir " + dir.getName());
if (!dir.mkdirs()) {
throw new RuntimeException("Can not create dir " + dir);
}
}
}