summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/openslx/util/TarArchiveUtil.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/openslx/util/TarArchiveUtil.java')
-rw-r--r--src/main/java/org/openslx/util/TarArchiveUtil.java146
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();
+ }
+ }
+}