private void processFeaturePackConfig(
     ServerProvisioningFeaturePack provisioningFeaturePack,
     ServerProvisioning.Config provisioningConfig)
     throws IOException, XMLStreamException {
   FeaturePack featurePack = provisioningFeaturePack.getFeaturePack();
   getLog()
       .debug(
           "Processing provisioning feature pack "
               + featurePack.getFeaturePackFile()
               + " configs");
   try (ZipFile zipFile = new ZipFile(featurePack.getFeaturePackFile())) {
     for (ServerProvisioningFeaturePack.ConfigFile serverProvisioningFeaturePackConfigFile :
         provisioningFeaturePack.getDomainConfigFiles()) {
       processFeaturePackConfigFile(
           serverProvisioningFeaturePackConfigFile,
           zipFile,
           provisioningFeaturePack,
           provisioningConfig.getDomainConfigFiles());
     }
     for (ServerProvisioningFeaturePack.ConfigFile serverProvisioningFeaturePackConfigFile :
         provisioningFeaturePack.getStandaloneConfigFiles()) {
       processFeaturePackConfigFile(
           serverProvisioningFeaturePackConfigFile,
           zipFile,
           provisioningFeaturePack,
           provisioningConfig.getStandaloneConfigFiles());
     }
     for (ServerProvisioningFeaturePack.ConfigFile serverProvisioningFeaturePackConfigFile :
         provisioningFeaturePack.getHostConfigFiles()) {
       processFeaturePackConfigFile(
           serverProvisioningFeaturePackConfigFile,
           zipFile,
           provisioningFeaturePack,
           provisioningConfig.getHostConfigFiles());
     }
   }
 }
 private void processConfig(
     ServerProvisioning serverProvisioning, File outputDirectory, Set<String> filesProcessed)
     throws IOException, XMLStreamException {
   ServerProvisioning.Config provisioningConfig = serverProvisioning.getConfig();
   // 1. collect and merge each feature pack configs
   for (ServerProvisioningFeaturePack provisioningFeaturePack :
       serverProvisioning.getFeaturePacks()) {
     processFeaturePackConfig(provisioningFeaturePack, provisioningConfig);
   }
   // 2. assemble the merged configs
   for (ServerProvisioning.ConfigFile provisioningConfigFile :
       provisioningConfig.getDomainConfigFiles().values()) {
     if (provisioningConfigFile.getTemplateInputStreamSource() == null) {
       getLog()
           .debugf(
               "Skipping assembly of config file %s, template not set.",
               provisioningConfigFile.getOutputFile());
       continue;
     }
     getLog().debugf("Assembling config file %s", provisioningConfigFile.getOutputFile());
     filesProcessed.add(provisioningConfigFile.getOutputFile());
     new ConfigurationAssembler(
             provisioningConfig.getInputStreamSources(),
             provisioningConfigFile.getTemplateInputStreamSource(),
             "domain",
             provisioningConfigFile.getSubsystems(),
             new File(outputDirectory, provisioningConfigFile.getOutputFile()))
         .assemble();
   }
   for (ServerProvisioning.ConfigFile provisioningConfigFile :
       provisioningConfig.getStandaloneConfigFiles().values()) {
     if (provisioningConfigFile.getTemplateInputStreamSource() == null) {
       getLog()
           .debugf(
               "Skipping assembly of config file %s, template not set.",
               provisioningConfigFile.getOutputFile());
       continue;
     }
     getLog().debugf("Assembling config file %s", provisioningConfigFile.getOutputFile());
     filesProcessed.add(provisioningConfigFile.getOutputFile());
     new ConfigurationAssembler(
             provisioningConfig.getInputStreamSources(),
             provisioningConfigFile.getTemplateInputStreamSource(),
             "server",
             provisioningConfigFile.getSubsystems(),
             new File(outputDirectory, provisioningConfigFile.getOutputFile()))
         .assemble();
   }
   for (ServerProvisioning.ConfigFile provisioningConfigFile :
       provisioningConfig.getHostConfigFiles().values()) {
     if (provisioningConfigFile.getTemplateInputStreamSource() == null) {
       getLog()
           .debugf(
               "Skipping assembly of config file %s, template not set.",
               provisioningConfigFile.getOutputFile());
       continue;
     }
     getLog().debugf("Assembling config file %s", provisioningConfigFile.getOutputFile());
     filesProcessed.add(provisioningConfigFile.getOutputFile());
     new ConfigurationAssembler(
             provisioningConfig.getInputStreamSources(),
             provisioningConfigFile.getTemplateInputStreamSource(),
             "host",
             provisioningConfigFile.getSubsystems(),
             new File(outputDirectory, provisioningConfigFile.getOutputFile()))
         .assemble();
   }
 }