/* $This file is distributed under the terms of the license in /doc/license.txt$ */ package freemarker.ext.dump; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.fail; import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; import java.sql.Time; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.junit.Before; import org.junit.Test; import freemarker.core.Environment; import freemarker.ext.beans.BeansWrapper; import freemarker.ext.dump.BaseDumpDirective.DateType; import freemarker.ext.dump.BaseDumpDirective.Key; import freemarker.ext.dump.BaseDumpDirective.Type; import freemarker.template.Configuration; import freemarker.template.SimpleCollection; import freemarker.template.Template; import freemarker.template.TemplateCollectionModel; import freemarker.template.TemplateDirectiveBody; import freemarker.template.TemplateDirectiveModel; import freemarker.template.TemplateException; import freemarker.template.TemplateMethodModel; import freemarker.template.TemplateModel; import freemarker.template.TemplateModelException; /** * Unit tests of dump directive. The tests follow the same basic pattern: * 1. Create the data model * 2. Create the expected dump data structure * 3. Create the actual dump data structure by running the data model through a processing environment * 4. Compare expected and actual dump data structures * * @author rjy7 * */ public class DumpDirectiveTest { private Template template; @Before public void setUp() { Configuration config = new Configuration(); String templateStr = ""; try { template = new Template("template", new StringReader(templateStr), config); } catch (Exception e) { fail(e.getMessage()); } // Turn off log messages to console Logger.getLogger(BaseDumpDirective.class).setLevel(Level.OFF); } @Test public void dumpString() { String varName = "dog"; Map dataModel = new HashMap(); String value = "Rover"; dataModel.put(varName, value); Map expectedDump = new HashMap(); expectedDump.put(Key.NAME.toString(), varName); expectedDump.put(Key.TYPE.toString(), Type.STRING); expectedDump.put(Key.VALUE.toString(), value); test(varName, dataModel, expectedDump); } @Test public void dumpBoolean() { String varName = "isLoggedIn"; Map dataModel = new HashMap(); boolean value = true; dataModel.put(varName, value); Map expectedDump = new HashMap(); expectedDump.put(Key.NAME.toString(), varName); expectedDump.put(Key.TYPE.toString(), Type.BOOLEAN); expectedDump.put(Key.VALUE.toString(), value); test(varName, dataModel, expectedDump); } @Test public void dumpNumber() { String varName = "tabCount"; Map dataModel = new HashMap(); int value = 7; dataModel.put(varName, value); Map expectedDump = new HashMap(); expectedDump.put(Key.NAME.toString(), varName); expectedDump.put(Key.TYPE.toString(), Type.NUMBER); expectedDump.put(Key.VALUE.toString(), value); test(varName, dataModel, expectedDump); } @Test public void dumpSimpleDate() { String varName = "now"; Map dataModel = new HashMap(); Date now = new Date(); dataModel.put(varName, now); Map expectedDump = new HashMap(); expectedDump.put(Key.NAME.toString(), varName); expectedDump.put(Key.TYPE.toString(), Type.DATE); expectedDump.put(Key.DATE_TYPE.toString(), DateType.UNKNOWN); expectedDump.put(Key.VALUE.toString(), now); test(varName, dataModel, expectedDump); } @Test public void dumpCalendarDate() { String varName = "myDate"; Map dataModel = new HashMap(); Calendar c = Calendar.getInstance(); c.set(91, Calendar.MAY, 5); Date myDate = c.getTime(); dataModel.put("myDate", myDate); Map expectedDump = new HashMap(); expectedDump.put(Key.NAME.toString(), varName); expectedDump.put(Key.TYPE.toString(), Type.DATE); expectedDump.put(Key.DATE_TYPE.toString(), DateType.UNKNOWN); expectedDump.put(Key.VALUE.toString(), myDate); test(varName, dataModel, expectedDump); } @Test public void dumpDateTime() { String varName = "timestamp"; Map dataModel = new HashMap(); Timestamp ts = new Timestamp(1302297332043L); dataModel.put(varName, ts); Map expectedDump = new HashMap(); expectedDump.put(Key.NAME.toString(), varName); expectedDump.put(Key.TYPE.toString(), Type.DATE); expectedDump.put(Key.DATE_TYPE.toString(), DateType.DATETIME); expectedDump.put(Key.VALUE.toString(), ts); test(varName, dataModel, expectedDump); } @Test public void dumpSqlDate() { String varName = "date"; Map dataModel = new HashMap(); java.sql.Date date = new java.sql.Date(1302297332043L); dataModel.put(varName, date); Map expectedDump = new HashMap(); expectedDump.put(Key.NAME.toString(), varName); expectedDump.put(Key.TYPE.toString(), Type.DATE); expectedDump.put(Key.DATE_TYPE.toString(), DateType.DATE); expectedDump.put(Key.VALUE.toString(), date); test(varName, dataModel, expectedDump); } @Test public void dumpTime() { String varName = "time"; Map dataModel = new HashMap(); Time time = new Time(1302297332043L); dataModel.put(varName, time); Map expectedDump = new HashMap(); expectedDump.put(Key.NAME.toString(), varName); expectedDump.put(Key.TYPE.toString(), Type.DATE); expectedDump.put(Key.DATE_TYPE.toString(), DateType.TIME); expectedDump.put(Key.VALUE.toString(), time); test(varName, dataModel, expectedDump); } // RY test method and directive types with and without help methods @Test public void dumpHelplessMethod() { String varName = "square"; Map dataModel = new HashMap(); TemplateMethodModel methodModel = new HelplessMethod(); dataModel.put(varName, methodModel); Map expectedDump = new HashMap(); expectedDump.put(Key.NAME.toString(), varName); expectedDump.put(Key.TYPE.toString(), Type.METHOD); expectedDump.put("help", null); test(varName, dataModel, expectedDump); } @Test public void dumpHelpfulMethod() { String varName = "square"; Map dataModel = new HashMap(); TemplateMethodModel methodModel = new HelpfulMethod(); dataModel.put(varName, methodModel); Map expectedDump = new HashMap(); expectedDump.put(Key.NAME.toString(), varName); expectedDump.put(Key.TYPE.toString(), Type.METHOD); expectedDump.put("help", getMethodHelp(varName)); test(varName, dataModel, expectedDump); } @Test public void dumpMethodWithBadHelp() { String varName = "square"; Map dataModel = new HashMap(); TemplateMethodModel methodModel = new MethodWithBadHelp(); dataModel.put(varName, methodModel); Map expectedDump = new HashMap(); expectedDump.put(Key.NAME.toString(), varName); expectedDump.put(Key.TYPE.toString(), Type.METHOD); expectedDump.put("help", null); test(varName, dataModel, expectedDump); } @Test public void dumpHelplessDirective() { String varName = "dump"; Map dataModel = new HashMap(); TemplateDirectiveModel directiveModel = new HelplessDirective(); dataModel.put(varName, directiveModel); Map expectedDump = new HashMap(); expectedDump.put(Key.NAME.toString(), varName); expectedDump.put(Key.TYPE.toString(), Type.DIRECTIVE); expectedDump.put("help", null); test(varName, dataModel, expectedDump); } @Test public void dumpHelpfulDirective() { String varName = "dump"; Map dataModel = new HashMap(); TemplateDirectiveModel directiveModel = new HelpfulDirective(); dataModel.put(varName, directiveModel); Map expectedDump = new HashMap(); expectedDump.put(Key.NAME.toString(), varName); expectedDump.put(Key.TYPE.toString(), Type.DIRECTIVE); expectedDump.put("help", getDirectiveHelp(varName)); test(varName, dataModel, expectedDump); } @Test public void dumpDirectiveWithBadHelp() { String varName = "dump"; Map dataModel = new HashMap(); TemplateDirectiveModel directiveModel = new DirectiveWithBadHelp(); dataModel.put(varName, directiveModel); Map expectedDump = new HashMap(); expectedDump.put(Key.NAME.toString(), varName); expectedDump.put(Key.TYPE.toString(), Type.DIRECTIVE); expectedDump.put("help", null); test(varName, dataModel, expectedDump); } @Test public void dumpStringList() { String varName = "fruit"; Map dataModel = new HashMap(); List myList = new ArrayList(); myList.add("apples"); myList.add("bananas"); myList.add("oranges"); dataModel.put(varName, myList); Map expectedDump = new HashMap(); expectedDump.put(Key.NAME.toString(), varName); expectedDump.put(Key.TYPE.toString(), Type.SEQUENCE); List> myListExpectedDump = new ArrayList>(myList.size()); for ( String str : myList) { Map itemDump = new HashMap(); itemDump.put(Key.TYPE.toString(), Type.STRING); itemDump.put(Key.VALUE.toString(), str); myListExpectedDump.add(itemDump); } expectedDump.put(Key.VALUE.toString(), myListExpectedDump); test(varName, dataModel, expectedDump); } @Test public void dumpStringArray() { String varName = "fruit"; Map dataModel = new HashMap(); String[] myArray = { "apples", "bananas", "oranges" }; dataModel.put(varName, myArray); Map expectedDump = new HashMap(); expectedDump.put(Key.NAME.toString(), varName); expectedDump.put(Key.TYPE.toString(), Type.SEQUENCE); List> myArrayExpectedDump = new ArrayList>(myArray.length); for ( String str : myArray) { Map itemDump = new HashMap(); itemDump.put(Key.TYPE.toString(), Type.STRING); itemDump.put(Key.VALUE.toString(), str); myArrayExpectedDump.add(itemDump); } expectedDump.put(Key.VALUE.toString(), myArrayExpectedDump); test(varName, dataModel, expectedDump); } @Test public void dumpMixedList() { String varName = "stuff"; Map dataModel = new HashMap(); List mixedList = new ArrayList(); String myString = "apples"; mixedList.add(myString); int myInt = 4; mixedList.add(myInt); boolean myBool = true; mixedList.add(myBool); List myList = new ArrayList(); myList.add("dog"); myList.add("cat"); myList.add("elephant"); mixedList.add(myList); dataModel.put(varName, mixedList); Map expectedDump = new HashMap(); expectedDump.put(Key.NAME.toString(), varName); expectedDump.put(Key.TYPE.toString(), Type.SEQUENCE); List> mixedListExpectedDump = new ArrayList>(mixedList.size()); Map myStringExpectedDump = new HashMap(); myStringExpectedDump.put(Key.TYPE.toString(), Type.STRING); myStringExpectedDump.put(Key.VALUE.toString(), myString); mixedListExpectedDump.add(myStringExpectedDump); Map myIntExpectedDump = new HashMap(); myIntExpectedDump.put(Key.TYPE.toString(), Type.NUMBER); myIntExpectedDump.put(Key.VALUE.toString(), myInt); mixedListExpectedDump.add(myIntExpectedDump); Map myBoolExpectedDump = new HashMap(); myBoolExpectedDump.put(Key.TYPE.toString(), Type.BOOLEAN); myBoolExpectedDump.put(Key.VALUE.toString(), myBool); mixedListExpectedDump.add(myBoolExpectedDump); Map myListExpectedDump = new HashMap(); myListExpectedDump.put(Key.TYPE.toString(), Type.SEQUENCE); List> myListItemsExpectedDump = new ArrayList>(myList.size()); for ( String animal : myList ) { Map itemDump = new HashMap(); itemDump.put(Key.TYPE.toString(), Type.STRING); itemDump.put(Key.VALUE.toString(), animal); myListItemsExpectedDump.add(itemDump); } myListExpectedDump.put(Key.VALUE.toString(), myListItemsExpectedDump); mixedListExpectedDump.add(myListExpectedDump); expectedDump.put(Key.VALUE.toString(), mixedListExpectedDump); test(varName, dataModel, expectedDump); } @Test public void dumpNumberSet() { String varName = "oddNums"; Map dataModel = new HashMap(); Set myIntSet = new HashSet(); for (int i=0; i <= 10; i++) { if (i % 2 == 1) { myIntSet.add(i); } } dataModel.put(varName, myIntSet); Map expectedDump = new HashMap(); expectedDump.put(Key.NAME.toString(), varName); expectedDump.put(Key.TYPE.toString(), Type.SEQUENCE); List> myIntSetExpectedDump = new ArrayList>(myIntSet.size()); for ( int i : myIntSet ) { Map itemDump = new HashMap(); itemDump.put(Key.TYPE.toString(), Type.NUMBER); itemDump.put(Key.VALUE.toString(), i); myIntSetExpectedDump.add(itemDump); } expectedDump.put(Key.VALUE.toString(), myIntSetExpectedDump); test(varName, dataModel, expectedDump); } @Test public void dumpNumberCollection() { String varName = "oddNums"; Map dataModel = new HashMap(); Set odds = new HashSet(); for (int i=0; i <= 10; i++) { if (i % 2 == 1) { odds.add(i); } } TemplateCollectionModel myCollection = new SimpleCollection(odds); dataModel.put(varName, myCollection); Map expectedDump = new HashMap(); expectedDump.put(Key.NAME.toString(), varName); expectedDump.put(Key.TYPE.toString(), Type.COLLECTION); List> myCollectionExpectedDump = new ArrayList>(odds.size()); for ( int i : odds ) { Map itemDump = new HashMap(); itemDump.put(Key.TYPE.toString(), Type.NUMBER); itemDump.put(Key.VALUE.toString(), i); myCollectionExpectedDump.add(itemDump); } expectedDump.put(Key.VALUE.toString(), myCollectionExpectedDump); test(varName, dataModel, expectedDump); } @Test public void dumpHash() { } @Test public void dumpStringToStringMap() { String varName = "capitals"; Map dataModel = new HashMap(); Map myMap = new HashMap(); myMap.put("Albany", "New York"); myMap.put("St. Paul", "Minnesota"); myMap.put("Austin", "Texas"); myMap.put("Sacramento", "California"); myMap.put("Richmond", "Virginia"); dataModel.put(varName, myMap); Map expectedDump = new HashMap(); expectedDump.put(Key.NAME.toString(), varName); expectedDump.put(Key.TYPE.toString(), Type.HASH_EX); SortedMap myMapExpectedDump = new TreeMap(); for ( String key : myMap.keySet() ) { Map itemDump = new HashMap(); itemDump.put(Key.TYPE.toString(), Type.STRING); itemDump.put(Key.VALUE.toString(), myMap.get(key)); myMapExpectedDump.put(key, itemDump); } expectedDump.put(Key.VALUE.toString(), (myMapExpectedDump)); Map dump = getDump(varName, dataModel); assertEquals(expectedDump, dump); // Test the sorting of the map List expectedKeys = new ArrayList(myMapExpectedDump.keySet()); @SuppressWarnings("unchecked") SortedMap myMapActualDump = (SortedMap) dump.get(Key.VALUE.toString()); List actualKeys = new ArrayList(myMapActualDump.keySet()); assertEquals(expectedKeys, actualKeys); } @Test public void dumpStringToObjectMap() { String varName = "stuff"; Map dataModel = new HashMap(); Map mixedMap = new HashMap(); String myString = "apples"; mixedMap.put("myString", myString); boolean myBool = true; mixedMap.put("myBoolean", myBool); int myInt = 4; mixedMap.put("myNumber", myInt); Date myDate = new Date(); mixedMap.put("myDate", myDate); List myList = new ArrayList(); myList.add("apples"); myList.add("bananas"); myList.add("oranges"); mixedMap.put("myList", myList); Map myMap = new HashMap(); myMap.put("Great Expectations", "Charles Dickens"); myMap.put("Pride and Prejudice", "Jane Austen"); myMap.put("Middlemarch", "George Eliot"); myMap.put("Jude the Obscure", "Thomas Hardy"); mixedMap.put("myMap", myMap); dataModel.put(varName, mixedMap); Map expectedDump = new HashMap(); expectedDump.put(Key.NAME.toString(), varName); expectedDump.put(Key.TYPE.toString(), Type.HASH_EX); Map mixedMapExpectedDump = new HashMap(mixedMap.size()); Map myStringExpectedDump = new HashMap(); myStringExpectedDump.put(Key.TYPE.toString(), Type.STRING); myStringExpectedDump.put(Key.VALUE.toString(), myString); mixedMapExpectedDump.put("myString", myStringExpectedDump); Map myBooleanExpectedDump = new HashMap(); myBooleanExpectedDump.put(Key.TYPE.toString(), Type.BOOLEAN); myBooleanExpectedDump.put(Key.VALUE.toString(), myBool); mixedMapExpectedDump.put("myBoolean", myBooleanExpectedDump); Map myIntExpectedDump = new HashMap(); myIntExpectedDump.put(Key.TYPE.toString(), Type.NUMBER); myIntExpectedDump.put(Key.VALUE.toString(), myInt); mixedMapExpectedDump.put("myNumber", myIntExpectedDump); Map myDateExpectedDump = new HashMap(); myDateExpectedDump.put(Key.TYPE.toString(), Type.DATE); myDateExpectedDump.put(Key.DATE_TYPE.toString(), DateType.UNKNOWN); myDateExpectedDump.put(Key.VALUE.toString(), myDate); mixedMapExpectedDump.put("myDate", myDateExpectedDump); Map myListExpectedDump = new HashMap(); myListExpectedDump.put(Key.TYPE.toString(), Type.SEQUENCE); List> myListItemsExpectedDump = new ArrayList>(myList.size()); for ( String item : myList ) { Map itemDump = new HashMap(); itemDump.put(Key.TYPE.toString(), Type.STRING); itemDump.put(Key.VALUE.toString(), item); myListItemsExpectedDump.add(itemDump); } myListExpectedDump.put(Key.VALUE.toString(), myListItemsExpectedDump); mixedMapExpectedDump.put("myList", myListExpectedDump); Map myMapExpectedDump = new HashMap(); myMapExpectedDump.put(Key.TYPE.toString(), Type.HASH_EX); SortedMap myMapItemsExpectedDump = new TreeMap(); for ( String key : myMap.keySet() ) { Map itemDump = new HashMap(); itemDump.put(Key.TYPE.toString(), Type.STRING); itemDump.put(Key.VALUE.toString(), myMap.get(key)); myMapItemsExpectedDump.put(key, itemDump); } myMapExpectedDump.put(Key.VALUE.toString(), myMapItemsExpectedDump); mixedMapExpectedDump.put("myMap", myMapExpectedDump); expectedDump.put(Key.VALUE.toString(), mixedMapExpectedDump); Map dump = getDump(varName, dataModel); assertEquals(expectedDump, dump); // Test the sorting of the myMap dump List expectedKeys = new ArrayList(myMapItemsExpectedDump.keySet()); @SuppressWarnings("unchecked") Map mixedMapActualDump = (Map) dump.get(Key.VALUE.toString()); @SuppressWarnings("unchecked") Map myMapActualDump = (Map) mixedMapActualDump.get("myMap"); @SuppressWarnings("unchecked") Map myMapItemsActualDump = (SortedMap) myMapActualDump.get(Key.VALUE.toString()); List actualKeys = new ArrayList(myMapItemsActualDump.keySet()); assertEquals(expectedKeys, actualKeys); } @Test public void dumpObjectWithExposeNothingWrapper() { dumpObject(BeansWrapper.EXPOSE_NOTHING); } @Test public void dumpObjectWithExposePropertiesOnlyWrapper() { dumpObject(BeansWrapper.EXPOSE_PROPERTIES_ONLY); } @Test public void dumpObjectWithExposeSafeWrapper() { //dumpObject(BeansWrapper.EXPOSE_SAFE); } @Test public void dumpObjectWithExposeAllWrapper() { //dumpObject(BeansWrapper.EXPOSE_ALL); } /////////////////////////// Private stub classes and helper methods /////////////////////////// private void test(String varName, Map dataModel, Map expectedDump) { Map dump = getDump(varName, dataModel); assertEquals(expectedDump, dump); } private void dumpObject(int exposureLevel) { String varName = "employee"; Map dataModel = new HashMap(); BeansWrapper wrapper = new BeansWrapper(); wrapper.setExposureLevel(exposureLevel); try { dataModel.put("employee", wrapper.wrap(getEmployee())); } catch (TemplateModelException e) { // logging is suppressed, so what do we do here? } Map expectedDump = new HashMap(); expectedDump.put(Key.NAME.toString(), varName); expectedDump.put(Key.TYPE.toString(), "freemarker.ext.dump.DumpDirectiveTest$Employee"); expectedDump.put(Key.VALUE.toString(), getJohnDoeExpectedDump(exposureLevel)); testObjectDump(varName, dataModel, expectedDump); } private void testObjectDump(String varName, Map dataModel, Map expectedDump) { Map dump = getDump(varName, dataModel); assertEquals(expectedDump, dump); // Test the sorting of the properties and methods @SuppressWarnings("unchecked") Map valueExpectedDump = (Map) expectedDump.get(Key.VALUE.toString()); @SuppressWarnings("unchecked") Map valueActualDump = (Map) dump.get(Key.VALUE.toString()); @SuppressWarnings("unchecked") Map propertiesExpectedDump = (Map) valueExpectedDump.get(Key.PROPERTIES.toString()); List propertyKeysExpected = new ArrayList(propertiesExpectedDump.keySet()); @SuppressWarnings("unchecked") Map propertiesActualDump = (Map) valueActualDump.get(Key.PROPERTIES.toString()); List propertyKeysActual = new ArrayList(propertiesActualDump.keySet()); assertEquals(propertyKeysExpected, propertyKeysActual); @SuppressWarnings("unchecked") Map methodsExpectedDump = (Map) valueExpectedDump.get(Key.METHODS.toString()); List methodKeysExpected = new ArrayList(methodsExpectedDump.keySet()); @SuppressWarnings("unchecked") Map methodsActualDump = (Map) valueActualDump.get(Key.METHODS.toString()); List methodKeysActual = new ArrayList(methodsActualDump.keySet()); assertEquals(methodKeysExpected, methodKeysActual); } private Map getDump(String varName, Map dataModel) { try { Environment env = template.createProcessingEnvironment(dataModel, new StringWriter()); return new DumpDirective().getTemplateVariableData(varName, env); } catch (Exception e) { fail(e.getMessage()); return null; } } private class HelplessMethod implements TemplateMethodModel { @Override public Object exec(List arg0) throws TemplateModelException { return null; } } private class HelpfulMethod implements TemplateMethodModel { @Override public Object exec(List arg0) throws TemplateModelException { return null; } public Map help(String name) { return getMethodHelp(name); } } private class MethodWithBadHelp implements TemplateMethodModel { @Override public Object exec(List arg0) throws TemplateModelException { return null; } public Map help() { return new HashMap(); } } private class HelplessDirective implements TemplateDirectiveModel { @Override public void execute(Environment arg0, Map arg1, TemplateModel[] arg2, TemplateDirectiveBody arg3) throws TemplateException, IOException { } } private class HelpfulDirective implements TemplateDirectiveModel { @Override public void execute(Environment arg0, Map arg1, TemplateModel[] arg2, TemplateDirectiveBody arg3) throws TemplateException, IOException { } public Map help(String name) { return getDirectiveHelp(name); } } private class DirectiveWithBadHelp implements TemplateDirectiveModel { @Override public void execute(Environment arg0, Map arg1, TemplateModel[] arg2, TemplateDirectiveBody arg3) throws TemplateException, IOException { } public String help(String name) { return "help"; } } private Map getDirectiveHelp(String name) { Map map = new HashMap(); map.put("effect", "Dump the contents of a template variable."); map.put("comments", "Sequences (lists and arrays) are enclosed in square brackets. Hashes are enclosed in curly braces."); Map params = new HashMap(); params.put("var", "name of variable to dump"); map.put("params", params); List examples = new ArrayList(); examples.add("<@" + name + " var=\"urls\" />"); map.put("examples", examples); return map; } private Map getMethodHelp(String name) { Map map = new HashMap(); map.put(Key.NAME.toString(), name); map.put("returns", "The square of the argument"); Listparams = new ArrayList(); params.add("Integer to square"); map.put("params", params); List examples = new ArrayList(); examples.add(name + "(4)"); map.put("examples", examples); return map; } public static class Employee { private static int count = 0; private String firstName; private String lastName; private String nickname; //private Date birthdate; private boolean married; private int id; private String middleName; private List favoriteColors; private Employee supervisor; private float salary; Employee(String firstName, String lastName, int id) { this.firstName = firstName; this.lastName = lastName; this.middleName = null; // test a null value //this.birthdate = birthdate; this.married = true; this.id = id; this.nickname = ""; this.favoriteColors = new ArrayList(); count++; } void setSupervisor(Employee supervisor) { this.supervisor = supervisor; } void setSalary(float salary) { this.salary = salary; } public void setNickname(String nickname) { this.nickname = nickname; } public void setFavoriteColors(String...colors) { for (String color : colors) { favoriteColors.add(color); } } // Not available to templates float getSalary() { return salary; } public static int getEmployeeCount() { return count; } /* Public accessor methods for templates */ public String getFullName() { return firstName + " " + lastName; } public String getName(String which) { return which == "first" ? firstName : lastName; } public String getMiddleName() { return middleName; } public String getNickname() { return nickname; } // public Date getBirthdate() { // return birthdate; // } public int getId() { return id; } public boolean isMarried() { return married; } @Deprecated public int getFormerId() { return id % 10000; } public Employee getSupervisor() { return supervisor; } public List getFavoriteColors() { return favoriteColors; } } private Employee getEmployee() { Employee jdoe = new Employee("John", "Doe", 34523); jdoe.setFavoriteColors("blue", "green"); jdoe.setSalary(65000); Employee jsmith = new Employee("Jane", "Smith", 78234); jsmith.setFavoriteColors("red", "orange"); jdoe.setSupervisor(jsmith); return jdoe; } private Map getJohnDoeExpectedDump(int exposureLevel) { Map expectedDump = new HashMap(); // Properties SortedMap propertiesExpectedDump = new TreeMap(); if (exposureLevel != BeansWrapper.EXPOSE_NOTHING) { // Map birthdateExpectedDump = new HashMap(); // birthdateExpectedDump.put(Key.TYPE.toString(), Type.DATE); // birthdateExpectedDump.put(Key.DATE_TYPE.toString(), DateType.UNKNOWN); // Calendar c = Calendar.getInstance(); // c.set(75, Calendar.MAY, 5); // birthdateExpectedDump.put(Key.VALUE.toString(), c.getTime()); // propertiesExpectedDump.put("birthdate", birthdateExpectedDump); Map fullNameExpectedDump = new HashMap(); fullNameExpectedDump.put(Key.TYPE.toString(), Type.STRING); fullNameExpectedDump.put(Key.VALUE.toString(), "John Doe"); propertiesExpectedDump.put("fullName", fullNameExpectedDump); Map idExpectedDump = new HashMap(); idExpectedDump.put(Key.TYPE.toString(), Type.NUMBER); idExpectedDump.put(Key.VALUE.toString(), 34523); propertiesExpectedDump.put("id", idExpectedDump); Map nicknameExpectedDump = new HashMap(); nicknameExpectedDump.put(Key.TYPE.toString(), Type.STRING); nicknameExpectedDump.put(Key.VALUE.toString(), ""); propertiesExpectedDump.put("nickname", nicknameExpectedDump); Map middleNameExpectedDump = new HashMap(); middleNameExpectedDump.put(Key.VALUE.toString(), "null"); propertiesExpectedDump.put("middleName", middleNameExpectedDump); Map marriedExpectedDump = new HashMap(); marriedExpectedDump.put(Key.TYPE.toString(), Type.BOOLEAN); marriedExpectedDump.put(Key.VALUE.toString(), true); propertiesExpectedDump.put("married", marriedExpectedDump); Map supervisorExpectedDump = new HashMap(); supervisorExpectedDump.put(Key.TYPE.toString(), "freemarker.ext.dump.DumpDirectiveTest$Employee"); supervisorExpectedDump.put(Key.VALUE.toString(), getJaneSmithExpectedDump(exposureLevel)); propertiesExpectedDump.put("supervisor", supervisorExpectedDump); Map favoriteColorsExpectedDump = new HashMap(); favoriteColorsExpectedDump.put(Key.TYPE.toString(), Type.SEQUENCE); List> favoriteColorListExpectedDump = new ArrayList>(); Map color1ExpectedDump = new HashMap(); color1ExpectedDump.put(Key.TYPE.toString(), Type.STRING); color1ExpectedDump.put(Key.VALUE.toString(), "blue"); favoriteColorListExpectedDump.add(color1ExpectedDump); Map color2ExpectedDump = new HashMap(); color2ExpectedDump.put(Key.TYPE.toString(), Type.STRING); color2ExpectedDump.put(Key.VALUE.toString(), "green"); favoriteColorListExpectedDump.add(color2ExpectedDump); favoriteColorsExpectedDump.put(Key.VALUE.toString(), favoriteColorListExpectedDump); propertiesExpectedDump.put("favoriteColors", favoriteColorsExpectedDump); } expectedDump.put(Key.PROPERTIES.toString(), propertiesExpectedDump); // Methods SortedMap methodsExpectedDump = new TreeMap(); expectedDump.put(Key.METHODS.toString(), methodsExpectedDump); return expectedDump; } private Map getJaneSmithExpectedDump(int exposureLevel) { Map expectedDump = new HashMap(); SortedMap propertiesExpectedDump = new TreeMap(); // Properties if (exposureLevel != BeansWrapper.EXPOSE_NOTHING) { // Map birthdateExpectedDump = new HashMap(); // birthdateExpectedDump.put(Key.TYPE.toString(), Type.DATE); // birthdateExpectedDump.put(Key.DATE_TYPE.toString(), DateType.UNKNOWN); // Calendar c = Calendar.getInstance(); // c.set(75, Calendar.MAY, 5); // birthdateExpectedDump.put(Key.VALUE.toString(), c.getTime()); // propertiesExpectedDump.put("birthdate", birthdateExpectedDump); Map fullNameExpectedDump = new HashMap(); fullNameExpectedDump.put(Key.TYPE.toString(), Type.STRING); fullNameExpectedDump.put(Key.VALUE.toString(), "Jane Smith"); propertiesExpectedDump.put("fullName", fullNameExpectedDump); Map idExpectedDump = new HashMap(); idExpectedDump.put(Key.TYPE.toString(), Type.NUMBER); idExpectedDump.put(Key.VALUE.toString(), 78234); propertiesExpectedDump.put("id", idExpectedDump); Map nicknameExpectedDump = new HashMap(); nicknameExpectedDump.put(Key.TYPE.toString(), Type.STRING); nicknameExpectedDump.put(Key.VALUE.toString(), ""); propertiesExpectedDump.put("nickname", nicknameExpectedDump); Map middleNameExpectedDump = new HashMap(); middleNameExpectedDump.put(Key.VALUE.toString(), "null"); propertiesExpectedDump.put("middleName", middleNameExpectedDump); Map marriedExpectedDump = new HashMap(); marriedExpectedDump.put(Key.TYPE.toString(), Type.BOOLEAN); marriedExpectedDump.put(Key.VALUE.toString(), true); propertiesExpectedDump.put("married", marriedExpectedDump); Map supervisorExpectedDump = new HashMap(); supervisorExpectedDump.put(Key.VALUE.toString(), "null"); propertiesExpectedDump.put("supervisor", supervisorExpectedDump); Map favoriteColorsExpectedDump = new HashMap(); favoriteColorsExpectedDump.put(Key.TYPE.toString(), Type.SEQUENCE); List> favoriteColorListExpectedDump = new ArrayList>(); Map color1ExpectedDump = new HashMap(); color1ExpectedDump.put(Key.TYPE.toString(), Type.STRING); color1ExpectedDump.put(Key.VALUE.toString(), "red"); favoriteColorListExpectedDump.add(color1ExpectedDump); Map color2ExpectedDump = new HashMap(); color2ExpectedDump.put(Key.TYPE.toString(), Type.STRING); color2ExpectedDump.put(Key.VALUE.toString(), "orange"); favoriteColorListExpectedDump.add(color2ExpectedDump); favoriteColorsExpectedDump.put(Key.VALUE.toString(), favoriteColorListExpectedDump); propertiesExpectedDump.put("favoriteColors", favoriteColorsExpectedDump); } expectedDump.put(Key.PROPERTIES.toString(), propertiesExpectedDump); // Methods SortedMap methodsExpectedDump = new TreeMap(); expectedDump.put(Key.METHODS.toString(), methodsExpectedDump); return expectedDump; } }