001/*
002 *  Licensed to the Apache Software Foundation (ASF) under one or more
003 *  contributor license agreements.  See the NOTICE file distributed with
004 *  this work for additional information regarding copyright ownership.
005 *  The ASF licenses this file to You under the Apache License, Version 2.0
006 *  (the "License"); you may not use this file except in compliance with
007 *  the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 *  Unless required by applicable law or agreed to in writing, software
012 *  distributed under the License is distributed on an "AS IS" BASIS,
013 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 *  See the License for the specific language governing permissions and
015 *  limitations under the License.
016 *
017 */
018package org.apache.commons.compress.archivers.zip;
019
020import java.util.Collections;
021import java.util.HashMap;
022import java.util.Map;
023import java.util.zip.ZipEntry;
024
025/**
026 * List of known compression methods
027 *
028 * Many of these methods are currently not supported by commons compress
029 *
030 * @since 1.5
031 */
032public enum ZipMethod {
033
034    /**
035     * Compression method 0 for uncompressed entries.
036     *
037     * @see ZipEntry#STORED
038     */
039    STORED(ZipEntry.STORED),
040
041    /**
042     * UnShrinking.
043     * dynamic Lempel-Ziv-Welch-Algorithm
044     *
045     * @see <a href="https://www.pkware.com/documents/casestudies/APPNOTE.TXT">Explanation of fields: compression
046     *      method: (2 bytes)</a>
047     */
048    UNSHRINKING(1),
049
050    /**
051     * Reduced with compression factor 1.
052     *
053     * @see <a href="https://www.pkware.com/documents/casestudies/APPNOTE.TXT">Explanation of fields: compression
054     *      method: (2 bytes)</a>
055     */
056    EXPANDING_LEVEL_1(2),
057
058    /**
059     * Reduced with compression factor 2.
060     *
061     * @see <a href="https://www.pkware.com/documents/casestudies/APPNOTE.TXT">Explanation of fields: compression
062     *      method: (2 bytes)</a>
063     */
064    EXPANDING_LEVEL_2(3),
065
066    /**
067     * Reduced with compression factor 3.
068     *
069     * @see <a href="https://www.pkware.com/documents/casestudies/APPNOTE.TXT">Explanation of fields: compression
070     *      method: (2 bytes)</a>
071     */
072    EXPANDING_LEVEL_3(4),
073
074    /**
075     * Reduced with compression factor 4.
076     *
077     * @see <a href="https://www.pkware.com/documents/casestudies/APPNOTE.TXT">Explanation of fields: compression
078     *      method: (2 bytes)</a>
079     */
080    EXPANDING_LEVEL_4(5),
081
082    /**
083     * Imploding.
084     *
085     * @see <a href="https://www.pkware.com/documents/casestudies/APPNOTE.TXT">Explanation of fields: compression
086     *      method: (2 bytes)</a>
087     */
088    IMPLODING(6),
089
090    /**
091     * Tokenization.
092     *
093     * @see <a href="https://www.pkware.com/documents/casestudies/APPNOTE.TXT">Explanation of fields: compression
094     *      method: (2 bytes)</a>
095     */
096    TOKENIZATION(7),
097
098    /**
099     * Compression method 8 for compressed (deflated) entries.
100     *
101     * @see ZipEntry#DEFLATED
102     */
103    DEFLATED(ZipEntry.DEFLATED),
104
105    /**
106     * Compression Method 9 for enhanced deflate.
107     *
108     * @see <a href="https://www.winzip.com/wz54.htm">https://www.winzip.com/wz54.htm</a>
109     */
110    ENHANCED_DEFLATED(9),
111
112    /**
113     * PKWARE Data Compression Library Imploding.
114     *
115     * @see <a href="https://www.winzip.com/wz54.htm">https://www.winzip.com/wz54.htm</a>
116     */
117    PKWARE_IMPLODING(10),
118
119    /**
120     * Compression Method 12 for bzip2.
121     *
122     * @see <a href="https://www.winzip.com/wz54.htm">https://www.winzip.com/wz54.htm</a>
123     */
124    BZIP2(12),
125
126    /**
127     * Compression Method 14 for LZMA.
128     *
129     * @see <a href="https://www.7-zip.org/sdk.html">https://www.7-zip.org/sdk.html</a>
130     * @see <a href="https://www.winzip.com/wz54.htm">https://www.winzip.com/wz54.htm</a>
131     */
132    LZMA(14),
133
134
135    /**
136     * Compression Method 95 for XZ.
137     *
138     * @see <a href="https://www.winzip.com/wz54.htm">https://www.winzip.com/wz54.htm</a>
139     */
140    XZ(95),
141
142    /**
143     * Compression Method 96 for Jpeg compression.
144     *
145     * @see <a href="https://www.winzip.com/wz54.htm">https://www.winzip.com/wz54.htm</a>
146     */
147    JPEG(96),
148
149    /**
150     * Compression Method 97 for WavPack.
151     *
152     * @see <a href="https://www.winzip.com/wz54.htm">https://www.winzip.com/wz54.htm</a>
153     */
154    WAVPACK(97),
155
156    /**
157     * Compression Method 98 for PPMd.
158     *
159     * @see <a href="https://www.winzip.com/wz54.htm">https://www.winzip.com/wz54.htm</a>
160     */
161    PPMD(98),
162
163
164    /**
165     * Compression Method 99 for AES encryption.
166     *
167     * @see <a href="https://www.winzip.com/wz54.htm">https://www.winzip.com/wz54.htm</a>
168     */
169    AES_ENCRYPTED(99),
170
171    /**
172     * Unknown compression method.
173     */
174    UNKNOWN();
175
176    static final int UNKNOWN_CODE = -1;
177
178    private final int code;
179
180    private static final Map<Integer, ZipMethod> codeToEnum;
181
182    static {
183        final Map<Integer, ZipMethod> cte = new HashMap<>();
184        for (final ZipMethod method : values()) {
185            cte.put(method.getCode(), method);
186        }
187        codeToEnum = Collections.unmodifiableMap(cte);
188    }
189
190    private ZipMethod() {
191        this(UNKNOWN_CODE);
192    }
193
194    /**
195     * private constructor for enum style class.
196     */
197    ZipMethod(final int code) {
198        this.code = code;
199    }
200
201    /**
202     * the code of the compression method.
203     *
204     * @see ZipArchiveEntry#getMethod()
205     *
206     * @return an integer code for the method
207     */
208    public int getCode() {
209        return code;
210    }
211
212
213    /**
214     * returns the {@link ZipMethod} for the given code or null if the
215     * method is not known.
216     * @param code the code
217     * @return the {@link ZipMethod} for the given code or null if the
218     * method is not known.
219     */
220    public static ZipMethod getMethodByCode(final int code) {
221        return codeToEnum.get(code);
222    }
223}