Search in sources :

Example 1 with ControllerPageArgsException

use of org.webpieces.router.api.exceptions.ControllerPageArgsException in project webpieces by deanhiller.

the class ProxyStreamHandle method sendRenderHtml.

public XFuture<Void> sendRenderHtml(RenderResponse resp) {
    Http2Request request = originalHttp2Request;
    if (log.isInfoEnabled())
        log.info("About to send render html response for request=" + request + " controller=" + resp.view.getControllerName() + "." + resp.view.getMethodName());
    View view = resp.view;
    String packageStr = view.getPackageName();
    // For this type of View, the template is the name of the method..
    String templateClassName = view.getRelativeOrAbsolutePath();
    int lastIndexOf = templateClassName.lastIndexOf(".");
    String extension = null;
    if (lastIndexOf > 0) {
        extension = templateClassName.substring(lastIndexOf + 1);
    }
    String templatePath = templateClassName;
    if (!templatePath.startsWith("/")) {
        // relative path so need to form absolute path...
        if (lastIndexOf > 0) {
            templateClassName = templateClassName.substring(0, lastIndexOf);
        }
        templatePath = getTemplatePath(packageStr, templateClassName, extension);
    }
    // TODO: stream this out with chunked response instead??....
    StringWriter out = new StringWriter();
    try {
        templatingService.loadAndRunTemplate(templatePath, out, resp.pageArgs);
    } catch (MissingPropException e) {
        Set<String> keys = resp.pageArgs.keySet();
        throw new ControllerPageArgsException("Controller.method=" + view.getControllerName() + "." + view.getMethodName() + " did\nnot" + " return enough arguments for the template =" + templatePath + ".  specifically, the method\nreturned these" + " arguments=" + keys + "  There is a chance in your html you forgot the '' around a variable name\n" + "such as #{set 'key'}# but you put #{set key}# which is 'usually' not the correct way\n" + "The missing properties are as follows....\n" + e.getMessage(), e);
    }
    String content = out.toString();
    StatusCode statusCode;
    switch(resp.routeType) {
        case HTML:
            statusCode = StatusCode.HTTP_200_OK;
            break;
        case NOT_FOUND:
            statusCode = StatusCode.HTTP_404_NOT_FOUND;
            break;
        case INTERNAL_SERVER_ERROR:
            statusCode = StatusCode.HTTP_500_INTERNAL_SERVER_ERROR;
            break;
        default:
            throw new IllegalStateException("did add case for state=" + resp.routeType);
    }
    // The real mime type is looked up based on extension so htm or html results in text/html
    if (extension == null) {
        extension = "txt";
    }
    String finalExt = extension;
    return futureUtil.catchBlockWrap(() -> createResponseAndSend(request, statusCode, content, finalExt, "text/plain"), (t) -> convert(t));
}
Also used : Set(java.util.Set) Http2Request(com.webpieces.http2.api.dto.highlevel.Http2Request) StringWriter(java.io.StringWriter) ControllerPageArgsException(org.webpieces.router.api.exceptions.ControllerPageArgsException) View(org.webpieces.router.impl.dto.View) StatusCode(org.webpieces.http.StatusCode) MissingPropException(org.webpieces.ctx.api.MissingPropException)

Aggregations

Http2Request (com.webpieces.http2.api.dto.highlevel.Http2Request)1 StringWriter (java.io.StringWriter)1 Set (java.util.Set)1 MissingPropException (org.webpieces.ctx.api.MissingPropException)1 StatusCode (org.webpieces.http.StatusCode)1 ControllerPageArgsException (org.webpieces.router.api.exceptions.ControllerPageArgsException)1 View (org.webpieces.router.impl.dto.View)1