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 processFeaturePackContents(
     FeaturePack featurePack,
     ServerProvisioningDescription.FeaturePack.ContentFilters contentFilters,
     File outputDirectory,
     Set<String> filesProcessed,
     boolean excludeDependencies)
     throws IOException {
   final int fileNameWithoutContentsStart = Locations.CONTENT.length() + 1;
   try (JarFile jar = new JarFile(featurePack.getFeaturePackFile())) {
     for (String contentFile : featurePack.getContentFiles()) {
       final String outputFile = contentFile.substring(fileNameWithoutContentsStart);
       boolean include = true;
       if (contentFilters != null) {
         include = contentFilters.isInclude();
         for (FileFilter contentFilter : contentFilters.getFilters()) {
           if (contentFilter.matches(outputFile) && !contentFilter.isInclude()) {
             include = false;
             break;
           }
         }
       }
       if (!include) {
         getLog()
             .debugf(
                 "Skipping feature pack %s filtered content file %s",
                 featurePack.getFeaturePackFile(), outputFile);
         continue;
       }
       if (!filesProcessed.add(outputFile)) {
         getLog()
             .debugf(
                 "Skipping already processed feature pack %s content file %s",
                 featurePack.getFeaturePackFile(), outputFile);
         continue;
       }
       getLog()
           .debugf(
               "Adding feature pack %s content file %s",
               featurePack.getFeaturePackFile(), outputFile);
       FileUtils.extractFile(jar, contentFile, new java.io.File(outputDirectory, outputFile));
     }
   }
   if (!excludeDependencies) {
     for (FeaturePack dependency : featurePack.getDependencies()) {
       processFeaturePackContents(
           dependency, contentFilters, outputDirectory, filesProcessed, 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);
      }
    }
  }