/**
   * Constructs a web request to add a message to the back of the queue. Write the encoded message
   * request body generated with a call to
   * QueueMessageSerializer#generateMessageRequestBody(String)} to the output stream of the request.
   * Sign the web request with the length of the encoded message request body.
   *
   * @param uri A <code>URI</code> object that specifies the absolute URI to the queue.
   * @param timeout The server response timeout interval in milliseconds. If the operation does not
   *     complete within the specified timeout interval, a timeout error is returned by the server.
   *     If the timeout value is 0, the maximum timeout of 30 seconds is used.
   * @param visibilityTimeoutInSeconds Specifies the length of time for the message to be invisible
   *     in seconds, starting when it is added to the queue. A value of 0 will make the message
   *     visible immediately. The value must be greater than or equal to 0, and cannot be larger
   *     than 7 days. The visibility timeout of a message cannot be set to a value greater than the
   *     time-to-live time.
   * @param timeToLiveInSeconds Specifies the time-to-live interval for the message, in seconds. The
   *     maximum time-to-live allowed is 7 days. If this parameter is 0, the default time-to-live of
   *     7 days is used.
   * @param opContext An {@link OperationContext} object that represents the context for the current
   *     operation. This object is used to track requests to the storage service, and to provide
   *     additional runtime information about the operation.
   * @return An <code>HttpURLConnection</code> configured for the specified operation.
   * @throws IOException
   * @throws URISyntaxException If the URI is not valid.
   * @throws StorageException If a storage service error occurred during the operation.
   */
  public static HttpURLConnection putMessage(
      final URI uri,
      final int timeout,
      final int visibilityTimeoutInSeconds,
      final int timeToLiveInSeconds,
      final OperationContext opContext)
      throws IOException, URISyntaxException, StorageException {

    final UriQueryBuilder builder = new UriQueryBuilder();

    if (visibilityTimeoutInSeconds != 0) {
      builder.add(VISIBILITY_TIMEOUT, Integer.toString(visibilityTimeoutInSeconds));
    }

    if (timeToLiveInSeconds != 0) {
      builder.add(MESSAGE_TTL, Integer.toString(timeToLiveInSeconds));
    }

    final HttpURLConnection request =
        BaseRequest.createURLConnection(uri, timeout, builder, opContext);

    request.setDoOutput(true);
    request.setRequestMethod(Constants.HTTP_POST);

    return request;
  }
  /**
   * Constructs a web request to clear all the messages in the queue. Sign the web request with a
   * length of -1L.
   *
   * @param uri A <code>URI</code> object that specifies the absolute URI to the queue.
   * @param timeout The server response timeout interval in milliseconds. If the operation does not
   *     complete within the specified timeout interval, a timeout error is returned by the server.
   *     If the timeout value is 0, the maximum timeout of 30 seconds is used.
   * @param opContext An {@link OperationContext} object that represents the context for the current
   *     operation. This object is used to track requests to the storage service, and to provide
   *     additional runtime information about the operation.
   * @return An <code>HttpURLConnection</code> configured for the specified operation.
   * @throws IOException
   * @throws URISyntaxException If the URI is not valid.
   * @throws StorageException If a storage service error occurred during the operation.
   */
  public static HttpURLConnection clearMessages(
      final URI uri, final int timeout, final OperationContext opContext)
      throws URISyntaxException, IOException, StorageException {

    final HttpURLConnection request =
        BaseRequest.createURLConnection(uri, timeout, null, opContext);

    request.setRequestMethod(Constants.HTTP_DELETE);

    return request;
  }
  /**
   * Constructs a web request to return the ACL for this queue. Sign with no length specified.
   *
   * @param uri The absolute URI to the container.
   * @param timeout The server timeout interval.
   * @return a HttpURLConnection configured for the operation.
   * @throws StorageException
   */
  public static HttpURLConnection getAcl(
      final URI uri, final int timeout, final OperationContext opContext)
      throws IOException, URISyntaxException, StorageException {
    final UriQueryBuilder builder = new UriQueryBuilder();
    builder.add(Constants.QueryConstants.COMPONENT, Constants.QueryConstants.ACL);

    final HttpURLConnection request =
        BaseRequest.createURLConnection(uri, timeout, builder, opContext);

    request.setRequestMethod(Constants.HTTP_GET);

    return request;
  }
  /**
   * Constructs a web request to delete a message from the queue. Sign the web request with a length
   * of -1L.
   *
   * @param uri A <code>URI</code> object that specifies the absolute URI to the queue.
   * @param timeout The server response timeout interval in milliseconds. If the operation does not
   *     complete within the specified timeout interval, a timeout error is returned by the server.
   *     If the timeout value is 0, the maximum timeout of 30 seconds is used.
   * @param popReceipt A <code>String</code> that contains the pop receipt value returned from an
   *     earlier call to {@link CloudQueueMessage#getPopReceipt} for the message to delete.
   * @param opContext An {@link OperationContext} object that represents the context for the current
   *     operation. This object is used to track requests to the storage service, and to provide
   *     additional runtime information about the operation.
   * @return An <code>HttpURLConnection</code> configured for the specified operation.
   * @throws URISyntaxException If the URI is not valid.
   * @throws IOException
   * @throws StorageException If a storage service error occurred during the operation.
   */
  public static HttpURLConnection deleteMessage(
      final URI uri, final int timeout, final String popReceipt, final OperationContext opContext)
      throws URISyntaxException, IOException, StorageException {

    final UriQueryBuilder builder = new UriQueryBuilder();
    builder.add(POP_RECEIPT, popReceipt);

    final HttpURLConnection request =
        BaseRequest.createURLConnection(uri, timeout, builder, opContext);

    request.setRequestMethod(Constants.HTTP_DELETE);

    return request;
  }
  /**
   * Constructs a web request to retrieve a specified number of messages from the front of the queue
   * without changing their visibility. Sign the web request with a length of -1L.
   *
   * @param uri A <code>URI</code> object that specifies the absolute URI to the queue.
   * @param timeout The server response timeout interval in milliseconds. If the operation does not
   *     complete within the specified timeout interval, a timeout error is returned by the server.
   *     If the timeout value is 0, the maximum timeout of 30 seconds is used.
   * @param numberOfMessages A nonzero value that specifies the number of messages to retrieve from
   *     the queue, up to a maximum of 32.
   * @param opContext An {@link OperationContext} object that represents the context for the current
   *     operation. This object is used to track requests to the storage service, and to provide
   *     additional runtime information about the operation.
   * @return An <code>HttpURLConnection</code> configured for the specified operation.
   * @throws IOException
   * @throws URISyntaxException If the URI is not valid.
   * @throws StorageException If a storage service error occurred during the operation.
   */
  public static HttpURLConnection peekMessages(
      final URI uri,
      final int timeout,
      final int numberOfMessages,
      final OperationContext opContext)
      throws URISyntaxException, IOException, StorageException {

    final UriQueryBuilder builder = new UriQueryBuilder();
    builder.add(PEEK_ONLY, "true");

    if (numberOfMessages != 0) {
      builder.add(NUMBER_OF_MESSAGES, Integer.toString(numberOfMessages));
    }

    final HttpURLConnection request =
        BaseRequest.createURLConnection(uri, timeout, builder, opContext);

    request.setRequestMethod(Constants.HTTP_GET);

    return request;
  }
  /**
   * Constructs a web request to update the visibility timeout of a message in the queue. Optionally
   * updates the message content if a message request body is written to the output stream of the
   * web request. The web request should be signed with the length of the encoded message request
   * body if one is included, or a length of 0 if no message request body is included.
   *
   * @param uri A <code>URI</code> object that specifies the absolute URI to the queue.
   * @param timeout The server response timeout interval in milliseconds. If the operation does not
   *     complete within the specified timeout interval, a timeout error is returned by the server.
   *     If the timeout value is 0, the maximum timeout of 30 seconds is used.
   * @param popReceipt A <code>String</code> that contains the pop receipt value returned from an
   *     earlier call to {@link CloudQueueMessage#getPopReceipt} for the message to update.
   * @param visibilityTimeoutInSeconds Specifies the new visibility timeout value in seconds,
   *     relative to server time, to make the retrieved messages invisible until the visibility
   *     timeout expires. The value must be larger than or equal to 0, and cannot be larger than 7
   *     days. The visibility timeout of a message can be set to a value later than the expiry time,
   *     which will prevent the message from being retrieved again whether it is processed or not.
   * @param opContext An {@link OperationContext} object that represents the context for the current
   *     operation. This object is used to track requests to the storage service, and to provide
   *     additional runtime information about the operation.
   * @return An <code>HttpURLConnection</code> configured for the specified operation.
   * @throws IOException
   * @throws URISyntaxException If the URI is not valid.
   * @throws StorageException If a storage service error occurred during the operation.
   */
  public static HttpURLConnection updateMessage(
      final URI uri,
      final int timeout,
      final String popReceipt,
      final int visibilityTimeoutInSeconds,
      final OperationContext opContext)
      throws URISyntaxException, IOException, StorageException {

    final UriQueryBuilder builder = new UriQueryBuilder();

    builder.add(POP_RECEIPT, popReceipt);

    builder.add(VISIBILITY_TIMEOUT, Integer.toString(visibilityTimeoutInSeconds));

    final HttpURLConnection request =
        BaseRequest.createURLConnection(uri, timeout, builder, opContext);

    request.setDoOutput(true);
    request.setRequestMethod(Constants.HTTP_PUT);

    return request;
  }
  /**
   * Constructs a web request to return a listing of all queues in this storage account. Sign the
   * web request with a length of -1L.
   *
   * @param uri A <code>URI</code> object that specifies the absolute URI to the storage account.
   * @param timeout The server response timeout interval in milliseconds. If the operation does not
   *     complete within the specified timeout interval, a timeout error is returned by the server.
   *     If the timeout value is 0, the maximum timeout of 30 seconds is used.
   * @param listingContext A {@link ListingContext} object that specifies parameters for the listing
   *     operation, if any. May be <code>null</code>.
   * @param detailsIncluded A {@link QueueListingDetails} object that specifies additional details
   *     to return with the listing, if any. May be <code>null</code>.
   * @param opContext An {@link OperationContext} object that represents the context for the current
   *     operation. This object is used to track requests to the storage service, and to provide
   *     additional runtime information about the operation.
   * @return An <code>HttpURLConnection</code> configured for the specified operation.
   * @throws IOException
   * @throws URISyntaxException If the URI is not valid.
   * @throws StorageException If a storage service error occurred during the operation.
   */
  public static HttpURLConnection list(
      final URI uri,
      final int timeout,
      final ListingContext listingContext,
      final QueueListingDetails detailsIncluded,
      final OperationContext opContext)
      throws URISyntaxException, IOException, StorageException {

    final UriQueryBuilder builder = new UriQueryBuilder();
    builder.add(Constants.QueryConstants.COMPONENT, Constants.QueryConstants.LIST);

    if (listingContext != null) {
      if (!Utility.isNullOrEmpty(listingContext.getPrefix())) {
        builder.add(Constants.QueryConstants.PREFIX, listingContext.getPrefix());
      }

      if (!Utility.isNullOrEmpty(listingContext.getMarker())) {
        builder.add(Constants.QueryConstants.MARKER, listingContext.getMarker());
      }

      if (listingContext.getMaxResults() != null && listingContext.getMaxResults() > 0) {
        builder.add(
            Constants.QueryConstants.MAX_RESULTS, listingContext.getMaxResults().toString());
      }
    }

    if (detailsIncluded == QueueListingDetails.ALL
        || detailsIncluded == QueueListingDetails.METADATA) {
      builder.add(Constants.QueryConstants.INCLUDE, Constants.QueryConstants.METADATA);
    }

    final HttpURLConnection request =
        BaseRequest.createURLConnection(uri, timeout, builder, opContext);

    request.setRequestMethod(Constants.HTTP_GET);

    return request;
  }
  /**
   * Constructs a web request to retrieve messages from the front of the queue. Sign the web request
   * with a length of -1L.
   *
   * @param uri A <code>URI</code> object that specifies the absolute URI to the queue.
   * @param timeout The server response timeout interval in milliseconds. If the operation does not
   *     complete within the specified timeout interval, a timeout error is returned by the server.
   *     If the timeout value is 0, the maximum timeout of 30 seconds is used.
   * @param numberOfMessages A nonzero value that specifies the number of messages to retrieve from
   *     the queue, up to a maximum of 32.
   * @param visibilityTimeoutInSeconds Specifies the visibility timeout value in seconds, relative
   *     to server time, to make the retrieved messages invisible until the visibility timeout
   *     expires. The value must be larger than or equal to 0, and cannot be larger than 7 days. The
   *     visibility timeout of a message can be set to a value later than the expiry time, which
   *     will prevent the message from being retrieved again whether it is processed or not.
   * @param opContext An {@link OperationContext} object that represents the context for the current
   *     operation. This object is used to track requests to the storage service, and to provide
   *     additional runtime information about the operation.
   * @return An <code>HttpURLConnection</code> configured for the specified operation.
   * @throws IOException
   * @throws URISyntaxException If the URI is not valid.
   * @throws StorageException If a storage service error occurred during the operation.
   */
  public static HttpURLConnection retrieveMessages(
      final URI uri,
      final int timeout,
      final int numberOfMessages,
      final int visibilityTimeoutInSeconds,
      final OperationContext opContext)
      throws URISyntaxException, IOException, StorageException {

    final UriQueryBuilder builder = new UriQueryBuilder();

    if (numberOfMessages != 0) {
      builder.add(NUMBER_OF_MESSAGES, Integer.toString(numberOfMessages));
    }

    builder.add(VISIBILITY_TIMEOUT, Integer.toString(visibilityTimeoutInSeconds));

    final HttpURLConnection request =
        BaseRequest.createURLConnection(uri, timeout, builder, opContext);

    request.setRequestMethod("GET");

    return request;
  }