protected void renderExclusive(
      HttpServletRequest request, HttpServletResponse response, ThemeDisplay themeDisplay)
      throws Exception {

    RenderRequestImpl renderRequestImpl =
        (RenderRequestImpl) request.getAttribute(JavaConstants.JAVAX_PORTLET_REQUEST);

    RenderResponseImpl renderResponseImpl =
        (RenderResponseImpl) request.getAttribute(JavaConstants.JAVAX_PORTLET_RESPONSE);

    StringServletResponse stringResponse =
        (StringServletResponse) renderRequestImpl.getAttribute(WebKeys.STRING_SERVLET_RESPONSE);

    if (stringResponse == null) {
      stringResponse = (StringServletResponse) renderResponseImpl.getHttpServletResponse();

      Portlet portlet = processPortletRequest(request, response, PortletRequest.RENDER_PHASE);

      InvokerPortlet invokerPortlet = PortletInstanceFactoryUtil.create(portlet, null);

      invokerPortlet.render(renderRequestImpl, renderResponseImpl);

      if (Validator.isNull(stringResponse.getString())) {
        stringResponse.setString(null);
      }
    }

    renderResponseImpl.transferHeaders(response);

    if (stringResponse.isCalledGetOutputStream()) {
      UnsyncByteArrayOutputStream ubaos = stringResponse.getUnsyncByteArrayOutputStream();

      InputStream is = new UnsyncByteArrayInputStream(ubaos.unsafeGetByteArray(), 0, ubaos.size());

      ServletResponseUtil.sendFile(
          request,
          response,
          renderResponseImpl.getResourceName(),
          is,
          renderResponseImpl.getContentType());
    } else if (stringResponse.isCalledGetWriter()) {
      byte[] content = stringResponse.getString().getBytes(StringPool.UTF8);

      ServletResponseUtil.sendFile(
          request,
          response,
          renderResponseImpl.getResourceName(),
          content,
          renderResponseImpl.getContentType());
    }

    renderRequestImpl.cleanUp();
  }