package org.ovirt.engine.core.utils.archivers.tar; import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; import java.util.HashMap; import java.util.Map; import org.apache.commons.compress.archivers.tar.TarArchiveEntry; import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class TarInMemoryExport implements AutoCloseable { protected static final Logger log = LoggerFactory.getLogger(TarInMemoryExport.class); private TarArchiveInputStream tarInputStream; public TarInMemoryExport(InputStream inputStream) { tarInputStream = new TarArchiveInputStream(inputStream); } /** * Extracting tarInputStream files and returns map with the file name as the key and the file content as the value * as string. This function does not support tar with directories. * * @return Map with the file names as the keys, and the file content as string value. */ public Map<String, ByteBuffer> unTar() throws IOException { Map<String, ByteBuffer> fileContent = new HashMap<>(); for (TarArchiveEntry tarEntry = tarInputStream.getNextTarEntry(); tarEntry != null; tarEntry = tarInputStream.getNextTarEntry()) { // Get Size of the file and create a byte array for the size. byte[] content = new byte[(int) tarEntry.getSize()]; // Read file from the archive into byte array. if (tarInputStream.read(content) == -1) { log.warn("File '{}' could not be read.", tarEntry.getFile()); } fileContent.put(tarEntry.getName(), ByteBuffer.wrap(content)); } return fileContent; } @Override public void close() throws IOException { tarInputStream.close(); } }