001package org.hl7.fhir.r5.utils.client.network;
002
003import okhttp3.internal.http2.Header;
004import org.hl7.fhir.exceptions.FHIRException;
005
006import java.util.ArrayList;
007import java.util.List;
008import java.util.stream.Collectors;
009
010/**
011 * Generic Implementation of Client Headers.
012 *
013 * Stores a list of headers for HTTP calls to the TX server. Users can implement their own instance if they desire
014 * specific, custom behavior.
015 */
016public class ClientHeaders {
017  
018  private final ArrayList<Header> headers;
019
020  public ClientHeaders() {
021    this.headers = new ArrayList<>();
022  }
023
024  public ClientHeaders(ArrayList<Header> headers) {
025    this.headers = headers;
026  }
027
028  public ArrayList<Header> headers() {
029    return headers;
030  }
031
032  /**
033   * Add a header to the list of stored headers for network operations.
034   *
035   * @param header {@link Header} to add to the list.
036   * @throws FHIRException if the header being added is a duplicate.
037   */
038  public ClientHeaders addHeader(Header header) throws FHIRException {
039    if (headers.contains(header)) {
040      throw new FHIRException("Attempting to add duplicate header, <" + header.name + ", "
041        + header.value + ">.");
042    }
043    headers.add(header);
044    return this;
045  }
046
047  /**
048   * Add a header to the list of stored headers for network operations.
049   *
050   * @param headerList {@link List} of {@link Header} to add.
051   * @throws FHIRException if any of the headers being added is a duplicate.
052   */
053  public ClientHeaders addHeaders(List<Header> headerList) throws FHIRException {
054    headerList.forEach(this::addHeader);
055    return this;
056  }
057
058  /**
059   * Removes the passed in header from the list of stored headers.
060   * @param header {@link Header} to remove from the list.
061   * @throws FHIRException if the header passed in does not exist within the stored list.
062   */
063  public ClientHeaders removeHeader(Header header) throws FHIRException {
064    if (!headers.remove(header)) {
065      throw new FHIRException("Attempting to remove header, <" + header.name + ", "
066        + header.value + ">, from GenericClientHeaders that is not currently stored.");
067    }
068    return this;
069  }
070
071  /**
072   * Removes the passed in headers from the list of stored headers.
073   * @param headerList {@link List} of {@link Header} to remove.
074   * @throws FHIRException if any of the headers passed in does not exist within the stored list.
075   */
076  public ClientHeaders removeHeaders(List<Header> headerList) throws FHIRException {
077    headerList.forEach(this::removeHeader);
078    return this;
079  }
080
081  /**
082   * Clears all stored {@link Header}.
083   */
084  public ClientHeaders clearHeaders() {
085    headers.clear();
086    return this;
087  }
088
089  @Override
090  public String toString() {
091    return this.headers.stream()
092      .map(header -> "\t" + header.name + ":" + header.value)
093      .collect(Collectors.joining(",\n", "{\n", "\n}"));
094  }
095}