private void processFeaturePackCopyArtifacts(
     FeaturePack featurePack,
     File outputDirectory,
     Set<String> filesProcessed,
     ArtifactFileResolver artifactFileResolver,
     File schemaOutputDirectory,
     boolean excludeDependencies)
     throws IOException {
   processCopyArtifacts(
       featurePack.getDescription().getCopyArtifacts(),
       featurePack.getArtifactResolver(),
       outputDirectory,
       filesProcessed,
       artifactFileResolver,
       schemaOutputDirectory);
   if (!excludeDependencies) {
     for (FeaturePack dependency : featurePack.getDependencies()) {
       processFeaturePackCopyArtifacts(
           dependency,
           outputDirectory,
           filesProcessed,
           artifactFileResolver,
           schemaOutputDirectory,
           excludeDependencies);
     }
   }
 }
  private void processFeaturePackFilePermissions(
      FeaturePack featurePack, File outputDirectory, boolean excludeDependencies)
      throws IOException {
    final Path baseDir = Paths.get(outputDirectory.getAbsolutePath());
    final List<FilePermission> filePermissions = featurePack.getDescription().getFilePermissions();
    Files.walkFileTree(
        baseDir,
        new SimpleFileVisitor<Path>() {
          @Override
          public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
              throws IOException {
            String relative = baseDir.relativize(dir).toString();
            if (!OS_WINDOWS) {
              for (FilePermission perm : filePermissions) {
                if (perm.includeFile(relative)) {
                  Files.setPosixFilePermissions(dir, perm.getPermission());
                  continue;
                }
              }
            }
            return FileVisitResult.CONTINUE;
          }

          @Override
          public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
              throws IOException {
            String relative = baseDir.relativize(file).toString();
            if (!OS_WINDOWS) {
              for (FilePermission perm : filePermissions) {
                if (perm.includeFile(relative)) {
                  Files.setPosixFilePermissions(file, perm.getPermission());
                  continue;
                }
              }
            }
            return FileVisitResult.CONTINUE;
          }
        });
    if (!excludeDependencies) {
      for (FeaturePack dependency : featurePack.getDependencies()) {
        processFeaturePackFilePermissions(dependency, outputDirectory, excludeDependencies);
      }
    }
  }