package com.amazonaws.eclipse.opsworks.deploy.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
import org.apache.commons.io.IOUtils;
public class ZipUtils {
public static void createZipFileOfDirectory(File srcDir, File zipOutput) throws IOException {
if ( !srcDir.exists() || !srcDir.isDirectory() ) {
throw new IllegalArgumentException(
srcDir.getAbsolutePath() + " is not a directory!");
}
if ( zipOutput.exists() && !zipOutput.isFile() ) {
throw new IllegalArgumentException(
zipOutput.getAbsolutePath() + " exists but is not a file!");
}
ZipOutputStream zipOutputStream = null;
String baseName = srcDir.getAbsolutePath() + File.pathSeparator;
try {
zipOutputStream = new ZipOutputStream(new FileOutputStream(zipOutput));
addDirToZip(srcDir, zipOutputStream, baseName);
} finally {
IOUtils.closeQuietly(zipOutputStream);
}
}
public static void unzipFileToDirectory(File zipFile, File targetDirectory) throws IOException {
if ( !zipFile.exists() || !zipFile.isFile() ) {
throw new IllegalArgumentException(
zipFile.getAbsolutePath() + " is not a file!");
}
if ( !targetDirectory.exists() || !targetDirectory.isDirectory() ) {
throw new IllegalArgumentException(
targetDirectory.getAbsolutePath() + " is not a directory!");
}
if ( targetDirectory.listFiles().length != 0 ) {
throw new IllegalArgumentException(
targetDirectory.getAbsolutePath() + " is not empty!");
}
ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile));
ZipEntry zipEntry = zis.getNextEntry();
while (zipEntry != null) {
String entryFileName = zipEntry.getName();
File newFile = new File(targetDirectory, entryFileName);
if (zipEntry.isDirectory()) {
if ( !newFile.exists() ) {
newFile.mkdirs();
} else if ( !newFile.isDirectory() ) {
throw new RuntimeException(newFile.getAbsolutePath()
+ " already exists and is not a directory!");
}
} else {
// File entry might be visited before its parent folder
new File(newFile.getParent()).mkdirs();
FileOutputStream fos = new FileOutputStream(newFile);
try {
IOUtils.copy(zis, fos);
} finally {
IOUtils.closeQuietly(fos);
}
}
zipEntry = zis.getNextEntry();
}
zis.closeEntry();
IOUtils.closeQuietly(zis);
}
private static void addDirToZip(File dir, ZipOutputStream zip, String baseName) throws IOException {
File[] files = dir.listFiles();
for (File file : files) {
if (file.isDirectory()) {
addDirToZip(file, zip, baseName);
} else {
String entryName = file.getAbsolutePath().substring(
baseName.length());
ZipEntry zipEntry = new ZipEntry(entryName);
zip.putNextEntry(zipEntry);
FileInputStream fileInput = new FileInputStream(file);
try {
IOUtils.copy(fileInput, zip);
zip.closeEntry();
} finally {
IOUtils.closeQuietly(fileInput);
}
}
}
}
}