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";


Reply via email to