001 //$HeadURL: svn+ssh://jwilden@svn.wald.intevation.org/deegree/base/branches/2.5_testing/src/org/deegree/framework/util/ZipUtils.java $ 002 /*---------------------------------------------------------------------------- 003 This file is part of deegree, http://deegree.org/ 004 Copyright (C) 2001-2009 by: 005 Department of Geography, University of Bonn 006 and 007 lat/lon GmbH 008 009 This library is free software; you can redistribute it and/or modify it under 010 the terms of the GNU Lesser General Public License as published by the Free 011 Software Foundation; either version 2.1 of the License, or (at your option) 012 any later version. 013 This library is distributed in the hope that it will be useful, but WITHOUT 014 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 015 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 016 details. 017 You should have received a copy of the GNU Lesser General Public License 018 along with this library; if not, write to the Free Software Foundation, Inc., 019 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 020 021 Contact information: 022 023 lat/lon GmbH 024 Aennchenstr. 19, 53177 Bonn 025 Germany 026 http://lat-lon.de/ 027 028 Department of Geography, University of Bonn 029 Prof. Dr. Klaus Greve 030 Postfach 1147, 53001 Bonn 031 Germany 032 http://www.geographie.uni-bonn.de/deegree/ 033 034 e-mail: info@deegree.org 035 ----------------------------------------------------------------------------*/ 036 package org.deegree.framework.util; 037 038 import java.io.File; 039 import java.io.FileInputStream; 040 import java.io.FileNotFoundException; 041 import java.io.FileOutputStream; 042 import java.io.IOException; 043 import java.io.InputStream; 044 import java.util.zip.ZipEntry; 045 import java.util.zip.ZipInputStream; 046 import java.util.zip.ZipOutputStream; 047 048 import org.deegree.framework.log.ILogger; 049 import org.deegree.framework.log.LoggerFactory; 050 051 /** 052 * 053 * 054 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a> 055 * @author last edited by: $Author: mschneider $ 056 * 057 * @version $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18 Jun 2009) $ 058 */ 059 public class ZipUtils { 060 061 private static ILogger LOG = LoggerFactory.getLogger( ZipUtils.class ); 062 063 private StringBuffer details = null; 064 065 /** 066 * packs the passed files into a zip-archive, deletes the files if desired and returns the name 067 * of the archive 068 * 069 * @deprecated please don't use this method any more. For the same result you might use 070 * doZip(dirName,archiveName,fileNames,deleteFiles,true); 071 * 072 * @param dirName 073 * name of the directory where to store the archive 074 * @param archiveName 075 * desired archive name 076 * @param fileNames 077 * names of the files to be packed into the zip archive 078 * @param deleteFiles 079 * if true all files will be deleted after zip-file has been created 080 * @return the name of the archive 081 * @throws FileNotFoundException 082 * @throws IOException 083 */ 084 @Deprecated 085 public String doZip( String dirName, String archiveName, String[] fileNames, boolean deleteFiles ) 086 throws FileNotFoundException, IOException { 087 088 return doZip( dirName, archiveName, fileNames, deleteFiles, true ); 089 090 // byte[] b = new byte[512]; 091 // 092 // File file = new File( archiveName ); 093 // String archive = archiveName; 094 // if ( !file.isAbsolute() ) { 095 // archive = dirName + '/' + archiveName; 096 // } 097 // ZipOutputStream zout = new ZipOutputStream( new FileOutputStream( archive ) ); 098 // 099 // details = new StringBuffer(); 100 // 101 // for ( int i = 0; i < fileNames.length; i++ ) { 102 // file = new File( fileNames[i] ); 103 // 104 // if ( !file.isAbsolute() ) { 105 // fileNames[i] = dirName + '/' + fileNames[i]; 106 // } 107 // InputStream in = new FileInputStream( fileNames[i] ); 108 // ZipEntry e = new ZipEntry( fileNames[i] ); 109 // zout.putNextEntry( e ); 110 // 111 // int len = 0; 112 // 113 // while ( ( len = in.read( b ) ) != -1 ) { 114 // zout.write( b, 0, len ); 115 // } 116 // 117 // in.close(); 118 // zout.closeEntry(); 119 // details.append( createZipDetails( e ) + "\n" ); 120 // } 121 // 122 // if ( deleteFiles ) { 123 // for ( int i = 0; i < fileNames.length; i++ ) { 124 // file = new File( fileNames[i] ); 125 // 126 // LOG.logInfo( fileNames[i] + " deleted: " + file.delete() ); 127 // } 128 // } 129 // 130 // zout.close(); 131 // 132 // return archive; 133 } 134 135 /** 136 * packs the passed files into a zip-archive, deletes the files if desired and returns the name 137 * of the archive as absolute path 138 * 139 * @param dirName 140 * name of the directory where the files are found (see fileNames) and where the 141 * archive will be stored. Needs to be an absolute path. 142 * @param archiveName 143 * desired name of the archive. It will be stored in the directory given in dirName. 144 * @param fileNames 145 * names of the files to be packed into the zip archive. The files are expected to be 146 * in the directory given in dirName. 147 * @param deleteFiles 148 * if true all files will be deleted after zip-file has been created 149 * @param storeFolderPathInZip 150 * if true, the files are stored in the zip according to their folder structur (with 151 * absolute paths); if false, the files are stored under their file name only. 152 * @return the name of the zip file (combined dirName and archiveName) 153 * @throws FileNotFoundException 154 * @throws IOException 155 */ 156 public String doZip( String dirName, String archiveName, String[] fileNames, boolean deleteFiles, 157 boolean storeFolderPathInZip ) 158 throws FileNotFoundException, IOException { 159 160 byte[] b = new byte[512]; 161 162 // make sure, that directory name ends with a file separator ("/" on Linux, or "\" on 163 // Windows) 164 if ( !dirName.endsWith( "/" ) && !dirName.endsWith( "\\" ) ) { 165 dirName = dirName + File.separator; 166 } 167 168 File file = new File( archiveName ); 169 String archive = archiveName; 170 if ( !file.isAbsolute() ) { 171 archive = dirName + archiveName; 172 } 173 LOG.logDebug( "archive name: " + archive ); 174 175 ZipOutputStream zout = new ZipOutputStream( new FileOutputStream( archive ) ); 176 details = new StringBuffer(); 177 String[] absFileNames = new String[fileNames.length]; 178 179 for ( int i = 0; i < fileNames.length; i++ ) { 180 file = new File( fileNames[i] ); 181 if ( !file.isAbsolute() ) { 182 absFileNames[i] = dirName + fileNames[i]; 183 } else { 184 absFileNames[i] = fileNames[i]; 185 } 186 187 InputStream in = new FileInputStream( absFileNames[i] ); 188 ZipEntry e = null; 189 if ( storeFolderPathInZip ) { 190 e = new ZipEntry( absFileNames[i] ); 191 } else { 192 e = new ZipEntry( file.getName() ); 193 } 194 zout.putNextEntry( e ); 195 196 int len = 0; 197 while ( ( len = in.read( b ) ) != -1 ) { 198 zout.write( b, 0, len ); 199 } 200 in.close(); 201 zout.closeEntry(); 202 details.append( createZipDetails( e ) + "\n" ); 203 } 204 205 if ( deleteFiles ) { 206 for ( int i = 0; i < absFileNames.length; i++ ) { 207 file = new File( absFileNames[i] ); 208 LOG.logInfo( absFileNames[i] + " deleted: " + file.delete() ); 209 } 210 } 211 212 zout.close(); 213 return archive; 214 } 215 216 /** 217 * @return details about the zipping 218 */ 219 public String getZipDetails() { 220 return details.toString(); 221 } 222 223 /** 224 * returns some information about the zip process of the current <code>ZipEntry</code>. 225 * 226 * @param e 227 * @return information on the zip process 228 */ 229 private StringBuffer createZipDetails( ZipEntry e ) { 230 231 StringBuffer sb = new StringBuffer(); 232 233 sb.append( "added " + e.getName() ); 234 235 if ( e.getMethod() == ZipEntry.DEFLATED ) { 236 long size = e.getSize(); 237 238 if ( size > 0 ) { 239 long csize = e.getCompressedSize(); 240 long ratio = ( ( size - csize ) * 100 ) / size; 241 sb.append( " (deflated " + ratio + "%)" ); 242 } else { 243 sb.append( " (deflated 0%)" ); 244 } 245 } else { 246 sb.append( " (stored 0%)" ); 247 } 248 249 return sb; 250 } 251 252 /** 253 * @param file 254 * @param outdir 255 * @throws IOException 256 */ 257 public void doUnzip( File file, String outdir ) 258 throws IOException { 259 this.doUnzip( new FileInputStream( file ), outdir ); 260 } 261 262 /** 263 * @param is 264 * @param outdir 265 * @throws IOException 266 */ 267 public void doUnzip( InputStream is, String outdir ) 268 throws IOException { 269 int read = 0; 270 byte[] data = new byte[1024]; 271 ZipEntry entry; 272 // Archiv öffnen und mit Stream verbinden 273 ZipInputStream in = new ZipInputStream( is ); 274 // Alle Einträge des Archivs auslesen 275 while ( ( entry = in.getNextEntry() ) != null ) { 276 if ( entry.getMethod() == ZipEntry.DEFLATED ) 277 System.out.println( " Inflating: " + entry.getName() ); 278 else 279 System.out.println( " Extracting: " + entry.getName() ); 280 // Anlegen der Ausgabedatei für den aktuellen Eintrag 281 FileOutputStream out = new FileOutputStream( outdir + entry.getName() ); 282 // Daten des Eintrags aus dem Archiv lesen und in die 283 // Ausgabedatei schreiben 284 while ( ( read = in.read( data, 0, 1024 ) ) != -1 ) 285 out.write( data, 0, read ); 286 out.close(); 287 } 288 in.close(); 289 System.out.println(); 290 } 291 292 }