Author: gangolli
Date: Sat Aug 17 15:26:40 2013
New Revision: 1515001
URL: http://svn.apache.org/r1515001
Log:
Add cleanup in UIAction.getText() calls. Add unit test.
Added:
roller/trunk/app/src/test/java/org/apache/roller/weblogger/ui/struts2/
roller/trunk/app/src/test/java/org/apache/roller/weblogger/ui/struts2/util/
roller/trunk/app/src/test/java/org/apache/roller/weblogger/ui/struts2/util/UIActionTest.java
Modified:
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UIAction.java
Modified:
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UIAction.java
URL:
http://svn.apache.org/viewvc/roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UIAction.java?rev=1515001&r1=1515000&r2=1515001&view=diff
==============================================================================
---
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UIAction.java
(original)
+++
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UIAction.java
Sat Aug 17 15:26:40 2013
@@ -19,12 +19,7 @@
package org.apache.roller.weblogger.ui.struts2.util;
import com.opensymphony.xwork2.ActionSupport;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
+import org.apache.commons.lang.StringEscapeUtils;
import org.apache.roller.weblogger.business.UserManager;
import org.apache.roller.weblogger.business.WebloggerFactory;
import org.apache.roller.weblogger.config.WebloggerConfig;
@@ -37,6 +32,12 @@ import org.apache.roller.weblogger.ui.co
import org.apache.roller.weblogger.ui.core.util.menu.MenuHelper;
import org.apache.struts2.interceptor.RequestAware;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
/**
* Extends the Struts2 ActionSupport class to add in support for handling an
@@ -169,8 +170,58 @@ public abstract class UIAction extends A
return (value == null) ? 0 : new Integer(value);
}
-
-
+
+ @Override
+ public String getText(String aTextName) {
+ return super.getText(cleanText(aTextName));
+ }
+
+ @Override
+ public String getText(String aTextName, String defaultValue) {
+ return super.getText(cleanText(aTextName), cleanText(defaultValue));
+ }
+
+ @Override
+ public String getText(String aTextName, String defaultValue, String obj) {
+ return super.getText(cleanText(aTextName), cleanText(defaultValue),
cleanText(obj));
+ }
+
+ @Override
+ public String getText(String aTextName, List<?> args) {
+ List<Object> cleanedArgs = new ArrayList<Object>(args.size());
+ for (Object el : args) {
+ cleanedArgs.add(el instanceof String ? cleanText((String) el) :
el);
+ }
+ return super.getText(cleanText(aTextName), cleanedArgs);
+ }
+
+ @Override
+ public String getText(String key, String[] args) {
+ String[] cleanedArgs = new String[args.length];
+ for (int i = 0; i < args.length; ++i) {
+ cleanedArgs[i] = cleanText(args[i]);
+ }
+ return super.getText(cleanText(key), cleanedArgs);
+ }
+
+ @Override
+ public String getText(String aTextName, String defaultValue, List<?> args)
{
+ List<Object> cleanedArgs = new ArrayList<Object>(args.size());
+ for (Object el : args) {
+ cleanedArgs.add(el instanceof String ? cleanText((String) el) :
el);
+ }
+ return super.getText(cleanText(aTextName), cleanText(defaultValue),
cleanedArgs);
+ }
+
+ @Override
+ public String getText(String key, String defaultValue, String[] args) {
+ String[] cleanedArgs = new String[args.length];
+ for (int i = 0; i < args.length; ++i) {
+ cleanedArgs[i] = cleanText(args[i]);
+ }
+ return super.getText(cleanText(key), cleanText(defaultValue),
cleanedArgs);
+ }
+
public void addError(String errorKey) {
addActionError(getText(errorKey));
}
@@ -335,5 +386,41 @@ public abstract class UIAction extends A
return opts;
}
-
+
+ private static String cleanDollarExpressions(String s) {
+ // Remove ${ } expressions; handcoded automaton
+ StringBuilder cleaned = new StringBuilder(s.length());
+ boolean skipping = false;
+ int braceDepth = 0;
+ int p = 0;
+ char prior = ' ';
+ while (p < s.length()) {
+ char c = s.charAt(p);
+ switch (c) {
+ case '{':
+ ++braceDepth;
+ skipping = skipping || (prior == '$');
+ break;
+ case '}':
+ if (braceDepth > 0) --braceDepth;
+ break;
+ default:
+ }
+ if (!skipping) {
+ if (prior == '$') cleaned.append(prior);
+ if (c != '$') cleaned.append(c);
+ }
+ skipping = skipping && (braceDepth > 0);
+ prior = c;
+ ++p;
+ }
+ if (prior == '$') cleaned.append(prior); // string had final $ held
in prior
+ return cleaned.toString();
+ }
+
+ public static String cleanText(String s) {
+ if (s == null || s.isEmpty()) return s;
+ // escape HTML
+ return StringEscapeUtils.escapeHtml(cleanDollarExpressions(s));
+ }
}
Added:
roller/trunk/app/src/test/java/org/apache/roller/weblogger/ui/struts2/util/UIActionTest.java
URL:
http://svn.apache.org/viewvc/roller/trunk/app/src/test/java/org/apache/roller/weblogger/ui/struts2/util/UIActionTest.java?rev=1515001&view=auto
==============================================================================
---
roller/trunk/app/src/test/java/org/apache/roller/weblogger/ui/struts2/util/UIActionTest.java
(added)
+++
roller/trunk/app/src/test/java/org/apache/roller/weblogger/ui/struts2/util/UIActionTest.java
Sat Aug 17 15:26:40 2013
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. The ASF licenses this file to You
+ * 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. For additional information regarding
+ * copyright in this work, please see the NOTICE file in the top level
+ * directory of this distribution.
+ */
+
+package org.apache.roller.weblogger.ui.struts2.util;
+
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+
+public class UIActionTest extends TestCase {
+
+ public UIActionTest() {
+ }
+
+ public static Test suite() {
+ return new TestSuite(UIActionTest.class);
+ }
+
+ public void testCleanTextEmpty() {
+ assertEquals(null,UIAction.cleanText(null));
+ assertEquals("",UIAction.cleanText(""));
+ }
+
+ public void testCleanTextDollarExpressions() {
+ assertEquals(null,UIAction.cleanText(null));
+ assertEquals("",UIAction.cleanText(""));
+ assertEquals("a",UIAction.cleanText("a"));
+ assertEquals("$",UIAction.cleanText("$"));
+ assertEquals("{",UIAction.cleanText("{"));
+ assertEquals("}",UIAction.cleanText("}"));
+ assertEquals("",UIAction.cleanText("${"));
+ assertEquals("text$",UIAction.cleanText("text$"));
+ assertEquals("text something more", UIAction.cleanText("text
something ${ more } ${ and more } more"));
+ assertEquals("text more", UIAction.cleanText("text ${ something ${
more } ${ and more } } more"));
+ assertEquals("text %{1} text %{2} more", UIAction.cleanText("text %{1}
text${2} %{2} more"));
+ assertEquals("already { clean }", UIAction.cleanText("already { clean
}"));
+ assertEquals("$signs but not immediately followed by { braces }",
UIAction.cleanText("$signs but not immediately followed by { braces }"));
+ assertEquals("clean", UIAction.cleanText("${part { }
}clean${anything}"));
+ }
+
+ public void testCleanTextHtml() {
+ assertEquals("<i>some
text</i>",UIAction.cleanText("<i>some text</i>"));
+ assertEquals("<i>some </i>",UIAction.cleanText("<i>some
${text}</i>")); // combined
+ }
+
+}