/*
* Copyright (C) 2009 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.commons.utils.io;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
/**
* Created by The eXo Platform SAS Author : Thuannd nhudinhthuan@yahoo.com Feb
* 6, 2006
*/
public class ZipUtil
{
private final int BUFFER = 2048;
private byte data[] = new byte[BUFFER];
public void addToArchive(File input, File output, boolean containParent) throws Exception
{
ByteArrayOutputStream byteOutput = addToArchive(input, containParent);
output = createFile(output, false);
byteOutput.writeTo(new FileOutputStream(output));
byteOutput.close();
}
public ByteArrayOutputStream addToArchive(File input, boolean containParent) throws Exception
{
ByteArrayOutputStream byteOutput = new ByteArrayOutputStream();
addToArchive(input, byteOutput, containParent).close();
return byteOutput;
}
public ZipOutputStream addToArchive(File input, OutputStream output, boolean containParent) throws Exception
{
String path = input.getAbsolutePath();
ZipOutputStream zipOutput = new ZipOutputStream(output);
BufferedInputStream bufInput = null;
List<File> list = listFile(input);
if (input.isDirectory())
list.remove(input);
if (list == null || list.size() < 1)
return zipOutput;
for (File f : list)
{
StringBuilder filePath = new StringBuilder(f.getAbsolutePath());
if (f.getAbsolutePath().startsWith(path))
{
if (containParent && input.isDirectory())
{
filePath = new StringBuilder(input.getName());
filePath.append(File.separator);
filePath.append(f.getAbsolutePath().substring(path.length() + 1));
}
else if (input.isDirectory())
{
filePath = new StringBuilder(f.getAbsolutePath().substring(path.length() + 1));
}
else
{
filePath = new StringBuilder(input.getName());
}
}
if (f.isFile())
{
FileInputStream fileInput = new FileInputStream(f);
bufInput = new BufferedInputStream(fileInput, BUFFER);
}
else
{
filePath.append("/");
}
addToArchive(zipOutput, bufInput, filePath.toString());
if (bufInput != null)
{
bufInput.close();
}
}
return zipOutput;
}
public ByteArrayOutputStream addToArchive(InputStream input, String entryName) throws Exception
{
ByteArrayOutputStream output = new ByteArrayOutputStream();
ZipOutputStream zipOutput = new ZipOutputStream(output);
addToArchive(zipOutput, input, entryName);
zipOutput.close();
return output;
}
public ZipOutputStream addToArchive(ZipOutputStream zipOutput, InputStream input, String entryName) throws Exception
{
ZipEntry entry = new ZipEntry(entryName);
zipOutput.putNextEntry(entry);
if (input != null)
{
int count;
while ((count = input.read(data, 0, BUFFER)) != -1)
zipOutput.write(data, 0, count);
}
zipOutput.closeEntry();
return zipOutput;
}
public ZipOutputStream addToArchive(ZipOutputStream zipOutput, byte[] d, String entryName) throws Exception
{
ZipEntry entry = new ZipEntry(entryName);
zipOutput.putNextEntry(entry);
if (d != null && d.length > 0)
zipOutput.write(d);
zipOutput.closeEntry();
return zipOutput;
}
public void extractFromArchive(File input, String output) throws Exception
{
BufferedOutputStream dest = null;
FileInputStream fileInput = new FileInputStream(input);
ZipInputStream zipInput = new ZipInputStream(new BufferedInputStream(fileInput));
ZipEntry entry;
int count;
FileOutputStream fileOuput = null;
while ((entry = zipInput.getNextEntry()) != null)
{
if (entry.isDirectory())
createFile(new File(output + entry.getName()), true);
else
{
if (output != null)
fileOuput = new FileOutputStream(createFile(new File(output + entry.getName()), false));
else
fileOuput = new FileOutputStream(createFile(new File(entry.getName()), false));
dest = new BufferedOutputStream(fileOuput, BUFFER);
while ((count = zipInput.read(data, 0, BUFFER)) != -1)
dest.write(data, 0, count);
dest.close();
}
}
zipInput.close();
}
private File createFile(File file, boolean folder) throws Exception
{
if (file.getParentFile() != null)
createFile(file.getParentFile(), true);
if (file.exists())
return file;
if (file.isDirectory() || folder)
file.mkdir();
else
file.createNewFile();
return file;
}
private List<File> listFile(File dir)
{
final List<File> list = new ArrayList<File>();
if (dir.isFile())
{
list.add(dir);
return list;
}
dir.listFiles(new FileFilter()
{
public boolean accept(File f)
{
if (f.isDirectory())
list.addAll(listFile(f));
list.add(f);
return true;
}
});
return list;
}
}