/**
   * Get the response from the URL
   *
   * @param url
   * @return
   * @throws TrailerAddictException
   */
  private static DigestedResponse getResponse(String url) throws TrailerAddictException {
    final DigestedResponse response;
    try {
      HttpGet httpGet = new HttpGet(url);
      httpGet.addHeader("accept", "application/xml");
      response = DigestedResponseReader.requestContent(HTTP_CLIENT, httpGet, CHARSET);

      if (response.getStatusCode() >= 500) {
        throw new TrailerAddictException(ApiExceptionType.HTTP_503_ERROR, url);
      } else if (response.getStatusCode() >= 300) {
        throw new TrailerAddictException(ApiExceptionType.HTTP_404_ERROR, url);
      }
    } catch (IOException ex) {
      throw new TrailerAddictException(
          ApiExceptionType.CONNECTION_ERROR, "Unable to read URL", url, ex);
    }
    return response;
  }
  /**
   * Get a DOM document from the supplied URL
   *
   * @param url
   * @return
   * @throws TrailerAddictException
   */
  public static synchronized Document getEventDocFromUrl(String url) throws TrailerAddictException {
    final DigestedResponse response = getResponse(url);

    try (InputStream in =
        new ByteArrayInputStream(response.getContent().getBytes(DEFAULT_CHARSET))) {
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
      DocumentBuilder db = dbf.newDocumentBuilder();

      Document doc = db.parse(in);
      doc.getDocumentElement().normalize();
      return doc;
    } catch (UnsupportedEncodingException ex) {
      throw new TrailerAddictException(
          ApiExceptionType.INVALID_URL, "Unable to encode URL", url, ex);
    } catch (ParserConfigurationException | SAXException | IOException error) {
      throw new TrailerAddictException(
          ApiExceptionType.MAPPING_FAILED, UNABLE_TO_PARSE, url, error);
    }
  }