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);
     }
   }
 }