Author: musachy Date: Wed Dec 17 14:38:40 2008 New Revision: 727558 URL: http://svn.apache.org/viewvc?rev=727558&view=rev Log: WW-2732 Add a "searchValueStack" to "text" tag
Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/Text.java struts/struts2/trunk/core/src/main/java/org/apache/struts2/util/TextProviderHelper.java struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/jsp/TextTag.java struts/struts2/trunk/core/src/site/resources/tags/text.html struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/TextTagTest.java Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/Text.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/Text.java?rev=727558&r1=727557&r2=727558&view=diff ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/Text.java (original) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/Text.java Wed Dec 17 14:38:40 2008 @@ -125,6 +125,7 @@ protected List values = Collections.EMPTY_LIST; protected String actualName; protected String name; + protected String searchStack; public Text(ValueStack stack) { super(stack); @@ -135,6 +136,10 @@ this.name = name; } + @StrutsTagAttribute(description="Search the stack if property is not found on resources", type = "Boolean", defaultValue = "true") + public void setSearchValueStack(String searchStack) { + this.searchStack = searchStack; + } public boolean usesBody() { // overriding this to true such that EVAL_BODY_BUFFERED is return and @@ -152,7 +157,8 @@ defaultMessage = actualName; } - String msg = TextProviderHelper.getText(actualName, defaultMessage, values, getStack()); + Boolean doSearchStack = searchStack != null ? (Boolean) findValue(searchStack, Boolean.class) : true; + String msg = TextProviderHelper.getText(actualName, defaultMessage, values, getStack(), doSearchStack == null || doSearchStack); if (msg != null) { try { Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/util/TextProviderHelper.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/util/TextProviderHelper.java?rev=727558&r1=727557&r2=727558&view=diff ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/util/TextProviderHelper.java (original) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/util/TextProviderHelper.java Wed Dec 17 14:38:40 2008 @@ -38,6 +38,21 @@ private static final Logger LOG = LoggerFactory.getLogger(TextProviderHelper.class); + /** + * <p>Get a message from the first TextProvider encountered in the stack. + * If the first TextProvider doesn't provide the message the default message is returned.</p> + * The stack is searched if if no TextProvider is found, or the message is not found. + * @param key the message key in the resource bundle + * @param defaultMessage the message to return if not found (evaluated for OGNL) + * @param args an array args to be used in a {...@link java.text.MessageFormat} message + * @param stack the value stack to use for finding the text + * + * @return the message if found, otherwise the defaultMessage + */ + public static String getText(String key, String defaultMessage, List<Object> args, ValueStack stack) { + return getText(key, defaultMessage, args, stack, true); + } + /** * <p>Get a message from the first TextProvider encountered in the stack. * If the first TextProvider doesn't provide the message the default message is returned.</p> @@ -48,10 +63,11 @@ * @param defaultMessage the message to return if not found (evaluated for OGNL) * @param args an array args to be used in a {...@link java.text.MessageFormat} message * @param stack the value stack to use for finding the text - * + * @param searchStack search stack for the key + * * @return the message if found, otherwise the defaultMessage */ - public static String getText(String key, String defaultMessage, List<Object> args, ValueStack stack) { + public static String getText(String key, String defaultMessage, List<Object> args, ValueStack stack, boolean searchStack) { String msg = null; TextProvider tp = null; @@ -68,7 +84,9 @@ if (msg == null) { // evaluate the defaultMesage as an OGNL expression - msg = stack.findString(defaultMessage); + if (searchStack) + msg = stack.findString(defaultMessage); + if (msg == null) { // use the defaultMessage literal value msg = defaultMessage; Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/jsp/TextTag.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/jsp/TextTag.java?rev=727558&r1=727557&r2=727558&view=diff ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/jsp/TextTag.java (original) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/jsp/TextTag.java Wed Dec 17 14:38:40 2008 @@ -38,6 +38,7 @@ private static final long serialVersionUID = -3075088084198264581L; protected String name; + protected String searchValueStack; public Component getBean(ValueStack stack, HttpServletRequest req, HttpServletResponse res) { return new Text(stack); @@ -46,10 +47,16 @@ protected void populateParams() { super.populateParams(); - ((Text) component).setName(name); + Text text = (Text) component; + text.setName(name); + text.setSearchValueStack(searchValueStack); } public void setName(String name) { this.name = name; } + + public void setSearchValueStack(String searchStack) { + this.searchValueStack = searchStack; + } } Modified: struts/struts2/trunk/core/src/site/resources/tags/text.html URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/site/resources/tags/text.html?rev=727558&r1=727557&r2=727558&view=diff ============================================================================== --- struts/struts2/trunk/core/src/site/resources/tags/text.html (original) +++ struts/struts2/trunk/core/src/site/resources/tags/text.html Wed Dec 17 14:38:40 2008 @@ -50,6 +50,14 @@ <td align="left" valign="top"> Name of resource property to fetch</td> </tr> <tr> + <td align="left" valign="top">searchValueStack</td> + <td align="left" valign="top">false</td> + <td align="left" valign="top">true</td> + <td align="left" valign="top">false</td> + <td align="left" valign="top">Boolean</td> + <td align="left" valign="top">Search the stack if property is not found on resources</td> + </tr> + <tr> <td align="left" valign="top">var</td> <td align="left" valign="top">false</td> <td align="left" valign="top"></td> Modified: struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/TextTagTest.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/TextTagTest.java?rev=727558&r1=727557&r2=727558&view=diff ============================================================================== --- struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/TextTagTest.java (original) +++ struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/TextTagTest.java Wed Dec 17 14:38:40 2008 @@ -216,6 +216,45 @@ assertEquals(value_int, writer.toString()); } + public void testTextTagSearchesStackByDefault() throws JspException { + String key = "result"; + + tag.setName(key); + final StringBuffer buffer = writer.getBuffer(); + buffer.delete(0, buffer.length()); + ValueStack newStack = container.getInstance(ValueStackFactory.class).createValueStack(); + newStack.getContext().put(ActionContext.CONTAINER, container); + TestAction testAction = new TestAction(); + testAction.setResult("bar"); + newStack.push(testAction); + request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, newStack); + + + tag.doStartTag(); + tag.doEndTag(); + assertEquals("bar", writer.toString()); + } + + public void testTextTagDoNotSearchStack() throws JspException { + String key = "result"; + + tag.setName(key); + tag.setSearchValueStack("false"); + final StringBuffer buffer = writer.getBuffer(); + buffer.delete(0, buffer.length()); + ValueStack newStack = container.getInstance(ValueStackFactory.class).createValueStack(); + newStack.getContext().put(ActionContext.CONTAINER, container); + TestAction testAction = new TestAction(); + testAction.setResult("bar"); + newStack.push(testAction); + request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, newStack); + + + tag.doStartTag(); + tag.doEndTag(); + assertEquals("result", writer.toString()); + } + public void testWithNoMessageAndBodyIsNotEmptyBodyIsReturned() throws Exception { final String key = "key.does.not.exist"; final String bodyText = "body text";