/**
   * Setup the UserAgent for FOP, from given parameters *
   *
   * @param transformer Created based on the XSLT, so containing any parameters to the XSL-FO
   *     specified in the XQuery
   * @param parameters any user defined parameters to the XSL-FO process
   * @return FOUserAgent The generated FOUserAgent to include any parameters passed in
   */
  private FOUserAgent setupFOUserAgent(
      FOUserAgent foUserAgent, Properties parameters, Transformer transformer)
      throws TransformerException {

    // setup the foUserAgent as per the parameters given
    foUserAgent.setProducer("eXist with Apache FOP");

    if (transformer.getParameter("FOPauthor") != null)
      foUserAgent.setAuthor(parameters.getProperty("author"));

    if (transformer.getParameter("FOPtitle") != null)
      foUserAgent.setTitle(parameters.getProperty("title"));

    if (transformer.getParameter("FOPkeywords") != null)
      foUserAgent.setTitle(parameters.getProperty("keywords"));

    if (transformer.getParameter("FOPdpi") != null) {
      String dpiStr = (String) transformer.getParameter("dpi");
      try {
        foUserAgent.setTargetResolution(Integer.parseInt(dpiStr));
      } catch (NumberFormatException nfe) {
        throw new TransformerException(
            "Cannot parse value of \"dpi\" - " + dpiStr + " to configure FOUserAgent");
      }
    }

    return foUserAgent;
  }
  /**
   * @see Results
   * @param targetResolution The Target Output Resolution.
   * @param ff The FopFactory used to create the FOUserAgent used to convert.
   * @param xmlSource XML file to be used in conversion.
   * @param xsltSource XSLT file to be used in translation.
   * @return A Result Class containing the conversion results
   */
  public static Results translate(
      int targetResolution, FopFactory ff, Source xmlSource, Source xsltSource) {

    FOUserAgent fua = getFopUserAgent(ff);
    fua.setTargetResolution(targetResolution);

    return translate(fua, xmlSource, xsltSource);
  }