package au.org.aurin.wif.io;
import static org.apache.commons.io.FileUtils.forceMkdir;
import static org.apache.commons.io.FileUtils.openOutputStream;
import static org.apache.commons.io.IOUtils.closeQuietly;
import static org.apache.commons.io.IOUtils.copy;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ZipUtils {
public static final Logger LOGGER = LoggerFactory.getLogger(ZipUtils.class);
/**
* Takes in the outputDir(extracted files are placed here), zipArchive and
* file encoding;
*
* @param outputDir
* @param zipArchive
* @param encoding
* @return the output directory
* @throws IOException
*/
public static File extract(final String outputDir, final File zipArchive,
final String encoding) throws IOException {
org.apache.commons.compress.archivers.zip.ZipFile file = null;
InputStream in = null;
OutputStream out = null;
File outDir = new File(outputDir);
try {
file = new org.apache.commons.compress.archivers.zip.ZipFile(zipArchive,
encoding);
final Enumeration<ZipArchiveEntry> entries = file.getEntries();
while (entries.hasMoreElements()) {
final ZipArchiveEntry entry = entries.nextElement();
final String entryName = entry.getName();
if (entry.isDirectory()) {
outDir = new File(outputDir + File.separator + entryName);
forceMkdir(outDir);
LOGGER.info("created output directory: " + outDir.getAbsolutePath());
continue;
}
final File outFile = new File(outDir + File.separator + entryName);
out = openOutputStream(outFile);
in = file.getInputStream(entry);
copy(in, out);
LOGGER.info("extracted: " + outFile.getAbsolutePath());
closeQuietly(in);
closeQuietly(out);
}
} finally {
closeQuietly(in);
closeQuietly(out);
org.apache.commons.compress.archivers.zip.ZipFile.closeQuietly(file);
}
// ali
final String str = zipArchive.getAbsolutePath();
zipArchive.delete();
LOGGER.info("zip file deleted: " + str);
// end ali
LOGGER.info("returning output directory: " + outDir.getAbsolutePath());
return outDir;
}
/*
* public static void extractTar(String outputDir, File tarFile, String
* encoding) throws IOException {
* org.apache.commons.compress.archivers.zip.ZipFile file = null; InputStream
* in = null; OutputStream out = null; try { file = new
* org.apache.commons.compress.archivers.zip.ZipFile(tarFile, encoding);
* TarArchiveInputStream tin = new TarArchiveInputStream(new
* FileInputStream(tarFile)); tin.get Enumeration<ZipArchiveEntry> entries =
* file.getEntries(); while (entries.hasMoreElements()) { ZipArchiveEntry
* entry = entries.nextElement(); String entryName = entry.getName(); if
* (entry.isDirectory()) { forceMkdir(new File(outputDir + File.separator +
* entryName)); continue; } File outFile = new File(outputDir +
* File.separator+ entryName); out = openOutputStream(outFile); in =
* file.getInputStream(entry); copy(in, out);
* LOGGER.info("extracted: "+outFile.getAbsolutePath()); closeQuietly(in);
* closeQuietly(out); } } finally { closeQuietly(in); closeQuietly(out);
* org.apache.commons.compress.archivers.zip.ZipFile.closeQuietly(file); } }
*/
/**
* Takes in the contents directory and the zipfile and writes the contents of
* the directory to the zipfile.
*
* @param contentsDirPath
* @param zipFile
* - The final output
* @throws IOException
*/
public static void compress(final String contentsDirPath, final File zipFile)
throws IOException {
final List<File> files = new ArrayList<File>();
final File contentsDir = new File(contentsDirPath);
listFileAndDirectories(contentsDir, files);
InputStream in = null;
ZipArchiveOutputStream out = null;
try {
out = new ZipArchiveOutputStream(zipFile);
final String contentsDirAbsolutePath = contentsDir.getAbsolutePath();
for (final File file : files) {
final String entryName = file.getAbsolutePath().substring(
contentsDirAbsolutePath.length() + 1)
+ (file.isDirectory() ? File.separator : "");
final ZipArchiveEntry entry = new ZipArchiveEntry(entryName);
out.putArchiveEntry(entry);
if (file.isDirectory()) {
continue;
}
in = new FileInputStream(file);
copy(in, out);
out.closeArchiveEntry();
closeQuietly(in);
}
} finally {
closeQuietly(in);
closeQuietly(out);
}
}
static void listFileAndDirectories(final File directory, final List<File> list) {
final File[] files = directory.listFiles();
for (final File file : files) {
list.add(file);
if (file.isDirectory()) {
listFileAndDirectories(file, list);
}
}
}
}