/** * OpenKM, Open Document Management System (http://www.openkm.com) * Copyright (c) 2006-2011 Paco Avila & Josep Llort * * No bytes were intentionally harmed during the development of this application. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ package com.openkm.util; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import org.apache.commons.compress.archivers.jar.JarArchiveEntry; import org.apache.commons.compress.archivers.jar.JarArchiveOutputStream; import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream; import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream.UnicodeExtraFieldPolicy; import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ArchiveUtils { private static Logger log = LoggerFactory.getLogger(ArchiveUtils.class); /** * Recursively create ZIP archive from directory */ public static void createZip(File path, String root, OutputStream os) throws IOException { log.debug("createZip({}, {}, {})", new Object[] { path, root, os }); if (path.exists() && path.canRead()) { ZipArchiveOutputStream zaos = new ZipArchiveOutputStream(os); zaos.setComment("Generated by OpenKM"); zaos.setCreateUnicodeExtraFields(UnicodeExtraFieldPolicy.ALWAYS); zaos.setUseLanguageEncodingFlag(true); zaos.setFallbackToUTF8(true); zaos.setEncoding("UTF-8"); // Prevents java.util.zip.ZipException: ZIP file must have at least one entry ZipArchiveEntry zae = new ZipArchiveEntry(root+"/"); zaos.putArchiveEntry(zae); zaos.closeArchiveEntry(); createZipHelper(path, zaos, root); zaos.flush(); zaos.finish(); zaos.close(); } else { throw new IOException("Can't access "+path); } log.debug("createZip: void"); } /** * Recursively create ZIP archive from directory helper utility */ private static void createZipHelper(File fs, ZipArchiveOutputStream zaos, String zePath) throws IOException { log.debug("createZipHelper({}, {}, {})", new Object[]{ fs, zaos, zePath }); File[] files = fs.listFiles(); for (int i=0; i<files.length; i++) { if (files[i].isDirectory()) { log.debug("DIRECTORY {}", files[i]); ZipArchiveEntry zae = new ZipArchiveEntry(zePath + "/" + files[i].getName() + "/"); zaos.putArchiveEntry(zae); zaos.closeArchiveEntry(); createZipHelper(files[i], zaos, zePath + "/" + files[i].getName()); } else { log.debug("FILE {}", files[i]); ZipArchiveEntry zae = new ZipArchiveEntry(zePath + "/" + files[i].getName()); zaos.putArchiveEntry(zae); FileInputStream fis = new FileInputStream(files[i]); IOUtils.copy(fis, zaos); fis.close(); zaos.closeArchiveEntry(); } } log.debug("createZipHelper: void"); } /** * Recursively create JAR archive from directory */ public static void createJar(File path, String root, OutputStream os) throws IOException { log.debug("createJar({}, {}, {})", new Object[] { path, root, os }); if (path.exists() && path.canRead()) { JarArchiveOutputStream jaos = new JarArchiveOutputStream(os); jaos.setComment("Generated by OpenKM"); jaos.setCreateUnicodeExtraFields(UnicodeExtraFieldPolicy.ALWAYS); jaos.setUseLanguageEncodingFlag(true); jaos.setFallbackToUTF8(true); jaos.setEncoding("UTF-8"); // Prevents java.util.jar.JarException: JAR file must have at least one entry JarArchiveEntry jae = new JarArchiveEntry(root+"/"); jaos.putArchiveEntry(jae); jaos.closeArchiveEntry(); createJarHelper(path, jaos, root); jaos.flush(); jaos.finish(); jaos.close(); } else { throw new IOException("Can't access "+path); } log.debug("createJar: void"); } /** * Recursively create JAR archive from directory helper utility */ private static void createJarHelper(File fs, JarArchiveOutputStream jaos, String zePath) throws IOException { log.debug("createJarHelper({}, {}, {})", new Object[]{ fs, jaos, zePath }); File[] files = fs.listFiles(); for (int i=0; i<files.length; i++) { if (files[i].isDirectory()) { log.debug("DIRECTORY {}", files[i]); JarArchiveEntry jae = new JarArchiveEntry(zePath + "/" + files[i].getName() + "/"); jaos.putArchiveEntry(jae); jaos.closeArchiveEntry(); createJarHelper(files[i], jaos, zePath + "/" + files[i].getName()); } else { log.debug("FILE {}", files[i]); JarArchiveEntry jae = new JarArchiveEntry(zePath + "/" + files[i].getName()); jaos.putArchiveEntry(jae); FileInputStream fis = new FileInputStream(files[i]); IOUtils.copy(fis, jaos); fis.close(); jaos.closeArchiveEntry(); } } log.debug("createJarHelper: void"); } /** * Read file from ZIP */ public static byte[] readFileFromZip(ZipInputStream zis, String filename) throws IOException { ZipEntry zi = null; byte content[] = null; while ((zi = zis.getNextEntry()) != null) { if (filename.equals(zi.getName())) { IOUtils.toByteArray(zis); break; } } return content; } /** * Read file from ZIP */ public static InputStream getInputStreamFromZip(ZipInputStream zis, String filename) throws IOException { ZipEntry zi = null; InputStream is = null; while ((zi = zis.getNextEntry()) != null) { if (filename.equals(zi.getName())) { is = zis; break; } } return is; } }