docs: private void recurseAndAddFiles(GraphRewrite event, EvaluationContext context,
                  Path tempFolder,
                  FileService fileService, ArchiveModel archiveModel,
                  FileModel parentFileModel, boolean subArchivesOnly)
      {
          checkCancelled(event);
  
          int numberAdded = 0;
  
          FileFilter filter = TrueFileFilter.TRUE;
          if (archiveModel instanceof IdentifiedArchiveModel)
          {
              filter = new IdentifiedArchiveFileFilter(archiveModel);
          }
  
          File fileReference;
          if (parentFileModel instanceof ArchiveModel)
              fileReference = new File(((ArchiveModel) parentFileModel).getUnzippedDirectory());
          else
              fileReference = parentFileModel.asFile();
  
          WindupJavaConfigurationService windupJavaConfigurationService = new WindupJavaConfigurationService(event.getGraphContext());
          File[] subFiles = fileReference.listFiles();
          if (subFiles == null)
              return;
  
          for (File subFile : subFiles)
          {
              if (!filter.accept(subFile))
                  continue;
  
              if (subArchivesOnly && !ZipUtil.endsWithZipExtension(subFile.getAbsolutePath()))
                  continue;
  
              FileModel subFileModel = fileService.createByFilePath(parentFileModel, subFile.getAbsolutePath());
  
              // check if this file should be ignored
              if (windupJavaConfigurationService.checkIfIgnored(event, subFileModel))
                  continue;
  
              numberAdded++;
              if (numberAdded % 250 == 0)
                  event.getGraphContext().commit();
  
              if (subFile.isFile() && ZipUtil.endsWithZipExtension(subFileModel.getFilePath()))
              {
                  File newZipFile = subFileModel.asFile();
                  ArchiveModel newArchiveModel = GraphService.addTypeToModel(event.getGraphContext(), subFileModel, ArchiveModel.class);
                  newArchiveModel.setParentArchive(archiveModel);
                  newArchiveModel.setArchiveName(newZipFile.getName());
  
                  /*
                   * New archive must be reloaded in case the archive should be ignored
                   */
                  newArchiveModel = GraphService.refresh(event.getGraphContext(), newArchiveModel);
  
                  ArchiveModel canonicalArchiveModel = null;
                  for (FileModel otherMatches : fileService.findAllByProperty(FileModel.SHA1_HASH, newArchiveModel.getSHA1Hash()))
                  {
                      if (otherMatches instanceof ArchiveModel && !otherMatches.equals(newArchiveModel) && !(otherMatches instanceof DuplicateArchiveModel))
                      {
                          canonicalArchiveModel = (ArchiveModel)otherMatches;
                          break;
                      }
                  }
  
                  if (canonicalArchiveModel != null)
                  {
                      // handle as duplicate
                      DuplicateArchiveModel duplicateArchive = GraphService.addTypeToModel(event.getGraphContext(), newArchiveModel, DuplicateArchiveModel.class);
                      duplicateArchive.setCanonicalArchive(canonicalArchiveModel);
  
                      // create dupes for child archives
                      unzipToTempDirectory(event, context, tempFolder, newZipFile, duplicateArchive, true);
                  } else
                  {
                      unzipToTempDirectory(event, context, tempFolder, newZipFile, newArchiveModel, false);
                  }
              } else if (subFile.isDirectory())
              {
                  recurseAndAddFiles(event, context, tempFolder, fileService, archiveModel, subFileModel, false);
              }
          }
      }