    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     * http://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     */
    019    package org.apache.commons.compress.archivers.jar;
    020
    021    import java.io.IOException;
    022    import java.io.OutputStream;
    023
    024    import org.apache.commons.compress.archivers.ArchiveEntry;
    025    import org.apache.commons.compress.archivers.zip.JarMarker;
    026    import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
    027    import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
    028
    029    /**
    030     * Subclass that adds a special extra field to the very first entry
    031     * which allows the created archive to be used as an executable jar on
    032     * Solaris.
    033     *
    034     * @NotThreadSafe
    035     */
    036    public class JarArchiveOutputStream extends ZipArchiveOutputStream {
    037
    038        private boolean jarMarkerAdded = false;
    039
    040        public JarArchiveOutputStream(final OutputStream out) {
    041            super(out);
    042        }
    043
    044        // @throws ClassCastException if entry is not an instance of ZipArchiveEntry
    045        @Override
    046        public void putArchiveEntry(ArchiveEntry ze) throws IOException {
    047            if (!jarMarkerAdded) {
    048                ((ZipArchiveEntry)ze).addAsFirstExtraField(JarMarker.getInstance());
    049                jarMarkerAdded = true;
    050            }
    051            super.putArchiveEntry(ze);
    052        }
    053    }