blob: d9bfdfb64a192dc1b30cf977b9665680266e2ece [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009 by SAP AG, Walldorf.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* SAP AG - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.ws.jaxws.testutils.files;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
/**
* A simple utility for unzipping ZIP archives
*
* @author Danail Branekov
*/
public class Unzipper {
public static final Unzipper INSTANCE = new Unzipper();
// Hide default constructor
private Unzipper() {
}
/**
* Copy the content from the <code>sourceStream</code> to the
* <code>destinationStream</code>
*
* @param sourceStream
* @param destStream
* @throws IOException
*/
public void copyInputStream(final InputStream sourceStream,
final OutputStream destStream) throws IOException {
byte[] buffer = new byte[1024];
int len;
while ((len = sourceStream.read(buffer)) >= 0) {
destStream.write(buffer, 0, len);
}
destStream.flush();
}
/**
* Unzip the zip file specified to the destination directory
*
* @param sourceFile
* the source zip file
* @param destinationDir
* the destination directory
* @param toLowerCase
* if true, all the unzipped entries would be lowercased (for *IX
* compatibility) The background behind this parameter is the
* case inconsistency between ABAP xml test data directory names
* and the real directory names in the ABAP ZIP
* @throws IOException
* @throws NullPointerException
* when any of the input parameters is null
* @throws IllegalArgumentException
* when <code>sourceFile</code> does not exist or points to a
* directory
* @throws IllegalArgumentException
* when <code>destinationDir</code> does not exist or is not a
* directory
*/
public void unzip(final File sourceFile, final File destinationDir,
final boolean toLowerCase) throws IOException {
checkInputParams(sourceFile, destinationDir);
ZipFile zipFile = null;
try {
zipFile = new ZipFile(sourceFile);
Enumeration<? extends ZipEntry> entries = zipFile.entries();
// Create dir structure
while (entries.hasMoreElements()) {
final ZipEntry entry = entries.nextElement();
if (entry.isDirectory()) {
// This is not robust, just for demonstration purposes.
(new File(destinationDir, toLowerCase ? entry.getName()
.toLowerCase() : entry.getName())).mkdirs();
}
}
// Create files
entries = zipFile.entries();
while (entries.hasMoreElements()) {
final ZipEntry entry = entries.nextElement();
if (entry.isDirectory()) {
continue;
}
FileOutputStream fos = null;
BufferedOutputStream bufOutStream = null;
try {
fos = new FileOutputStream(new File(destinationDir,
toLowerCase ? entry.getName().toLowerCase() : entry
.getName()));
bufOutStream = new BufferedOutputStream(fos);
copyInputStream(zipFile.getInputStream(entry), bufOutStream);
fos.flush();
bufOutStream.flush();
} finally {
if (fos != null) {
fos.close();
}
if (bufOutStream != null) {
bufOutStream.close();
}
}
}
} finally {
if (zipFile != null) {
zipFile.close();
}
}
}
private void checkInputParams(final File zipFile, final File destination) {
// ContractChecker.nullCheckParam(zipFile, "zipFile");
// ContractChecker.nullCheckParam(destination, "destination");
if (!zipFile.exists() || zipFile.isDirectory()) {
throw new IllegalArgumentException(
"ZIP file does not exist or is a directory");
}
if (!destination.exists() || !destination.isDirectory()) {
throw new IllegalArgumentException(
"Destination does not exist or is not a directory");
}
}
}