Search in sources :

Example 1 with TemplateRenderingContext

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();
    }
}
Also used : ValueStack(com.opensymphony.xwork2.util.ValueStack) Configuration(freemarker.template.Configuration) ActionInvocation(com.opensymphony.xwork2.ActionInvocation) HttpServletResponse(javax.servlet.http.HttpServletResponse) IOException(java.io.IOException) ServletActionContext(org.apache.struts2.ServletActionContext) ActionContext(com.opensymphony.xwork2.ActionContext) IOException(java.io.IOException) ParseException(freemarker.core.ParseException) HttpServletRequest(javax.servlet.http.HttpServletRequest) SimpleHash(freemarker.template.SimpleHash) ServletContext(javax.servlet.ServletContext) ParseException(freemarker.core.ParseException) Writer(java.io.Writer)

Example 2 with TemplateRenderingContext

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);
}
Also used : OgnlTextParser(com.opensymphony.xwork2.util.OgnlTextParser) ValueStack(com.opensymphony.xwork2.util.ValueStack) TextParser(com.opensymphony.xwork2.util.TextParser) OgnlTextParser(com.opensymphony.xwork2.util.OgnlTextParser) HttpServletResponse(javax.servlet.http.HttpServletResponse) ActionContext(com.opensymphony.xwork2.ActionContext) Template(org.apache.struts2.components.template.Template) HttpServletRequest(javax.servlet.http.HttpServletRequest) Container(com.opensymphony.xwork2.inject.Container) StringWriter(java.io.StringWriter) XWorkConverter(com.opensymphony.xwork2.conversion.impl.XWorkConverter) TemplateRenderingContext(org.apache.struts2.components.template.TemplateRenderingContext)

Example 3 with TemplateRenderingContext

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);
    }
}
Also used : StrutsException(org.apache.struts2.StrutsException) ArrayList(java.util.ArrayList) IOException(java.io.IOException)

Example 4 with TemplateRenderingContext

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);
    }
}
Also used : TemplateEngine(org.apache.struts2.components.template.TemplateEngine) BaseTemplateEngine(org.apache.struts2.components.template.BaseTemplateEngine) StrutsException(org.apache.struts2.StrutsException) ConfigurationException(com.opensymphony.xwork2.config.ConfigurationException) SimpleTheme(org.apache.struts2.views.java.simple.SimpleTheme) ConfigurationException(com.opensymphony.xwork2.config.ConfigurationException) StrutsException(org.apache.struts2.StrutsException) Template(org.apache.struts2.components.template.Template)

Example 5 with TemplateRenderingContext

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);
}
Also used : TemplateRenderingContext(org.apache.struts2.components.template.TemplateRenderingContext) ServletActionContext(org.apache.struts2.ServletActionContext) Context(org.apache.velocity.context.Context) ServletContext(javax.servlet.ServletContext) VelocityEngine(org.apache.velocity.app.VelocityEngine) HttpServletResponse(javax.servlet.http.HttpServletResponse) Template(org.apache.struts2.components.template.Template) HttpServletRequest(javax.servlet.http.HttpServletRequest) ServletContext(javax.servlet.ServletContext) Map(java.util.Map) Writer(java.io.Writer)

Aggregations

ValueStack (com.opensymphony.xwork2.util.ValueStack)3 HttpServletRequest (javax.servlet.http.HttpServletRequest)3 HttpServletResponse (javax.servlet.http.HttpServletResponse)3 Template (org.apache.struts2.components.template.Template)3 TemplateRenderingContext (org.apache.struts2.components.template.TemplateRenderingContext)3 ActionContext (com.opensymphony.xwork2.ActionContext)2 ConfigurationException (com.opensymphony.xwork2.config.ConfigurationException)2 IOException (java.io.IOException)2 Writer (java.io.Writer)2 ServletContext (javax.servlet.ServletContext)2 ServletActionContext (org.apache.struts2.ServletActionContext)2 StrutsException (org.apache.struts2.StrutsException)2 TemplateEngine (org.apache.struts2.components.template.TemplateEngine)2 ActionInvocation (com.opensymphony.xwork2.ActionInvocation)1 XWorkConverter (com.opensymphony.xwork2.conversion.impl.XWorkConverter)1 Container (com.opensymphony.xwork2.inject.Container)1 OgnlTextParser (com.opensymphony.xwork2.util.OgnlTextParser)1 TextParser (com.opensymphony.xwork2.util.TextParser)1 ParseException (freemarker.core.ParseException)1 Configuration (freemarker.template.Configuration)1