3 import freemarker.template.*;
8 public class FreemarkerGenerator implements Generator {
9 private Template template;
11 public FreemarkerGenerator(Template aTemplate) {
15 public void generate(PrintWriter anOutputWriter, Map aValues, PrintWriter aLogger) throws GeneratorException {
16 aLogger.println("processing...<br/>");
17 template.process((TemplateModelRoot) makeMapAdapter(aValues), anOutputWriter);
18 aLogger.println("processed...<br/>");
21 private static TemplateScalarModel makeStringAdapter(String aString) {
22 return new SimpleScalar(aString);
25 private static TemplateHashModel makeMapAdapter(Map aMap) {
26 return new MapAdapter(aMap);
29 private static TemplateListModel makeListAdapter(List aList) {
30 return new ListAdapter(aList);
33 private static TemplateModel makeAdapter(Object anObject) {
36 if (anObject instanceof TemplateModel)
37 return (TemplateModel) anObject;
38 if (anObject instanceof String)
39 return makeStringAdapter((String) anObject);
40 else if (anObject instanceof Map)
41 return makeMapAdapter((Map) anObject);
42 else if (anObject instanceof List)
43 return makeListAdapter((List) anObject);
48 private static class MapAdapter implements TemplateModelRoot {
52 private MapAdapter(Map aMap) {
54 valuesCache = new HashMap();
57 public void put(String aKey, TemplateModel aModel) {
58 valuesCache.put(aKey, aModel);
61 public void remove(String aKey) {
62 // ML: kinda tricky...
65 public boolean isEmpty() {
69 public TemplateModel get(String aKey) throws TemplateModelException {
70 if (!valuesCache.containsKey(aKey)) {
71 Object value = map.get(aKey);
74 throw new TemplateModelException("MapAdapter: no key "+aKey+" available");
76 valuesCache.put(aKey, makeAdapter(value));
79 return (TemplateModel) valuesCache.get(aKey);
83 private static class ListAdapter implements TemplateListModel {
88 private ListAdapter(List aList) {
90 valuesCache = new Vector();
94 public boolean isEmpty() {
95 return list.isEmpty();
98 public TemplateModel get(int i) {
100 if (i>=valuesCache.size() && i<list.size()) {
101 for(int j=valuesCache.size(); j<=i; j++) {
102 valuesCache.add(makeAdapter(list.get(j)));
106 if (i<valuesCache.size())
107 return (TemplateModel) valuesCache.get(i);
112 public boolean hasNext() {
113 return position<list.size();
116 public boolean isRewound() {
120 public TemplateModel next() {
121 TemplateModel result = null;
124 result = get(position);
131 public void rewind() {