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);
}
}