/* * Geotoolkit - An Open Source Java GIS Toolkit * http://www.geotoolkit.org * * (C) 2010, Geomatys * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotoolkit.nio; import java.io.File; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.zip.Adler32; import java.util.zip.Checksum; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipOutputStream; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; import static org.junit.Assert.*; /** * * @author Samuel Andrés */ public class ZipUtilitiesTest extends org.geotoolkit.test.TestBase { private final static Checksum CHECKSUM = new Adler32(); public ZipUtilitiesTest() { } @Test public void fileTestStored() throws IOException { File file1 = File.createTempFile("file1", ".txt"); File archive = File.createTempFile("archive", ".zip"); file1.deleteOnExit(); archive.deleteOnExit(); ZipUtilities.zip(archive.toPath(), CHECKSUM, file1.toPath()); ZipUtilities.unzip(archive.toPath(), CHECKSUM); List<String> zipContent = listContent(archive); assertEquals(zipContent.get(0), file1.getName()); } @Test public void fileTest() throws IOException { File file1 = File.createTempFile("file1", ".txt"); File archive = File.createTempFile("archive", ".zip"); file1.deleteOnExit(); archive.deleteOnExit(); ZipUtilities.zip(archive.toPath(), ZipOutputStream.DEFLATED, 9, CHECKSUM, file1.toPath()); ZipUtilities.unzip(archive.toPath(), CHECKSUM); List<String> zipContent = listContent(archive); assertEquals(zipContent.get(0), file1.getName()); } @Test public void directoryTest() throws IOException { final File dir = File.createTempFile("directory", null); dir.delete(); dir.mkdir(); dir.deleteOnExit(); final File file1 = File.createTempFile("file1", ".txt", dir); file1.deleteOnExit(); final File file2 = File.createTempFile("file2", ".txt", dir); file2.deleteOnExit(); final File dir2 = new File(dir, "directory2"); dir2.mkdir(); dir2.deleteOnExit(); final File file3 = File.createTempFile("file3", ".txt", dir2); file3.deleteOnExit(); final File archive = File.createTempFile("archive", ".zip"); archive.deleteOnExit(); ZipUtilities.zip(archive.toPath(), ZipOutputStream.DEFLATED, 9, CHECKSUM, dir.toPath()); final File extract = File.createTempFile("extract", null); extract.delete(); ZipUtilities.unzip(archive.toPath(), extract.toPath(), CHECKSUM); final List<String> files = new ArrayList<String>(); for (String file : extract.list()) { files.add(file); } // Checking extracted folder location. assertTrue(files.contains(dir.getName())); // Checking dir content files.clear(); File currentFile = new File(extract, dir.getName()); assertEquals(dir.listFiles().length, currentFile.listFiles().length); for (String file : currentFile.list()) { files.add(file); } for (String element : dir.list()) { assertTrue(files.contains(element)); } // Checking dir2 content. files.clear(); currentFile = new File(currentFile, dir2.getName()); assertEquals(dir2.listFiles().length, currentFile.listFiles().length); for (String file : currentFile.list()) { files.add(file); } for (String element : dir2.list()) { assertTrue(files.contains(element)); } IOUtilities.deleteRecursively(extract.toPath()); } @Test public void stringTest() throws IOException { File file1 = File.createTempFile("file1", ".txt"); File archive = File.createTempFile("archive", ".zip"); file1.deleteOnExit(); archive.deleteOnExit(); String file1Path = file1.getAbsolutePath(); String archivePath = archive.getAbsolutePath(); ZipUtilities.zip(Paths.get(archivePath), ZipOutputStream.DEFLATED, 9, CHECKSUM, Paths.get(file1Path)); ZipUtilities.unzip(Paths.get(archivePath), CHECKSUM); List<String> zipContent = listContent(archive); assertEquals(zipContent.get(0), file1.getName()); } /** * TODO disabled for now because toURL() on windows create error (path is file:/C:/... instead of file:///C:/...) */ @Test @Ignore public void urlTest() throws IOException, URISyntaxException { File file1 = File.createTempFile("file1", ".txt"); File archive = File.createTempFile("archive", ".zip"); file1.deleteOnExit(); archive.deleteOnExit(); URL url1 = file1.toURI().toURL(); URL urlArchive = archive.toURI().toURL(); ZipUtilities.zip(archive.toPath(), ZipOutputStream.DEFLATED, 9, CHECKSUM, Paths.get(url1.toURI())); ZipUtilities.unzip(Paths.get(urlArchive.toURI()), CHECKSUM); List<String> zipContent = listContent(archive); assertEquals(zipContent.get(0), file1.getName()); } @Test public void uriTest() throws IOException { File file1 = File.createTempFile("file1", ".txt"); File archive = File.createTempFile("archive", ".zip"); file1.deleteOnExit(); archive.deleteOnExit(); URI uri1 = file1.toURI(); URI uriArchive = archive.toURI(); ZipUtilities.zip(archive.toPath(), ZipOutputStream.DEFLATED, 9, CHECKSUM, Paths.get(uri1)); ZipUtilities.unzip(Paths.get(uriArchive), CHECKSUM); List<String> zipContent = listContent(archive); assertEquals(zipContent.get(0), file1.getName()); } @Test public void nioTest() throws IOException { Path file1 = Files.createTempFile(null, "_geotk1"); Path dir1 = Files.createTempDirectory(null); Path dir2 = Files.createTempDirectory(null); Path file2 = Files.createTempFile(dir1, null, "_geotk2"); Path file3 = Files.createTempFile(dir2, null, "_geotk3"); Path archive = Files.createTempFile("archive", ".zip"); Path targetDir = Files.createTempDirectory(null); ZipUtilities.zipNIO(archive, file1, dir1, dir2); ZipUtilities.unzipNIO(archive, targetDir, true); List<String> zipContent = listContent(archive); } /** * <p>This method lists the content of indicated archive.</p> * * @param archive Instance of ZipFile, File or String path * @return a list of archive entries. * @throws IOException */ public static List<String> listContent(final Object archive) throws IOException { final List<String> out = new ArrayList<String>(); ZipFile zf = null; if (archive instanceof ZipFile) { zf = (ZipFile) archive; } else if (archive instanceof File) { zf = new ZipFile((File) archive); } else if (archive instanceof String) { zf = new ZipFile((String) archive); } else if (archive instanceof Path) { zf = new ZipFile(((Path) archive).toFile()); } Enumeration entries = zf.entries(); while (entries.hasMoreElements()) { ZipEntry entry = (ZipEntry) entries.nextElement(); out.add(entry.getName()); } return out; } }