Resolved WW-3463 - added support for dynamic attributes

git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/trunk@963604 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Lukasz Lenart
2010-07-13 05:54:28 +00:00
parent cd5c35e24a
commit 9787de855f
4 changed files with 64 additions and 15 deletions
@@ -0,0 +1,22 @@
package org.apache.struts2.views.java.simple;
import org.apache.struts2.views.java.Attributes;
import java.io.IOException;
import java.util.Map;
/**
* Adds dynamic attributes
*/
public class DynamicAttributesHandler extends AbstractTagHandler {
/* (non-Javadoc)
* @see org.apache.struts2.views.java.simple.AbstractTagHandler#start(java.lang.String, org.apache.struts2.views.java.Attributes)
*/
@Override
public void start(String name, Attributes a) throws IOException {
a.putAll((Map<String, String>) context.getParameters().get("dynamicAttributes"));
super.start(name, a);
}
}
@@ -34,28 +34,28 @@ public class SimpleTheme extends DefaultTheme {
public SimpleTheme() {
setHandlerFactories(new HashMap<String, List<TagHandlerFactory>>() {
{
put("text", new FactoryList(TextFieldHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
put("textfield", new FactoryList(TextFieldHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
put("select", new FactoryList(SelectHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
put("form", new FactoryList(FormHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
put("text", new FactoryList(TextFieldHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class, DynamicAttributesHandler.class));
put("textfield", new FactoryList(TextFieldHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class, DynamicAttributesHandler.class));
put("select", new FactoryList(SelectHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class, DynamicAttributesHandler.class));
put("form", new FactoryList(FormHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class, DynamicAttributesHandler.class));
put("form-close", new FactoryList(FormHandler.CloseHandler.class));
put("a", new FactoryList(AnchorHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
put("a", new FactoryList(AnchorHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class, DynamicAttributesHandler.class));
put("a-close", new FactoryList(AnchorHandler.CloseHandler.class));
put("checkbox", new FactoryList(CheckboxHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
put("file", new FactoryList(FileHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
put("password", new FactoryList(PasswordHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
put("label", new FactoryList(LabelHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
put("reset", new FactoryList(ResetHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
put("submit", new FactoryList(SubmitHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
put("checkbox", new FactoryList(CheckboxHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class, DynamicAttributesHandler.class));
put("file", new FactoryList(FileHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class, DynamicAttributesHandler.class));
put("password", new FactoryList(PasswordHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class, DynamicAttributesHandler.class));
put("label", new FactoryList(LabelHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class, DynamicAttributesHandler.class));
put("reset", new FactoryList(ResetHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class, DynamicAttributesHandler.class));
put("submit", new FactoryList(SubmitHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class, DynamicAttributesHandler.class));
put("submit-close", new FactoryList(SubmitHandler.CloseHandler.class));
put("textarea", new FactoryList(TextAreaHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
put("textarea", new FactoryList(TextAreaHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class, DynamicAttributesHandler.class));
put("actionerror", new FactoryList(ActionErrorHandler.class));
put("token", new FactoryList(TokenHandler.class));
put("actionmessage", new FactoryList(ActionMessageHandler.class));
put("head", new FactoryList(HeadHandler.class));
put("hidden", new FactoryList(HiddenHandler.class));
put("fielderror", new FactoryList(FieldErrorHandler.class));
put("div", new FactoryList(DivHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
put("div", new FactoryList(DivHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class, DynamicAttributesHandler.class));
put("div-close", new FactoryList(DivHandler.CloseHandler.class));
put("empty", new FactoryList(EmptyHandler.class));
}
@@ -27,7 +27,19 @@ public abstract class AbstractCommonAttributesTest extends AbstractTest {
theme.renderTag(getTagName(), context);
String output = writer.getBuffer().toString();
assertCommongAttrs(output);
assertCommonAttrs(output);
}
public void testRenderTextFieldDynamicAttrs() throws Exception {
UIBean tag = getUIBean();
applyDynamicAttrs(tag);
tag.evaluateParams();
map.putAll(tag.getParameters());
theme.renderTag(getTagName(), context);
String output = writer.getBuffer().toString();
assertDynamicAttrs(output);
}
}
@@ -23,6 +23,7 @@ import java.util.Stack;
public abstract class AbstractTest extends TestCase {
private Map<String, String> scriptingAttrs = new HashMap<String, String>();
private Map<String, String> commonAttrs = new HashMap<String, String>();
private Map<String, Object> dynamicAttrs = new HashMap<String, Object>();
protected SimpleTheme theme;
@@ -60,6 +61,9 @@ public abstract class AbstractTest extends TestCase {
commonAttrs.put("accesskey", "accesskey_");
dynamicAttrs.put("data-remote", "data-remote_");
dynamicAttrs.put("data-label", "data-label_");
theme = new SimpleTheme();
writer = new StringWriter();
map = new HashMap();
@@ -132,6 +136,10 @@ public abstract class AbstractTest extends TestCase {
bean.setAccesskey("accesskey_");
}
protected void applyDynamicAttrs(UIBean bean) {
bean.setDynamicAttributes(dynamicAttrs);
}
protected void assertScriptingAttrs(String str) {
for (Map.Entry<String, String> entry : scriptingAttrs.entrySet()) {
String substr = entry.getKey() + "=\"" + entry.getValue() + "\"";
@@ -139,13 +147,20 @@ public abstract class AbstractTest extends TestCase {
}
}
protected void assertCommongAttrs(String str) {
protected void assertCommonAttrs(String str) {
for (Map.Entry<String, String> entry : commonAttrs.entrySet()) {
String substr = entry.getKey() + "=\"" + entry.getValue() + "\"";
assertTrue("String [" + substr + "] was not found in [" + str + "]", str.indexOf(substr) >= 0);
}
}
protected void assertDynamicAttrs(String str) {
for (Map.Entry<String, Object> entry : dynamicAttrs.entrySet()) {
String substr = entry.getKey() + "=\"" + entry.getValue() + "\"";
assertTrue("String [" + substr + "] was not found in [" + str + "]", str.indexOf(substr) >= 0);
}
}
protected Object doFindValue(String expr, Class toType) {
Object val = stack.findValue(expr);