package org.jboss.windup.decompiler.util;
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 org.apache.commons.io.IOUtils;
/**
* @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>
* @author <a href="mailto:ozizka@redhat.com">Ondrej Zizka</a>
*/
public class ZipUtil
{
/**
* Unzip the given archive into the specified directory.
*/
public static void unzip(File inputFile, File outputDir) throws IOException
{
unzipWithFilter(inputFile, outputDir, null);
}
/**
* Unzip the given archive into the specified directory, using given filter. Directories are created only if needed.
*/
public static void unzipWithFilter(File inputFile, File outputDir, Filter<ZipEntry> filter) throws IOException
{
try (ZipFile zipFile = new ZipFile(inputFile))
{
Enumeration<? extends ZipEntry> entryEnum = zipFile.entries();
while (entryEnum.hasMoreElements())
{
ZipEntry entry = entryEnum.nextElement();
String entryName = entry.getName();
File destFile = new File(outputDir, entryName);
if (entry.isDirectory())
continue;
if (filter != null)
{
final Filter.Result res = filter.decide(entry);
switch (res)
{
case STOP:
return;
case REJECT:
continue;
}
}
File parentDir = destFile.getParentFile();
if (!parentDir.isDirectory() && !parentDir.mkdirs())
throw new RuntimeException("Unable to create directory: " + parentDir.getAbsolutePath());
try (InputStream zipInputStream = zipFile.getInputStream(entry))
{
try (FileOutputStream outputStream = new FileOutputStream(destFile))
{
IOUtils.copy(zipInputStream, outputStream);
}
}
if (filter != null)
{
final Filter.Result res = filter.decide(entry);
switch (res)
{
case ACCEPT_STOP:
return;
}
}
}
}
}
}