diff options
Diffstat (limited to 'src/main/java/org/openslx/util/TarArchiveUtil.java')
-rw-r--r-- | src/main/java/org/openslx/util/TarArchiveUtil.java | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/src/main/java/org/openslx/util/TarArchiveUtil.java b/src/main/java/org/openslx/util/TarArchiveUtil.java new file mode 100644 index 0000000..9970b0b --- /dev/null +++ b/src/main/java/org/openslx/util/TarArchiveUtil.java @@ -0,0 +1,146 @@ +package org.openslx.util; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; + +import org.apache.commons.compress.archivers.tar.TarArchiveEntry; +import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; +import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream; + +public class TarArchiveUtil +{ + + private TarArchiveUtil() + { + } + + public static class TarArchiveReader implements AutoCloseable + { + private final TarArchiveInputStream tarInputStream; + private TarArchiveEntry currentEntry = null; + + public TarArchiveReader( InputStream in ) throws IOException + { + this( in, true, false ); + } + + public TarArchiveReader( InputStream in, boolean isBuffered, boolean isCompressed ) throws IOException + { + InputStream stream = in; + if ( isBuffered ) { + stream = new BufferedInputStream( stream ); + } + + if ( isCompressed ) { + stream = new GZIPInputStream( stream ); + } + + this.tarInputStream = new TarArchiveInputStream( stream ); + } + + public boolean hasNextEntry() throws IOException + { + this.currentEntry = this.tarInputStream.getNextTarEntry(); + if ( this.currentEntry != null ) { + return true; + } else { + return false; + } + } + + public String getEntryName() + { + if ( this.currentEntry == null ) + return null; + + return this.currentEntry.getName(); + } + + public byte[] readCurrentEntry() throws IOException + { + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] rawData = new byte[ 1024 ]; + int count = 0; + + while ( ( count = this.tarInputStream.read( rawData ) ) != -1 ) { + output.write( rawData, 0, count ); + } + + return output.toByteArray(); + } + + @Override + public void close() throws IOException + { + tarInputStream.close(); + } + + } + + public static class TarArchiveWriter implements AutoCloseable + { + private final TarArchiveOutputStream tarOutputStream; + + public TarArchiveWriter( OutputStream out ) throws IOException + { + this( out, true, true ); + } + + public TarArchiveWriter( OutputStream out, boolean isBuffered, boolean isCompressed ) throws IOException + { + OutputStream stream = out; + + if ( isBuffered ) { + stream = new BufferedOutputStream( stream ); + } + + if ( isCompressed ) { + stream = new GZIPOutputStream( stream ); + } + + this.tarOutputStream = new TarArchiveOutputStream( stream ); + } + + public void writeFile( String filename, String data ) throws IOException + { + + if ( data == null ) + return; + putFile( filename, data.getBytes( StandardCharsets.UTF_8 ) ); + } + + public void writeFile( String filename, byte[] data ) throws IOException + { + if ( data == null ) + return; + putFile( filename, data ); + } + + private void putFile( String filename, byte[] data ) throws IOException + { + if ( data == null ) + return; + + TarArchiveEntry entry = new TarArchiveEntry( filename ); + entry.setSize( data.length ); + entry.setModTime( System.currentTimeMillis() ); + entry.setMode( 0644 ); + tarOutputStream.putArchiveEntry( entry ); + tarOutputStream.write( data ); + tarOutputStream.closeArchiveEntry(); + } + + @Override + public void close() throws IOException + { + tarOutputStream.close(); + } + } +} |