aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/tar/TarBuffer.java
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/tar/TarBuffer.java')
-rw-r--r--framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/tar/TarBuffer.java463
1 files changed, 0 insertions, 463 deletions
diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/tar/TarBuffer.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/tar/TarBuffer.java
deleted file mode 100644
index b089d9bf..00000000
--- a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/tar/TarBuffer.java
+++ /dev/null
@@ -1,463 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-/*
- * This package is based on the work done by Timothy Gerard Endres
- * (time@ice.com) to whom the Ant project is very grateful for his great code.
- */
-
-package org.apache.tools.tar;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Arrays;
-
-/**
- * The TarBuffer class implements the tar archive concept
- * of a buffered input stream. This concept goes back to the
- * days of blocked tape drives and special io devices. In the
- * Java universe, the only real function that this class
- * performs is to ensure that files have the correct "block"
- * size, or other tars will complain.
- * <p>
- * You should never have a need to access this class directly.
- * TarBuffers are created by Tar IO Streams.
- *
- */
-
-public class TarBuffer {
-
- /** Default record size */
- public static final int DEFAULT_RCDSIZE = (512);
-
- /** Default block size */
- public static final int DEFAULT_BLKSIZE = (DEFAULT_RCDSIZE * 20);
-
- private InputStream inStream;
- private OutputStream outStream;
- private final int blockSize;
- private final int recordSize;
- private final int recsPerBlock;
- private final byte[] blockBuffer;
-
- private int currBlkIdx;
- private int currRecIdx;
- private boolean debug;
-
- /**
- * Constructor for a TarBuffer on an input stream.
- * @param inStream the input stream to use
- */
- public TarBuffer(InputStream inStream) {
- this(inStream, TarBuffer.DEFAULT_BLKSIZE);
- }
-
- /**
- * Constructor for a TarBuffer on an input stream.
- * @param inStream the input stream to use
- * @param blockSize the block size to use
- */
- public TarBuffer(InputStream inStream, int blockSize) {
- this(inStream, blockSize, TarBuffer.DEFAULT_RCDSIZE);
- }
-
- /**
- * Constructor for a TarBuffer on an input stream.
- * @param inStream the input stream to use
- * @param blockSize the block size to use
- * @param recordSize the record size to use
- */
- public TarBuffer(InputStream inStream, int blockSize, int recordSize) {
- this(inStream, null, blockSize, recordSize);
- }
-
- /**
- * Constructor for a TarBuffer on an output stream.
- * @param outStream the output stream to use
- */
- public TarBuffer(OutputStream outStream) {
- this(outStream, TarBuffer.DEFAULT_BLKSIZE);
- }
-
- /**
- * Constructor for a TarBuffer on an output stream.
- * @param outStream the output stream to use
- * @param blockSize the block size to use
- */
- public TarBuffer(OutputStream outStream, int blockSize) {
- this(outStream, blockSize, TarBuffer.DEFAULT_RCDSIZE);
- }
-
- /**
- * Constructor for a TarBuffer on an output stream.
- * @param outStream the output stream to use
- * @param blockSize the block size to use
- * @param recordSize the record size to use
- */
- public TarBuffer(OutputStream outStream, int blockSize, int recordSize) {
- this(null, outStream, blockSize, recordSize);
- }
-
- /**
- * Private constructor to perform common setup.
- */
- private TarBuffer(InputStream inStream, OutputStream outStream, int blockSize, int recordSize) {
- this.inStream = inStream;
- this.outStream = outStream;
- this.debug = false;
- this.blockSize = blockSize;
- this.recordSize = recordSize;
- this.recsPerBlock = (this.blockSize / this.recordSize);
- this.blockBuffer = new byte[this.blockSize];
-
- if (this.inStream != null) {
- this.currBlkIdx = -1;
- this.currRecIdx = this.recsPerBlock;
- } else {
- this.currBlkIdx = 0;
- this.currRecIdx = 0;
- }
- }
-
- /**
- * Get the TAR Buffer's block size. Blocks consist of multiple records.
- * @return the block size
- */
- public int getBlockSize() {
- return this.blockSize;
- }
-
- /**
- * Get the TAR Buffer's record size.
- * @return the record size
- */
- public int getRecordSize() {
- return this.recordSize;
- }
-
- /**
- * Set the debugging flag for the buffer.
- *
- * @param debug If true, print debugging output.
- */
- public void setDebug(boolean debug) {
- this.debug = debug;
- }
-
- /**
- * Determine if an archive record indicate End of Archive. End of
- * archive is indicated by a record that consists entirely of null bytes.
- *
- * @param record The record data to check.
- * @return true if the record data is an End of Archive
- */
- public boolean isEOFRecord(byte[] record) {
- for (int i = 0, sz = getRecordSize(); i < sz; ++i) {
- if (record[i] != 0) {
- return false;
- }
- }
-
- return true;
- }
-
- /**
- * Skip over a record on the input stream.
- * @throws IOException on error
- */
- public void skipRecord() throws IOException {
- if (debug) {
- System.err.println("SkipRecord: recIdx = " + currRecIdx
- + " blkIdx = " + currBlkIdx);
- }
-
- if (inStream == null) {
- throw new IOException("reading (via skip) from an output buffer");
- }
-
- if (currRecIdx >= recsPerBlock && !readBlock()) {
- return; // UNDONE
- }
-
- currRecIdx++;
- }
-
- /**
- * Read a record from the input stream and return the data.
- *
- * @return The record data.
- * @throws IOException on error
- */
- public byte[] readRecord() throws IOException {
- if (debug) {
- System.err.println("ReadRecord: recIdx = " + currRecIdx
- + " blkIdx = " + currBlkIdx);
- }
-
- if (inStream == null) {
- if (outStream == null) {
- throw new IOException("input buffer is closed");
- }
- throw new IOException("reading from an output buffer");
- }
-
- if (currRecIdx >= recsPerBlock && !readBlock()) {
- return null;
- }
-
- byte[] result = new byte[recordSize];
-
- System.arraycopy(blockBuffer,
- (currRecIdx * recordSize), result, 0,
- recordSize);
-
- currRecIdx++;
-
- return result;
- }
-
- /**
- * @return false if End-Of-File, else true
- */
- private boolean readBlock() throws IOException {
- if (debug) {
- System.err.println("ReadBlock: blkIdx = " + currBlkIdx);
- }
-
- if (inStream == null) {
- throw new IOException("reading from an output buffer");
- }
-
- currRecIdx = 0;
-
- int offset = 0;
- int bytesNeeded = blockSize;
-
- while (bytesNeeded > 0) {
- long numBytes = inStream.read(blockBuffer, offset,
- bytesNeeded);
-
- //
- // NOTE
- // We have fit EOF, and the block is not full!
- //
- // This is a broken archive. It does not follow the standard
- // blocking algorithm. However, because we are generous, and
- // it requires little effort, we will simply ignore the error
- // and continue as if the entire block were read. This does
- // not appear to break anything upstream. We used to return
- // false in this case.
- //
- // Thanks to 'Yohann.Roussel@alcatel.fr' for this fix.
- //
- if (numBytes == -1) {
- if (offset == 0) {
- // Ensure that we do not read gigabytes of zeros
- // for a corrupt tar file.
- // See http://issues.apache.org/bugzilla/show_bug.cgi?id=39924
- return false;
- }
- // However, just leaving the unread portion of the buffer dirty does
- // cause problems in some cases. This problem is described in
- // http://issues.apache.org/bugzilla/show_bug.cgi?id=29877
- //
- // The solution is to fill the unused portion of the buffer with zeros.
-
- Arrays.fill(blockBuffer, offset, offset + bytesNeeded, (byte) 0);
-
- break;
- }
-
- offset += numBytes;
- bytesNeeded -= numBytes;
-
- if (numBytes != blockSize) {
- if (debug) {
- System.err.println("ReadBlock: INCOMPLETE READ "
- + numBytes + " of " + blockSize
- + " bytes read.");
- }
- }
- }
-
- currBlkIdx++;
-
- return true;
- }
-
- /**
- * Get the current block number, zero based.
- *
- * @return The current zero based block number.
- */
- public int getCurrentBlockNum() {
- return currBlkIdx;
- }
-
- /**
- * Get the current record number, within the current block, zero based.
- * Thus, current offset = (currentBlockNum * recsPerBlk) + currentRecNum.
- *
- * @return The current zero based record number.
- */
- public int getCurrentRecordNum() {
- return currRecIdx - 1;
- }
-
- /**
- * Write an archive record to the archive.
- *
- * @param record The record data to write to the archive.
- * @throws IOException on error
- */
- public void writeRecord(byte[] record) throws IOException {
- if (debug) {
- System.err.println("WriteRecord: recIdx = " + currRecIdx
- + " blkIdx = " + currBlkIdx);
- }
-
- if (outStream == null) {
- if (inStream == null){
- throw new IOException("Output buffer is closed");
- }
- throw new IOException("writing to an input buffer");
- }
-
- if (record.length != recordSize) {
- throw new IOException("record to write has length '"
- + record.length
- + "' which is not the record size of '"
- + recordSize + "'");
- }
-
- if (currRecIdx >= recsPerBlock) {
- writeBlock();
- }
-
- System.arraycopy(record, 0, blockBuffer,
- (currRecIdx * recordSize),
- recordSize);
-
- currRecIdx++;
- }
-
- /**
- * Write an archive record to the archive, where the record may be
- * inside of a larger array buffer. The buffer must be "offset plus
- * record size" long.
- *
- * @param buf The buffer containing the record data to write.
- * @param offset The offset of the record data within buf.
- * @throws IOException on error
- */
- public void writeRecord(byte[] buf, int offset) throws IOException {
- if (debug) {
- System.err.println("WriteRecord: recIdx = " + currRecIdx
- + " blkIdx = " + currBlkIdx);
- }
-
- if (outStream == null) {
- if (inStream == null){
- throw new IOException("Output buffer is closed");
- }
- throw new IOException("writing to an input buffer");
- }
-
- if ((offset + recordSize) > buf.length) {
- throw new IOException("record has length '" + buf.length
- + "' with offset '" + offset
- + "' which is less than the record size of '"
- + recordSize + "'");
- }
-
- if (currRecIdx >= recsPerBlock) {
- writeBlock();
- }
-
- System.arraycopy(buf, offset, blockBuffer,
- (currRecIdx * recordSize),
- recordSize);
-
- currRecIdx++;
- }
-
- /**
- * Write a TarBuffer block to the archive.
- */
- private void writeBlock() throws IOException {
- if (debug) {
- System.err.println("WriteBlock: blkIdx = " + currBlkIdx);
- }
-
- if (outStream == null) {
- throw new IOException("writing to an input buffer");
- }
-
- outStream.write(blockBuffer, 0, blockSize);
- outStream.flush();
-
- currRecIdx = 0;
- currBlkIdx++;
- Arrays.fill(blockBuffer, (byte) 0);
- }
-
- /**
- * Flush the current data block if it has any data in it.
- */
- void flushBlock() throws IOException {
- if (debug) {
- System.err.println("TarBuffer.flushBlock() called.");
- }
-
- if (outStream == null) {
- throw new IOException("writing to an input buffer");
- }
-
- if (currRecIdx > 0) {
- writeBlock();
- }
- }
-
- /**
- * Close the TarBuffer. If this is an output buffer, also flush the
- * current block before closing.
- * @throws IOException on error
- */
- public void close() throws IOException {
- if (debug) {
- System.err.println("TarBuffer.closeBuffer().");
- }
-
- if (outStream != null) {
- flushBlock();
-
- if (outStream != System.out
- && outStream != System.err) {
- outStream.close();
-
- outStream = null;
- }
- } else if (inStream != null) {
- if (inStream != System.in) {
- inStream.close();
- }
- inStream = null;
- }
- }
-}