/*
 ** Contributed by "Bay" <bayard@generationjava.com>
 **
 ** This code has been placed into the public domain.
 */

package org.jboss.shrinkwrap.impl.base.io.tar;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.zip.GZIPOutputStream;

// we extend TarOutputStream to have the same type,
// BUT, we don't use ANY methods. It's all about
// typing.

Outputs TAR files; essentially a copy (ie. hack) of TarGzOutputStream, except the output is *not* encoded with a GZIPOutputStream wrapper. In place temporarily until we determine a way to properly write entries and automatically handle the proper "next entry" logic for TAR just as is done for TAR.GZ. Likely well centralize a lot of this logic into a common base class.
Author:"Bay" , ALR
/** * Outputs TAR files; essentially a copy (ie. hack) of {@link TarGzOutputStream}, except the output is *not* encoded * with a {@link GZIPOutputStream} wrapper. In place temporarily until we determine a way to properly write entries and * automatically handle the proper "next entry" logic for TAR just as is done for TAR.GZ. Likely well centralize a lot * of this logic into a common base class. * * @author "Bay" <bayard@generationjava.com> * @author <a href="mailto:andrew.rubinger@jboss.org">ALR</a> */
public class TarOutputStream extends TarOutputStreamImpl { private TarOutputStreamImpl tos = null; private ByteArrayOutputStream bos = null; private TarEntry currentEntry = null; public TarOutputStream(OutputStream out) throws IOException { super(null); this.tos = new TarOutputStreamImpl(out); this.bos = new ByteArrayOutputStream(); } // proxy all methods, but buffer if unknown size public void setDebug(boolean b) { this.tos.setDebug(b); } public void setBufferDebug(boolean b) { this.tos.setBufferDebug(b); } public void finish() throws IOException { if (this.currentEntry != null) { closeEntry(); } this.tos.finish(); } public void close() throws IOException { this.flush(); this.tos.close(); } public int getRecordSize() { return this.tos.getRecordSize(); } public void putNextEntry(TarEntry entry) throws IOException { if (entry.getSize() != 0) { this.tos.putNextEntry(entry); } else { this.currentEntry = entry; } } public void closeEntry() throws IOException { if (this.currentEntry == null) { this.tos.closeEntry(); } else { this.currentEntry.setSize(bos.size()); this.tos.putNextEntry(this.currentEntry); this.bos.writeTo(this.tos); this.tos.closeEntry(); this.currentEntry = null; this.bos = new ByteArrayOutputStream(); } } public void write(int b) throws IOException { if (this.currentEntry == null) { this.tos.write(b); } else { this.bos.write(b); } } public void write(byte[] b) throws IOException { if (this.currentEntry == null) { this.tos.write(b); } else { this.bos.write(b); } } public void write(byte[] b, int start, int length) throws IOException { if (this.currentEntry == null) { this.tos.write(b, start, length); } else { this.bos.write(b, start, length); } }
{@inheritDoc}
See Also:
/** * {@inheritDoc} * * @see java.io.FilterOutputStream#flush() */
@Override public void flush() throws IOException { this.bos.flush(); } }