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