/** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    final String S_ProcName = "doGet";
    ICFSecuritySchemaObj schemaObj;
    HttpSession sess = request.getSession(false);
    if (sess == null) {
      sess = request.getSession(true);
      schemaObj = new CFSecuritySchemaPooledObj();
      sess.setAttribute("SchemaObj", schemaObj);
    } else {
      schemaObj = (ICFSecuritySchemaObj) sess.getAttribute("SchemaObj");
      if (schemaObj == null) {
        schemaObj = new CFSecuritySchemaPooledObj();
        sess.setAttribute("SchemaObj", schemaObj);
      }
    }

    ICFSecuritySchema dbSchema = null;
    try {
      CFSecurityAuthorization auth = schemaObj.getAuthorization();
      if (auth != null) {
        response.sendRedirect("CFSecuritySMWarSecurityMainHtml");
        return;
      }

      dbSchema = (ICFSecuritySchema) CFSecuritySchemaPool.getSchemaPool().getInstance();
      schemaObj.setBackingStore(dbSchema);
      schemaObj.beginTransaction();
      ICFSecuritySecUserObj systemUser =
          schemaObj.getSecUserTableObj().readSecUserByULoginIdx("system");
      String passwordHash = systemUser.getRequiredPasswordHash();
      if ((passwordHash == null)
          || (passwordHash.length() <= 0)
          || passwordHash.equals("bootstrap")) {
        response.sendRedirect("CFSecuritySMWarSetSystemPasswordHtml");
        return;
      }

      ICFSecuritySysClusterObj sysCluster =
          schemaObj.getSysClusterTableObj().readSysClusterByIdIdx(1, false);
      if (sysCluster == null) {
        throw CFLib.getDefaultExceptionFactory()
            .newNullArgumentException(getClass(), S_ProcName, 0, "sysCluster");
      }

      ICFSecurityClusterObj resolvedCluster = sysCluster.getRequiredContainerCluster();
      if (resolvedCluster == null) {
        throw CFLib.getDefaultExceptionFactory()
            .newNullArgumentException(getClass(), S_ProcName, "resolvedCluster");
      }
      String clusterDomainName = resolvedCluster.getRequiredFullDomainName();
      String clusterDescription = resolvedCluster.getRequiredDescription();

      String confirmationUUIDStr = (String) request.getParameter("ConfirmationUUID");
      if ((confirmationUUIDStr == null) || (confirmationUUIDStr.length() <= 0)) {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">");
        out.println("<HTML>");
        out.println("<BODY>");
        out.println("<form method=\"post\" formaction=\"CFSecuritySMWarConfirmEMailAddressHtml\">");
        out.println(
            "<H1 style=\"text-align:center\">" + clusterDescription + " Security Manager</H1>");
        out.println("<H2 style=\"text-align:center\">ERROR</H2>");
        out.println("<p>");
        out.println("<center>");
        out.println("<p>");
        out.println(
            "The ConfirmationUUID parameter was missing in your request.  Please use the link provided by your confirmation email.");
        out.println("</BODY>");
        out.println("</HTML>");
        return;
      }

      UUID confirmationUUID = UUID.fromString(confirmationUUIDStr);
      if (confirmationUUID == null) {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">");
        out.println("<HTML>");
        out.println("<BODY>");
        out.println("<form method=\"post\" formaction=\"CFSecuritySMWarConfirmEMailAddressHtml\">");
        out.println(
            "<H1 style=\"text-align:center\">" + clusterDescription + " Security Manager</H1>");
        out.println("<H2 style=\"text-align:center\">ERROR</H2>");
        out.println("<p>");
        out.println("<center>");
        out.println("<p>");
        out.println(
            "Invalid ConfirmationUUID \""
                + confirmationUUIDStr
                + "\".  Please use the link provided by your confirmation email.");
        out.println("</BODY>");
        out.println("</HTML>");
        return;
      }

      ICFSecuritySecUserObj cancelUser = null;
      Iterator<ICFSecuritySecUserObj> secUserForUUID =
          schemaObj.getSecUserTableObj().readSecUserByEMConfIdx(confirmationUUID).iterator();
      if (secUserForUUID.hasNext()) {
        cancelUser = secUserForUUID.next();
        if (secUserForUUID.hasNext()) {
          throw CFLib.getDefaultExceptionFactory()
              .newRuntimeException(
                  getClass(),
                  S_ProcName,
                  "Multiple SecUser instances found for ConfirmationUUID \""
                      + confirmationUUIDStr
                      + "\"");
        }
      } else {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">");
        out.println("<HTML>");
        out.println("<BODY>");
        out.println("<form method=\"post\" formaction=\"CFSecuritySMWarConfirmEMailAddressHtml\">");
        out.println(
            "<H1 style=\"text-align:center\">" + clusterDescription + " Security Manager</H1>");
        out.println("<H2 style=\"text-align:center\">ERROR</H2>");
        out.println("<p>");
        out.println("<center>");
        out.println("<p>");
        out.println(
            "Invalid ConfirmationUUID \""
                + confirmationUUIDStr
                + "\".  Please use the link provided by your confirmation email.");
        out.println("</BODY>");
        out.println("</HTML>");
        return;
      }

      ICFSecurityClusterObj systemCluster =
          schemaObj.getClusterTableObj().readClusterByUDomainNameIdx("system");
      ICFSecurityTenantObj systemTenant =
          schemaObj
              .getTenantTableObj()
              .readTenantByUNameIdx(systemCluster.getRequiredId(), "system");
      ICFSecuritySecSessionObj systemSession = schemaObj.getSecSessionTableObj().newInstance();
      ICFSecuritySecSessionEditObj editSystemSession =
          (ICFSecuritySecSessionEditObj) systemSession.beginEdit();
      editSystemSession.setRequiredContainerSecUser(systemUser);
      editSystemSession.setRequiredStart(Calendar.getInstance());
      systemSession = editSystemSession.create();
      editSystemSession.endEdit();

      auth = new CFSecurityAuthorization();
      auth.setSecCluster(systemCluster);
      auth.setSecTenant(systemTenant);
      auth.setSecSession(systemSession);
      schemaObj.setAuthorization(auth);

      ICFSecuritySecUserEditObj editCancelUser = cancelUser.beginEdit();
      editCancelUser.delete();
      editCancelUser.endEdit();

      editSystemSession = (ICFSecuritySecSessionEditObj) systemSession.beginEdit();
      editSystemSession.setOptionalFinish(Calendar.getInstance());
      editSystemSession.update();
      editSystemSession.endEdit();

      schemaObj.commit();

      schemaObj.setAuthorization(null);

      response.setContentType("text/html");
      PrintWriter out = response.getWriter();
      out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">");
      out.println("<HTML>");
      out.println("<BODY>");
      out.println("<form method=\"post\" formaction=\"CFSecuritySMWarConfirmEMailAddressHtml\">");
      out.println(
          "<H1 style=\"text-align:center\">" + clusterDescription + " Security Manager</H1>");
      out.println(
          "<H2 style=\"text-align:center\">Account creation for "
              + cancelUser.getRequiredEMailAddress()
              + " cancelled.</H2>");
      out.println("<p>");
      out.println("<center>");
      out.println("<table style=\"width:75%\">");
      out.println(
          "<tr><td colSpan=\"2\" style=\"text-align:center\">Take me to the "
              + clusterDescription
              + " Security Manager <A HRef=\"CFSecuritySMWarLoginHtml\">Log In</A> page.</td></tr>");
      out.println("</table>");
      out.println("</center>");
      out.println("</form>");
      out.println("</BODY>");
      out.println("</HTML>");
    } catch (RuntimeException e) {
      throw CFLib.getDefaultExceptionFactory()
          .newRuntimeException(
              getClass(), S_ProcName, "Caught RuntimeException -- " + e.getMessage(), e);
    } finally {
      if (dbSchema != null) {
        try {
          if (schemaObj.isTransactionOpen()) {
            schemaObj.rollback();
          }
        } catch (RuntimeException e) {
        }
        schemaObj.setBackingStore(null);
        CFSecuritySchemaPool.getSchemaPool().releaseInstance(dbSchema);
      }
    }
  }
  public void startElement(String uri, String localName, String qName, Attributes attrs)
      throws SAXException {
    try {
      // Common XML Attributes
      String attrId = null;
      // SecUser Attributes
      String attrLoginId = null;
      String attrEMailAddress = null;
      String attrEMailConfirmationUuid = null;
      String attrPasswordHash = null;
      String attrPasswordResetUuid = null;
      String attrDefDev = null;
      // SecUser References
      ICFSecuritySecDeviceObj refDefDev = null;
      // Attribute Extraction
      String attrLocalName;
      int numAttrs;
      int idxAttr;
      final String S_ProcName = "startElement";
      final String S_LocalName = "LocalName";

      assert qName.equals("SecUser");

      CFSecuritySaxLoader saxLoader = (CFSecuritySaxLoader) getParser();
      if (saxLoader == null) {
        throw CFLib.getDefaultExceptionFactory()
            .newNullArgumentException(getClass(), S_ProcName, 0, "getParser()");
      }

      ICFSecuritySchemaObj schemaObj = saxLoader.getSchemaObj();
      if (schemaObj == null) {
        throw CFLib.getDefaultExceptionFactory()
            .newNullArgumentException(getClass(), S_ProcName, 0, "getParser().getSchemaObj()");
      }

      // Instantiate an edit buffer for the parsed information
      ICFSecuritySecUserEditObj editBuff =
          (ICFSecuritySecUserEditObj) schemaObj.getSecUserTableObj().newInstance().beginEdit();

      // Extract Attributes
      numAttrs = attrs.getLength();
      for (idxAttr = 0; idxAttr < numAttrs; idxAttr++) {
        attrLocalName = attrs.getLocalName(idxAttr);
        if (attrLocalName.equals("Id")) {
          if (attrId != null) {
            throw CFLib.getDefaultExceptionFactory()
                .newUniqueIndexViolationException(
                    getClass(), S_ProcName, S_LocalName, attrLocalName);
          }
          attrId = attrs.getValue(idxAttr);
        } else if (attrLocalName.equals("LoginId")) {
          if (attrLoginId != null) {
            throw CFLib.getDefaultExceptionFactory()
                .newUniqueIndexViolationException(
                    getClass(), S_ProcName, S_LocalName, attrLocalName);
          }
          attrLoginId = attrs.getValue(idxAttr);
        } else if (attrLocalName.equals("EMailAddress")) {
          if (attrEMailAddress != null) {
            throw CFLib.getDefaultExceptionFactory()
                .newUniqueIndexViolationException(
                    getClass(), S_ProcName, S_LocalName, attrLocalName);
          }
          attrEMailAddress = attrs.getValue(idxAttr);
        } else if (attrLocalName.equals("EMailConfirmationUuid")) {
          if (attrEMailConfirmationUuid != null) {
            throw CFLib.getDefaultExceptionFactory()
                .newUniqueIndexViolationException(
                    getClass(), S_ProcName, S_LocalName, attrLocalName);
          }
          attrEMailConfirmationUuid = attrs.getValue(idxAttr);
        } else if (attrLocalName.equals("PasswordHash")) {
          if (attrPasswordHash != null) {
            throw CFLib.getDefaultExceptionFactory()
                .newUniqueIndexViolationException(
                    getClass(), S_ProcName, S_LocalName, attrLocalName);
          }
          attrPasswordHash = attrs.getValue(idxAttr);
        } else if (attrLocalName.equals("PasswordResetUuid")) {
          if (attrPasswordResetUuid != null) {
            throw CFLib.getDefaultExceptionFactory()
                .newUniqueIndexViolationException(
                    getClass(), S_ProcName, S_LocalName, attrLocalName);
          }
          attrPasswordResetUuid = attrs.getValue(idxAttr);
        } else if (attrLocalName.equals("DefDev")) {
          if (attrDefDev != null) {
            throw CFLib.getDefaultExceptionFactory()
                .newUniqueIndexViolationException(
                    getClass(), S_ProcName, S_LocalName, attrLocalName);
          }
          attrDefDev = attrs.getValue(idxAttr);
        } else if (attrLocalName.equals("schemaLocation")) {
          // ignored
        } else {
          throw CFLib.getDefaultExceptionFactory()
              .newUnrecognizedAttributeException(
                  getClass(), S_ProcName, getParser().getLocationInfo(), attrLocalName);
        }
      }

      // Ensure that required attributes have values
      if (attrLoginId == null) {
        throw CFLib.getDefaultExceptionFactory()
            .newNullArgumentException(getClass(), S_ProcName, 0, "LoginId");
      }
      if (attrEMailAddress == null) {
        throw CFLib.getDefaultExceptionFactory()
            .newNullArgumentException(getClass(), S_ProcName, 0, "EMailAddress");
      }
      if (attrPasswordHash == null) {
        throw CFLib.getDefaultExceptionFactory()
            .newNullArgumentException(getClass(), S_ProcName, 0, "PasswordHash");
      }

      // Save named attributes to context
      CFLibXmlCoreContext curContext = getParser().getCurContext();
      curContext.putNamedValue("Id", attrId);
      curContext.putNamedValue("LoginId", attrLoginId);
      curContext.putNamedValue("EMailAddress", attrEMailAddress);
      curContext.putNamedValue("EMailConfirmationUuid", attrEMailConfirmationUuid);
      curContext.putNamedValue("PasswordHash", attrPasswordHash);
      curContext.putNamedValue("PasswordResetUuid", attrPasswordResetUuid);
      curContext.putNamedValue("DefDev", attrDefDev);

      // Convert string attributes to native Java types
      // and apply the converted attributes to the editBuff.

      Integer natId;
      if ((attrId != null) && (attrId.length() > 0)) {
        natId = new Integer(Integer.parseInt(attrId));
      } else {
        natId = null;
      }
      String natLoginId = attrLoginId;
      editBuff.setRequiredLoginId(natLoginId);

      String natEMailAddress = attrEMailAddress;
      editBuff.setRequiredEMailAddress(natEMailAddress);

      UUID natEMailConfirmationUuid;
      if ((attrEMailConfirmationUuid == null) || (attrEMailConfirmationUuid.length() <= 0)) {
        natEMailConfirmationUuid = null;
      } else {
        natEMailConfirmationUuid = UUID.fromString(attrEMailConfirmationUuid);
      }
      editBuff.setOptionalEMailConfirmationUuid(natEMailConfirmationUuid);

      String natPasswordHash = attrPasswordHash;
      editBuff.setRequiredPasswordHash(natPasswordHash);

      UUID natPasswordResetUuid;
      if ((attrPasswordResetUuid == null) || (attrPasswordResetUuid.length() <= 0)) {
        natPasswordResetUuid = null;
      } else {
        natPasswordResetUuid = UUID.fromString(attrPasswordResetUuid);
      }
      editBuff.setOptionalPasswordResetUuid(natPasswordResetUuid);

      // Get the scope/container object

      CFLibXmlCoreContext parentContext = curContext.getPrevContext();
      Object scopeObj;
      if (parentContext != null) {
        scopeObj = parentContext.getNamedValue("Object");
      } else {
        scopeObj = null;
      }

      // Lookup refDefDev by key name value attr
      if ((attrDefDev != null) && (attrDefDev.length() > 0)) {
        refDefDev =
            (ICFSecuritySecDeviceObj)
                schemaObj
                    .getSecDeviceTableObj()
                    .readSecDeviceByIdIdx(editBuff.getOptionalDefaultDevSecUserId(), attrDefDev);
        if (refDefDev == null) {
          throw CFLib.getDefaultExceptionFactory()
              .newNullArgumentException(
                  getClass(),
                  S_ProcName,
                  0,
                  "Resolve DefDev reference named \"" + attrDefDev + "\" to table SecDevice");
        }
      } else {
        refDefDev = null;
      }
      editBuff.setOptionalLookupDefDev(refDefDev);

      CFSecuritySaxLoader.LoaderBehaviourEnum loaderBehaviour =
          saxLoader.getSecUserLoaderBehaviour();
      ICFSecuritySecUserEditObj editSecUser = null;
      ICFSecuritySecUserObj origSecUser =
          (ICFSecuritySecUserObj)
              schemaObj.getSecUserTableObj().readSecUserByULoginIdx(editBuff.getRequiredLoginId());
      if (origSecUser == null) {
        editSecUser = editBuff;
      } else {
        switch (loaderBehaviour) {
          case Insert:
            break;
          case Update:
            editSecUser = (ICFSecuritySecUserEditObj) origSecUser.beginEdit();
            editSecUser.setRequiredLoginId(editBuff.getRequiredLoginId());
            editSecUser.setRequiredEMailAddress(editBuff.getRequiredEMailAddress());
            editSecUser.setOptionalEMailConfirmationUuid(
                editBuff.getOptionalEMailConfirmationUuid());
            editSecUser.setRequiredPasswordHash(editBuff.getRequiredPasswordHash());
            editSecUser.setOptionalPasswordResetUuid(editBuff.getOptionalPasswordResetUuid());
            editSecUser.setOptionalLookupDefDev(editBuff.getOptionalLookupDefDev());
            break;
          case Replace:
            editSecUser = (ICFSecuritySecUserEditObj) origSecUser.beginEdit();
            editSecUser.delete();
            editSecUser.endEdit();
            origSecUser = null;
            editSecUser = editBuff;
            break;
        }
      }

      if (editSecUser != null) {
        if (origSecUser != null) {
          editSecUser.update();
        } else {
          origSecUser = (ICFSecuritySecUserObj) editSecUser.create();
        }
        editSecUser.endEdit();
      }

      curContext.putNamedValue("Object", origSecUser);
    } catch (RuntimeException e) {
      throw new RuntimeException(
          "Near "
              + getParser().getLocationInfo()
              + ": Caught and rethrew "
              + e.getClass().getName()
              + " - "
              + e.getMessage(),
          e);
    } catch (Error e) {
      throw new Error(
          "Near "
              + getParser().getLocationInfo()
              + ": Caught and rethrew "
              + e.getClass().getName()
              + " - "
              + e.getMessage(),
          e);
    }
  }