private void renderPage(
      final HttpServletRequest req,
      String reqPagePath,
      HttpServletResponse res,
      Site site,
      Page page,
      String[] requestContext)
      throws PebbleException, IOException {

    TemplateContext global = new TemplateContext();
    global.setRequestContext(requestContext);
    for (String key : req.getParameterMap().keySet()) {
      global.put(key, req.getParameter(key));
    }

    global.put("page", makePageWrapper(page));
    populateSiteInfo(req, page, site, global);

    List<TemplateContext> components = new ArrayList<TemplateContext>();

    for (Component component : page.getComponentsSet()) {
      TemplateContext local = new TemplateContext();
      component.handle(page, local, global);
      components.add(local);
    }

    global.put("components", components);

    PebbleTemplate compiledTemplate =
        engine.getTemplate(site.getTheme().getType() + "/" + page.getTemplate().getFilePath());

    res.setStatus(200);
    res.setContentType("text/html");
    compiledTemplate.evaluate(res.getWriter(), global);
  }
  private void renderCMSPage(
      final HttpServletRequest req, HttpServletResponse res, Site sites, String pageSlug)
      throws ServletException, IOException, PebbleException {
    if (pageSlug.startsWith("/")) {
      pageSlug = pageSlug.substring(1);
    }
    String[] parts = pageSlug.split("/");

    String pageName = parts[0];

    Page page;
    if (Strings.isNullOrEmpty(pageName) && sites.getInitialPage() != null) {
      page = sites.getInitialPage();
    } else {
      page =
          sites
              .getPagesSet()
              .stream()
              .filter(p -> pageName.equals(p.getSlug()))
              .findAny()
              .orElse(null);
    }

    if (page == null || page.getTemplate() == null) {
      errorPage(req, res, sites, 404);
    } else if (!page.isPublished() || !page.getCanViewGroup().isMember(Authenticate.getUser())) {
      errorPage(req, res, sites, 404);
    } else {
      try {
        renderPage(req, pageSlug, res, sites, page, parts);
      } catch (ResourceNotFoundException e) {
        errorPage(req, res, sites, 404);
      }
    }
  }