@Override
  public Document build(final String systemId) throws JDOMException, IOException {
    if (systemId == null) {
      throw new NullPointerException("Unable to build a URI from a null systemID.");
    }

    try {
      return getEngine().build(systemId);
    }
    catch (IOException ioe) {
      // OK, Issue #63
      // it is common for people to pass in raw XML content instead of
      // a SystemID. To make troubleshooting easier, we do a simple check
      // all valid XML documents start with a '<' character.
      // no URI ever has an '<' character.
      // if we think an XML document was passed in, we wrap the exception
      // Typically this problem causes a MalformedURLException to be
      // thrown, but that is not particular specified that way. Of
      // interest, depending on the broken systemID, you could get a
      // FileNotFoundException which is also an IOException, which will
      // also be processed by this handler....

      final int len = systemId.length();
      int i = 0;
      while (i < len && Verifier.isXMLWhitespace(systemId.charAt(i))) {
        i++;
      }
      if (i < len && '<' == systemId.charAt(i)) {
        // our systemID URI has a '<' - this is likely the problem.
        MalformedURLException mx = new MalformedURLException(
          "SAXBuilder.build(String) expects the String to be " +
          "a systemID, but in this instance it appears to be " +
          "actual XML data.");
        // include the original problem for accountability, and perhaps
        // a false positive.... though very unlikely
        mx.initCause(ioe);
        throw mx;
      }
      // it is likely not an XML document - re-throw the exception
      throw ioe;
    }
  }
@Override
  public Document build(final String systemId)