private void printInputParameters(
     final PrintWriter w, BulkParameterFactory f, ExperimentRunSettings s, boolean allParams) {
   w.println("<form action=\"#\">");
   w.println("<h2>Input parameters</h2>");
   w.println("<table>");
   for (final ParameterType t : ParameterType.values()) {
     if (!allParams && t.getDescription().isEmpty()) {
       continue;
     }
     w.println("<tr><td style=\"vertical-align:top;text-align:right\">");
     w.println(t.toString());
     w.println("</td><td style=\"vertical-align:top\">");
     w.println(this.getInputFor(t, f));
     w.println("</td><td style=\"vertical-align:top\">");
     w.println(t.getDescription());
     w.println("</td></tr>");
   }
   w.println("</table>");
   w.println("<h2>Experiment settings</h2>");
   w.println("<table>");
   for (final ExperimentRunParameters t : ExperimentRunParameters.values()) {
     w.println("<tr><td style=\"vertical-align:top;text-align:right\">");
     w.println(t.toString());
     w.println("</td><td style=\"vertical-align:top\">");
     w.println(this.getInputFor(t, s));
     w.println("</td><td style=\"vertical-align:top\">");
     w.println(t.getDescription());
     w.println("</td></tr>");
   }
   w.println("</table>");
   w.println("<button type=\"submit\">Start simulation</button>");
   w.println("</form>");
 }
 private Properties parametersToProperties(BulkParameterFactory f) {
   final Properties ret = new Properties();
   for (final ParameterType type : ParameterType.values()) {
     ret.setProperty(type.name(), f.getParam(type).toString());
   }
   return ret;
 }
 private String getInputFor(ParameterType t, BulkParameterFactory f) {
   if (t.getType().isEnum()) {
     final StringBuilder ret = new StringBuilder();
     ret.append("<select name=\"").append(t.name()).append("\">");
     for (final Object o : t.getType().getEnumConstants()) {
       if (o.equals(f.getParam(t))) {
         ret.append("<option selected=\"selected\">");
       } else {
         ret.append("<option>");
       }
       ret.append(o.toString()).append("</option>");
     }
     ret.append("</select>");
     return ret.toString();
   } else if (t.getType().equals(Double.class)) {
     return "<input name=\""
         + t.name()
         + "\" value=\""
         + f.getParam(t)
         + "\" type=\"number\" step=\"any\" />";
   } else if (t.getType().equals(Integer.class)) {
     return "<input name=\""
         + t.name()
         + "\" value=\""
         + f.getParam(t)
         + "\" type=\"number\" step=\"1\" />";
   } else {
     return "Invalid type: " + t.getType();
   }
 }
 private BulkParameterFactory getParameters(PrintWriter w, HttpServletRequest request) {
   BulkParameterFactory f = BulkParameterFactory.forCommercial();
   for (final ParameterType t : ParameterType.values()) {
     final String param = request.getParameter(t.name());
     if (param != null && !param.isEmpty()) {
       try {
         f = f.copyWithChangedParam(t, t.parse(param));
       } catch (final RuntimeException e) {
         this.printParseError(w, t.toString(), e);
       }
     }
   }
   return f;
 }
  private BulkParameterFactory loadParameters(int requestId) throws IOException {
    final File requestDir = this.getRequestDir(requestId);
    final File paramsFile = new File(requestDir, PARAMS_PROPERTIES);
    try (FileInputStream in = new FileInputStream(paramsFile)) {
      final Properties properties = new Properties();
      properties.load(in);

      BulkParameterFactory ret = BulkParameterFactory.forCommercial();
      for (final String name : properties.stringPropertyNames()) {
        final ParameterType type = ParameterType.valueOf(name);
        ret = ret.copyWithChangedParam(type, type.parse(properties.getProperty(name)));
      }
      return ret;
    }
  }
  private void handleDetailsPage(
      HttpServletRequest request, HttpServletResponse response, int requestId, int runNbr)
      throws IOException {

    final BulkParameterFactory f = this.createRunDirectoryIfMissing(requestId, runNbr);

    response.setContentType("text/html;charset=utf-8");
    response.setStatus(HttpServletResponse.SC_OK);

    final PrintWriter w = response.getWriter();
    w.println("<h2>Details for run " + runNbr + "</h2>");
    w.println("<h3>Parameters</h3>");
    for (final ParameterType type : ParameterType.values()) {
      w.println(type + ": " + f.getParam(type) + "<br/>");
    }
    w.println("Seed: " + f.getSeed());

    w.println("<h3>Pre commit review</h3>");
    w.println(
        "<img src=\"ExperimentPRE_COMMIT_runplotBoard.png\" /><img src=\"ExperimentPRE_COMMIT_runplotResults.png\" /><br/>");
    w.println(
        "<iframe width=\"800\" height=\"400\" src=\"ExperimentPRE_COMMIT_run_report.html\">Report</iframe><br/>");
    w.println("<a href=\"ExperimentPRE_COMMIT_run_trace.html\">Trace</a><br/>");
    w.println("<a href=\"ExperimentPRE_COMMIT_run_error.html\">Error log</a><br/>");
    w.println("<a href=\"ExperimentPRE_COMMIT_run_debug.html\">Debug</a><br/>");

    w.println("<h3>Post commit review</h3>");
    w.println(
        "<img src=\"ExperimentPOST_COMMIT_runplotBoard.png\" /><img src=\"ExperimentPOST_COMMIT_runplotResults.png\" /><br/>");
    w.println(
        "<iframe width=\"800\" height=\"400\" src=\"ExperimentPOST_COMMIT_run_report.html\">Report</iframe><br/>");
    w.println("<a href=\"ExperimentPOST_COMMIT_run_trace.html\">Trace</a><br/>");
    w.println("<a href=\"ExperimentPOST_COMMIT_run_error.html\">Error log</a><br/>");
    w.println("<a href=\"ExperimentPOST_COMMIT_run_debug.html\">Debug</a><br/>");

    w.println("<h3>No review</h3>");
    w.println(
        "<img src=\"ExperimentNO_REVIEW_runplotBoard.png\" /><img src=\"ExperimentNO_REVIEW_runplotResults.png\" /><br/>");
    w.println(
        "<iframe width=\"800\" height=\"400\" src=\"ExperimentNO_REVIEW_run_report.html\">Report</iframe><br/>");
    w.println("<a href=\"ExperimentNO_REVIEW_run_trace.html\">Trace</a><br/>");
    w.println("<a href=\"ExperimentNO_REVIEW_run_error.html\">Error log</a><br/>");
    w.println("<a href=\"ExperimentNO_REVIEW_run_debug.html\">Debug</a><br/>");
  }