Author: musachy Date: Fri May 18 18:27:11 2007 New Revision: 539662 URL: http://svn.apache.org/viewvc?view=rev&rev=539662 Log: WW-1830 Support non-String attributes to freemarker JSP tag extensions * port from fix on WebWork rev 2866
Added: struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/freemarker/tags/ - copied from r539660, struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/views/freemarker/tags/ struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/freemarker/tags/TagModelTest.java - copied unchanged from r539660, struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/views/freemarker/tags/TagModelTest.java Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/freemarker/tags/TagModel.java Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/freemarker/tags/TagModel.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/freemarker/tags/TagModel.java?view=diff&rev=539662&r1=539661&r2=539662 ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/freemarker/tags/TagModel.java (original) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/freemarker/tags/TagModel.java Fri May 18 18:27:11 2007 @@ -31,15 +31,16 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.struts2.components.ActionComponent; import org.apache.struts2.components.Component; import org.apache.struts2.dispatcher.Dispatcher; import com.opensymphony.xwork2.inject.Container; import com.opensymphony.xwork2.util.ValueStack; +import freemarker.template.DefaultObjectWrapper; import freemarker.template.SimpleNumber; import freemarker.template.SimpleSequence; +import freemarker.template.TemplateModel; import freemarker.template.TemplateModelException; import freemarker.template.TemplateTransformModel; @@ -56,17 +57,47 @@ this.res = res; } - public Writer getWriter(Writer writer, Map params) throws TemplateModelException, IOException { + public Writer getWriter(Writer writer, Map params) + throws TemplateModelException, IOException { Component bean = getBean(); Container container = Dispatcher.getInstance().getConfigurationManager().getConfiguration().getContainer(); container.inject(bean); - Map basicParams = convertParams(params); - bean.copyParams(basicParams); - bean.addAllParameters(getComplexParams(params)); + + Map unwrappedParameters = unwrapParameters(params); + bean.copyParams(unwrappedParameters); + return new CallbackWriter(bean, writer); } protected abstract Component getBean(); + + protected Map unwrapParameters(Map params) { + Map map = new HashMap(params.size()); + DefaultObjectWrapper objectWrapper = new DefaultObjectWrapper(); + for (Iterator iterator = params.entrySet().iterator(); iterator.hasNext();) { + Map.Entry entry = (Map.Entry) iterator.next(); + + Object value = entry.getValue(); + + if (value != null) { + // the value should ALWAYS be a decendant of TemplateModel + if (value instanceof TemplateModel) { + try { + map.put(entry.getKey(), objectWrapper + .unwrap((TemplateModel) value)); + } catch (TemplateModelException e) { + LOG.error("failed to unwrap [" + value + + "] it will be ignored", e); + } + } + // if it doesn't, we'll do it the old way by just returning the toString() representation + else { + map.put(entry.getKey(), value.toString()); + } + } + } + return map; + } protected Map convertParams(Map params) { HashMap map = new HashMap(params.size());