/* * 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; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; 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.net.URL; import java.util.ArrayList; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; /** * Created by The eXo Platform SAS Author : Chung Nguyen * nguyenchung136@yahoo.com Feb 8, 2006 */ @Deprecated public class ExoExpression { protected static final int EOF = -1; protected static final int BUFFER = 2048; public static String entryName; public static String outFileName; public static String pathOut; public ExoExpression() { } /** * Method accept Zip one InputStream * * @param is : InputStream * @return : ByteArrayInputStream * @throws Exception */ public ByteArrayInputStream ZipExcute(InputStream is) throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); BufferedInputStream bis = new BufferedInputStream(is); BufferedOutputStream out = new BufferedOutputStream(baos); int c; while ((c = bis.read()) != EOF) { out.write((byte)c); } bis.close(); out.close(); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); return getZipOutputStream(bais); } /** * Method accept Zip one File * * @param file : File input * @return : ByteArrayInputStream * @throws Exception : FileNotFoundException */ public ByteArrayInputStream ZipExcute(File file) throws Exception { ByteArrayInputStream bais; if (file.isDirectory()) { bais = getZipByteToFolder(file, true); } else { setEntry(file.getName()); InputStream is = new FileInputStream(file); bais = ZipExcute(is); } return bais; } /** * Method accept Zip one ByteArrayInputStream * * @param bytesStream * @return ByteArrayInputStream * @throws Exception */ public ByteArrayInputStream ZipExcute(ByteArrayInputStream bytesStream) throws Exception { return getZipOutputStream(bytesStream); } /** * Method accept download File with URL and Zip it * * @param url * @return : ByteArrayInputStream * @throws Exception */ public ByteArrayInputStream ZipExcute(String url) throws Exception { URL urlAdd = new URL(url); InputStream inputStream = urlAdd.openStream(); return ZipExcute(inputStream); } /** * Method create File Zip with * * @throws Exception */ public ByteArrayInputStream getZipOutputStream(ByteArrayInputStream bais) throws Exception { byte[] buf = new byte[BUFFER]; ByteArrayOutputStream baos = new ByteArrayOutputStream(); ZipOutputStream out = new ZipOutputStream(baos); out.putNextEntry(new ZipEntry(getEntry())); try { if (bais != null && bais.available() != EOF) { int count; while ((count = bais.read(buf)) > 0) { out.write(buf, 0, count); } } } finally { if (bais != null) { bais.close(); } } out.closeEntry(); out.close(); return new ByteArrayInputStream(baos.toByteArray()); } /** * Create File with ByteArrInputStrem Zip * * @param bais * @return File Zip * @throws Exception */ public File getFileToByte(ByteArrayInputStream bais) throws Exception { File file = new File(getDirOut()); byte[] data = new byte[BUFFER]; FileOutputStream out = new FileOutputStream(file); ByteArrayOutputStream baos = new ByteArrayOutputStream(bais.available()); int x; while ((x = bais.read(data, 0, BUFFER)) > 0) { baos.write(data, 0, x); } baos.writeTo(out); baos.close(); bais.close(); out.close(); return file; } public static void setEntry(String entry) { entryName = entry; } public static String getEntry() { return entryName; } /** * @param fileName : Name of File Zip out */ public static void setOutFileName(String fileName) { outFileName = fileName; } public static String getOutFileName() { return outFileName; } /** * @param dir : Directory Out */ public static void setPathOut(String dir) { pathOut = dir; } public static String getPathOut() { return pathOut; } /** * @return Dir of Zip File */ public String getDirOut() { String dir = getPathOut() + getOutFileName() + ".zip"; return dir; } /** * Mothed accept Zip one Folder and Return ByteArrayInputStream of it after * Zip * * @param input : File Folder input * @param containParent = true Folder is Parent * @return ByteArrayInputStream after Zip * @throws Exception */ public ByteArrayInputStream getZipByteToFolder(File input, boolean containParent) throws Exception { String path = input.getAbsolutePath(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ZipOutputStream zipOutput = new ZipOutputStream(baos); BufferedInputStream bufInput = null; List<File> list = listFile(input); if (input.isDirectory()) list.remove(input); if (list == null || list.size() < 1) return new ByteArrayInputStream(baos.toByteArray()); 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(); } } zipOutput.close(); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); return bais; } 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; } public ZipOutputStream addToArchive(ZipOutputStream zipOutput, InputStream input, String entryName1) throws Exception { byte data[] = new byte[BUFFER]; ZipEntry entry = new ZipEntry(entryName1); zipOutput.putNextEntry(entry); if (input != null) { int count; while ((count = input.read(data, 0, BUFFER)) != EOF) zipOutput.write(data, 0, count); } zipOutput.closeEntry(); return zipOutput; } }