/**
   * Builds the URL to redirect the client to.
   *
   * @param messageContext current message context
   * @param endpoint endpoint URL to send encoded message to
   * @param message Deflated and Base64 encoded message
   * @return URL to redirect client to
   * @throws MessageEncodingException thrown if the SAML message is neither a RequestAbstractType or
   *     Response
   */
  protected String buildRedirectURL(
      MessageContext<SAMLObject> messageContext, String endpoint, String message)
      throws MessageEncodingException {
    log.debug("Building URL to redirect client to");

    URLBuilder urlBuilder = null;
    try {
      urlBuilder = new URLBuilder(endpoint);
    } catch (MalformedURLException e) {
      throw new MessageEncodingException("Endpoint URL " + endpoint + " is not a valid URL", e);
    }

    List<Pair<String, String>> queryParams = urlBuilder.getQueryParams();
    queryParams.clear();

    SAMLObject outboundMessage = messageContext.getMessage();

    if (outboundMessage instanceof RequestAbstractType) {
      queryParams.add(new Pair<String, String>("SAMLRequest", message));
    } else if (outboundMessage instanceof StatusResponseType) {
      queryParams.add(new Pair<String, String>("SAMLResponse", message));
    } else {
      throw new MessageEncodingException(
          "SAML message is neither a SAML RequestAbstractType or StatusResponseType");
    }

    String relayState = SAMLBindingSupport.getRelayState(messageContext);
    if (SAMLBindingSupport.checkRelayState(relayState)) {
      queryParams.add(new Pair<String, String>("RelayState", relayState));
    }

    SignatureSigningParameters signingParameters =
        SAMLMessageSecuritySupport.getContextSigningParameters(messageContext);
    if (signingParameters != null && signingParameters.getSigningCredential() != null) {
      String sigAlgURI = getSignatureAlgorithmURI(signingParameters);
      Pair<String, String> sigAlg = new Pair<String, String>("SigAlg", sigAlgURI);
      queryParams.add(sigAlg);
      String sigMaterial = urlBuilder.buildQueryString();

      queryParams.add(
          new Pair<String, String>(
              "Signature",
              generateSignature(signingParameters.getSigningCredential(), sigAlgURI, sigMaterial)));
    } else {
      log.debug("No signing credential was supplied, skipping HTTP-Redirect DEFLATE signing");
    }

    return urlBuilder.buildURL();
  }
 /**
  * Gets the response URL from the message context.
  *
  * @param messageContext current message context
  * @return response URL from the message context
  * @throws MessageEncodingException throw if no relying party endpoint is available
  */
 protected URI getEndpointURL(MessageContext<SAMLObject> messageContext)
     throws MessageEncodingException {
   try {
     return SAMLBindingSupport.getEndpointURL(messageContext);
   } catch (BindingException e) {
     throw new MessageEncodingException("Could not obtain message endpoint URL", e);
   }
 }