1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.struts2.views.freemarker.tags;
19
20 import java.io.IOException;
21 import java.io.Writer;
22 import java.util.HashMap;
23 import java.util.Iterator;
24 import java.util.Map;
25
26 import javax.servlet.http.HttpServletRequest;
27 import javax.servlet.http.HttpServletResponse;
28
29 import org.apache.commons.logging.Log;
30 import org.apache.commons.logging.LogFactory;
31 import org.apache.struts2.components.Component;
32
33 import com.opensymphony.xwork2.util.ValueStack;
34
35 import freemarker.template.SimpleNumber;
36 import freemarker.template.SimpleSequence;
37 import freemarker.template.TemplateModelException;
38 import freemarker.template.TemplateTransformModel;
39
40 public abstract class TagModel implements TemplateTransformModel {
41 private static final Log LOG = LogFactory.getLog(TagModel.class);
42
43 protected ValueStack stack;
44 protected HttpServletRequest req;
45 protected HttpServletResponse res;
46
47 public TagModel(ValueStack stack, HttpServletRequest req, HttpServletResponse res) {
48 this.stack = stack;
49 this.req = req;
50 this.res = res;
51 }
52
53 public Writer getWriter(Writer writer, Map params) throws TemplateModelException, IOException {
54 Component bean = getBean();
55 Map basicParams = convertParams(params);
56 bean.copyParams(basicParams);
57 bean.addAllParameters(getComplexParams(params));
58 return new CallbackWriter(bean, writer);
59 }
60
61 protected abstract Component getBean();
62
63 private Map convertParams(Map params) {
64 HashMap map = new HashMap(params.size());
65 for (Iterator iterator = params.entrySet().iterator(); iterator.hasNext();) {
66 Map.Entry entry = (Map.Entry) iterator.next();
67 Object value = entry.getValue();
68 if (value != null && !complexType(value)) {
69 map.put(entry.getKey(), value.toString());
70 }
71 }
72 return map;
73 }
74
75 private Map getComplexParams(Map params) {
76 HashMap map = new HashMap(params.size());
77 for (Iterator iterator = params.entrySet().iterator(); iterator.hasNext();) {
78 Map.Entry entry = (Map.Entry) iterator.next();
79 Object value = entry.getValue();
80 if (value != null && complexType(value)) {
81 if (value instanceof freemarker.ext.beans.BeanModel) {
82 map.put(entry.getKey(), ((freemarker.ext.beans.BeanModel) value).getWrappedObject());
83 } else if (value instanceof SimpleNumber) {
84 map.put(entry.getKey(), ((SimpleNumber) value).getAsNumber());
85 } else if (value instanceof SimpleSequence) {
86 try {
87 map.put(entry.getKey(), ((SimpleSequence) value).toList());
88 } catch (TemplateModelException e) {
89 LOG.error("There was a problem converting a SimpleSequence to a list", e);
90 }
91 }
92 }
93 }
94 return map;
95 }
96
97 private boolean complexType(Object value) {
98 return value instanceof freemarker.ext.beans.BeanModel
99 || value instanceof SimpleNumber
100 || value instanceof SimpleSequence;
101 }
102 }