/*
* Copyright 2008-2011 the original author or authors.
*
* Licensed 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
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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.jdal.util;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
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 java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Utility library to manage Zip files.
*
* @author Roberto Martin
* @author Jose Luis Martin
* @since 1.0
*/
public abstract class ZipFileUtils {
/** commons log */
private static Log log = LogFactory.getLog(ZipFileUtils.class);
/** bufferr to copy entries */
private static final int BUFFER = 1024;
/**
* Unzip file to dirname
*
* @param file file to unzip
* @param dirname dir name to store unzipped entries
*/
public static void unzip(ZipFile file, String dirname) {
File dir = new File(dirname);
dir.mkdirs();
List<ZipEntry> dirs = new ArrayList<ZipEntry>();
List<ZipEntry> files = new ArrayList<ZipEntry>();
Enumeration< ? extends ZipEntry> e = file.entries();
while (e.hasMoreElements()) {
ZipEntry entry = (ZipEntry) e.nextElement();
if (entry.isDirectory()) {
dirs.add(entry);
} else {
files.add(entry);
}
}
for (ZipEntry entry : dirs) {
File eDir = new File(dirname + "/" + entry.getName());
eDir.mkdirs();
}
for (ZipEntry entry : files) {
log.debug("Extracting: " + entry);
unzipEntry(file, entry, dirname);
}
}
/**
* Unzip a Entry
* @param file file to unzip
* @param entry entry to extract
* @param dir dir to store entry
*/
private static void unzipEntry(ZipFile file, ZipEntry entry, String dir) {
if (entry == null) {
return;
}
try {
InputStream is =
new BufferedInputStream(file.getInputStream(entry));
int count;
byte data[] = new byte[BUFFER];
FileOutputStream fos =
new FileOutputStream(dir + "/" + entry.getName());
OutputStream dest = new BufferedOutputStream(fos, BUFFER);
while ((count = is.read(data, 0, BUFFER)) != -1) {
dest.write(data, 0, count);
}
dest.flush();
dest.close();
is.close();
} catch (IOException e) {
log.error(e);
}
}
/**
* Create a zip file from zipFileName
*
* @param file to compress
* @param zipFilename to create
* @throws Exception if fail
*/
public static void zip(File file, String zipFilename) throws Exception {
// get a list of files from current directory
if (file.isDirectory()) {
zip(file.listFiles(), zipFilename);
} else {
zip(new File[] { file }, zipFilename);
}
}
/**
* Create a zip file with files
* @param files to compress
* @param zipFilename zip file to create
* @throws Exception if fail
*/
public static void zip(File[] files, String zipFilename) throws Exception {
OutputStream os =
new BufferedOutputStream(new FileOutputStream(zipFilename));
ZipOutputStream zos = new ZipOutputStream(os);
byte data[] = new byte[BUFFER];
for (int i = 0; i < files.length; i++) {
log.debug("Adding: " + files[i]);
InputStream is =
new BufferedInputStream(new FileInputStream(files[i]), BUFFER);
ZipEntry entry = new ZipEntry(files[i].getName());
zos.putNextEntry(entry);
int count;
while ((count = is.read(data, 0, BUFFER)) != -1) {
zos.write(data, 0, count);
}
is.close();
}
zos.close();
log.debug("Zipped file: " + zipFilename);
}
/**
* Add File to Zip File
* @param zipFile to add on
* @param addFile file to add
* @throws Exception if fail
*/
public static void addFile(File zipFile, File addFile) throws Exception {
OutputStream os = new
BufferedOutputStream(new FileOutputStream(zipFile));
ZipOutputStream zos = new ZipOutputStream(os);
log.debug("Adding: " + addFile.getName());
InputStream is =
new BufferedInputStream(new FileInputStream(addFile), BUFFER);
ZipEntry entry = new ZipEntry(addFile.getName());
zos.putNextEntry(entry);
copy(is, zos);
log.debug("Added " + addFile.getName() + " to " + zipFile.getName());
}
/**
* Copy Streams
* @param is InputStream to read
* @param os OuputStream to write
* @throws IOException if fail
*/
private static void copy(InputStream is, OutputStream os)
throws IOException {
int count;
byte data[] = new byte[BUFFER];
while ((count = is.read(data, 0, BUFFER)) != -1) {
os.write(data, 0, count);
}
is.close();
os.close();
}
/**
* Read a Zip Entry as byte[]
* @param file zip file
* @param ze zip entry
* @return byte with data
* @throws IOException if fail
*/
public static byte[] readEntryAsByteArray(ZipFile file, ZipEntry ze)
throws IOException {
InputStream is = file.getInputStream(ze);
ByteArrayOutputStream os = new ByteArrayOutputStream();
copy(is, os);
return os.toByteArray();
}
}