private List<String> constructArguments()
      throws IOException, XMLStreamException, URISyntaxException, UnspecifiedPladipusException {
    File peptideShakerJar = getJar();
    ArrayList<String> cmdArgs = new ArrayList<>();
    cmdArgs.add("java");
    cmdArgs.add("-Xmx" + MemoryWarningSystem.getAllowedRam() + "M");
    cmdArgs.add("-cp");
    cmdArgs.add(peptideShakerJar.getAbsolutePath());
    cmdArgs.add("eu.isas.peptideshaker.cmd.PeptideShakerCLI");
    // check if folder exists
    File outputFolder = new File(parameters.get("output_folder"));
    outputFolder.mkdirs();
    // check if reports are requested
    if (parameters.containsKey("reports")) {
      File outputReportFolder = new File(outputFolder, "reports");
      if (outputReportFolder.mkdirs()) {
        parameters.put("out_reports", outputReportFolder.getAbsolutePath());
      }
    }

    for (AllowedPeptideShakerParams aParameter : AllowedPeptideShakerParams.values()) {
      if (parameters.containsKey(aParameter.getId())) {
        cmdArgs.add("-" + aParameter.getId());
        cmdArgs.add(parameters.get(aParameter.getId()));
      } else if (aParameter.isMandatory()) {
        throw new IllegalArgumentException("Missing mandatory parameter : " + aParameter.id);
      }
    }
    // check if spectra need to be exported
    if (parameters.containsKey("spectrum_folder")) {
      File exportFolder = new File(parameters.get("spectrum_folder"));
      exportFolder.mkdirs();
    }
    // also add these for other possible CLI's?
    for (AllowedPeptideShakerFollowUpParams aParameter :
        AllowedPeptideShakerFollowUpParams.values()) {
      if (parameters.containsKey(aParameter.getId())) {
        cmdArgs.add("-" + aParameter.getId());
        cmdArgs.add(parameters.get(aParameter.getId()));
      }
    }

    for (Map.Entry<String, String> aParameter : parameters.entrySet()) {
      cmdArgs.add("-" + aParameter.getKey());
      cmdArgs.add(parameters.get(aParameter.getValue()));
    }

    return cmdArgs;
  }
 /** @param usageThreshold the memory threshold */
 public MemoryWarningSystem(double usageThreshold) {
   LOGGER.debug("Started memory monitoring");
   MemoryWarningSystem.setPercentageUsageThreshold(usageThreshold);
   MemoryMXBean mbean = ManagementFactory.getMemoryMXBean();
   NotificationEmitter emitter = (NotificationEmitter) mbean;
   emitter.addNotificationListener(
       new NotificationListener() {
         @Override
         public void handleNotification(Notification n, Object hb) {
           if (n.getType().equals(MemoryNotificationInfo.MEMORY_THRESHOLD_EXCEEDED)) {
             long maxMemory = tenuredGenPool.getUsage().getMax();
             long usedMemory = tenuredGenPool.getUsage().getUsed();
             for (MemoryListener listener : listeners) {
               listener.checkMemoryUsage(usedMemory, maxMemory);
             }
           }
         }
       },
       null,
       null);
 }