protected String getEndpointURL() {
   String endpointURL = null;
   String serviceName = OPENEMPI_SERVICE;
   try {
     endpointURL = invokeConnectionManager(serviceName);
     log.debug("Retrieved endpoint URL for service " + serviceName + ": " + endpointURL);
   } catch (ConnectionManagerException ex) {
     log.error(
         "Error getting url for "
             + serviceName
             + " from the connection manager. Error: "
             + ex.getMessage(),
         ex);
   }
   return endpointURL;
 }
  private String getUrl(NhinTargetSystemType target) {
    String url = null;

    if (target != null) {
      try {
        url =
            ConnectionManagerCache.getEndpontURLFromNhinTarget(
                target, NhincConstants.SUBJECT_DISCOVERY_SERVICE_NAME);
      } catch (ConnectionManagerException ex) {
        log.error(
            "Error: Failed to retrieve url for service: "
                + NhincConstants.SUBJECT_DISCOVERY_SERVICE_NAME);
        log.error(ex.getMessage());
      }
    } else {
      log.error("Target system passed into the proxy is null");
    }

    return url;
  }
  private AdapterNotificationConsumerPortType getPort() {
    AdapterNotificationConsumerPortType port =
        adapterNotifyService.getAdapterNotificationConsumerPortSoap();
    String url = null;

    try {
      url =
          ConnectionManagerCache.getLocalEndpointURLByServiceName(
              NhincConstants.HIEM_NOTIFY_ADAPTER_SERVICE_NAME);
    } catch (ConnectionManagerException ex) {
      log.error(
          "Error: Failed to retrieve url for service: "
              + NhincConstants.HIEM_NOTIFY_ADAPTER_SERVICE_NAME
              + " for local home community");
      log.error(ex.getMessage());
    }

    log.info("Setting endpoint address to Adapter Hiem Notify Service to " + url);
    ((javax.xml.ws.BindingProvider) port)
        .getRequestContext()
        .put(javax.xml.ws.BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url);

    return port;
  }
  public FindAuditEventsResponseType auditQuery(FindAuditEventsRequestType request) {
    String url = null;

    try {
      log.debug(
          "NhincConstants.AUDIT_LOG_ADAPTER_SERVICE_NAME: "
              + NhincConstants.AUDIT_LOG_ADAPTER_SERVICE_NAME);
      url =
          ConnectionManagerCache.getLocalEndpointURLByServiceName(
              NhincConstants.AUDIT_LOG_ADAPTER_SERVICE_NAME);
    } catch (ConnectionManagerException ex) {
      log.error(
          "Error: Failed to retrieve url for service: "
              + NhincConstants.AUDIT_LOG_ADAPTER_SERVICE_NAME
              + " for local home community");
      log.error(ex.getMessage());
    }

    AdapterAuditLogQueryPortType port = getAdapterPort(url);
    FindAuditEventsResponseType resp = null;

    int retryCount =
        gov.hhs.fha.nhinc.webserviceproxy.WebServiceProxyHelper.getInstance().getRetryAttempts();
    int retryDelay =
        gov.hhs.fha.nhinc.webserviceproxy.WebServiceProxyHelper.getInstance().getRetryDelay();
    String exceptionText =
        gov.hhs.fha.nhinc.webserviceproxy.WebServiceProxyHelper.getInstance().getExceptionText();
    javax.xml.ws.WebServiceException catchExp = null;
    if (retryCount > 0
        && retryDelay > 0
        && exceptionText != null
        && !exceptionText.equalsIgnoreCase("")) {
      int i = 1;
      while (i <= retryCount) {
        try {
          resp = port.findAuditEvents(request);
          break;
        } catch (javax.xml.ws.WebServiceException e) {
          catchExp = e;
          int flag = 0;
          StringTokenizer st = new StringTokenizer(exceptionText, ",");
          while (st.hasMoreTokens()) {
            if (e.getMessage().contains(st.nextToken())) {
              flag = 1;
            }
          }
          if (flag == 1) {
            log.warn("Exception calling ... web service: " + e.getMessage());
            System.out.println(
                "retrying the connection for attempt [ "
                    + i
                    + " ] after [ "
                    + retryDelay
                    + " ] seconds");
            log.info(
                "retrying attempt [ "
                    + i
                    + " ] the connection after [ "
                    + retryDelay
                    + " ] seconds");
            i++;
            try {
              Thread.sleep(retryDelay);
            } catch (InterruptedException iEx) {
              log.error(
                  "Thread Got Interrupted while waiting on AdapterAuditLogQuery call :" + iEx);
            } catch (IllegalArgumentException iaEx) {
              log.error(
                  "Thread Got Interrupted while waiting on AdapterAuditLogQuery call :" + iaEx);
            }
            retryDelay = retryDelay + retryDelay; // This is a requirement from Customer
          } else {
            log.error("Unable to call AdapterAuditLogQuery Webservice due to  : " + e);
            throw e;
          }
        }
      }

      if (i > retryCount) {
        log.error("Unable to call AdapterAuditLogQuery Webservice due to  : " + catchExp);
        throw catchExp;
      }

    } else {
      resp = port.findAuditEvents(request);
    }

    return resp;
  }
  public void notify(
      Element notifyElement,
      ReferenceParametersElements referenceParametersElements,
      AssertionType assertion,
      NhinTargetSystemType target) {
    String url = null;

    log.debug(
        "Notify element received in NhinHiemNotifyWebServiceProxy: "
            + XmlUtility.serializeElementIgnoreFaults(notifyElement));

    if (target != null) {
      try {
        url =
            ConnectionManagerCache.getEndpontURLFromNhinTarget(
                target, NhincConstants.HIEM_NOTIFY_SERVICE_NAME);
      } catch (ConnectionManagerException ex) {
        log.error(
            "Error: Failed to retrieve url for service: "
                + NhincConstants.HIEM_NOTIFY_SERVICE_NAME);
        log.error(ex.getMessage());
      }
    } else {
      log.error("Target system passed into the proxy is null");
    }

    try {
      if (NullChecker.isNotNullish(url)) {
        NotificationConsumer port = getPort(url);

        log.debug("unmarshaling notify message");
        WsntSubscribeMarshaller notifyMarshaller = new WsntSubscribeMarshaller();
        Notify notify = notifyMarshaller.unmarshalNotifyRequest(notifyElement);

        //                Element reMarshalled = notifyMarshaller.marshalNotifyRequest(notify);
        //                log.debug("REMARSHALLED: " +
        // XmlUtility.serializeElementIgnoreFaults(reMarshalled));

        // Policy check
        log.debug("Calling checkPolicy");
        if (checkPolicy(notify, assertion)) {
          log.debug("attaching reference parameter headers");
          SoapUtil soapUtil = new SoapUtil();
          soapUtil.attachReferenceParameterElements(
              (WSBindingProvider) port, referenceParametersElements);

          auditInputMessage(notify, assertion);

          log.debug("Calling token creator");
          SamlTokenCreator tokenCreator = new SamlTokenCreator();
          Map requestContext =
              tokenCreator.CreateRequestContext(assertion, url, NhincConstants.SUBSCRIBE_ACTION);
          ((BindingProvider) port).getRequestContext().putAll(requestContext);

          try {
            log.debug("Calling notification consumer port in NhinHiemWebServiceProxy.");
            port.notify(notify);
          } catch (Exception ex) {
            log.error("Error occurred while trying to invoke notify", ex);
          }

          ((Closeable) port).close();
        } else {
          log.error("Failed policy check on send NHIN notify message");
        }
      } else {
        log.error("The URL for service: " + NhincConstants.HIEM_NOTIFY_SERVICE_NAME + " is null");
      }
    } catch (Throwable t) {
      // TODO: Figure out what to do with the exception
      log.error("Error sending notify to remote gateway: " + t.getMessage(), t);
    }
  }