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 }