Example usage for org.apache.commons.compress.tar TarInputStream close

List of usage examples for org.apache.commons.compress.tar TarInputStream close

Introduction

In this page you can find the example usage for org.apache.commons.compress.tar TarInputStream close.

Prototype

public void close() throws IOException 

Source Link

Document

Closes this stream.

Usage

From source file:org.dcm4chex.archive.hsm.TarRetrieverService.java

private void extractTar(File tarFile, File cacheDir) throws IOException, VerifyTarException {
    int count = 0;
    long totalSize = 0;
    long free = FileSystemUtils.freeSpace(journal.getDataRootDir().getPath());
    long fsize = tarFile.length();
    long toDelete = fsize + minFreeDiskSpace - free;
    if (toDelete > 0)
        free += free(toDelete);//from w w  w. jav a 2  s.  co  m
    byte[] buf = new byte[bufferSize];
    TarInputStream tar = new TarInputStream(new FileInputStream(tarFile));
    InputStream in = tar;
    try {
        TarEntry entry = skipDirectoryEntries(tar);
        if (entry == null)
            throw new IOException("No entries in " + tarFile);
        String entryName = entry.getName();
        Map<String, byte[]> md5sums = null;
        MessageDigest digest = null;
        if ("MD5SUM".equals(entryName)) {
            if (checkMD5) {
                try {
                    digest = MessageDigest.getInstance("MD5");
                } catch (NoSuchAlgorithmException e) {
                    throw new RuntimeException(e);
                }
                md5sums = new HashMap<String, byte[]>();
                BufferedReader lineReader = new BufferedReader(new InputStreamReader(tar));
                String line;
                while ((line = lineReader.readLine()) != null) {
                    md5sums.put(line.substring(34), MD5Utils.toBytes(line.substring(0, 32)));
                }
            }
            entry = skipDirectoryEntries(tar);
        } else if (checkMD5) {
            getLog().warn("Missing MD5SUM entry in " + tarFile);
        }
        for (; entry != null; entry = skipDirectoryEntries(tar)) {
            entryName = entry.getName();
            // Retrieve saved MD5 checksum
            byte[] md5sum = null;
            if (md5sums != null && digest != null) {
                md5sum = md5sums.remove(entryName);
                if (md5sum == null)
                    throw new VerifyTarException("Unexpected TAR entry: " + entryName + " in " + tarFile);
                digest.reset();
                in = new DigestInputStream(tar, digest);
            }

            File fOri = new File(cacheDir, entryName.replace('/', File.separatorChar));
            File f = new File(fOri.getAbsolutePath() + ".tmp");
            File dir = f.getParentFile();
            if (dir.mkdirs()) {
                log.info("M-WRITE " + dir);
            }
            log.info("M-WRITE " + f);
            // Write the stream to file
            FileOutputStream out = new FileOutputStream(f);
            boolean cleanup = true;
            try {
                int len;
                while ((len = in.read(buf)) > 0) {
                    out.write(buf, 0, len);
                }
                cleanup = false;
            } finally {
                try {
                    out.close();
                } catch (Exception ignore) {
                }
                if (cleanup) {
                    log.info("M-DELETE " + f);
                    f.delete();
                }
            }

            // Verify MD5
            if (md5sums != null && digest != null) {
                if (!Arrays.equals(digest.digest(), md5sum)) {
                    log.info("M-DELETE " + f);
                    f.delete();
                    throw new VerifyTarException(
                            "Failed MD5 check of TAR entry: " + entryName + " in " + tarFile);
                } else
                    log.info("MD5 check is successful for " + entryName + " in " + tarFile);
            }
            free -= f.length();
            count++;
            totalSize += f.length();
            if (f.exists())
                f.renameTo(fOri);
        }
    } finally {
        tar.close();
    }
    toDelete = prefFreeDiskSpace - free;
    if (toDelete > 0) {
        freeNonBlocking(toDelete);
    }
}

From source file:org.dcm4chex.archive.hsm.VerifyTar.java

public static Map<String, byte[]> verify(InputStream in, String tarname, byte[] buf,
        ArrayList<String> objectNames) throws IOException, VerifyTarException {
    TarInputStream tar = new TarInputStream(in);
    try {//from w w w .  j a v  a2s  . com
        log.debug("Verify tar file: {}", tarname);
        TarEntry entry = tar.getNextEntry();
        if (entry == null)
            throw new VerifyTarException("No entries in " + tarname);
        String entryName = entry.getName();
        if (!"MD5SUM".equals(entryName))
            throw new VerifyTarException("Missing MD5SUM entry in " + tarname);
        BufferedReader dis = new BufferedReader(new InputStreamReader(tar));

        HashMap<String, byte[]> md5sums = new HashMap<String, byte[]>();
        String line;
        while ((line = dis.readLine()) != null) {
            char[] c = line.toCharArray();
            byte[] md5sum = new byte[16];
            for (int i = 0, j = 0; i < md5sum.length; i++, j++, j++) {
                md5sum[i] = (byte) ((fromHexDigit(c[j]) << 4) | fromHexDigit(c[j + 1]));
            }
            md5sums.put(line.substring(34), md5sum);
        }
        Map<String, byte[]> entries = new HashMap<String, byte[]>(md5sums.size());
        entries.putAll(md5sums);
        MessageDigest digest;
        try {
            digest = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
        while ((entry = tar.getNextEntry()) != null) {
            entryName = entry.getName();
            log.debug("START: Check MD5 of entry: {}", entryName);
            if (objectNames != null && !objectNames.remove(entryName))
                throw new VerifyTarException(
                        "TAR " + tarname + " contains entry: " + entryName + " not in file list");
            byte[] md5sum = (byte[]) md5sums.remove(entryName);
            if (md5sum == null)
                throw new VerifyTarException("Unexpected TAR entry: " + entryName + " in " + tarname);
            digest.reset();
            in = new DigestInputStream(tar, digest);
            while (in.read(buf) > 0)
                ;
            if (!Arrays.equals(digest.digest(), md5sum)) {
                throw new VerifyTarException("Failed MD5 check of TAR entry: " + entryName + " in " + tarname);
            }
            log.debug("DONE: Check MD5 of entry: {}", entryName);
        }
        if (!md5sums.isEmpty())
            throw new VerifyTarException("Missing TAR entries: " + md5sums.keySet() + " in " + tarname);
        if (objectNames != null && !objectNames.isEmpty())
            throw new VerifyTarException(
                    "Missing TAR entries from object list: " + objectNames.toString() + " in " + tarname);
        return entries;
    } finally {
        tar.close();
    }
}