    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     */
    018    package org.apache.commons.compress.archivers.zip;
    019
    020    import java.util.zip.ZipException;
    021
    022    /**
    023     * If this extra field is added as the very first extra field of the
    024     * archive, Solaris will consider it an executable jar file.
    025     * @Immutable
    026     */
    027    public final class JarMarker implements ZipExtraField {
    028
    029        private static final ZipShort ID = new ZipShort(0xCAFE);
    030        private static final ZipShort NULL = new ZipShort(0);
    031        private static final byte[] NO_BYTES = new byte[0];
    032        private static final JarMarker DEFAULT = new JarMarker();
    033
    034        /** No-arg constructor */
    035        public JarMarker() {
    036            // empty
    037        }
    038
    039        /**
    040         * Since JarMarker is stateless we can always use the same instance.
    041         * @return the DEFAULT jarmaker.
    042         */
    043        public static JarMarker getInstance() {
    044            return DEFAULT;
    045        }
    046
    047        /**
    048         * The Header-ID.
    049         * @return the header id
    050         */
    051        public ZipShort getHeaderId() {
    052            return ID;
    053        }
    054
    055        /**
    056         * Length of the extra field in the local file data - without
    057         * Header-ID or length specifier.
    058         * @return 0
    059         */
    060        public ZipShort getLocalFileDataLength() {
    061            return NULL;
    062        }
    063
    064        /**
    065         * Length of the extra field in the central directory - without
    066         * Header-ID or length specifier.
    067         * @return 0
    068         */
    069        public ZipShort getCentralDirectoryLength() {
    070            return NULL;
    071        }
    072
    073        /**
    074         * The actual data to put into local file data - without Header-ID
    075         * or length specifier.
    076         * @return the data
    077         */
    078        public byte[] getLocalFileDataData() {
    079            return NO_BYTES;
    080        }
    081
    082        /**
    083         * The actual data to put central directory - without Header-ID or
    084         * length specifier.
    085         * @return the data
    086         */
    087        public byte[] getCentralDirectoryData() {
    088            return NO_BYTES;
    089        }
    090
    091        /**
    092         * Populate data from this array as if it was in local file data.
    093         * @param data an array of bytes
    094         * @param offset the start offset
    095         * @param length the number of bytes in the array from offset
    096         *
    097         * @throws ZipException on error
    098         */
    099        public void parseFromLocalFileData(byte[] data, int offset, int length)
    100            throws ZipException {
    101            if (length != 0) {
    102                throw new ZipException("JarMarker doesn't expect any data");
    103            }
    104        }
    105
    106        /**
    107         * Doesn't do anything special since this class always uses the
    108         * same data in central directory and local file data.
    109         */
    110        public void parseFromCentralDirectoryData(byte[] buffer, int offset,
    111                                                  int length)
    112            throws ZipException {
    113            parseFromLocalFileData(buffer, offset, length);
    114        }
    115    }