    001/*
    002 * Licensed to the Apache Software Foundation (ASF) under one
    003 * or more contributor license agreements.  See the NOTICE file
    004 * distributed with this work for additional information
    005 * regarding copyright ownership.  The ASF licenses this file
    006 * to you under the Apache License, Version 2.0 (the
    007 * "License"); you may not use this file except in compliance
    008 * with the License.  You may obtain a copy of the License at
    009 *
    010 *   https://www.apache.org/licenses/LICENSE-2.0
    011 *
    012 * Unless required by applicable law or agreed to in writing,
    013 * software distributed under the License is distributed on an
    014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    015 * KIND, either express or implied.  See the License for the
    016 * specific language governing permissions and limitations
    017 * under the License.
    018 */
    019package org.apache.commons.compress.archivers.zip;
    020
    021import java.util.Collections;
    022import java.util.Map;
    023import java.util.function.Function;
    024import java.util.stream.Collectors;
    025import java.util.stream.Stream;
    026import java.util.zip.ZipEntry;
    027
    028/**
    029 * Enumerates known compression methods.
    030 *
    031 * Some of these methods are currently not supported by commons compress.
    032 *
    033 * @since 1.5
    034 */
    035public enum ZipMethod {
    036
    037    /**
    038     * Compression method 0 for uncompressed entries.
    039     *
    040     * @see ZipEntry#STORED
    041     */
    042    STORED(ZipEntry.STORED),
    043
    044    /**
    045     * UnShrinking. dynamic Lempel-Ziv-Welch-Algorithm
    046     *
    047     * @see <a href="https://www.pkware.com/documents/casestudies/APPNOTE.TXT">Explanation of fields: compression method: (2 bytes)</a>
    048     */
    049    UNSHRINKING(1),
    050
    051    /**
    052     * Reduced with compression factor 1.
    053     *
    054     * @see <a href="https://www.pkware.com/documents/casestudies/APPNOTE.TXT">Explanation of fields: compression 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 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 method: (2 bytes)</a>
    069     */
    070    EXPANDING_LEVEL_3(4),
    071
    072    /**
    073     * Reduced with compression factor 4.
    074     *
    075     * @see <a href="https://www.pkware.com/documents/casestudies/APPNOTE.TXT">Explanation of fields: compression method: (2 bytes)</a>
    076     */
    077    EXPANDING_LEVEL_4(5),
    078
    079    /**
    080     * Imploding.
    081     *
    082     * @see <a href="https://www.pkware.com/documents/casestudies/APPNOTE.TXT">Explanation of fields: compression method: (2 bytes)</a>
    083     */
    084    IMPLODING(6),
    085
    086    /**
    087     * Tokenization.
    088     *
    089     * @see <a href="https://www.pkware.com/documents/casestudies/APPNOTE.TXT">Explanation of fields: compression method: (2 bytes)</a>
    090     */
    091    TOKENIZATION(7),
    092
    093    /**
    094     * Compression method 8 for compressed (deflated) entries.
    095     *
    096     * @see ZipEntry#DEFLATED
    097     */
    098    DEFLATED(ZipEntry.DEFLATED),
    099
    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}