package org.krakenapps.docxcod.test; import static org.junit.Assert.assertEquals; import java.io.Closeable; import java.io.IOException; import java.io.InputStreamReader; import java.io.StringWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Scanner; import org.json.JSONObject; import org.json.JSONTokener; import org.junit.Test; import org.krakenapps.docxcod.JsonHelper; import freemarker.core.Environment; import freemarker.template.Configuration; import freemarker.template.DefaultObjectWrapper; import freemarker.template.Template; import freemarker.template.TemplateMethodModelEx; import freemarker.template.TemplateModelException; public class FreeMarkerTest { public class MakeNewChartFunction implements TemplateMethodModelEx { public int callCount = 0; @Override public Object exec(@SuppressWarnings("rawtypes") List arguments) throws TemplateModelException { callCount ++; System.out.printf("makeNewChart called(%s, %s)\n", arguments.get(0), arguments.get(1)); System.out.printf("%s\n", Environment.getCurrentEnvironment().getKnownVariableNames()); System.out.printf("%s\n", Environment.getCurrentEnvironment().getVariable("u")); return ""; } } @Test public void UserDefMethodTest() throws Exception { InputStreamReader templateReader = null; InputStreamReader inputReader = null; Scanner scanner = null; try { Configuration cfg = new Configuration(); cfg.setObjectWrapper(new DefaultObjectWrapper()); inputReader = new InputStreamReader(getClass().getResourceAsStream("/nestedListTest.in")); JSONTokener tokener = new JSONTokener(inputReader); Map<String, Object> rootMap = JsonHelper.parse((JSONObject) tokener.nextValue()); MakeNewChartFunction makeNewChartFunction = new MakeNewChartFunction(); rootMap.put("makeNewChart", makeNewChartFunction); templateReader = new InputStreamReader(getClass().getResourceAsStream("/userDefMethodTest.fpl")); Template t = new Template("UserDefMethodTest", templateReader, cfg); StringWriter out = new StringWriter(); t.process(rootMap, out); scanner = new Scanner(getClass().getResourceAsStream("/userDefMethodTest.out")); String expectedOutput = scanner.useDelimiter("\\A").next(); assertEquals(expectedOutput, out.toString()); assertEquals(3, makeNewChartFunction.callCount); } catch (Exception e) { e.printStackTrace(); } finally { safeClose(inputReader); if (scanner != null) scanner.close(); } } public void nestedListTest() throws Exception { Configuration cfg = new Configuration(); cfg.setObjectWrapper(new DefaultObjectWrapper()); InputStreamReader templateReader = null; InputStreamReader inputReader = null; try { inputReader = new InputStreamReader(getClass().getResourceAsStream("/nestedListTest.in")); JSONTokener tokener = new JSONTokener(inputReader); Map<String, Object> rootMap = JsonHelper.parse((JSONObject) tokener.nextValue()); templateReader = new InputStreamReader(getClass().getResourceAsStream("/nestedListTest.fpl")); Template t = new Template("test", templateReader, cfg); StringWriter out = new StringWriter(); t.process(rootMap, out); System.out.println(out.toString()); } catch (Exception e) { e.printStackTrace(); } finally { safeClose(templateReader); safeClose(inputReader); } } public void test1() throws Exception { Configuration cfg = new Configuration(); cfg.setObjectWrapper(new DefaultObjectWrapper()); InputStreamReader templateReader = new InputStreamReader(getClass().getResourceAsStream("/test1.fpl")); // XXX: close templateReader using try..finally try { Template t = new Template("test", templateReader, cfg); StringWriter out = new StringWriter(); Map<String, Object> rootMap = new HashMap<String, Object>(); ArrayList<Object> beings = new ArrayList<Object>(); rootMap.put("title", "Developers"); rootMap.put("data", beings); { HashMap<String, Object> being = new HashMap<String, Object>(); beings.add(being); being.put("name", "junsang"); being.put("tel", "010-1111-2222"); } { HashMap<String, Object> being = new HashMap<String, Object>(); beings.add(being); being.put("name", "jun"); being.put("tel", "010-3333-2222"); } { HashMap<String, Object> being = new HashMap<String, Object>(); beings.add(being); being.put("name", "sang"); being.put("tel", "010-4444-2222"); } t.process(rootMap, out); System.out.print(out.toString()); } finally { templateReader.close(); } } private void safeClose(Closeable templateReader) { if (templateReader == null) return; try { templateReader.close(); } catch (IOException e) { e.printStackTrace(); } } }