Search in sources :

Example 1 with Template

use of org.apache.struts2.components.template.Template 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 Template

use of org.apache.struts2.components.template.Template in project struts by apache.

the class SelectTest method testBigDecimal.

/**
 * Tests WW-455: Select tag template does not work properly for Object like BigDecimal.
 */
public void testBigDecimal() throws Exception {
    BigDecimalObject hello = new BigDecimalObject("hello", new BigDecimal(1));
    BigDecimalObject foo = new BigDecimalObject("foo", new BigDecimal(2));
    TestAction testAction = (TestAction) action;
    Collection collection = new ArrayList(2);
    // expect strings to be returned, we're still dealing with HTTP here!
    collection.add("hello");
    collection.add("foo");
    testAction.setCollection(collection);
    List list2 = new ArrayList();
    list2.add(hello);
    list2.add(foo);
    list2.add(new BigDecimalObject("<cat>", new BigDecimal(1.500)));
    testAction.setList2(list2);
    SelectTag tag = new SelectTag();
    tag.setPageContext(pageContext);
    tag.setLabel("mylabel");
    tag.setName("collection");
    tag.setList("list2");
    tag.setListKey("name");
    tag.setListValue("bigDecimal");
    tag.setMultiple("true");
    tag.setTitle("mytitle");
    tag.setOnmousedown("alert('onmousedown');");
    tag.setOnmousemove("alert('onmousemove');");
    tag.setOnmouseout("alert('onmouseout');");
    tag.setOnmouseover("alert('onmouseover');");
    tag.setOnmouseup("alert('onmouseup');");
    tag.doStartTag();
    tag.doEndTag();
    verify(SelectTag.class.getResource("Select-3.txt"));
    // Basic sanity check of clearTagStateForTagPoolingServers() behaviour for Struts Tags after doEndTag().
    SelectTag freshTag = new SelectTag();
    freshTag.setPageContext(pageContext);
    assertFalse("Tag state after doEndTag() under default tag clear state is equal to new Tag with pageContext/parent set.  " + "May indicate that clearTagStateForTagPoolingServers() calls are not working properly.", strutsBodyTagsAreReflectionEqual(tag, freshTag));
}
Also used : ArrayList(java.util.ArrayList) Collection(java.util.Collection) List(java.util.List) ArrayList(java.util.ArrayList) BigDecimal(java.math.BigDecimal) TestAction(org.apache.struts2.TestAction)

Example 3 with Template

use of org.apache.struts2.components.template.Template in project struts by apache.

the class SelectTest method testBigDecimal_clearTagStateSet.

/**
 * Tests WW-455: Select tag template does not work properly for Object like BigDecimal.
 */
public void testBigDecimal_clearTagStateSet() throws Exception {
    BigDecimalObject hello = new BigDecimalObject("hello", new BigDecimal(1));
    BigDecimalObject foo = new BigDecimalObject("foo", new BigDecimal(2));
    TestAction testAction = (TestAction) action;
    Collection collection = new ArrayList(2);
    // expect strings to be returned, we're still dealing with HTTP here!
    collection.add("hello");
    collection.add("foo");
    testAction.setCollection(collection);
    List list2 = new ArrayList();
    list2.add(hello);
    list2.add(foo);
    list2.add(new BigDecimalObject("<cat>", new BigDecimal(1.500)));
    testAction.setList2(list2);
    SelectTag tag = new SelectTag();
    // Explicitly request tag state clearing.
    tag.setPerformClearTagStateForTagPoolingServers(true);
    tag.setPageContext(pageContext);
    tag.setLabel("mylabel");
    tag.setName("collection");
    tag.setList("list2");
    tag.setListKey("name");
    tag.setListValue("bigDecimal");
    tag.setMultiple("true");
    tag.setTitle("mytitle");
    tag.setOnmousedown("alert('onmousedown');");
    tag.setOnmousemove("alert('onmousemove');");
    tag.setOnmouseout("alert('onmouseout');");
    tag.setOnmouseover("alert('onmouseover');");
    tag.setOnmouseup("alert('onmouseup');");
    tag.doStartTag();
    // Ensure component tag state clearing is set true (to match tag).
    setComponentTagClearTagState(tag, true);
    tag.doEndTag();
    verify(SelectTag.class.getResource("Select-3.txt"));
    // Basic sanity check of clearTagStateForTagPoolingServers() behaviour for Struts Tags after doEndTag().
    SelectTag freshTag = new SelectTag();
    freshTag.setPerformClearTagStateForTagPoolingServers(true);
    freshTag.setPageContext(pageContext);
    assertTrue("Tag state after doEndTag() and explicit tag state clearing is inequal to new Tag with pageContext/parent set.  " + "May indicate that clearTagStateForTagPoolingServers() calls are not working properly.", strutsBodyTagsAreReflectionEqual(tag, freshTag));
}
Also used : ArrayList(java.util.ArrayList) Collection(java.util.Collection) List(java.util.List) ArrayList(java.util.ArrayList) BigDecimal(java.math.BigDecimal) TestAction(org.apache.struts2.TestAction)

