1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * https://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19 package org.apache.commons.compress.archivers.zip;
20
21 import java.util.Collections;
22 import java.util.Map;
23 import java.util.function.Function;
24 import java.util.stream.Collectors;
25 import java.util.stream.Stream;
26 import java.util.zip.ZipEntry;
27
28 /**
29 * Enumerates known compression methods.
30 *
31 * Some of these methods are currently not supported by commons compress.
32 *
33 * @since 1.5
34 */
35 public enum ZipMethod {
36
37 /**
38 * Compression method 0 for uncompressed entries.
39 *
40 * @see ZipEntry#STORED
41 */
42 STORED(ZipEntry.STORED),
43
44 /**
45 * UnShrinking. dynamic Lempel-Ziv-Welch-Algorithm
46 *
47 * @see <a href="https://www.pkware.com/documents/casestudies/APPNOTE.TXT">Explanation of fields: compression method: (2 bytes)</a>
48 */
49 UNSHRINKING(1),
50
51 /**
52 * Reduced with compression factor 1.
53 *
54 * @see <a href="https://www.pkware.com/documents/casestudies/APPNOTE.TXT">Explanation of fields: compression method: (2 bytes)</a>
55 */
56 EXPANDING_LEVEL_1(2),
57
58 /**
59 * Reduced with compression factor 2.
60 *
61 * @see <a href="https://www.pkware.com/documents/casestudies/APPNOTE.TXT">Explanation of fields: compression method: (2 bytes)</a>
62 */
63 EXPANDING_LEVEL_2(3),
64
65 /**
66 * Reduced with compression factor 3.
67 *
68 * @see <a href="https://www.pkware.com/documents/casestudies/APPNOTE.TXT">Explanation of fields: compression method: (2 bytes)</a>
69 */
70 EXPANDING_LEVEL_3(4),
71
72 /**
73 * Reduced with compression factor 4.
74 *
75 * @see <a href="https://www.pkware.com/documents/casestudies/APPNOTE.TXT">Explanation of fields: compression method: (2 bytes)</a>
76 */
77 EXPANDING_LEVEL_4(5),
78
79 /**
80 * Imploding.
81 *
82 * @see <a href="https://www.pkware.com/documents/casestudies/APPNOTE.TXT">Explanation of fields: compression method: (2 bytes)</a>
83 */
84 IMPLODING(6),
85
86 /**
87 * Tokenization.
88 *
89 * @see <a href="https://www.pkware.com/documents/casestudies/APPNOTE.TXT">Explanation of fields: compression method: (2 bytes)</a>
90 */
91 TOKENIZATION(7),
92
93 /**
94 * Compression method 8 for compressed (deflated) entries.
95 *
96 * @see ZipEntry#DEFLATED
97 */
98 DEFLATED(ZipEntry.DEFLATED),
99
100 /**
101 * Compression Method 9 for enhanced deflate.
102 *
103 * @see <a href="https://www.pkware.com/documents/casestudies/APPNOTE.TXT">Explanation of fields: compression method: (2 bytes)</a>
104 */
105 ENHANCED_DEFLATED(9),
106
107 /**
108 * PKWARE Data Compression Library Imploding.
109 *
110 * @see <a href="https://www.pkware.com/documents/casestudies/APPNOTE.TXT">Explanation of fields: compression method: (2 bytes)</a>
111 */
112 PKWARE_IMPLODING(10),
113
114 /**
115 * Compression Method 12 for bzip2.
116 *
117 * @see <a href="https://www.pkware.com/documents/casestudies/APPNOTE.TXT">Explanation of fields: compression method: (2 bytes)</a>
118 */
119 BZIP2(12),
120
121 /**
122 * Compression Method 14 for LZMA.
123 *
124 * @see <a href="https://www.7-zip.org/sdk.html">https://www.7-zip.org/sdk.html</a>
125 * @see <a href="https://www.pkware.com/documents/casestudies/APPNOTE.TXT">Explanation of fields: compression method: (2 bytes)</a>
126 */
127 LZMA(14),
128
129 /**
130 * Compression Method 20 for Zstandard (deprecated).
131 *
132 * @see <a href="https://github.com/facebook/zstd">Facebook Zstandard source code</a>
133 * @see <a href="https://pkwaredownloads.blob.core.windows.net/pkware-general/Documentation/APPNOTE-6.3.7.TXT">.ZIP File Format Specification 6.3.7:
134 * Deprecated zstd compression method id</a>
135 * @see <a href="https://www.pkware.com/documents/casestudies/APPNOTE.TXT">.ZIP File Format Specification: Explanation of fields: compression method: (2
136 * bytes)</a>
137 * @since 1.28.0
138 */
139 ZSTD_DEPRECATED(20),
140
141 /**
142 * Compression Method 93 for Zstandard.
143 *
144 * @see <a href="https://github.com/facebook/zstd">Facebook Zstandard source code</a>
145 * @see <a href="https://pkwaredownloads.blob.core.windows.net/pkware-general/Documentation/APPNOTE-6.3.8.TXT">.ZIP File Format Specification 6.3.8: Changed
146 * zstd compression method id</a>
147 * @see <a href="https://www.pkware.com/documents/casestudies/APPNOTE.TXT">.ZIP File Format Specification: Explanation of fields: compression method: (2
148 * bytes)</a>
149 * @since 1.28.0
150 */
151 ZSTD(93),
152
153 /**
154 * Compression Method 95 for XZ.
155 *
156 * @see <a href="https://www.pkware.com/documents/casestudies/APPNOTE.TXT">Explanation of fields: compression method: (2 bytes)</a>
157 */
158 XZ(95),
159
160 /**
161 * Compression Method 96 for Jpeg compression.
162 *
163 * @see <a href="https://www.pkware.com/documents/casestudies/APPNOTE.TXT">Explanation of fields: compression method: (2 bytes)</a>
164 */
165 JPEG(96),
166
167 /**
168 * Compression Method 97 for WavPack.
169 *
170 * @see <a href="https://www.pkware.com/documents/casestudies/APPNOTE.TXT">Explanation of fields: compression method: (2 bytes)</a>
171 */
172 WAVPACK(97),
173
174 /**
175 * Compression Method 98 for PPMd.
176 *
177 * @see <a href="https://www.pkware.com/documents/casestudies/APPNOTE.TXT">Explanation of fields: compression method: (2 bytes)</a>
178 */
179 PPMD(98),
180
181 /**
182 * Compression Method 99 for AES encryption.
183 *
184 * @see <a href="https://www.pkware.com/documents/casestudies/APPNOTE.TXT">Explanation of fields: compression method: (2 bytes)</a>
185 */
186 AES_ENCRYPTED(99),
187
188 /**
189 * Unknown compression method.
190 */
191 UNKNOWN();
192
193 static final int UNKNOWN_CODE = -1;
194
195 private static final Map<Integer, ZipMethod> codeToEnum = Collections
196 .unmodifiableMap(Stream.of(values()).collect(Collectors.toMap(ZipMethod::getCode, Function.identity())));
197
198 /**
199 * Gets the {@link ZipMethod} for the given code or null if the method is not known.
200 *
201 * @param code the code
202 * @return the {@link ZipMethod} for the given code or null if the method is not known.
203 */
204 public static ZipMethod getMethodByCode(final int code) {
205 return codeToEnum.get(code);
206 }
207
208 /**
209 * Tests whether the given ZIP method is a ZStandard method.
210 *
211 * @param method The method to test.
212 * @return Whether the given ZIP method is a ZStandard method.
213 */
214 static boolean isZstd(final int method) {
215 return method == ZSTD.getCode() || method == ZSTD_DEPRECATED.getCode();
216 }
217
218 private final int code;
219
220 ZipMethod() {
221 this(UNKNOWN_CODE);
222 }
223
224 /**
225 * Constructs a new instance.
226 */
227 ZipMethod(final int code) {
228 this.code = code;
229 }
230
231 /**
232 * Gets the code of the compression method.
233 *
234 * @see ZipArchiveEntry#getMethod()
235 * @return an integer code for the method
236 */
237 public int getCode() {
238 return code;
239 }
240 }