src/core/net/sf/basedb/util/zip/ZipFilePacker.java

Code
Comments
Other
Rev Date Author Line
3568 18 Jul 07 martin 1 /**
3568 18 Jul 07 martin 2 $Id$
3568 18 Jul 07 martin 3
3675 16 Aug 07 jari 4 Copyright (C) 2007 Nicklas Nordborg, Martin Svensson
3568 18 Jul 07 martin 5
3568 18 Jul 07 martin 6 This file is part of BASE - BioArray Software Environment.
3568 18 Jul 07 martin 7 Available at http://base.thep.lu.se/
3568 18 Jul 07 martin 8
3568 18 Jul 07 martin 9 BASE is free software; you can redistribute it and/or modify it
3568 18 Jul 07 martin 10 under the terms of the GNU General Public License as published by
4479 05 Sep 08 jari 11 the Free Software Foundation; either version 3 of the License, or
3568 18 Jul 07 martin 12 (at your option) any later version.
3568 18 Jul 07 martin 13
3568 18 Jul 07 martin 14 BASE is distributed in the hope that it will be useful, but
3568 18 Jul 07 martin 15 WITHOUT ANY WARRANTY; without even the implied warranty of
3568 18 Jul 07 martin 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
3568 18 Jul 07 martin 17 General Public License for more details.
3568 18 Jul 07 martin 18
3568 18 Jul 07 martin 19 You should have received a copy of the GNU General Public License
4515 11 Sep 08 jari 20 along with BASE. If not, see <http://www.gnu.org/licenses/>.
3568 18 Jul 07 martin 21 */
3568 18 Jul 07 martin 22
3641 08 Aug 07 nicklas 23 package net.sf.basedb.util.zip;
3568 18 Jul 07 martin 24
8094 04 Nov 22 nicklas 25 import net.lingala.zip4j.io.outputstream.ZipOutputStream;
8094 04 Nov 22 nicklas 26 import net.lingala.zip4j.model.ZipParameters;
8094 04 Nov 22 nicklas 27 import net.lingala.zip4j.model.enums.AesKeyStrength;
8094 04 Nov 22 nicklas 28 import net.lingala.zip4j.model.enums.CompressionLevel;
8094 04 Nov 22 nicklas 29 import net.lingala.zip4j.model.enums.CompressionMethod;
8094 04 Nov 22 nicklas 30 import net.lingala.zip4j.model.enums.EncryptionMethod;
8094 04 Nov 22 nicklas 31 import net.sf.basedb.core.BaseException;
8094 04 Nov 22 nicklas 32 import net.sf.basedb.core.PluginParameter;
8094 04 Nov 22 nicklas 33 import net.sf.basedb.core.StringParameterType;
3568 18 Jul 07 martin 34 import net.sf.basedb.util.FileUtil;
3568 18 Jul 07 martin 35
3568 18 Jul 07 martin 36 import java.io.IOException;
3641 08 Aug 07 nicklas 37 import java.io.InputStream;
3568 18 Jul 07 martin 38 import java.io.OutputStream;
3568 18 Jul 07 martin 39
3641 08 Aug 07 nicklas 40 /**
3641 08 Aug 07 nicklas 41   This class packs files into a ZIP archive.
3641 08 Aug 07 nicklas 42
3641 08 Aug 07 nicklas 43   @author Martin, Nicklas
3641 08 Aug 07 nicklas 44   @version 2.4
3641 08 Aug 07 nicklas 45   @base.modified $Date$
3641 08 Aug 07 nicklas 46 */
3568 18 Jul 07 martin 47 public class ZipFilePacker 
3568 18 Jul 07 martin 48   implements FilePacker
3568 18 Jul 07 martin 49 {
3641 08 Aug 07 nicklas 50   private ZipOutputStream zip;
8094 04 Nov 22 nicklas 51   private String password;
3568 18 Jul 07 martin 52   
3641 08 Aug 07 nicklas 53   /**
3641 08 Aug 07 nicklas 54     Create a new packer that compresses files with the zip format.
3641 08 Aug 07 nicklas 55   */
3641 08 Aug 07 nicklas 56   public ZipFilePacker()
3641 08 Aug 07 nicklas 57   {}
3641 08 Aug 07 nicklas 58
3568 18 Jul 07 martin 59   /*
3641 08 Aug 07 nicklas 60     From the FilePacker interface
3641 08 Aug 07 nicklas 61     -------------------------------------------
3568 18 Jul 07 martin 62   */
3641 08 Aug 07 nicklas 63   /**
3641 08 Aug 07 nicklas 64     @return Always "Zip-archive (.zip)"
3641 08 Aug 07 nicklas 65   */
6127 14 Sep 12 nicklas 66   @Override
3641 08 Aug 07 nicklas 67   public String getDescription()
3568 18 Jul 07 martin 68   {
3641 08 Aug 07 nicklas 69     return "Zip-archive (.zip)";
3568 18 Jul 07 martin 70   }
3641 08 Aug 07 nicklas 71   /**
3641 08 Aug 07 nicklas 72     @return Always "zip"
3568 18 Jul 07 martin 73   */
6127 14 Sep 12 nicklas 74   @Override
3568 18 Jul 07 martin 75   public String getFileExtension()
3568 18 Jul 07 martin 76   {
3641 08 Aug 07 nicklas 77     return "zip";
3568 18 Jul 07 martin 78   }
3641 08 Aug 07 nicklas 79   /**
3641 08 Aug 07 nicklas 80       @return Always "application/zip"
3568 18 Jul 07 martin 81   */
6127 14 Sep 12 nicklas 82   @Override
3568 18 Jul 07 martin 83   public String getMimeType()
3568 18 Jul 07 martin 84   {
3641 08 Aug 07 nicklas 85     return "application/zip";
3568 18 Jul 07 martin 86   }
3641 08 Aug 07 nicklas 87   /**
8094 04 Nov 22 nicklas 88     Wrap the output stream in a {@link ZipOutputStream}.
8094 04 Nov 22 nicklas 89   */
6127 14 Sep 12 nicklas 90   @Override
3641 08 Aug 07 nicklas 91   public void setOutputStream(OutputStream out)
3641 08 Aug 07 nicklas 92   {
8094 04 Nov 22 nicklas 93     try
8094 04 Nov 22 nicklas 94     {
8094 04 Nov 22 nicklas 95       this.zip = password == null ? new ZipOutputStream(out) : new ZipOutputStream(out, password.toCharArray());
8094 04 Nov 22 nicklas 96     }
8094 04 Nov 22 nicklas 97     catch (IOException ex)
8094 04 Nov 22 nicklas 98     {
8094 04 Nov 22 nicklas 99       throw new BaseException(ex);
8094 04 Nov 22 nicklas 100     }
3641 08 Aug 07 nicklas 101   }
8094 04 Nov 22 nicklas 102   
3641 08 Aug 07 nicklas 103   /**
8094 04 Nov 22 nicklas 104     Encryption is supported.
8094 04 Nov 22 nicklas 105     @since 3.19.5
3568 18 Jul 07 martin 106   */
6127 14 Sep 12 nicklas 107   @Override
8094 04 Nov 22 nicklas 108   public boolean supportsEncryption() 
8094 04 Nov 22 nicklas 109   {
8094 04 Nov 22 nicklas 110     return true;
8094 04 Nov 22 nicklas 111   }
8094 04 Nov 22 nicklas 112
8094 04 Nov 22 nicklas 113   /**
8094 04 Nov 22 nicklas 114     Get the encyption password parameter.
8094 04 Nov 22 nicklas 115     @since 3.19.5
8094 04 Nov 22 nicklas 116   */
8094 04 Nov 22 nicklas 117   @Override
8094 04 Nov 22 nicklas 118   public PluginParameter<String> getPasswordParameter()
8094 04 Nov 22 nicklas 119   {
8094 04 Nov 22 nicklas 120     PluginParameter<String> passwordParameter = new PluginParameter<String>
8094 04 Nov 22 nicklas 121     (
8094 04 Nov 22 nicklas 122       "password", "Password", "Enter a password to encrypt the archive with strong AES256 encryption. "
8094 04 Nov 22 nicklas 123         + "If empty, the ZIP archive will not be encrypted." , new StringParameterType()
8094 04 Nov 22 nicklas 124     );
8094 04 Nov 22 nicklas 125     return passwordParameter;
8094 04 Nov 22 nicklas 126   }
8094 04 Nov 22 nicklas 127
8094 04 Nov 22 nicklas 128   /**
8094 04 Nov 22 nicklas 129     @since 3.19.5
8094 04 Nov 22 nicklas 130   */
8094 04 Nov 22 nicklas 131   @Override
8094 04 Nov 22 nicklas 132   public void setPassword(String password) 
8094 04 Nov 22 nicklas 133   {
8094 04 Nov 22 nicklas 134     this.password = password;
8094 04 Nov 22 nicklas 135   }
8094 04 Nov 22 nicklas 136
8094 04 Nov 22 nicklas 137   /**
8094 04 Nov 22 nicklas 138     Create a new entry and write the compressed data to it.
8094 04 Nov 22 nicklas 139   */
8094 04 Nov 22 nicklas 140   @Override
3641 08 Aug 07 nicklas 141   public void pack(String entryName, InputStream in, long size, long lastModified)
3568 18 Jul 07 martin 142     throws IOException
3568 18 Jul 07 martin 143   {
3641 08 Aug 07 nicklas 144     boolean isDirectory = in == null;
3641 08 Aug 07 nicklas 145     if (isDirectory && !entryName.endsWith("/")) entryName += "/";
8094 04 Nov 22 nicklas 146     
8094 04 Nov 22 nicklas 147     ZipParameters zipParameters = new ZipParameters();
8094 04 Nov 22 nicklas 148     zipParameters.setFileNameInZip(entryName);
8094 04 Nov 22 nicklas 149     if (lastModified > 0)
3568 18 Jul 07 martin 150     {
8094 04 Nov 22 nicklas 151       zipParameters.setLastModifiedFileTime(lastModified);
3568 18 Jul 07 martin 152     }
8094 04 Nov 22 nicklas 153     if (isDirectory)
8094 04 Nov 22 nicklas 154     {
8094 04 Nov 22 nicklas 155       zipParameters.setCompressionMethod(CompressionMethod.STORE);
8094 04 Nov 22 nicklas 156       zipParameters.setEntrySize(0);
8094 04 Nov 22 nicklas 157       zipParameters.setEntryCRC(0);
8094 04 Nov 22 nicklas 158     }
3641 08 Aug 07 nicklas 159     else
3568 18 Jul 07 martin 160     {
8094 04 Nov 22 nicklas 161       zipParameters.setCompressionMethod(CompressionMethod.DEFLATE);
8094 04 Nov 22 nicklas 162       zipParameters.setCompressionLevel(CompressionLevel.NORMAL);
8094 04 Nov 22 nicklas 163       zipParameters.setEntrySize(size);
8094 04 Nov 22 nicklas 164       if (password != null)
8094 04 Nov 22 nicklas 165       {
8094 04 Nov 22 nicklas 166         zipParameters.setEncryptFiles(true);
8094 04 Nov 22 nicklas 167         zipParameters.setEncryptionMethod(EncryptionMethod.AES);
8094 04 Nov 22 nicklas 168         zipParameters.setAesKeyStrength(AesKeyStrength.KEY_STRENGTH_256);
8094 04 Nov 22 nicklas 169       }
3568 18 Jul 07 martin 170     }
8094 04 Nov 22 nicklas 171     zip.putNextEntry(zipParameters);
3641 08 Aug 07 nicklas 172     if (!isDirectory) FileUtil.copy(in, zip);
3641 08 Aug 07 nicklas 173     zip.flush();
3641 08 Aug 07 nicklas 174     zip.closeEntry();
3568 18 Jul 07 martin 175   }
3568 18 Jul 07 martin 176   /**
3641 08 Aug 07 nicklas 177     Finish the ZIP file.
3568 18 Jul 07 martin 178   */
6127 14 Sep 12 nicklas 179   @Override
3641 08 Aug 07 nicklas 180   public void close()
3641 08 Aug 07 nicklas 181     throws IOException
3568 18 Jul 07 martin 182   {
3646 09 Aug 07 nicklas 183     zip.close();
3641 08 Aug 07 nicklas 184     zip = null;
3568 18 Jul 07 martin 185   }
3641 08 Aug 07 nicklas 186   // -------------------------------------------
3641 08 Aug 07 nicklas 187
3675 16 Aug 07 jari 188 }