@Override
  protected void handleScriptletAction(Scriptlet scriptlet) {
    if (scriptlet != null && INTERPERET_TYPE.equals(scriptlet.getCodeType())) {
      String action = scriptlet.getCodeSource();

      if (GenericValidator.isBlankOrNull(action)) {
        return;
      }

      if (action.equals(HIV_INDETERMINATE_SCRIPT)
          || action.equals(HIV_N_SCRIPT)
          || action.equals(HIV_POSITIVE_SCRIPT)) {
        addHIVConclusion(action);
      }
    }
  }
  protected ActionForward performAction(
      ActionMapping mapping,
      ActionForm form,
      HttpServletRequest request,
      HttpServletResponse response)
      throws Exception {
    // The first job is to determine if we are coming to this action with an
    // ID parameter in the request. If there is no parameter, we are
    // creating a new Scriptlet.
    // If there is a parameter present, we should bring up an existing
    // Scriptlet to edit.
    String forward = FWD_SUCCESS;
    request.setAttribute(ALLOW_EDITS_KEY, "true");
    request.setAttribute(PREVIOUS_DISABLED, "false");
    request.setAttribute(NEXT_DISABLED, "false");

    String id = request.getParameter(ID);

    if (StringUtil.isNullorNill(id) || "0".equals(id)) {
      isNew = true;
    } else {
      isNew = false;
    }

    BaseActionForm dynaForm = (BaseActionForm) form;

    // server-side validation (validation.xml)
    ActionMessages errors = dynaForm.validate(mapping, request);
    if (errors != null && errors.size() > 0) {
      saveErrors(request, errors);
      // since we forward to jsp - not Action we don't need to repopulate
      // the lists here
      return mapping.findForward(FWD_FAIL);
    }

    String start = (String) request.getParameter("startingRecNo");
    String direction = (String) request.getParameter("direction");

    Scriptlet scriptlet = new Scriptlet();
    // get sysUserId from login module
    UserSessionData usd = (UserSessionData) request.getSession().getAttribute(USER_SESSION_DATA);
    String sysUserId = String.valueOf(usd.getSystemUserId());
    scriptlet.setSysUserId(sysUserId);

    // populate valueholder from form
    PropertyUtils.copyProperties(scriptlet, dynaForm);

    try {

      ScriptletDAO scriptletDAO = new ScriptletDAOImpl();

      if (!isNew) {
        // UPDATE
        scriptletDAO.updateData(scriptlet);

      } else {
        // INSERT
        scriptletDAO.insertData(scriptlet);
      }
    } catch (LIMSRuntimeException lre) {
      // bugzilla 2154
      LogEvent.logError("ScriptletUpdateAction", "performAction()", lre.toString());
      request.setAttribute(IActionConstants.REQUEST_FAILED, true);
      errors = new ActionMessages();
      java.util.Locale locale =
          (java.util.Locale) request.getSession().getAttribute("org.apache.struts.action.LOCALE");
      ActionError error = null;
      if (lre.getException() instanceof org.hibernate.StaleObjectStateException) {
        // how can I get popup instead of struts error at the top of
        // page?
        // ActionMessages errors = dynaForm.validate(mapping, request);
        error = new ActionError("errors.OptimisticLockException", null, null);
      } else {
        // bugzilla 1482
        if (lre.getException() instanceof LIMSDuplicateRecordException) {
          String messageKey = "scriptlet.scriptletName";
          String msg =
              ResourceLocator.getInstance().getMessageResources().getMessage(locale, messageKey);
          error = new ActionError("errors.DuplicateRecord", msg, null);

        } else {
          error = new ActionError("errors.UpdateException", null, null);
        }
      }
      errors.add(ActionMessages.GLOBAL_MESSAGE, error);
      saveErrors(request, errors);
      request.setAttribute(Globals.ERROR_KEY, errors);
      // bugzilla 1485: allow change and try updating again (enable save button)
      // request.setAttribute(IActionConstants.ALLOW_EDITS_KEY, "false");
      // disable previous and next
      request.setAttribute(PREVIOUS_DISABLED, "true");
      request.setAttribute(NEXT_DISABLED, "true");
      forward = FWD_FAIL;
    }
    if (forward.equals(FWD_FAIL)) return mapping.findForward(forward);

    // initialize the form
    dynaForm.initialize(mapping);
    // repopulate the form from valueholder
    PropertyUtils.copyProperties(dynaForm, scriptlet);

    if ("true".equalsIgnoreCase(request.getParameter("close"))) {
      forward = FWD_CLOSE;
    }

    if (scriptlet.getId() != null && !scriptlet.getId().equals("0")) {
      request.setAttribute(ID, scriptlet.getId());
    }

    // bugzilla 1400
    if (isNew) forward = FWD_SUCCESS_INSERT;
    // bugzilla 1467 added direction for redirect to NextPreviousAction
    return getForward(mapping.findForward(forward), scriptlet.getId(), start, direction);
  }