use of org.apache.struts2.components.template.TemplateRenderingContext in project struts by apache.
the class FreemarkerTemplateEngine method renderTemplate.
public void renderTemplate(TemplateRenderingContext templateContext) throws Exception {
// get the various items required from the stack
ValueStack stack = templateContext.getStack();
ActionContext context = stack.getActionContext();
ServletContext servletContext = context.getServletContext();
HttpServletRequest req = context.getServletRequest();
HttpServletResponse res = context.getServletResponse();
// prepare freemarker
Configuration config = freemarkerManager.getConfiguration(servletContext);
// get the list of templates we can use
List<Template> templates = templateContext.getTemplate().getPossibleTemplates(this);
// find the right template
freemarker.template.Template template = null;
String templateName = null;
Exception exception = null;
for (Template t : templates) {
templateName = getFinalTemplateName(t);
try {
// try to load, and if it works, stop at the first one
template = config.getTemplate(templateName);
break;
} catch (ParseException e) {
// template was found but was invalid - always report this.
exception = e;
break;
} catch (IOException e) {
// FileNotFoundException is anticipated - report the first IOException if no template found
if (exception == null) {
exception = e;
}
}
}
if (template == null) {
if (LOG.isErrorEnabled()) {
LOG.error("Could not load the FreeMarker template named '{}':", templateContext.getTemplate().getName());
for (Template t : templates) {
LOG.error("Attempted: {}", getFinalTemplateName(t));
}
LOG.error("The TemplateLoader provided by the FreeMarker Configuration was a: {}", config.getTemplateLoader().getClass().getName());
}
if (exception != null) {
throw exception;
} else {
return;
}
}
LOG.debug("Rendering template: {}", templateName);
ActionInvocation ai = ActionContext.getContext().getActionInvocation();
Object action = (ai == null) ? null : ai.getAction();
if (action == null) {
LOG.warn("Rendering tag {} out of Action scope, accessing directly JSPs is not recommended! " + "Please read https://struts.apache.org/security/#never-expose-jsp-files-directly", templateName);
}
SimpleHash model = freemarkerManager.buildTemplateModel(stack, action, servletContext, req, res, config.getObjectWrapper());
model.put("tag", templateContext.getTag());
model.put("themeProperties", getThemeProps(templateContext.getTemplate()));
// the BodyContent JSP writer doesn't like it when FM flushes automatically --
// so let's just not do it (it will be flushed eventually anyway)
Writer writer = templateContext.getWriter();
final Writer wrapped = writer;
writer = new Writer() {
public void write(char[] cbuf, int off, int len) throws IOException {
wrapped.write(cbuf, off, len);
}
public void flush() throws IOException {
// nothing!
}
public void close() throws IOException {
wrapped.close();
}
};
LOG.debug("Push tag on top of the stack");
stack.push(templateContext.getTag());
try {
template.process(model, writer);
} finally {
LOG.debug("Removes tag from top of the stack");
stack.pop();
}
}
use of org.apache.struts2.components.template.TemplateRenderingContext in project struts by apache.
the class AbstractTest method setUp.
@Override
protected void setUp() throws Exception {
super.setUp();
scriptingAttrs.put("onclick", "onclick_");
scriptingAttrs.put("ondblclick", "ondblclick_");
scriptingAttrs.put("onmousedown", "onmousedown_");
scriptingAttrs.put("onmouseup", "onmouseup_");
scriptingAttrs.put("onmouseover", "onmouseover_");
scriptingAttrs.put("onmousemove", "onmousemove_");
scriptingAttrs.put("onmouseout", "onmouseout_");
scriptingAttrs.put("onfocus", "onfocus_");
scriptingAttrs.put("onblur", "onblur_");
scriptingAttrs.put("onkeypress", "onkeypress_");
scriptingAttrs.put("onkeydown", "onkeydown_");
scriptingAttrs.put("onkeyup", "onkeyup_");
scriptingAttrs.put("onselect", "onselect_");
scriptingAttrs.put("onchange", "onchange_");
commonAttrs.put("accesskey", "accesskey_");
dynamicAttrs.put("data-remote", "data-remote_");
dynamicAttrs.put("data-label", "data-label_");
theme = new SimpleTheme();
writer = new StringWriter();
map = new HashMap<>();
template = createMock(Template.class);
stack = createNiceMock(ValueStack.class);
setUpStack();
stackContext = new HashMap<>();
context = new TemplateRenderingContext(template, writer, stack, map, null);
stackContext.put(Component.COMPONENT_STACK, new Stack<>());
ActionContext actionContext = ActionContext.of(stackContext).bind();
request = createNiceMock(HttpServletRequest.class);
expect(request.getContextPath()).andReturn("/some/path").anyTimes();
response = createNiceMock(HttpServletResponse.class);
expect(stack.getActionContext()).andReturn(actionContext).anyTimes();
expect(stack.getContext()).andReturn(stackContext).anyTimes();
Container container = createNiceMock(Container.class);
XWorkConverter converter = new ConverterEx();
expect(container.getInstance(XWorkConverter.class)).andReturn(converter).anyTimes();
TextParser parser = new OgnlTextParser();
expect(container.getInstance(TextParser.class)).andReturn(parser).anyTimes();
replay(request);
replay(stack);
replay(container);
actionContext.withContainer(container).withServletRequest(request);
}
use of org.apache.struts2.components.template.TemplateRenderingContext in project struts by apache.
the class DefaultTheme method renderTag.
public void renderTag(String tagName, TemplateRenderingContext context) {
if (tagName.endsWith(".java")) {
tagName = tagName.substring(0, tagName.length() - ".java".length());
}
List<TagHandler> handlers = new ArrayList<TagHandler>();
List<TagHandlerFactory> factories = handlerFactories.get(tagName);
if (factories == null) {
throw new StrutsException("Unable to find handlers for tag " + tagName);
}
TagHandler prev = null;
for (int x = factories.size() - 1; x >= 0; x--) {
prev = factories.get(x).create(prev);
prev.setup(context);
handlers.add(0, prev);
}
// TagSerializer ser = (TagSerializer) handlers.get(handlers.size() - 1);
TagGenerator gen = (TagGenerator) handlers.get(0);
try {
LOG.trace("Rendering tag [{}]", tagName);
gen.generate();
} catch (IOException ex) {
throw new StrutsException("Unable to write tag: " + tagName, ex);
}
}
use of org.apache.struts2.components.template.TemplateRenderingContext in project struts by apache.
the class JavaTemplateEngine method renderTemplate.
public void renderTemplate(TemplateRenderingContext templateContext) throws Exception {
Template t = templateContext.getTemplate();
Theme theme = themes.get(t.getTheme());
if (theme == null) {
// Theme not supported, so do what struts would have done if we were not here.
LOG.debug("Theme not found [{}] trying default template engine using template type [{}]", t.getTheme(), defaultTemplateType);
final TemplateEngine engine = templateEngineManager.getTemplateEngine(templateContext.getTemplate(), defaultTemplateType);
if (engine == null) {
// May be the default template has changed?
throw new ConfigurationException("Unable to find a TemplateEngine for template type '" + defaultTemplateType + "' whilst trying to render template " + templateContext.getTemplate());
} else {
try {
// Retry render
engine.renderTemplate(templateContext);
} catch (Exception e) {
// Give up and throw a new StrutsException(e);
throw new StrutsException("Cannot render tag [" + t.getName() + "] because theme [" + t.getTheme() + "] was not found.", e);
}
}
} else {
// Render our template
theme.renderTag(t.getName(), templateContext);
}
}
use of org.apache.struts2.components.template.TemplateRenderingContext in project struts by apache.
the class VelocityTemplateEngine method renderTemplate.
public void renderTemplate(TemplateRenderingContext templateContext) throws Exception {
// get the various items required from the stack
Map actionContext = templateContext.getStack().getContext();
ServletContext servletContext = (ServletContext) actionContext.get(ServletActionContext.SERVLET_CONTEXT);
HttpServletRequest req = (HttpServletRequest) actionContext.get(ServletActionContext.HTTP_REQUEST);
HttpServletResponse res = (HttpServletResponse) actionContext.get(ServletActionContext.HTTP_RESPONSE);
// prepare velocity
velocityManager.init(servletContext);
VelocityEngine velocityEngine = velocityManager.getVelocityEngine();
// get the list of templates we can use
List<Template> templates = templateContext.getTemplate().getPossibleTemplates(this);
// find the right template
org.apache.velocity.Template template = null;
String templateName = null;
Exception exception = null;
for (Template t : templates) {
templateName = getFinalTemplateName(t);
try {
// try to load, and if it works, stop at the first one
template = velocityEngine.getTemplate(templateName);
break;
} catch (Exception e) {
if (exception == null) {
exception = e;
}
}
}
if (template == null) {
LOG.error("Could not load template {}", templateContext.getTemplate());
if (exception != null) {
throw exception;
} else {
return;
}
}
LOG.debug("Rendering template {}", templateName);
Context context = velocityManager.createContext(templateContext.getStack(), req, res);
Writer outputWriter = templateContext.getWriter();
context.put("tag", templateContext.getTag());
context.put("parameters", templateContext.getParameters());
template.merge(context, outputWriter);
}
Aggregations