From 07cbc76b1f3d408f5899caff9add8e4138871579 Mon Sep 17 00:00:00 2001 From: ralph isenmann Date: Thu, 27 Jan 2022 11:42:13 +0100 Subject: Add TarArchiveReader and TarArchiveWriter as Util classes. - Wraps the jtar dependency --- src/main/java/org/openslx/util/TarArchiveUtil.java | 127 +++++++++++++++++++-- 1 file changed, 116 insertions(+), 11 deletions(-) (limited to 'src/main/java/org/openslx/util') diff --git a/src/main/java/org/openslx/util/TarArchiveUtil.java b/src/main/java/org/openslx/util/TarArchiveUtil.java index 09c4a2c..20af003 100644 --- a/src/main/java/org/openslx/util/TarArchiveUtil.java +++ b/src/main/java/org/openslx/util/TarArchiveUtil.java @@ -2,28 +2,133 @@ package org.openslx.util; import org.kamranzafar.jtar.TarEntry; import org.kamranzafar.jtar.TarHeader; +import org.kamranzafar.jtar.TarInputStream; import org.kamranzafar.jtar.TarOutputStream; +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; + + public class TarArchiveUtil { + private TarArchiveUtil() {} + public static class TarArchiveReader implements AutoCloseable { + private boolean isCompressed; + private final TarInputStream tarInputStream; - public static void tarPutFile(TarOutputStream output, String fileName, String data) throws IOException - { - if (data == null) - return; - tarPutFile(output, fileName, data.getBytes(StandardCharsets.UTF_8)); + private TarEntry currentEntry = null; + + public TarArchiveReader(InputStream in) throws IOException { + this(in,true,false); + } + + public TarArchiveReader(InputStream in, boolean isBuffered, boolean isCompressed) throws IOException { + this.isCompressed = isCompressed; + + InputStream stream = in; + if (isBuffered) { + stream = new BufferedInputStream(stream); + } + + if (isCompressed) { + stream = new GZIPInputStream(stream); + } + + this.tarInputStream = new TarInputStream(stream); + } + + public boolean hasNextEntry() throws IOException { + this.currentEntry = this.tarInputStream.getNextEntry(); + if (this.currentEntry != null) { + return true; + } else { + return false; + } + } + + public String getEntryName() { + 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 void tarPutFile(TarOutputStream output, String fileName, byte[] data) throws IOException + public static class TarArchiveWriter implements AutoCloseable { - if (data == null) - return; - output.putNextEntry(new TarEntry( - TarHeader.createHeader(fileName, data.length, Util.unixTime(), false, 0644))); - output.write(data); + private boolean isBuffered; + private boolean isCompressed; + private final TarOutputStream tarOutputStream; + + public TarArchiveWriter (OutputStream out) throws IOException { + this(out, true, true); + } + + public TarArchiveWriter (OutputStream out, boolean isBuffered, boolean isCompressed) throws IOException { + this.isBuffered = isBuffered; + this.isCompressed = isCompressed; + + OutputStream stream = out; + + if (isBuffered) { + stream = new BufferedOutputStream(stream); + } + + if (isCompressed) { + stream = new GZIPOutputStream(stream); + } + + this.tarOutputStream = new TarOutputStream(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; + tarOutputStream.putNextEntry(new TarEntry(TarHeader.createHeader(filename, + data.length, Util.unixTime(), false, 0644))); + tarOutputStream.write(data); + } + + @Override + public void close() throws Exception { + tarOutputStream.close(); + } } } -- cgit v1.2.3-55-g7522