Author: niallp Date: Fri Nov 5 07:45:31 2004 New Revision: 56678 Added: struts/trunk/src/test/org/apache/struts/taglib/TestTagUtils.java Modified: struts/trunk/build-tests.xml struts/trunk/src/share/org/apache/struts/taglib/TagUtils.java Log: Improve TagUtils filter. Bug 23924 - Sean Owen
Modified: struts/trunk/build-tests.xml ============================================================================== --- struts/trunk/build-tests.xml (original) +++ struts/trunk/build-tests.xml Fri Nov 5 07:45:31 2004 @@ -742,6 +742,9 @@ </fileset> </batchtest> + <!-- Tests for org.apache.struts.taglib.TagUtils --> + <test name="org.apache.struts.taglib.TestTagUtils"/> + </junit> </target> Modified: struts/trunk/src/share/org/apache/struts/taglib/TagUtils.java ============================================================================== --- struts/trunk/src/share/org/apache/struts/taglib/TagUtils.java (original) +++ struts/trunk/src/share/org/apache/struts/taglib/TagUtils.java Fri Nov 5 07:45:31 2004 @@ -621,37 +621,50 @@ */ public String filter(String value) { - if (value == null) { - return (null); + if (value == null || value.length() == 0) { + return value; } - char content[] = new char[value.length()]; - value.getChars(0, value.length(), content, 0); - StringBuffer result = new StringBuffer(content.length + 50); - - for (int i = 0; i < content.length; i++) { - switch (content[i]) { + StringBuffer result = null; + String filtered = null; + for (int i = 0; i < value.length(); i++) { + filtered = null; + switch (value.charAt(i)) { case '<': - result.append("<"); + filtered = "<"; break; case '>': - result.append(">"); + filtered = ">"; break; case '&': - result.append("&"); + filtered = "&"; break; case '"': - result.append("""); + filtered = """; break; case '\'': - result.append("'"); + filtered = "'"; break; - default: - result.append(content[i]); + } + + if (result == null) { + if (filtered != null) { + result = new StringBuffer(value.length() + 50); + if (i > 0) { + result.append(value.substring(0, i)); + } + result.append(filtered); + } + } else { + if (filtered == null) { + result.append(value.charAt(i)); + } else { + result.append(filtered); + } } } - return result.toString(); + return result == null ? value : result.toString(); } /** Added: struts/trunk/src/test/org/apache/struts/taglib/TestTagUtils.java ============================================================================== --- (empty file) +++ struts/trunk/src/test/org/apache/struts/taglib/TestTagUtils.java Fri Nov 5 07:45:31 2004 @@ -0,0 +1,109 @@ +/* + * Copyright 2004 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.struts.taglib; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; +import org.apache.commons.logging.LogFactory; +import org.apache.commons.logging.Log; + + +/** + * Unit tests for the TagUtils. + */ +public class TestTagUtils extends TestCase { + + /** All logging goes through this logger */ + private static Log log = LogFactory.getLog(TestTagUtils.class); + + protected TagUtils tagutils = TagUtils.getInstance(); + + /** + * Defines the testcase name for JUnit. + * + * @param theName the testcase's name. + */ + public TestTagUtils(String theName) { + super(theName); + } + + /** + * Start the tests. + * + * @param theArgs the arguments. Not used + */ + public static void main(String[] theArgs) { + junit.awtui.TestRunner.main( + new String[] {TestTagUtils.class.getName()}); + } + + /** + * @return a test suite (<code>TestSuite</code>) that includes all methods + * starting with "test" + */ + public static Test suite() { + // All methods starting with "test" will be executed in the test suite. + return new TestSuite(TestTagUtils.class); + } + + public void setUp() { + } + + public void tearDown() { + } + + /** + * Test Operators. + */ + public void testFilter() { + + // Test Null + assertNull("Filter Test 1", tagutils.filter(null)); + + // Test Empty String + assertEquals("Filter Test 2", "", tagutils.filter("")); + + // Test Single Character + assertEquals("Filter Test 3", "a", tagutils.filter("a")); + + // Test Multiple Characters + assertEquals("Filter Test 4", "adhdfhdfhadhf", tagutils.filter("adhdfhdfhadhf")); + + // Test Each filtered Character + assertEquals("Filter Test 5", "<", tagutils.filter("<")); + assertEquals("Filter Test 6", ">", tagutils.filter(">")); + assertEquals("Filter Test 7", "&", tagutils.filter("&")); + assertEquals("Filter Test 8", """, tagutils.filter("\"")); + assertEquals("Filter Test 9", "'", tagutils.filter("'")); + + // Test filtering beginning, middle, end + assertEquals("Filter Test 10", "a<", tagutils.filter("a<")); + assertEquals("Filter Test 11", "<a", tagutils.filter("<a")); + assertEquals("Filter Test 12", "a<a", tagutils.filter("a<a")); + + // Test filtering beginning, middle, end + assertEquals("Filter Test 13", "abc<", tagutils.filter("abc<")); + assertEquals("Filter Test 14", "<abc", tagutils.filter("<abc")); + assertEquals("Filter Test 15", "abc<abc", tagutils.filter("abc<abc")); + + // Test Multiple Characters + assertEquals("Filter Test 16", "<input type="text" value='Me & You'>", + tagutils.filter("<input type=\"text\" value='Me & You'>")); + } + +} --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]