All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.gesellix.docker.client.container.ArchiveUtil.groovy Maven / Gradle / Ivy

package de.gesellix.docker.client.container

import de.gesellix.util.IOUtils
import groovy.util.logging.Slf4j
import okio.Okio
import okio.Sink
import okio.Source
import org.apache.commons.compress.archivers.tar.TarArchiveEntry
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream

@Slf4j
class ArchiveUtil {

  byte[] extractSingleTarEntry(InputStream tarContent, String filename) {
    def stream = new TarArchiveInputStream(new BufferedInputStream(tarContent))

    TarArchiveEntry entry = stream.nextTarEntry
    log.debug("entry size: ${entry.size}")

    String entryName = entry.name
    if (!filename.endsWith(entryName)) {
      log.warn("entry name '${entryName}' doesn't match expected filename '${filename}'")
    }
    else {
      log.debug("entry name: ${entryName}")
    }

    byte[] content = new byte[(int) entry.size]
    log.debug("going to read ${content.length} bytes")

    stream.read(content, 0, content.length)
    IOUtils.closeQuietly(Okio.source(stream))

    return content
  }

  int copySingleTarEntry(InputStream tarContent, String filename, OutputStream target) {
    def stream = new TarArchiveInputStream(new BufferedInputStream(tarContent))

    TarArchiveEntry entry = stream.nextTarEntry
    log.debug("entry size: ${entry.size}")

    String entryName = entry.name
    if (!filename.endsWith(entryName)) {
      log.warn("entry name '${entryName}' doesn't match expected filename '${filename}'")
    }
    else {
      log.debug("entry name: ${entryName}")
    }

    byte[] content = new byte[(int) entry.size]
    log.debug("going to read ${content.length} bytes")

    Source source = Okio.source(stream)
    Sink sink = Okio.sink(target)
    IOUtils.copy(source, sink)
    sink.flush()
    sink.close()
    return entry.size
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy