/**
   * 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;
  }
  public void generateGeneric() {
    String tMIME = null;
    if (genMode.equals("PDF")) {
      tMIME = MimeConstants.MIME_PDF;
    } else {
      tMIME = MimeConstants.MIME_RTF;
    }

    try {
      System.out.println("FOP Transformation\n");
      System.out.println("Preparing...");

      String fileName = new File(xsltfile).getName();
      // File xsltfile = new File("lib/xsl2/xslt/base/fo/" + fileName);
      File xsltfile = new File("lib/xsl/fo/" + fileName);

      // configure fopFactory.4. as desired
      // FopFactoryConfig ffc = new FopFactoryConfig();

      // FopFactory fopFactory = FopFactory.newInstance(new File(".").toURI()) ; // .newInstance();
      FopFactory fopFactory = FopFactory.newInstance();
      FOUserAgent foUserAgent = fopFactory.newFOUserAgent();

      foUserAgent.setTitle("TEST");

      // configure foUserAgent as desired

      // Setup output
      OutputStream out = new java.io.FileOutputStream(outputfile);
      out = new java.io.BufferedOutputStream(out);

      try {
        TransformerFactory factory = TransformerFactory.newInstance();
        Transformer transformer = factory.newTransformer(new StreamSource(xsltfile));

        // test run to get total pagecount
        Fop fop = fopFactory.newFop(tMIME, foUserAgent, out);
        Source src = new StreamSource(xmlfile);
        Result res = new SAXResult(fop.getDefaultHandler());
        transformer.transform(src, res);

        // Get total page count
        String pageCount = "UNAVAILABLE";
        if (fop.getResults() != null) {
          pageCount = Integer.toString(fop.getResults().getPageCount());
        } else {

        }
        System.out.println("totalcc " + pageCount);

        // real run
        // Construct fop with desired output format
        fop = fopFactory.newFop(tMIME, foUserAgent, out);

        // set draft parameter
        String draftImageFn =
            new File("lib/xsl/images/draft.png").toURI().toString(); // .getAbsolutePath();
        transformer.setParameter("draft.watermark.image", draftImageFn);
        System.out.println(transformer.getParameter("draft.watermark.image"));

        if (isDraftMode) {
          transformer.setParameter("draft.mode", "yes");
        } else {
          transformer.setParameter("draft.mode", "no");
        }

        transformer.setParameter("draft.mode", pageCount);

        // set pagecount parameter
        transformer.setParameter("ebnf.statement.terminator", pageCount);

        // Resulting SAX events (the generated FO) must be piped
        // through
        // to FOP
        res = new SAXResult(fop.getDefaultHandler());

        // Start XSLT transformation and FOP processing
        transformer.transform(src, res);

      } finally {
        out.close();
        status = 0;
      }

      System.out.println("Success!");
      System.out.println("DocBook " + genMode + " generation COMPLETED");

    } catch (Exception e) {
      e.printStackTrace(System.err);
      StringWriter sw = new StringWriter();
      PrintWriter pw = new PrintWriter(sw);
      e.printStackTrace(pw);
      status = 2;
      return;
    }
  }