/**
   * Init provided {@link ExportURLFactory} and add rendered documents to ZIP stream.
   *
   * @param zos the ZIP output stream.
   * @param tempdir the directory where to copy attached files.
   * @param urlf the {@link com.xpn.xwiki.web.XWikiURLFactory} used to render the documents.
   * @param context the XWiki context.
   * @throws XWikiException error when render documents.
   * @throws IOException error when render documents.
   */
  private void renderDocuments(
      ZipOutputStream zos, File tempdir, ExportURLFactory urlf, XWikiContext context)
      throws XWikiException, IOException {
    ExecutionContextManager ecim = Utils.getComponent(ExecutionContextManager.class);
    Execution execution = Utils.getComponent(Execution.class);

    VelocityContext oldVelocityContext = (VelocityContext) context.get("vcontext");

    try {
      XWikiContext renderContext = (XWikiContext) context.clone();
      renderContext.put("action", "view");

      ExecutionContext ec = new ExecutionContext();

      // Bridge with old XWiki Context, required for old code.
      ec.setProperty("xwikicontext", renderContext);

      ecim.initialize(ec);

      // Push a clean new Execution Context since we don't want the main Execution Context to be
      // used for
      // rendering the HTML pages to export. It's cleaner to isolate it as we do. Note that the new
      // Execution Context automatically gets initialized with a new Velocity Context by
      // the VelocityRequestInitializer class.
      execution.pushContext(ec);

      VelocityManager velocityManager = Utils.getComponent(VelocityManager.class);

      // At this stage we have a clean Velocity Context
      VelocityContext vcontext = velocityManager.getVelocityContext();

      urlf.init(this.pages, tempdir, renderContext);
      renderContext.setURLFactory(urlf);

      for (String pageName : this.pages) {
        renderDocument(pageName, zos, renderContext, vcontext);
      }
    } catch (ExecutionContextException e) {
      throw new XWikiException(
          XWikiException.MODULE_XWIKI_EXPORT,
          XWikiException.ERROR_XWIKI_INIT_FAILED,
          "Failed to initialize Execution Context",
          e);
    } finally {
      // We must ensure that the new request we've used is removed so that the current
      // thread can continue to use its original Execution Context.
      execution.popContext();

      context.put("vcontext", oldVelocityContext);
    }
  }