/* ** 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.gz files. Added functionality that it doesn't need to know the size of an entry. If an entry has zero * size when it is put in the Tar, then it buffers it until it's closed and it knows the size. * * @author "Bay" <bayard@generationjava.com> */ public class TarGzOutputStream extends TarOutputStreamImpl { private TarOutputStreamImpl tos = null; private GZIPOutputStream gzip = null; private ByteArrayOutputStream bos = null; private TarEntry currentEntry = null; public TarGzOutputStream(OutputStream out) throws IOException { super(null); this.gzip = new GZIPOutputStream(out); this.tos = new TarOutputStreamImpl(this.gzip); 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(); this.gzip.finish(); } 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 java.io.FilterOutputStream#flush() */ @Override public void flush() throws IOException { this.bos.flush(); } }