public void writeTo()

in pytheas-core/src/main/java/com/netflix/explorers/providers/FreemarkerTemplateProvider.java [147:257]


    public void writeTo(Viewable viewable, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType,
            MultivaluedMap<String, Object> httpHeaders, OutputStream out) throws IOException,
            WebApplicationException {
        
        String resolvedPath = viewable.getTemplateName();
        Object model = viewable.getModel();
        
        LOG.debug( "Evaluating freemarker template (" + resolvedPath + ") with model of type " +
                ( model == null ? "null" : model.getClass().getSimpleName() ) );


        // Build the model context that will be passed to the page
        final Map<String,Object> vars;
        if ( model instanceof Map ) {
            vars = new HashMap<String, Object>( (Map<String, Object>)model );
        }
        else {
            vars = new HashMap<String, Object>();
            vars.put("it", model);
        }

        RequestContext requestContext = new RequestContext();
        requestContext.setHttpServletRequest(requestInvoker != null ? requestInvoker.get() : null);
        vars.put("RequestContext",  requestContext);
        vars.put("Request",         requestInvoker != null ? requestInvoker.get() : null);
        
        Principal ctx = null;
        if (requestInvoker.get() != null) {
            ctx = requestInvoker.get().getUserPrincipal();
            if (ctx == null && requestInvoker.get().getSession(false) != null) {
                final String username = (String) requestInvoker.get().getSession().getAttribute("SSO_UserName");
                if (username != null) {
                    ctx = new Principal() {
                        @Override
                        public String getName() {
                            return username;
                        }
                    };
                }
            }
        }
        vars.put("Principal",  ctx);
        
        // The following are here for backward compatibility and should be deprecated as soon as possible
        Map<String, Object> global = Maps.newHashMap();
        
        if (manager != null) {
            GlobalModelContext globalModel = manager.getGlobalModel();
            global.put("sysenv",    globalModel.getEnvironment());      // TODO: DEPRECATE
        }
        vars.put("global",      global);                            // TODO: DEPRECATE
        vars.put("pathToRoot",  requestContext.getPathToRoot());    // TODO: DEPRECATE
        
        String layout = DEFAULT_LAYOUT;

        Explorer explorer = null;
        final boolean hasExplorerName = !requestContext.getExplorerName().isEmpty();
        try {
            if (hasExplorerName) {
                explorer = manager.getExplorer(requestContext.getExplorerName());
            }
        }
        catch (Exception e) {
            LOG.warn(e.getMessage());
        }
        if (explorer == null) {
            if (hasExplorerName) {
                throw new WebApplicationException(new RuntimeException("Invalid explorer"), Response.Status.NOT_FOUND);
            } else {
                explorer = EmptyExplorer.getInstance();
            }
        }

        layout = explorer.getLayoutName();
        vars.put("Explorer", explorer);
        
        if (vars.containsKey("layout")) {
            layout = (String) vars.get("layout");
        }




        final StringWriter stringWriter = new StringWriter();

        try {
            if (requestContext.getIsAjaxRequest()) {
    	        fmConfig.getTemplate(resolvedPath).process(vars, stringWriter);
            }
            else {
    	        if (layout == null) {
    	        	layout = DEFAULT_LAYOUT;
    			}
    	    	vars.put("nestedpage", resolvedPath);
    	    	
                fmConfig.getTemplate("/layout/" + layout + "/main.ftl").process(vars, stringWriter);
            }
    	
            if ( LOG.isDebugEnabled() ) {
                LOG.debug( "OK: Resolved freemarker template" );
            }

            final OutputStreamWriter writer = new OutputStreamWriter( out );
            writer.write(stringWriter.getBuffer().toString());
            writer.flush();
        }
        catch ( Throwable t ) {
            LOG.error("Error processing freemarker template @ " + resolvedPath + ": " + t.getMessage(), t);
            throw new WebApplicationException(t, Response.Status.INTERNAL_SERVER_ERROR);
        }
    }