/** @return ArrayList of ListItem */
  private ArrayList<ListItem> CreateServiceList() {

    ArrayList<ListItem> itemsList = null;

    try {
      /*
       * Get the list of ProcessAgent names
       */
      ProcessAgents processAgents =
          this.serviceBrokerSession.getServiceManagement().getProcessAgents();
      String[] stringArray = processAgents.GetNamesAll();
      if (stringArray != null) {
        itemsList = new ArrayList<>();
        itemsList.add(new ListItem(LabConsts.STR_MakeSelection, LabConsts.STR_MakeSelection));
        for (String string : stringArray) {
          ProcessAgentInfo processAgentInfo = processAgents.RetrieveByName(string);
          if (processAgentInfo.isSelf() == false) {
            String label =
                String.format(
                    STR_ServiceNameType_arg2,
                    processAgentInfo.getAgentType().name(),
                    processAgentInfo.getAgentName());
            itemsList.add(new ListItem(label, processAgentInfo.getAgentName()));
          }
        }
      }
    } catch (Exception ex) {
      Logfile.WriteError(ex.toString());
    }

    return itemsList;
  }
  private void PopulateServiceInfo() {
    final String methodName = "PopulateServiceInfo";
    Logfile.WriteCalled(logLevel, STR_ClassName, methodName);

    try {
      /*
       * Retrieve the ProcessAgentInfo for the specified service
       */
      ProcessAgents processAgents =
          this.serviceBrokerSession.getServiceManagement().getProcessAgents();
      ProcessAgentInfo processAgentInfo = processAgents.RetrieveByName(this.hsomService);
      if (processAgentInfo == null) {
        throw new Exception(String.format(STRERR_RetrieveFailed_arg, this.hsomService));
      }

      /*
       * Update information
       */
      this.hitServiceName = processAgentInfo.getAgentName();
      this.hitServiceGuid = processAgentInfo.getAgentGuid();
      this.hitServiceUrl = processAgentInfo.getServiceUrl();
      this.hitClientUrl = processAgentInfo.getClientUrl();
      this.hitServiceType = processAgentInfo.getAgentType().toString();

      SystemSupportInfo systemSupportInfo = processAgentInfo.getSystemSupportInfo();
      this.htaDescription = systemSupportInfo.getDescription();
      this.hitLocation = systemSupportInfo.getLocation();
      this.hitInfoUrl = systemSupportInfo.getInfoUrl();
      this.hitContactName = systemSupportInfo.getContactName();
      this.hitContactEmail = systemSupportInfo.getContactEmail();

      /*
       * Update controls
       */
      this.registered = true;
    } catch (Exception ex) {
      ShowMessageError(ex.getMessage());
      Logfile.WriteError(ex.toString());
    }

    Logfile.WriteCompleted(logLevel, STR_ClassName, methodName);
  }
  /** @return String */
  public String actionRegister() {
    final String methodName = "actionRegister";
    Logfile.WriteCalled(logLevel, STR_ClassName, methodName);

    /*
     * Parse the web page information
     */
    ProcessAgentInfo processAgentInfo = this.Parse(null);
    if (processAgentInfo != null) {
      try {
        /*
         * Get self information
         */
        ProcessAgents processAgents =
            this.serviceBrokerSession.getServiceManagement().getProcessAgents();
        ProcessAgent selfProcessAgent = processAgents.RetrieveSelf();

        /*
         * Create coupons for the ProcessAgent
         */
        TicketIssuer ticketIssuer =
            this.serviceBrokerSession.getServiceManagement().getTicketIssuer();
        Coupon inCoupon = ticketIssuer.CreateCoupon();
        Coupon outCoupon = ticketIssuer.CreateCoupon();

        ProcessAgentAPI processAgentAPI = null;

        try {
          /*
           * Pass on to ProcessAgent for processing
           */
          processAgentAPI = new ProcessAgentAPI(processAgentInfo.getServiceUrl());
          processAgentAPI.setAuthHeaderInitPasskey(processAgentInfo.getOutCoupon().getPasskey());
          ProcessAgent processAgent =
              processAgentAPI.InstallDomainCredentials(selfProcessAgent, inCoupon, outCoupon);
          if (processAgent == null) {
            throw new RuntimeException("InstallDomainCredentials() returned null");
          }

          /*
           * Create the ProcessAgentInfo for the ProcessAgent
           */
          processAgentInfo.setProcessAgent(processAgent);
          processAgentInfo.setInCoupon(outCoupon);
          processAgentInfo.setOutCoupon(inCoupon);
          processAgentInfo.setIssuerGuid(ticketIssuer.getIssuerGuid());

          /*
           * Create the ProcessAgentInfo
           */
          if (processAgents.Create(processAgentInfo) < 0) {
            throw new RuntimeException(
                String.format(STRERR_SaveFailed_arg, processAgentInfo.getAgentName()));
          }

        } catch (Exception ex) {
          /*
           * Delete the issued coupons
           */
          if (outCoupon != null) {
            ticketIssuer.DeleteCoupon(outCoupon.getCouponId());
          }
          if (inCoupon != null) {
            ticketIssuer.DeleteCoupon(inCoupon.getCouponId());
          }

          throw ex;
        }

        /*
         * Register SystemSupportInfo
         */
        SystemSupportInfo systemSupportInfo = processAgents.RetrieveSystemSupportInfoSelf();
        if (systemSupportInfo != null) {
          SystemSupportPayload systemSupportPayload = new SystemSupportPayload(systemSupportInfo);
          String serviceProviderInfo = systemSupportPayload.ToXmlString();
          ServiceDescription[] serviceDescriptions =
              new ServiceDescription[] {
                new ServiceDescription(
                    serviceProviderInfo, null, ServiceDescription.STR_RequestSystemSupport)
              };
          processAgentAPI.setAuthHeaderAgentGuid(selfProcessAgent.getAgentGuid());
          processAgentAPI.setAuthHeaderCoupon(inCoupon);
          processAgentAPI.Register(hitServiceGuid, serviceDescriptions);
        }

        /*
         * Refresh the services list and repopulate ProcessAgentInfo information
         */
        this.serviceList = this.CreateServiceList();
        this.hsomService = processAgentInfo.getAgentName();
        this.PopulateServiceInfo();

        /*
         * Information saved successfully
         */
        this.registered = true;
        this.ShowMessageInfo(
            String.format(STR_RegisterSuccessful_arg, processAgentInfo.getAgentName()));

      } catch (Exception ex) {
        String message = ex.getMessage();
        ShowMessageError(message != null ? message : ex.toString());
        Logfile.WriteError(ex.toString());
      }
    }

    Logfile.WriteCompleted(logLevel, STR_ClassName, methodName);

    /* Navigate to the current page */
    return null;
  }