3568 |
18 Jul 07 |
martin |
1 |
/** |
3568 |
18 Jul 07 |
martin |
$Id$ |
3568 |
18 Jul 07 |
martin |
3 |
|
3675 |
16 Aug 07 |
jari |
Copyright (C) 2007 Nicklas Nordborg, Martin Svensson |
3568 |
18 Jul 07 |
martin |
5 |
|
3568 |
18 Jul 07 |
martin |
This file is part of BASE - BioArray Software Environment. |
3568 |
18 Jul 07 |
martin |
Available at http://base.thep.lu.se/ |
3568 |
18 Jul 07 |
martin |
8 |
|
3568 |
18 Jul 07 |
martin |
BASE is free software; you can redistribute it and/or modify it |
3568 |
18 Jul 07 |
martin |
under the terms of the GNU General Public License as published by |
4479 |
05 Sep 08 |
jari |
the Free Software Foundation; either version 3 of the License, or |
3568 |
18 Jul 07 |
martin |
(at your option) any later version. |
3568 |
18 Jul 07 |
martin |
13 |
|
3568 |
18 Jul 07 |
martin |
BASE is distributed in the hope that it will be useful, but |
3568 |
18 Jul 07 |
martin |
WITHOUT ANY WARRANTY; without even the implied warranty of |
3568 |
18 Jul 07 |
martin |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
3568 |
18 Jul 07 |
martin |
General Public License for more details. |
3568 |
18 Jul 07 |
martin |
18 |
|
3568 |
18 Jul 07 |
martin |
You should have received a copy of the GNU General Public License |
4515 |
11 Sep 08 |
jari |
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 |
This class packs files into a ZIP archive. |
3641 |
08 Aug 07 |
nicklas |
42 |
|
3641 |
08 Aug 07 |
nicklas |
@author Martin, Nicklas |
3641 |
08 Aug 07 |
nicklas |
@version 2.4 |
3641 |
08 Aug 07 |
nicklas |
@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 |
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 |
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 |
@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 |
@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 |
@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 |
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 |
Encryption is supported. |
8094 |
04 Nov 22 |
nicklas |
@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 |
Get the encyption password parameter. |
8094 |
04 Nov 22 |
nicklas |
@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 |
@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 |
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 |
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 |
} |