/**
   * Sets a header parameter with the specified key and value.
   *
   * <p>If the key matches one of the reserved header parameter names, then the relevant
   * <tt>set</tt> method is called to set that header parameter with the specified value.
   *
   * @param key The key of the header parameter.
   * @param value The value of the header parameter.
   */
  public void setParameter(String key, Object value) {
    JwtHeaderKey headerKey = getHeaderKey(key.toUpperCase());

    switch (headerKey) {
      case TYP:
        {
          if (isValueOfType(value, JwtType.class)) {
            setType((JwtType) value);
          } else {
            checkValueIsOfType(value, String.class);
            setType(JwtType.jwtType((String) value));
          }
          break;
        }
      case ALG:
        {
          if (isValueOfType(value, Algorithm.class)) {
            setAlgorithm((Algorithm) value);
          } else {
            checkValueIsOfType(value, String.class);
            put(ALG.value(), value);
          }
          break;
        }
      default:
        {
          put(key, value);
        }
    }
  }
 /**
  * Gets the string representation of the Algorithm set in the JWT header.
  *
  * @return The algorithm as a String.
  */
 protected String getAlgorithmString() {
   return get(ALG.value()).asString();
 }
 /**
  * Sets the algorithm used to perform cryptographic signing and/or encryption on the JWT.
  *
  * @param algorithm The Algorithm.
  */
 public void setAlgorithm(Algorithm algorithm) {
   put(ALG.value(), algorithm.toString());
 }