/**
  * Collects configs.
  *
  * @param folderName folderName, usually just the empty string.
  * @return List of ConfigInfo, may be empty
  * @throws IOException if an entry could not be read.
  */
 public List<ConfigInfo> collect(final String folderName) throws IOException {
   final File[] itemDirs;
   if ("deleted".equals(type)) {
     itemDirs = overViewhistoryDao.getDeletedJobs(folderName);
   } else {
     itemDirs =
         (File[])
             ArrayUtils.addAll(
                 overViewhistoryDao.getDeletedJobs(folderName),
                 overViewhistoryDao.getJobs(folderName));
   }
   Arrays.sort(itemDirs, FileNameComparator.INSTANCE);
   for (final File itemDir : itemDirs) {
     getConfigsForType(itemDir, folderName);
   }
   return configs;
 }
 /**
  * Gets config history entries for the view options 'created', 'deleted' and 'jobs'. While 'jobs'
  * displays all available job config history entries, 'deleted' and 'created' only show the last
  * or the first one respectively.
  *
  * @param itemDir The job directory as File
  * @param folderName Something Jesse Glick came up with but never documented, probably the
  *     folderName.
  * @throws IOException If one of the entries cannot be read.
  */
 void getConfigsForType(File itemDir, String folderName) throws IOException {
   final String itemName =
       folderName.isEmpty() ? itemDir.getName() : folderName + "/" + itemDir.getName();
   final List<HistoryDescr> historyEntries =
       new ArrayList<HistoryDescr>(overViewhistoryDao.getJobHistory(itemName).values());
   if (historyEntries.isEmpty()) {
     return;
   }
   final boolean isADeletedJob = DeletedFileFilter.accepts(itemName);
   final boolean isNotADeletedJob = !isADeletedJob;
   if ("created".equals(type)) {
     if (isADeletedJob) {
       return;
     }
     HistoryDescr histDescr = historyEntries.get(0);
     if ("Created".equals(histDescr.getOperation())) {
       final ConfigInfo config = ConfigInfo.create(itemName, true, histDescr, true);
       configs.add(config);
     } else {
       // Why would the created entry not be the first one? Answer:
       // There's always a 'Changed' entry before the 'Created' entry,
       // because in the Jenkins core, when creating a new job,
       // the SaveableListener (which handles changes) fires
       // before the ItemListener (which handles creation, deletion etc.)
       // Older versions of the plugin didn't show this behaviour
       // since it was masked by some race condition.
       histDescr = historyEntries.get(1);
       if ("Created".equals(histDescr.getOperation())) {
         final ConfigInfo config = ConfigInfo.create(itemName, true, histDescr, true);
         configs.add(config);
       }
     }
   } else if ("deleted".equals(type)) {
     final HistoryDescr histDescr = historyEntries.get(historyEntries.size() - 1);
     if ("Deleted".equals(histDescr.getOperation())) {
       final ConfigInfo config = ConfigInfo.create(itemName, false, histDescr, false);
       configs.add(config);
     }
   } else {
     configs.addAll(
         HistoryDescrToConfigInfo.convert(itemName, true, historyEntries, isNotADeletedJob));
   }
 }