GEODE-2430: Refactor ZipUtils (cherry picked from commit 50aebcc)
Project: http://git-wip-us.apache.org/repos/asf/geode/repo Commit: http://git-wip-us.apache.org/repos/asf/geode/commit/f637dc6a Tree: http://git-wip-us.apache.org/repos/asf/geode/tree/f637dc6a Diff: http://git-wip-us.apache.org/repos/asf/geode/diff/f637dc6a Branch: refs/heads/master Commit: f637dc6a5145e6e331189efab8dd2e854889c67c Parents: 889d170 Author: Jared Stewart <jstew...@pivotal.io> Authored: Fri Feb 3 12:53:38 2017 -0800 Committer: Jinmei Liao <jil...@pivotal.io> Committed: Tue Feb 7 16:09:34 2017 -0800 ---------------------------------------------------------------------- ...xportImportClusterConfigurationCommands.java | 2 +- .../internal/configuration/utils/ZipUtils.java | 62 ++++++++------------ .../configuration/ZipUtilsJUnitTest.java | 2 +- 3 files changed, 27 insertions(+), 39 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/geode/blob/f637dc6a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ExportImportClusterConfigurationCommands.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ExportImportClusterConfigurationCommands.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ExportImportClusterConfigurationCommands.java index 5e45f3b..8ce56f0 100644 --- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ExportImportClusterConfigurationCommands.java +++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ExportImportClusterConfigurationCommands.java @@ -89,7 +89,7 @@ public class ExportImportClusterConfigurationCommands extends AbstractCommandsSu for (Configuration config : sc.getEntireConfiguration().values()) { sc.writeConfigToFile(config); } - ZipUtils.zip(sc.getSharedConfigurationDirPath(), zipFile.getCanonicalPath()); + ZipUtils.zipDirectory(sc.getSharedConfigurationDirPath(), zipFile.getCanonicalPath()); InfoResultData infoData = ResultBuilder.createInfoResultData(); byte[] byteData = FileUtils.readFileToByteArray(zipFile); http://git-wip-us.apache.org/repos/asf/geode/blob/f637dc6a/geode-core/src/main/java/org/apache/geode/management/internal/configuration/utils/ZipUtils.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/configuration/utils/ZipUtils.java b/geode-core/src/main/java/org/apache/geode/management/internal/configuration/utils/ZipUtils.java index 8944194..81161d6 100644 --- a/geode-core/src/main/java/org/apache/geode/management/internal/configuration/utils/ZipUtils.java +++ b/geode-core/src/main/java/org/apache/geode/management/internal/configuration/utils/ZipUtils.java @@ -22,6 +22,9 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URI; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.Enumeration; import java.util.Stack; import java.util.zip.ZipEntry; @@ -32,51 +35,36 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; /**** - * Utilities class to zip/unzip folder + * Utilities class to zip/unzip directory * */ public class ZipUtils { - public static void zip(String sourceFolderPath, String targetFilePath) throws Exception { - File sourceFolder = new File(sourceFolderPath); - File targetFile = new File(targetFilePath); - - if (!sourceFolder.exists()) { - throw new Exception("Source folder does not exist"); - } - - FileOutputStream fos = new FileOutputStream(targetFile); - ZipOutputStream zos = new ZipOutputStream(fos); - URI baseURI = sourceFolder.toURI(); - - Stack<File> fileStack = new Stack<File>(); - fileStack.push(sourceFolder); - - while (!fileStack.isEmpty()) { - File directory = fileStack.pop(); - - for (File child : directory.listFiles()) { - String name = baseURI.relativize(child.toURI()).getPath(); - - if (child.isDirectory()) { - fileStack.push(child); - zos.putNextEntry(new ZipEntry(name)); - } else { - if (!name.endsWith("zip")) { - ZipEntry zipEntry = new ZipEntry(name); - zos.putNextEntry(zipEntry); - InputStream in = new FileInputStream(child); - IOUtils.copy(in, zos); - IOUtils.closeQuietly(in); - } + public static void zipDirectory(Path sourceDirectory, Path targetFile) throws IOException { + Path p = Files.createFile(targetFile); + try (ZipOutputStream zs = new ZipOutputStream(Files.newOutputStream(p))) { + Files.walk(sourceDirectory).filter(path -> !Files.isDirectory(path)).forEach(path -> { + ZipEntry zipEntry = new ZipEntry(sourceDirectory.relativize(path).toString()); + try { + zs.putNextEntry(zipEntry); + zs.write(Files.readAllBytes(path)); + zs.closeEntry(); + } catch (Exception e) { + throw new RuntimeException("Unable to write zip file", e); } - } + }); } - IOUtils.closeQuietly(zos); } + public static void zipDirectory(String sourceDirectoryPath, String targetFilePath) + throws IOException { + Path sourceDirectory = Paths.get(sourceDirectoryPath); + Path targetFile = Paths.get(targetFilePath); + + zipDirectory(sourceDirectory, targetFile); + } - public static void unzip(String zipFilePath, String outputFolderPath) throws IOException { + public static void unzip(String zipFilePath, String outputDirectoryPath) throws IOException { ZipFile zipFile = new ZipFile(zipFilePath); @SuppressWarnings("unchecked") Enumeration<ZipEntry> zipEntries = (Enumeration<ZipEntry>) zipFile.entries(); @@ -84,7 +72,7 @@ public class ZipUtils { try { while (zipEntries.hasMoreElements()) { ZipEntry zipEntry = zipEntries.nextElement(); - String fileName = outputFolderPath + File.separator + zipEntry.getName(); + String fileName = outputDirectoryPath + File.separator + zipEntry.getName(); if (zipEntry.isDirectory()) { FileUtils.forceMkdir(new File(fileName)); http://git-wip-us.apache.org/repos/asf/geode/blob/f637dc6a/geode-core/src/test/java/org/apache/geode/management/internal/configuration/ZipUtilsJUnitTest.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/configuration/ZipUtilsJUnitTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/configuration/ZipUtilsJUnitTest.java index 4e34dd5..1791574 100755 --- a/geode-core/src/test/java/org/apache/geode/management/internal/configuration/ZipUtilsJUnitTest.java +++ b/geode-core/src/test/java/org/apache/geode/management/internal/configuration/ZipUtilsJUnitTest.java @@ -75,7 +75,7 @@ public class ZipUtilsJUnitTest { assertFalse(zipFile.exists()); assertFalse(zipFile.isFile()); - ZipUtils.zip(sourceFolder.getCanonicalPath(), zipFile.getCanonicalPath()); + ZipUtils.zipDirectory(sourceFolder.getCanonicalPath(), zipFile.getCanonicalPath()); assertTrue(zipFile.exists()); assertTrue(zipFile.isFile());