public static List<ScheduledWorkFlowJob> searchWorkflowJobs(
      String pageSize, String pageNumber, String workflowJobId, String workflowName, String status)
      throws IOException {

    String workflowsPath =
        LoaderServerConfiguration.instance().getJobFSConfig().getWorkflowJobsPath();
    File[] workflowDirs = new File(workflowsPath).listFiles();
    Arrays.sort(
        workflowDirs,
        new Comparator<File>() {
          public int compare(File f1, File f2) {
            return Long.valueOf(f1.lastModified()).compareTo(f2.lastModified());
          }
        });
    ArrayList<ScheduledWorkFlowJob> result = new ArrayList<ScheduledWorkFlowJob>();
    for (File workflowDir : workflowDirs) {
      File f = new File(workflowDir.getAbsolutePath() + File.separator + "status.json");
      ScheduledWorkFlowJob scheduledWorkFlowJob =
          objectMapper.readValue(f, ScheduledWorkFlowJob.class);
      result.add(scheduledWorkFlowJob);
    }
    ArrayList<ScheduledWorkFlowJob> filter = new ArrayList<ScheduledWorkFlowJob>();
    if (!workflowJobId.equals("")) {
      for (ScheduledWorkFlowJob r : result) {
        if (r.getWorkFlowId().contains(workflowJobId)) filter.add(r);
      }
    }
    result.removeAll(filter);
    filter.clear();
    if (!workflowName.equals("")) {
      for (ScheduledWorkFlowJob r : result) {
        if (r.getWorkflowName().contains(workflowName)) filter.add(r);
      }
    }
    result.removeAll(filter);
    filter.clear();
    if (!status.equals("")) {
      for (ScheduledWorkFlowJob r : result) {
        if (r.getStatus().equals(status)) filter.add(r);
      }
    }
    result.removeAll(filter);
    filter.clear();
    int size = Integer.parseInt(pageSize);
    int numberOfPages = result.size() / size + 1;
    int startIndex = (Integer.parseInt(pageNumber) - 1) * size;
    int lastIndex = startIndex + size > result.size() ? result.size() : startIndex + size;
    return result.subList(startIndex, lastIndex);
  }
 // both reads and writes - need to be synchronized for consistent data to be written
 public static void deleteWorkflowJob(String workflowJobId) throws IOException {
   String workflowJobPath =
       LoaderServerConfiguration.instance().getJobFSConfig().getWorkflowJobPath(workflowJobId);
   File file = new File(workflowJobPath);
   if (!file.exists())
     throw new RuntimeException("WorkflowJobId " + workflowJobId + " not found.");
   File statusFile =
       new File(
           LoaderServerConfiguration.instance()
               .getJobFSConfig()
               .getWorkflowJobStatusPath(workflowJobId));
   ScheduledWorkFlowJob workflow = objectMapper.readValue(statusFile, ScheduledWorkFlowJob.class);
   FileHelper.deleteRecursively(file);
   File workflowJobsFile =
       new File(
           LoaderServerConfiguration.instance()
               .getJobFSConfig()
               .getScheduledWorkflowJobsFile(workflow.getWorkflowName()));
   synchronized (ScheduledWorkFlowJob.class) {
     ArrayList<String> allWorkflowJobIds =
         objectMapper.readValue(workflowJobsFile, ArrayList.class);
     allWorkflowJobIds.remove(workflowJobId);
     objectMapper.writerWithDefaultPrettyPrinter().writeValue(workflowJobsFile, allWorkflowJobIds);
   }
 }