List of usage examples for org.apache.commons.compress.tar TarInputStream close
public void close() throws IOException
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(); } }