Example 4 with Template

use of org.apache.struts2.components.template.Template in project struts by apache.

the class SelectTest method testByte_clearTagStateSet.

/**
 * Tests WW-1601: Select tag template does not work properly for Object like Byte.
 */
public void testByte_clearTagStateSet() throws Exception {
    ByteObject hello = new ByteObject(new Byte((byte) 1), "hello");
    ByteObject foo = new ByteObject(new Byte((byte) 2), "foo");
    TestAction testAction = (TestAction) action;
    Collection collection = new ArrayList(2);
    // expect strings to be returned, we're still dealing with HTTP here!
    collection.add("1");
    collection.add("2");
    testAction.setCollection(collection);
    List list2 = new ArrayList();
    list2.add(hello);
    list2.add(foo);
    testAction.setList2(list2);
    SelectTag tag = new SelectTag();
    // Explicitly request tag state clearing.
    tag.setPerformClearTagStateForTagPoolingServers(true);
    tag.setPageContext(pageContext);
    tag.setLabel("mylabel");
    tag.setName("collection");
    tag.setList("list2");
    tag.setListKey("byte");
    tag.setListValue("name");
    tag.setMultiple("true");
    tag.setTitle("mytitle");
    tag.setOnmousedown("alert('onmousedown');");
    tag.setOnmousemove("alert('onmousemove');");
    tag.setOnmouseout("alert('onmouseout');");
    tag.setOnmouseover("alert('onmouseover');");
    tag.setOnmouseup("alert('onmouseup');");
    tag.doStartTag();
    // Ensure component tag state clearing is set true (to match tag).
    setComponentTagClearTagState(tag, true);
    tag.doEndTag();
    verify(SelectTag.class.getResource("Select-10.txt"));
    // Basic sanity check of clearTagStateForTagPoolingServers() behaviour for Struts Tags after doEndTag().
    SelectTag freshTag = new SelectTag();
    freshTag.setPerformClearTagStateForTagPoolingServers(true);
    freshTag.setPageContext(pageContext);
    assertTrue("Tag state after doEndTag() and explicit tag state clearing is inequal to new Tag with pageContext/parent set.  " + "May indicate that clearTagStateForTagPoolingServers() calls are not working properly.", strutsBodyTagsAreReflectionEqual(tag, freshTag));
}
Also used : ArrayList(java.util.ArrayList) Collection(java.util.Collection) List(java.util.List) ArrayList(java.util.ArrayList) TestAction(org.apache.struts2.TestAction)

Example 5 with Template

use of org.apache.struts2.components.template.Template in project struts by apache.

the class TemplateEngineManagerTest method testTemplateTypeFromTemplateNameAndDefaults.

public void testTemplateTypeFromTemplateNameAndDefaults() {
    TemplateEngine engine = mgr.getTemplateEngine(new Template("/template", "simple", "foo"), null);
    assertTrue(engine instanceof JspTemplateEngine);
}
Also used : FreemarkerTemplateEngine(org.apache.struts2.components.template.FreemarkerTemplateEngine) TemplateEngine(org.apache.struts2.components.template.TemplateEngine) JspTemplateEngine(org.apache.struts2.components.template.JspTemplateEngine) JspTemplateEngine(org.apache.struts2.components.template.JspTemplateEngine) Template(org.apache.struts2.components.template.Template)

Aggregations

Template (org.apache.struts2.components.template.Template)13 TemplateEngine (org.apache.struts2.components.template.TemplateEngine)10 ActionContext (com.opensymphony.xwork2.ActionContext)9 HttpServletRequest (javax.servlet.http.HttpServletRequest)9 ServletActionContext (org.apache.struts2.ServletActionContext)9 ValueStack (com.opensymphony.xwork2.util.ValueStack)8 IOException (java.io.IOException)7 HttpServletResponse (javax.servlet.http.HttpServletResponse)7 File (java.io.File)6 Writer (java.io.Writer)6 StrutsException (org.apache.struts2.StrutsException)6 TestAction (org.apache.struts2.TestAction)6 FreemarkerTemplateEngine (org.apache.struts2.components.template.FreemarkerTemplateEngine)6 JspTemplateEngine (org.apache.struts2.components.template.JspTemplateEngine)6 ActionMapper (org.apache.struts2.dispatcher.mapper.ActionMapper)6 ActionMapping (org.apache.struts2.dispatcher.mapper.ActionMapping)6 ArrayList (java.util.ArrayList)5 List (java.util.List)5 ServletContext (javax.servlet.ServletContext)5 CoreMatchers.containsString (org.hamcrest.CoreMatchers.containsString)5