From 79951db2aa748d1c2935ac2774248e4527954fdc Mon Sep 17 00:00:00 2001 From: Stefaan Dutry Date: Wed, 3 Jan 2018 22:14:07 +0100 Subject: [PATCH 01/13] change tabs into spaces (formatting) --- .../src/main/java/org/apache/struts2/components/Anchor.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/org/apache/struts2/components/Anchor.java b/core/src/main/java/org/apache/struts2/components/Anchor.java index 163931010..5eeb3c860 100644 --- a/core/src/main/java/org/apache/struts2/components/Anchor.java +++ b/core/src/main/java/org/apache/struts2/components/Anchor.java @@ -115,10 +115,10 @@ public class Anchor extends ClosingUIBean { } @Inject - public void setUrlRenderer(UrlRenderer urlRenderer) { - urlProvider.setUrlRenderer(urlRenderer); + public void setUrlRenderer(UrlRenderer urlRenderer) { + urlProvider.setUrlRenderer(urlRenderer); this.urlRenderer = urlRenderer; - } + } @Inject(required=false) public void setExtraParameterProvider(ExtraParameterProvider provider) { From 0713da431c4d498c2243bd1e0bd4977907b16b50 Mon Sep 17 00:00:00 2001 From: Stefaan Dutry Date: Wed, 3 Jan 2018 22:15:54 +0100 Subject: [PATCH 02/13] add missing @Override annotations --- .../main/java/org/apache/struts2/components/Anchor.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/apache/struts2/components/Anchor.java b/core/src/main/java/org/apache/struts2/components/Anchor.java index 5eeb3c860..ef874ee40 100644 --- a/core/src/main/java/org/apache/struts2/components/Anchor.java +++ b/core/src/main/java/org/apache/struts2/components/Anchor.java @@ -80,14 +80,17 @@ public class Anchor extends ClosingUIBean { urlProvider.setHttpServletResponse(response); } + @Override public String getDefaultOpenTemplate() { return OPEN_TEMPLATE; } + @Override protected String getDefaultTemplate() { return TEMPLATE; } + @Override public boolean usesBody() { return true; } @@ -135,6 +138,7 @@ public class Anchor extends ClosingUIBean { /** * Overrides to be able to render body in a template rather than always before the template */ + @Override public boolean end(Writer writer, String body) { this.processingTagBody = false; evaluateParams(); @@ -151,7 +155,7 @@ public class Anchor extends ClosingUIBean { return false; } - + @Override public void addParameter(String key, Object value) { /* the parameters added by this method are used in the template. this method is also @@ -196,6 +200,7 @@ public class Anchor extends ClosingUIBean { urlProvider.setScheme(scheme); } + @Override @StrutsTagAttribute(description = "The target value to use, if not using action") public void setValue(String value) { urlProvider.setValue(value); From 1d0b375afd142d39940babe9889775fa57ad2cf4 Mon Sep 17 00:00:00 2001 From: Stefaan Dutry Date: Wed, 3 Jan 2018 22:26:36 +0100 Subject: [PATCH 03/13] add curly brackets (formatting) - add curly brackets around single line conditional statements - place finally statement on same line as closing catch bracket --- .../org/apache/struts2/components/Anchor.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/org/apache/struts2/components/Anchor.java b/core/src/main/java/org/apache/struts2/components/Anchor.java index ef874ee40..5d960c5aa 100644 --- a/core/src/main/java/org/apache/struts2/components/Anchor.java +++ b/core/src/main/java/org/apache/struts2/components/Anchor.java @@ -99,16 +99,17 @@ public class Anchor extends ClosingUIBean { protected void evaluateExtraParams() { super.evaluateExtraParams(); - if (href != null) + if (href != null) { addParameter("href", ensureAttributeSafelyNotEscaped(findString(href))); - else { + } else { //no href, build it from URL attributes StringWriter sw = new StringWriter(); urlRenderer.beforeRenderUrl(urlProvider); urlRenderer.renderUrl(sw, urlProvider); String builtHref = sw.toString(); - if (StringUtils.isNotEmpty(builtHref)) + if (StringUtils.isNotEmpty(builtHref)) { addParameter("href", ensureAttributeSafelyNotEscaped(builtHref)); + } } } @@ -147,8 +148,7 @@ public class Anchor extends ClosingUIBean { mergeTemplate(writer, buildTemplateName(template, getDefaultTemplate())); } catch (Exception e) { LOG.error("error when rendering", e); - } - finally { + } finally { popComponentStack(); } @@ -164,8 +164,9 @@ public class Anchor extends ClosingUIBean { */ if (processingTagBody) { this.urlParameters.put(key, value); - } else + } else { super.addParameter(key, value); + } } @Override @@ -177,8 +178,9 @@ public class Anchor extends ClosingUIBean { */ if (processingTagBody) { this.urlParameters.putAll(params); - } else + } else { super.addAllParameters(params); + } } public UrlProvider getUrlProvider() { From fe65910e0ed582e65663c9d30de30e41b79e340b Mon Sep 17 00:00:00 2001 From: Stefaan Dutry Date: Wed, 3 Jan 2018 22:44:07 +0100 Subject: [PATCH 04/13] change tabs into spaces (formatting) --- .../struts2/components/UrlRenderer.java | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/core/src/main/java/org/apache/struts2/components/UrlRenderer.java b/core/src/main/java/org/apache/struts2/components/UrlRenderer.java index 29890250e..b2f838a9a 100644 --- a/core/src/main/java/org/apache/struts2/components/UrlRenderer.java +++ b/core/src/main/java/org/apache/struts2/components/UrlRenderer.java @@ -28,26 +28,26 @@ import java.io.Writer; * */ public interface UrlRenderer { - - /** - * Preprocessing step - * @param provider The {@link UrlProvider} component that "owns" this renderer. - */ - void beforeRenderUrl(UrlProvider provider); - - /** - * Render a URL. - * @param writer A writer that the implementation can use to write the result to. - * @param provider The {@link UrlProvider} component that "owns" this renderer. - */ - void renderUrl(Writer writer, UrlProvider provider); - - /** - * Render a Form URL. - * @param formComponent The {@link Form} component that "owns" this renderer. - */ - void renderFormUrl(Form formComponent); - void setActionMapper(ActionMapper actionMapper); + /** + * Preprocessing step + * @param provider The {@link UrlProvider} component that "owns" this renderer. + */ + void beforeRenderUrl(UrlProvider provider); + + /** + * Render a URL. + * @param writer A writer that the implementation can use to write the result to. + * @param provider The {@link UrlProvider} component that "owns" this renderer. + */ + void renderUrl(Writer writer, UrlProvider provider); + + /** + * Render a Form URL. + * @param formComponent The {@link Form} component that "owns" this renderer. + */ + void renderFormUrl(Form formComponent); + + void setActionMapper(ActionMapper actionMapper); } From 38e3734930f0ebbb844cc62f38e08f5097947c6e Mon Sep 17 00:00:00 2001 From: Stefaan Dutry Date: Wed, 3 Jan 2018 22:50:23 +0100 Subject: [PATCH 05/13] change tabs into spaces (formatting) --- .../org/apache/struts2/components/UIBean.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/org/apache/struts2/components/UIBean.java b/core/src/main/java/org/apache/struts2/components/UIBean.java index 1a0356a0c..fa41c57a0 100644 --- a/core/src/main/java/org/apache/struts2/components/UIBean.java +++ b/core/src/main/java/org/apache/struts2/components/UIBean.java @@ -883,7 +883,7 @@ public abstract class UIBean extends Component { evaluateExtraParams(); } - protected String escape(String name) { + protected String escape(String name) { // escape any possible values that can make the ID painful to work with in JavaScript if (name != null) { return name.replaceAll("[\\/\\.\\[\\]]", "_"); @@ -930,7 +930,7 @@ public abstract class UIBean extends Component { form.addParameter("customOnsubmitEnabled", Boolean.TRUE); } else { if (LOG.isWarnEnabled()) { - LOG.warn("Cannot find an Ancestor form, custom onsubmit is NOT enabled"); + LOG.warn("Cannot find an Ancestor form, custom onsubmit is NOT enabled"); } } } @@ -1240,7 +1240,7 @@ public abstract class UIBean extends Component { this.tooltipIconPath = tooltipIconPath; } - public void setDynamicAttributes(Map tagDynamicAttributes) { + public void setDynamicAttributes(Map tagDynamicAttributes) { for (Map.Entry entry : tagDynamicAttributes.entrySet()) { String key = entry.getKey(); @@ -1250,12 +1250,12 @@ public abstract class UIBean extends Component { } } - @Override - /** - * supports dynamic attributes for freemarker ui tags - * @see https://issues.apache.org/jira/browse/WW-3174 + @Override + /** + * supports dynamic attributes for freemarker ui tags + * @see https://issues.apache.org/jira/browse/WW-3174 * @see https://issues.apache.org/jira/browse/WW-4166 - */ + */ public void copyParams(Map params) { super.copyParams(params); for (Object o : params.entrySet()) { From 7a251ddca92eaac6d56f9768d95df45271f51f11 Mon Sep 17 00:00:00 2001 From: Stefaan Dutry Date: Wed, 3 Jan 2018 22:53:02 +0100 Subject: [PATCH 06/13] add curly brackets (formatting) - add curly brackets around single line conditional statements --- core/src/main/java/org/apache/struts2/components/UIBean.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/apache/struts2/components/UIBean.java b/core/src/main/java/org/apache/struts2/components/UIBean.java index fa41c57a0..3038d117b 100644 --- a/core/src/main/java/org/apache/struts2/components/UIBean.java +++ b/core/src/main/java/org/apache/struts2/components/UIBean.java @@ -1261,8 +1261,9 @@ public abstract class UIBean extends Component { for (Object o : params.entrySet()) { Map.Entry entry = (Map.Entry) o; String key = (String) entry.getKey(); - if(!isValidTagAttribute(key) && !key.equals("dynamicAttributes")) + if (!isValidTagAttribute(key) && !key.equals("dynamicAttributes")) { dynamicAttributes.put(key, entry.getValue()); + } } } From a29051c835cb93d68578039361b8b325c2bd7831 Mon Sep 17 00:00:00 2001 From: Stefaan Dutry Date: Wed, 3 Jan 2018 22:59:52 +0100 Subject: [PATCH 07/13] add missing @Override annotation --- core/src/main/java/org/apache/struts2/components/UIBean.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/main/java/org/apache/struts2/components/UIBean.java b/core/src/main/java/org/apache/struts2/components/UIBean.java index 3038d117b..b7c4432e4 100644 --- a/core/src/main/java/org/apache/struts2/components/UIBean.java +++ b/core/src/main/java/org/apache/struts2/components/UIBean.java @@ -528,6 +528,7 @@ public abstract class UIBean extends Component { this.templateEngineManager = mgr; } + @Override public boolean end(Writer writer, String body) { evaluateParams(); try { From 0bfdc5e6435ecdfb7ddb097d93dd54e9654dabd7 Mon Sep 17 00:00:00 2001 From: Stefaan Dutry Date: Thu, 4 Jan 2018 16:32:21 +0100 Subject: [PATCH 08/13] add test for mergeTemplate method Test that a ConfigurationException is thrown when the TemplateEngineManager returns null instead of a TemplateEngine instance. --- .../apache/struts2/components/UIBeanTest.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/core/src/test/java/org/apache/struts2/components/UIBeanTest.java b/core/src/test/java/org/apache/struts2/components/UIBeanTest.java index 2b3da96c3..4a552c846 100644 --- a/core/src/test/java/org/apache/struts2/components/UIBeanTest.java +++ b/core/src/test/java/org/apache/struts2/components/UIBeanTest.java @@ -19,11 +19,16 @@ package org.apache.struts2.components; import com.opensymphony.xwork2.ActionContext; +import com.opensymphony.xwork2.config.ConfigurationException; import com.opensymphony.xwork2.util.ValueStack; import org.apache.struts2.StrutsInternalTestCase; +import org.apache.struts2.components.template.Template; +import org.apache.struts2.components.template.TemplateEngine; +import org.apache.struts2.components.template.TemplateEngineManager; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; + import java.util.Collections; import java.util.Map; @@ -161,4 +166,26 @@ public class UIBeanTest extends StrutsInternalTestCase { assertEquals("12", txtFld.getTheme()); } + public void testMergeTemplateNullEngineException() throws Exception { + ValueStack stack = ActionContext.getContext().getValueStack(); + MockHttpServletRequest req = new MockHttpServletRequest(); + MockHttpServletResponse res = new MockHttpServletResponse(); + //templateEngineManager that returns null as TemplateEngine + TemplateEngineManager templateEngineManager = new TemplateEngineManager() { + public TemplateEngine getTemplateEngine(Template template, String templateTypeOverride) { + return null; + } + }; + TextField txtFld = new TextField(stack, req, res); + + txtFld.setTemplateEngineManager(templateEngineManager); + + try { + txtFld.mergeTemplate(null, new Template(null, null, null)); + fail("Exception not thrown"); + } catch(final Exception e){ + assertTrue(e instanceof ConfigurationException); + } + } + } From 476697f99a55de585ffe3d6e44e6ada948c671b4 Mon Sep 17 00:00:00 2001 From: Stefaan Dutry Date: Thu, 4 Jan 2018 18:39:48 +0100 Subject: [PATCH 09/13] add test for buildTemplateName method Verified that: - default template name gets picked when no specific one is given - specific template gets precedence over default one --- .../apache/struts2/components/UIBeanTest.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/core/src/test/java/org/apache/struts2/components/UIBeanTest.java b/core/src/test/java/org/apache/struts2/components/UIBeanTest.java index 4a552c846..10be72fd2 100644 --- a/core/src/test/java/org/apache/struts2/components/UIBeanTest.java +++ b/core/src/test/java/org/apache/struts2/components/UIBeanTest.java @@ -188,4 +188,20 @@ public class UIBeanTest extends StrutsInternalTestCase { } } + public void testBuildTemplate() throws Exception { + String defaultTemplateName = "default"; + String customTemplateName = "custom"; + ValueStack stack = ActionContext.getContext().getValueStack(); + MockHttpServletRequest req = new MockHttpServletRequest(); + MockHttpServletResponse res = new MockHttpServletResponse(); + + TextField txtFld = new TextField(stack, req, res); + + Template defaultTemplate = txtFld.buildTemplateName(null, defaultTemplateName); + Template customTemplate = txtFld.buildTemplateName(customTemplateName, defaultTemplateName); + + assertEquals(defaultTemplateName, defaultTemplate.getName()); + assertEquals(customTemplateName, customTemplate.getName()); + } + } From dd76d3922410db8ba76fe65accdc9c11f9408b71 Mon Sep 17 00:00:00 2001 From: Stefaan Dutry Date: Thu, 4 Jan 2018 19:39:48 +0100 Subject: [PATCH 10/13] add tests for getTemplateDir method Verified that: - explicit templateDirectory gets precedence - attribute templateDir gets picked if no explitit one is given - defaultTemplateDirectory gets picked if there is no explicit one and an attribute templateDid - "template" is returned as default value --- .../apache/struts2/components/UIBeanTest.java | 58 ++++++++++++++++++- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/core/src/test/java/org/apache/struts2/components/UIBeanTest.java b/core/src/test/java/org/apache/struts2/components/UIBeanTest.java index 10be72fd2..488fc74a9 100644 --- a/core/src/test/java/org/apache/struts2/components/UIBeanTest.java +++ b/core/src/test/java/org/apache/struts2/components/UIBeanTest.java @@ -197,11 +197,65 @@ public class UIBeanTest extends StrutsInternalTestCase { TextField txtFld = new TextField(stack, req, res); - Template defaultTemplate = txtFld.buildTemplateName(null, defaultTemplateName); - Template customTemplate = txtFld.buildTemplateName(customTemplateName, defaultTemplateName); + Template defaultTemplate = txtFld.buildTemplateName(null, defaultTemplateName); + Template customTemplate = txtFld.buildTemplateName(customTemplateName, defaultTemplateName); assertEquals(defaultTemplateName, defaultTemplate.getName()); assertEquals(customTemplateName, customTemplate.getName()); } + public void testGetTemplateDirExplicit() throws Exception { + String explicitTemplateDir = "explicitTemplateDirectory"; + String attrTemplateDir = "attrTemplateDirectory"; + String defaultTemplateDir = "defaultTemplateDirectory"; + ValueStack stack = ActionContext.getContext().getValueStack(); + MockHttpServletRequest req = new MockHttpServletRequest(); + MockHttpServletResponse res = new MockHttpServletResponse(); + Map context = Collections.singletonMap("templateDir", attrTemplateDir); + ActionContext.getContext().put("attr", context); + + TextField txtFld = new TextField(stack, req, res); + txtFld.setTemplateDir(explicitTemplateDir); + txtFld.setDefaultTemplateDir(defaultTemplateDir); + + assertEquals(explicitTemplateDir, txtFld.getTemplateDir()); + } + + public void testGetTemplateDirAttr() throws Exception { + String attrTemplateDir = "attrTemplateDirectory"; + String defaultTemplateDir = "defaultTemplateDirectory"; + ValueStack stack = ActionContext.getContext().getValueStack(); + MockHttpServletRequest req = new MockHttpServletRequest(); + MockHttpServletResponse res = new MockHttpServletResponse(); + Map context = Collections.singletonMap("templateDir", attrTemplateDir); + ActionContext.getContext().put("attr", context); + + TextField txtFld = new TextField(stack, req, res); + txtFld.setDefaultTemplateDir(defaultTemplateDir); + + assertEquals(attrTemplateDir, txtFld.getTemplateDir()); + } + + public void testGetTemplateDirDefault() throws Exception { + String defaultTemplateDir = "defaultTemplateDirectory"; + ValueStack stack = ActionContext.getContext().getValueStack(); + MockHttpServletRequest req = new MockHttpServletRequest(); + MockHttpServletResponse res = new MockHttpServletResponse(); + + TextField txtFld = new TextField(stack, req, res); + txtFld.setDefaultTemplateDir(defaultTemplateDir); + + assertEquals(defaultTemplateDir, txtFld.getTemplateDir()); + } + + public void testGetTemplateDirNoneSet() throws Exception { + ValueStack stack = ActionContext.getContext().getValueStack(); + MockHttpServletRequest req = new MockHttpServletRequest(); + MockHttpServletResponse res = new MockHttpServletResponse(); + + TextField txtFld = new TextField(stack, req, res); + + assertEquals("template", txtFld.getTemplateDir()); + } + } From 7df1e67bac01fd4a2477b740d30aebc07d989451 Mon Sep 17 00:00:00 2001 From: Stefaan Dutry Date: Thu, 4 Jan 2018 23:08:12 +0100 Subject: [PATCH 11/13] add test for setting acceskey Verified that the value is added to the parameters after they have been evaluated. --- .../org/apache/struts2/components/UIBeanTest.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/core/src/test/java/org/apache/struts2/components/UIBeanTest.java b/core/src/test/java/org/apache/struts2/components/UIBeanTest.java index 488fc74a9..cc274a6c9 100644 --- a/core/src/test/java/org/apache/struts2/components/UIBeanTest.java +++ b/core/src/test/java/org/apache/struts2/components/UIBeanTest.java @@ -258,4 +258,17 @@ public class UIBeanTest extends StrutsInternalTestCase { assertEquals("template", txtFld.getTemplateDir()); } + public void testSetAccesskey() { + String accesskeyValue = "myAccesskey"; + ValueStack stack = ActionContext.getContext().getValueStack(); + MockHttpServletRequest req = new MockHttpServletRequest(); + MockHttpServletResponse res = new MockHttpServletResponse(); + + TextField txtFld = new TextField(stack, req, res); + txtFld.setAccesskey(accesskeyValue); + txtFld.evaluateParams(); + + assertEquals(accesskeyValue, txtFld.getParameters().get("accesskey")); + } + } From 2fd2cb5f971ceca39dcfaf0d50ac2c19c8741408 Mon Sep 17 00:00:00 2001 From: Stefaan Dutry Date: Thu, 4 Jan 2018 23:20:45 +0100 Subject: [PATCH 12/13] add test for parameter with name "value" Verified that the value parameter is added as the nameValue parameter. --- .../org/apache/struts2/components/UIBeanTest.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/core/src/test/java/org/apache/struts2/components/UIBeanTest.java b/core/src/test/java/org/apache/struts2/components/UIBeanTest.java index cc274a6c9..f3fc12117 100644 --- a/core/src/test/java/org/apache/struts2/components/UIBeanTest.java +++ b/core/src/test/java/org/apache/struts2/components/UIBeanTest.java @@ -271,4 +271,16 @@ public class UIBeanTest extends StrutsInternalTestCase { assertEquals(accesskeyValue, txtFld.getParameters().get("accesskey")); } + public void testValueParameterEvaluation() { + String value = "myValue"; + ValueStack stack = ActionContext.getContext().getValueStack(); + MockHttpServletRequest req = new MockHttpServletRequest(); + MockHttpServletResponse res = new MockHttpServletResponse(); + + TextField txtFld = new TextField(stack, req, res); + txtFld.addParameter("value", value); + txtFld.evaluateParams(); + + assertEquals(value, txtFld.getParameters().get("nameValue")); + } } From 0deea3f9e4de1682e8d3df9c64e160d35a5af6e0 Mon Sep 17 00:00:00 2001 From: Stefaan Dutry Date: Fri, 5 Jan 2018 17:28:47 +0100 Subject: [PATCH 13/13] remove old subversion comments --- .../test/java/org/apache/struts2/components/UIBeanTest.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/core/src/test/java/org/apache/struts2/components/UIBeanTest.java b/core/src/test/java/org/apache/struts2/components/UIBeanTest.java index f3fc12117..31f6e3487 100644 --- a/core/src/test/java/org/apache/struts2/components/UIBeanTest.java +++ b/core/src/test/java/org/apache/struts2/components/UIBeanTest.java @@ -32,10 +32,6 @@ import org.springframework.mock.web.MockHttpServletResponse; import java.util.Collections; import java.util.Map; -/** - * - * @version $Date$ $Id$ - */ public class UIBeanTest extends StrutsInternalTestCase { public void testPopulateComponentHtmlId1() throws Exception {