public Path extract(Path targetPath) throws IOException, UserException {
        try {
            Path zipPath = downloadZip(targetPath);
            return extractZip(zipPath, targetPath);
        } finally {
            // clean temp path;
            for (Path p : cleanPathList) {
                FileUtils.deleteQuietly(p.toFile());
            }
        }
    }
@Test
    public void testExtract() {
        try {
            Files.copy(PluginTestUtil.getTestPath("source/test.zip"), PluginTestUtil.getTestPath("source/test-a.zip"));

            PluginZip util = new PluginZip(PluginTestUtil.getTestPathString("source/test-a.zip"), null);

            Path actualPath = util.extract(PluginTestUtil.getTestPath("target"));
            assertTrue(Files.isDirectory(actualPath));

            Path txtPath = FileSystems.getDefault().getPath(actualPath.toString(), "test.txt");
            assertTrue(Files.exists(txtPath));

            assertTrue(FileUtils.deleteQuietly(actualPath.toFile()));
        } catch (Exception e) {
            e.printStackTrace();
            assert false;
        }
    }