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 +++++++++++++++++++-- .../container/ContainerDefinition.java | 51 +++------ 2 files changed, 133 insertions(+), 45 deletions(-) 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(); + } } } diff --git a/src/main/java/org/openslx/virtualization/configuration/container/ContainerDefinition.java b/src/main/java/org/openslx/virtualization/configuration/container/ContainerDefinition.java index 91cf50c..825d0c3 100644 --- a/src/main/java/org/openslx/virtualization/configuration/container/ContainerDefinition.java +++ b/src/main/java/org/openslx/virtualization/configuration/container/ContainerDefinition.java @@ -6,17 +6,14 @@ import com.google.gson.stream.JsonReader; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.kamranzafar.jtar.TarEntry; -import org.kamranzafar.jtar.TarInputStream; -import org.kamranzafar.jtar.TarOutputStream; -import org.openslx.util.TarArchiveUtil; +import org.openslx.util.Util; +import org.openslx.util.TarArchiveUtil.TarArchiveReader; +import org.openslx.util.TarArchiveUtil.TarArchiveWriter; import java.io.*; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.util.Objects; -import java.util.zip.GZIPInputStream; -import java.util.zip.GZIPOutputStream; public class ContainerDefinition { @@ -64,26 +61,15 @@ public class ContainerDefinition { ContainerDefinition containerDef = new ContainerDefinition(); try { - TarInputStream tis = new TarInputStream( - new GZIPInputStream(new BufferedInputStream(new ByteArrayInputStream(rawTarData)))); + TarArchiveReader tarReader = new TarArchiveReader(new ByteArrayInputStream(rawTarData), true, true); - TarEntry entry; - - while ((entry = tis.getNextEntry()) != null) { - byte[] rawData = new byte[1024]; - ByteArrayOutputStream output = new ByteArrayOutputStream(); - int count; - - // read everything from the TarInputStream for the current Entry - while ((count = tis.read(rawData)) != -1) { - output.write(rawData, 0, count); - } - - if (entry.getName().equals(CONTAINER_FILE)) - containerDef.setContainerRecipe(output.toByteArray()); - if (entry.getName().equals(CONTAINER_META_FILE)) - containerDef.setContainerMeta(output.toByteArray()); + while (tarReader.hasNextEntry()) { + if (tarReader.getEntryName().equals(CONTAINER_FILE)) + containerDef.setContainerRecipe(tarReader.readCurrentEntry()); + if (tarReader.getEntryName().equals(CONTAINER_META_FILE)) + containerDef.setContainerMeta(tarReader.readCurrentEntry()); } + tarReader.close(); } catch (IOException e) { LOGGER.error("Could not create a ContainerDefinition Object for rawTarData", e); @@ -127,18 +113,15 @@ public class ContainerDefinition { public ByteBuffer toByteBuffer() { ByteBuffer containerDef = null; - - try { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - TarOutputStream output = new TarOutputStream(new GZIPOutputStream(baos)); - - Gson gson = new GsonBuilder().setPrettyPrinting().create(); - TarArchiveUtil.tarPutFile(output, CONTAINER_META_FILE, gson.toJson(containerMeta)); - TarArchiveUtil.tarPutFile(output, CONTAINER_FILE, containerRecipe); - output.close(); + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try { + TarArchiveWriter tarWriter = new TarArchiveWriter(baos); + tarWriter.writeFile(CONTAINER_META_FILE, gson.toJson(containerMeta)); + tarWriter.writeFile(CONTAINER_FILE, containerRecipe); + Util.safeClose(tarWriter); containerDef = ByteBuffer.wrap(baos.toByteArray()); - } catch (IOException e) { LOGGER.warn("Could not create a tar file", e); } -- cgit v1.2.3-55-g7522