public void dirToZip(final Path srcDir, Path destZip) throws IOException, URISyntaxException {

    logger.debug("packaging " + srcDir + " -> " + destZip);

    if (Files.exists(destZip)) {
      logger.info("deleting existing " + destZip);
      Files.delete(destZip);
    }

    // destZip.toUri() does not work
    URI zipLocation = new URI("jar:file:" + destZip);

    // create zip
    Map<String, String> env = new HashMap<String, String>();
    env.put("create", "true");
    final FileSystem zipFs = FileSystems.newFileSystem(zipLocation, env);

    // copy recursively
    Files.walkFileTree(
        srcDir,
        new SimpleFileVisitor<Path>() {
          public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
              throws IOException {
            return copy(file);
          }

          public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
              throws IOException {
            return copy(dir);
          }

          private FileVisitResult copy(Path src) throws IOException {
            Path dest = src.subpath(srcDir.getNameCount() - 1, src.getNameCount());
            Path destInZip = zipFs.getPath(dest.toString());

            // permissions are not necessarily correct though, so they are also reset in comp
            Files.copy(
                src,
                destInZip,
                new CopyOption[] {
                  StandardCopyOption.COPY_ATTRIBUTES, StandardCopyOption.REPLACE_EXISTING
                });
            return FileVisitResult.CONTINUE;
          }
        });

    zipFs.close();
  }
  private void insertFile(
      Path apkPath, Map<String, String> zip_properties, File insert, String method, Path location)
      throws AndrolibException, IOException {
    // ZipFileSystem only writes at .close()
    // http://mail.openjdk.java.net/pipermail/nio-dev/2012-July/001764.html
    try (FileSystem fs = FileSystems.newFileSystem(apkPath, null)) {
      Path root = fs.getPath("/");

      // in order to get the path relative to the zip, we strip off the absolute path, minus what we
      // already have in the zip. thus /var/files/apktool/apk/unknown/folder/file => /folder/file
      Path dest =
          fs.getPath(root.toString(), insert.getAbsolutePath().replace(location.toString(), ""));
      Path newFile = Paths.get(insert.getAbsolutePath());
      Files.copy(newFile, dest, StandardCopyOption.REPLACE_EXISTING);
      fs.close();
    }
  }
  private void insertFolder(
      Path apkPath, Map<String, String> zip_properties, File insert, String method, Path location)
      throws AndrolibException, IOException {
    try (FileSystem fs = FileSystems.newFileSystem(apkPath, null)) {
      Path root = fs.getPath("/");
      Path dest =
          fs.getPath(root.toString(), insert.getAbsolutePath().replace(location.toString(), ""));
      Path parent = dest.normalize();

      // check for folder existing in apkFileSystem
      if (parent != null && Files.notExists(parent)) {
        if (!Files.isDirectory(parent, LinkOption.NOFOLLOW_LINKS)) {
          Files.createDirectories(parent);
        }
      }
      fs.close();
    }
  }
示例#4
0
  @Override
  public void download(String remote, String local, Collection<Option> options) throws IOException {
    local = ValidateUtils.checkNotNullAndNotEmpty(local, "Invalid argument local: %s", local);

    ClientSession session = getClientSession();
    FactoryManager manager = session.getFactoryManager();
    FileSystemFactory factory = manager.getFileSystemFactory();
    FileSystem fs = factory.createFileSystem(session);
    try {
      download(remote, fs, fs.getPath(local), options);
    } finally {
      try {
        fs.close();
      } catch (UnsupportedOperationException e) {
        // Ignore
      }
    }
  }
示例#5
0
  /** Example of usage of other than default filesystem */
  @Test
  public void testZipFileSystem() throws IOException {
    Path zipFile = getFileKeeper().copyResource(Paths.get("archived.zip"));
    assertTrue(Files.exists(zipFile));

    // chooses ZipFileSystemProvider
    FileSystem zipFS = FileSystems.newFileSystem(zipFile, null);
    assertNotNull("ZIP file system not installed", zipFS);

    Path root = zipFS.getPath("/");
    assertNotNull(root);
    assertTrue(Files.exists(root));

    List<Path> zipDirPaths = iterableToList(Files.newDirectoryStream(root));
    assertNotNull(zipDirPaths);
    // two files and one directory
    assertEquals(3, zipDirPaths.size());
    assertTrue(zipDirPaths.contains(zipFS.getPath("/mama.txt")));
    assertTrue(zipDirPaths.contains(zipFS.getPath("/dokument.docx")));
    assertTrue(zipDirPaths.contains(zipFS.getPath("/podpriecinok/")));
    // because Paths uses default filesystem
    assertFalse(zipDirPaths.contains(Paths.get("/mama.txt")));
    // file system need to be closed
    zipFS.close();

    // create new file archive
    // this dont work for me
    //		Map<String, String> attrs = new HashMap<>();
    //		attrs.put("create", "true"); // create of not exists, default is false
    //		// another possible attribute is "encoding"
    //
    //
    //		URI u = URI.create("zip:/test.zip");
    //		Path p =Paths.get(u);
    //		FileSystem tmpFS = FileSystems.newFileSystem(u, attrs);
    //
    //		tmpFS.close();
    //		getFileKeeper().markForWatch(emptyZip);
  }
示例#6
0
 @After
 public void after() throws Exception {
   fileSystem.close();
 }
示例#7
0
 @Override
 public void close() throws IOException {
   fileSystem.close();
 }