protected void doGet(HttpServletRequest req, HttpServletResponse response)
      throws ServletException, IOException {

    // Restrict commands to local host if request is not secure
    if (!ServletUtil.checkSecureRequest(req, LOG)) {
      ServletUtil.reportServletError(
          response,
          "Secure connection is required. Prefix your request with 'https'",
          LOG,
          "Accessing secure command over non-secure line from remote host is not allowed.");
      return;
    }

    // Get the idInstrumentRun
    if (req.getParameter("idInstrumentRun") != null
        && !req.getParameter("idInstrumentRun").equals("")) {
      idInstrumentRun = Integer.valueOf(req.getParameter("idInstrumentRun"));
    }

    if (idInstrumentRun == null) {
      LOG.error("idInstrumentRun required");

      response.setContentType("text/html");
      response.getOutputStream().println("<html><head><title>Error</title></head>");
      response.getOutputStream().println("<body><b>");
      response.getOutputStream().println("Missing parameter:  idInstrumentRun required" + "<br>");
      response.getOutputStream().println("</body>");
      response.getOutputStream().println("</html>");
      return;
    }

    if (req.getParameter("codeReactionType") != null
        && !req.getParameter("codeReactionType").equals("")) {
      codeReactionType = req.getParameter("codeReactionType");
    }

    InputStream in = null;
    SecurityAdvisor secAdvisor = null;

    try {

      // Get security advisor
      secAdvisor =
          (SecurityAdvisor)
              req.getSession().getAttribute(SecurityAdvisor.SECURITY_ADVISOR_SESSION_KEY);

      if (secAdvisor != null) {

        Session sess =
            secAdvisor.getHibernateSession(
                req.getUserPrincipal() != null ? req.getUserPrincipal().getName() : "guest");
        ir = (InstrumentRun) sess.load(InstrumentRun.class, idInstrumentRun);

        String runName =
            ir.getLabel() != null && !ir.getLabel().equals("")
                ? ir.getLabel()
                : ir.getIdInstrumentRun().toString();
        runName = runName.replaceAll("\\s", "_");
        String runFileName = runName + ".plt";

        // Check permissions
        if (!secAdvisor.hasPermission(SecurityAdvisor.CAN_MANAGE_DNA_SEQ_CORE)) {
          response.setContentType("text/html");
          response.getOutputStream().println("<html><head><title>Error</title></head>");
          response.getOutputStream().println("<body><b>");
          response
              .getOutputStream()
              .println(
                  "DownloadABIRunFileServlet: Insufficient permission to generate ABI Run (.plt) file."
                      + "<br>");
          response.getOutputStream().println("</body>");
          response.getOutputStream().println("</html>");
          System.out.println(
              "DownloadABIRunFileServlet: Insufficient  permission to generate ABI Run (.plt) file.");
          return;
        }

        response.setContentType("application/x-download");
        response.setHeader("Content-Disposition", "attachment;filename=" + runFileName);
        response.setHeader("Cache-Control", "max-age=0, must-revalidate");

        OutputStream out = response.getOutputStream();

        // Change run status
        if (ir.getCodeInstrumentRunStatus() == null
            || ir.getCodeInstrumentRunStatus().equals(InstrumentRunStatus.PENDING)) {
          ir.setCodeInstrumentRunStatus(InstrumentRunStatus.RUNNING);
          if (ir.getRunDate() == null) {
            ir.setRunDate(new java.util.Date(System.currentTimeMillis()));
          }
        }

        changeRequestsToProcessing(sess, ir);
        sess.flush();

        // Run headers
        if (codeReactionType.equals(ReactionType.FRAGMENT_ANALYSIS_REACTION_TYPE)) {
          response
              .getOutputStream()
              .print(
                  "Container Name\tPlate ID\tDescription\tContainerType\tAppType\tOwner\tOperator\tPlateSealing\tSchedulingPref\t\n");
        } else {
          response
              .getOutputStream()
              .print(
                  "Container Name\tPlate ID\tDescription\tApplication\tContainerType\tOwner\tOperator\tPlateSealing\tSchedulingPref\t\r\n");
        }
        // Run information
        SealType sealType = (SealType) sess.get(SealType.class, ir.getCodeSealType());
        String sealTypeText = sealType.getSealType();

        String plateID = "";
        if (codeReactionType.equals(ReactionType.SEQUENCING_REACTION_TYPE)) {
          plateID = runName;
        } else {
          plateID = idInstrumentRun.toString();
        }
        String owner = "";
        AppUser user = (AppUser) sess.get(AppUser.class, Integer.valueOf(ir.getCreator()));
        owner = user.getShortName() != null ? user.getShortName() : "Core";

        if (codeReactionType.equals(ReactionType.SEQUENCING_REACTION_TYPE)) {
          response
              .getOutputStream()
              .print(
                  runName
                      + "\t"
                      + plateID
                      + "\t\tSequencingAnalysis\t384-Well\t"
                      + owner
                      + "\t3730-1\t"
                      + sealTypeText
                      + "\t1234\t\r\n");
        } else if (codeReactionType.equals(ReactionType.MITO_DLOOP_REACTION_TYPE)) {
          response
              .getOutputStream()
              .print(
                  runName
                      + "\t"
                      + plateID
                      + "\t\tSequencingAnalysis\t384-Well\t"
                      + owner
                      + "\t"
                      + owner
                      + "\t"
                      + sealTypeText
                      + "\t1234\t\r\n");
        } else {
          response
              .getOutputStream()
              .print(
                  runName
                      + "\t"
                      + plateID
                      + "\t\t384-Well\tRegular\t"
                      + owner
                      + "\t"
                      + owner
                      + "\t"
                      + sealTypeText
                      + "\t1234\t\n");
          response.getOutputStream().print("AppServer\tAppInstance\t\n");
          response.getOutputStream().print("GeneMapper\tGeneMapper_Generic_Instance\t\n");
        }

        // Well headers
        if (codeReactionType.equals(ReactionType.FRAGMENT_ANALYSIS_REACTION_TYPE)) {
          response
              .getOutputStream()
              .print(
                  "Well\tSample Name\tComment\tSampleType\tSnp Set\tAnalysis Method\tPanel"
                      + "\tUser-Defined 3\tSize Standard"
                      + "\tUser-Defined 2\tUser-Defined 1"
                      + "\tResults Group 1\tInstrument Protocol 1"
                      + "\tResults Group 2\tInstrument Protocol 2"
                      + "\tResults Group 3\tInstrument Protocol 3"
                      + "\tResults Group 4\tInstrument Protocol 4"
                      + "\tResults Group 5\tInstrument Protocol 5\t\r\n");
        } else {
          response
              .getOutputStream()
              .print(
                  "Well\tSample Name\tComment\tResults Group"
                      + "\tInstrument Protocol 1\tAnalysis Protocol 1"
                      + "\tInstrument Protocol 2\tAnalysis Protocol 2"
                      + "\tInstrument Protocol 3\tAnalysis Protocol 3"
                      + "\tInstrument Protocol 4\tAnalysis Protocol 4"
                      + "\tInstrument Protocol 5\tAnalysis Protocol 5\t\r\n");
        }

        Element runNode = getRunWells(sess);

        if (runNode != null) {
          Iterator i = runNode.getChildren("PlateWell").iterator();

          for (char row = 'A'; row <= 'P'; row++) {
            for (int col = 1; col <= 24; col++) {

              if (i.hasNext()) {
                Element well = (Element) i.next();

                String idPlateWellString =
                    well.getAttributeValue("idPlateWell") != null
                        ? well.getAttributeValue("idPlateWell")
                        : "0";
                String sampleName =
                    well.getAttributeValue("sampleName") != null
                        ? well.getAttributeValue("sampleName")
                        : "";
                if (well.getAttributeValue("isControl") != null
                    && well.getAttributeValue("isControl").equals("Y")) {
                  sampleName = "pGem";
                }
                String idSample =
                    well.getAttributeValue("idSample") != null
                        ? well.getAttributeValue("idSample")
                        : "";
                String idPlate =
                    well.getAttributeValue("idPlate") != null
                        ? well.getAttributeValue("idPlate")
                        : "";
                String primer =
                    well.getAttributeValue("primer") != null
                        ? well.getAttributeValue("primer")
                        : "";
                String assay =
                    well.getAttributeValue("assay") != null ? well.getAttributeValue("assay") : "";
                String wellRow =
                    well.getAttributeValue("row") != null ? well.getAttributeValue("row") : "";
                int wellCol =
                    well.getAttributeValue("col") != null
                        ? Integer.valueOf(well.getAttributeValue("col"))
                        : 0;

                if (idPlateWellString != null && !idPlateWellString.equals("0")) {

                  if (well.getAttributeValue("isControl") != null
                      && well.getAttributeValue("isControl").equals("Y")) {
                    idSample = idPlateWellString;
                  }

                  response.getOutputStream().print(row + String.format("%02d", col) + "\t");

                  String fileName;
                  if (codeReactionType.equals(ReactionType.SEQUENCING_REACTION_TYPE)) {
                    fileName = sampleName;
                    fileName = fileName.replaceAll("\\s", "_");
                    response.getOutputStream().print(fileName + "\t");
                  } else if (codeReactionType.equals(ReactionType.MITO_DLOOP_REACTION_TYPE)) {
                    fileName = sampleName + "_" + primer;
                    fileName = fileName.replaceAll("\\s", "_");
                    response.getOutputStream().print(fileName + "\t");
                  } else if (codeReactionType.equals(
                      ReactionType.FRAGMENT_ANALYSIS_REACTION_TYPE)) {
                    fileName = sampleName + "_" + assay;
                    fileName = fileName.replaceAll("\\s", "_");
                    response.getOutputStream().print(fileName + "\t");
                  }

                  String comments = "<ID:" + idPlateWellString + ">";
                  if (codeReactionType.equals(ReactionType.SEQUENCING_REACTION_TYPE)) {
                    comments += "<WELL:" + wellRow + String.format("%02d", wellCol) + ">";
                  }
                  response.getOutputStream().print(comments + "\t");

                  if (codeReactionType.equals(ReactionType.SEQUENCING_REACTION_TYPE)) {
                    response.getOutputStream().print("HCI\tLongSeq50\tSeq_A\t\r\n");
                  } else if (codeReactionType.equals(ReactionType.MITO_DLOOP_REACTION_TYPE)) {
                    response.getOutputStream().print("HCI\tLongSeq50\tPCR\t\r\n");
                  } else if (codeReactionType.equals(
                      ReactionType.FRAGMENT_ANALYSIS_REACTION_TYPE)) {
                    response
                        .getOutputStream()
                        .print("\t\t\t\t\t\t\t\tHCI\tFragAnalysis-RCT_50_POP7\t\n");
                  }
                }
              }
            }
          }
        }

        out.close();
        out.flush();

      } else {
        response.setContentType("text/html");
        response.getOutputStream().println("<html><head><title>Error</title></head>");
        response.getOutputStream().println("<body><b>");
        response
            .getOutputStream()
            .println(
                "DownloadABIRunFileServlet: You must have a SecurityAdvisor in order to run this command."
                    + "<br>");
        response.getOutputStream().println("</body>");
        response.getOutputStream().println("</html>");
        System.out.println(
            "DownloadABIRunFileServlet: You must have a SecurityAdvisor in order to run this command.");
      }
    } catch (Exception e) {
      LOG.error("Exception in DownloadABIRunFileServlet: ", e);
      HibernateSession.rollback();
      response.setContentType("text/html");
      response.getOutputStream().println("<html><head><title>Error</title></head>");
      response.getOutputStream().println("<body><b>");
      response
          .getOutputStream()
          .println("DownloadABIRunFileServlet: An exception occurred " + e.toString() + "<br>");
      response.getOutputStream().println("</body>");
      response.getOutputStream().println("</html>");

    } finally {
      try {
        secAdvisor.closeHibernateSession();
      } catch (Exception e) {
        LOG.error("Exception in DownloadABIRunFileServlet: ", e);
      }
    }
  }