public void apply(ActionContext context) {
        Boolean hasTemplate = context.hasTemplate();
        if (null != hasTemplate && hasTemplate) {
            RenderTemplate.get(context.successStatus()).apply(context);
            return;
        }
        H.Format fmt = context.accept();
        if (fmt == UNKNOWN) {
            H.Request req = context.req();
            if (req.userAgent().isIE9Down()) {
                fmt = HTML;
            } else {
                H.Method method = req.method();
                String methodInfo = S.concat(method.name(), " method to ");
                String acceptHeader = req.header(H.Header.Names.ACCEPT);
                throw E.unsupport(S.concat(
                        "Unknown accept content type(",
                        acceptHeader,
                        "): ",
                        methodInfo,
                        req.url()));
            }
        }
        Result result = null;
        if (JSON == fmt) {
            List<String> varNames = context.__appRenderArgNames();
            Map<String, Object> map = new HashMap<>(context.renderArgs());
            if (null != varNames && !varNames.isEmpty()) {
                for (String name : varNames) {
                    map.put(name, context.renderArg(name));
                }
            }
            result = new RenderJSON(map);
        } else if (XML == fmt) {
            List<String> varNames = context.__appRenderArgNames();
            Map<String, Object> map = new HashMap<>();
            if (null != varNames && !varNames.isEmpty()) {
                for (String name : varNames) {
                    map.put(name, context.renderArg(name));
                }
            }
            result = new FilteredRenderXML(map, null, context);
        } else if (HTML == fmt || TXT == fmt || CSV == fmt) {
            if (!ignoreMissingTemplate) {
                throw E.unsupport("Template[%s] not found", context.templatePath());
            }
            context.nullValueResultIgnoreRenderArgs().apply(context.req(), context.prepareRespForResultEvaluation());
            return;
        } else if (PDF == fmt || XLS == fmt || XLSX == fmt || DOC == fmt || DOCX == fmt) {
            List<String> varNames = context.__appRenderArgNames();
            if (null != varNames && !varNames.isEmpty()) {
                Object firstVar = context.renderArg(varNames.get(0));
                String action = S.str(context.actionPath()).afterLast(".").toString();
                if (firstVar instanceof File) {
                    File file = (File) firstVar;
                    result = new RenderBinary(file, action);
                } else if (firstVar instanceof InputStream) {
                    InputStream is = (InputStream) firstVar;
                    result = new RenderBinary(is, action);
                } else if (firstVar instanceof ISObject) {
                    ISObject sobj = (ISObject) firstVar;
                    result = new RenderBinary(sobj.asInputStream(), action);
                }
                if (null == result) {
                    throw E.unsupport("Unknown render arg type [%s] for binary response", firstVar.getClass());
                }
            } else {
                throw E.unexpected("No render arg found for binary response");
            }
        }
        if (null != result) {
            ActResponse<?> resp = context.prepareRespForResultEvaluation();
            result.status(context.successStatus()).apply(context.req(), resp);
        } else {
            throw E.unexpected("Unknown accept content type: %s", fmt.contentType());
        }
    }
public void apply ( ActionContext context ) { Boolean hasTemplate = context . hasTemplate ( ) ; if ( null != hasTemplate && hasTemplate ) { RenderTemplate . get ( context . successStatus ( ) ) . apply ( context ) ; return ; } H . Format fmt = context . accept ( ) ; if ( fmt == UNKNOWN ) { H . Request req = context . req ( ) ; if ( req . userAgent ( ) . isIE9Down ( ) ) { fmt = HTML ; } else { H . Method method = req . method ( ) ; String methodInfo = S . concat ( method . name ( ) , " method to " ) ; String acceptHeader = req . header ( H . Header . Names . ACCEPT ) ; throw E . unsupport ( S . concat ( "Unknown accept content type(" , acceptHeader , "): " , methodInfo , req . url ( ) ) ) ; } } Result result = null ; if ( JSON == fmt ) { List < String > varNames = context . __appRenderArgNames ( ) ; Map < String , Object > map = new HashMap < > ( context . renderArgs ( ) ) ; if ( null != varNames && ! varNames . isEmpty ( ) ) { for ( String name : varNames ) { map . put ( name , context . renderArg ( name ) ) ; } } result = new RenderJSON ( map ) ; } else if ( XML == fmt ) { List < String > varNames = context . __appRenderArgNames ( ) ; Map < String , Object > map = new HashMap < > ( ) ; if ( null != varNames && ! varNames . isEmpty ( ) ) { for ( String name : varNames ) { map . put ( name , context . renderArg ( name ) ) ; } } result = new FilteredRenderXML ( map , null , context ) ; } else if ( HTML == fmt || TXT == fmt || CSV == fmt ) { if ( ! ignoreMissingTemplate ) { throw E . unsupport ( "Template[%s] not found" , context . templatePath ( ) ) ; } context . nullValueResultIgnoreRenderArgs ( ) . apply ( context . req ( ) , context . prepareRespForResultEvaluation ( ) ) ; return ; } else if ( PDF == fmt || XLS == fmt || XLSX == fmt || DOC == fmt || DOCX == fmt ) { List < String > varNames = context . __appRenderArgNames ( ) ; if ( null != varNames && ! varNames . isEmpty ( ) ) { Object firstVar = context . renderArg ( varNames . get ( 0 ) ) ; String action = S . str ( context . actionPath ( ) ) . afterLast ( "." ) . toString ( ) ; if ( firstVar instanceof File ) { File file = ( File ) firstVar ; result = new RenderBinary ( file , action ) ; } else if ( firstVar instanceof InputStream ) { InputStream is = ( InputStream ) firstVar ; result = new RenderBinary ( is , action ) ; } else if ( firstVar instanceof ISObject ) { ISObject sobj = ( ISObject ) firstVar ; result = new RenderBinary ( sobj . asInputStream ( ) , action ) ; } if ( null == result ) { throw E . unsupport ( "Unknown render arg type [%s] for binary response" , firstVar . getClass ( ) ) ; } } else { throw E . unexpected ( "No render arg found for binary response" ) ; } } if ( null != result ) { ActResponse < ? > resp = context . prepareRespForResultEvaluation ( ) ; result . status ( context . successStatus ( ) ) . apply ( context . req ( ) , resp ) ; } else { throw E . unexpected ( "Unknown accept content type: %s" , fmt . contentType ( ) ) ; } }
TODO: Allow plugin to support rendering pdf, xls or other binary types