diff --git a/webapp/src/freemarker/ext/dump/BaseDumpDirective.java b/webapp/src/freemarker/ext/dump/BaseDumpDirective.java index 6bc27b250..1eecbd610 100644 --- a/webapp/src/freemarker/ext/dump/BaseDumpDirective.java +++ b/webapp/src/freemarker/ext/dump/BaseDumpDirective.java @@ -7,7 +7,6 @@ import java.io.StringWriter; import java.io.Writer; import java.lang.reflect.Method; import java.util.ArrayList; -import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -42,25 +41,86 @@ public abstract class BaseDumpDirective implements TemplateDirectiveModel { private static final Log log = LogFactory.getLog(BaseDumpDirective.class); + enum Key { + NAME("name"), + TYPE("type"), + VALUE("value"), + DATE_TYPE("dateType"); + + private final String key; + + Key(String key) { + this.key = key; + } + + public String toString() { + return key; + } + } + + enum Type { + STRING("String"), + NUMBER("Number"), + BOOLEAN("Boolean"), + DATE("Date"), + SEQUENCE("Sequence"), + HASH("Hash"), + HASH_EX("HashEx"), + COLLECTION("Collection"), + METHOD("Method"), + DIRECTIVE("Directive"); + + private final String type; + + Type(String type) { + this.type = type; + } + + public String toString() { + return type; + } + } + + enum DateType { + DATE("Date"), + DATETIME("DateTime"), + TIME("Time"), + UNKNOWN("Unknown"); + + private final String type; + + DateType(String type) { + this.type = type; + } + + public String toString() { + return type; + } + } + + protected Map getTemplateVariableData(String varName, Environment env) throws TemplateModelException { Map map = new HashMap(); - map.put("name", varName); + map.put(Key.NAME.toString(), varName); TemplateHashModel dataModel = env.getDataModel(); TemplateModel model = dataModel.get(varName); - - // TemplateMethodModel and TemplateDirectiveModel objects can only be - // included in the data model at the top level. - if (model instanceof TemplateMethodModel) { - map.putAll( getTemplateModelData( ( TemplateMethodModel)model, varName ) ); - - } else if (model instanceof TemplateDirectiveModel) { - map.putAll( getTemplateModelData( ( TemplateDirectiveModel)model, varName ) ); - - } else { - map.putAll(getData(model)); + + // Don't return null if model == null. We still want to send the map to the template. + if (model != null) { + // TemplateMethodModel and TemplateDirectiveModel objects can only be + // included in the data model at the top level. + if (model instanceof TemplateMethodModel) { + map.putAll( getTemplateModelData( ( TemplateMethodModel)model, varName ) ); + + } else if (model instanceof TemplateDirectiveModel) { + map.putAll( getTemplateModelData( ( TemplateDirectiveModel)model, varName ) ); + + } else { + map.putAll(getData(model)); + } } return map; @@ -109,47 +169,47 @@ public abstract class BaseDumpDirective implements TemplateDirectiveModel { private Map getTemplateModelData(TemplateScalarModel model) throws TemplateModelException { Map map = new HashMap(); - map.put("type", "String"); - map.put("value", model.getAsString()); + map.put(Key.TYPE.toString(), Type.STRING); + map.put(Key.VALUE.toString(), model.getAsString()); return map; } private Map getTemplateModelData(TemplateBooleanModel model) throws TemplateModelException { Map map = new HashMap(); - map.put("type", "Boolean"); - map.put("value", model.getAsBoolean()); + map.put(Key.TYPE.toString(), Type.BOOLEAN); + map.put(Key.VALUE.toString(), model.getAsBoolean()); return map; } private Map getTemplateModelData(TemplateNumberModel model) throws TemplateModelException { Map map = new HashMap(); - map.put("type", "Number"); - map.put("value", model.getAsNumber()); + map.put(Key.TYPE.toString(), Type.NUMBER); + map.put(Key.VALUE.toString(), model.getAsNumber()); return map; } private Map getTemplateModelData(TemplateDateModel model) throws TemplateModelException { Map map = new HashMap(); - map.put("type", "Date"); + map.put(Key.TYPE.toString(), Type.DATE); int dateType = model.getDateType(); - String type; + DateType type; switch (dateType) { case TemplateDateModel.DATE: - type = "Date"; + type = DateType.DATE; break; case TemplateDateModel.DATETIME: - type = "DateTime"; + type = DateType.DATETIME; break; case TemplateDateModel.TIME: - type = "Time"; + type = DateType.TIME; break; default: - type = "Unknown"; + type = DateType.UNKNOWN; } - map.put("dateType", type); + map.put(Key.DATE_TYPE.toString(), type); - map.put("value", model.getAsDate()); + map.put(Key.VALUE.toString(), model.getAsDate()); return map; } @@ -157,27 +217,27 @@ public abstract class BaseDumpDirective implements TemplateDirectiveModel { // The data model is a hash; when else do we get here? log.debug("Dumping model " + model); Map map = new HashMap(); - map.put("type", "Hash"); - //map.put("value", model.getAsBoolean()); + map.put(Key.TYPE.toString(), Type.HASH); + //map.put(Key.VALUE.toString(), ????); return map; } private Map getTemplateModelData(TemplateSequenceModel model) throws TemplateModelException { Map map = new HashMap(); - map.put("type", "Sequence"); + map.put(Key.TYPE.toString(), Type.SEQUENCE); int itemCount = model.size(); List> items = new ArrayList>(itemCount); for ( int i = 0; i < itemCount; i++ ) { TemplateModel item = model.get(i); items.add(getData(item)); } - map.put("value", items); + map.put(Key.VALUE.toString(), items); return map; } private Map getTemplateModelData(TemplateHashModelEx model) throws TemplateModelException { Map map = new HashMap(); - map.put("type", "HashEx"); + map.put(Key.TYPE.toString(), Type.HASH_EX); Map items = new HashMap(); // keys() gets only values visible to template TemplateCollectionModel keys = model.keys(); @@ -187,33 +247,33 @@ public abstract class BaseDumpDirective implements TemplateDirectiveModel { TemplateModel value = model.get(key); items.put(key, getData(value)); } - map.put("value", items); + map.put(Key.VALUE.toString(), items); return map; } private Map getTemplateModelData(TemplateCollectionModel model) throws TemplateModelException { Map map = new HashMap(); - map.put("type", "Collection"); + map.put(Key.TYPE.toString(), Type.COLLECTION); List> items = new ArrayList>(); TemplateModelIterator iModel = model.iterator(); while (iModel.hasNext()) { TemplateModel m = iModel.next(); items.add(getData(m)); } - map.put("value", items); + map.put(Key.VALUE.toString(), items); return map; } private Map getTemplateModelData(TemplateMethodModel model, String varName) throws TemplateModelException { Map map = new HashMap(); - map.put("type", "Method"); + map.put(Key.TYPE.toString(), Type.METHOD); map.put("help", getHelp(model, varName)); return map; } private Map getTemplateModelData(TemplateDirectiveModel model, String varName) throws TemplateModelException { Map map = new HashMap(); - map.put("type", "Directive"); + map.put(Key.TYPE.toString(), Type.DIRECTIVE); map.put("help", getHelp(model, varName)); return map; } @@ -244,8 +304,8 @@ public abstract class BaseDumpDirective implements TemplateDirectiveModel { log.debug("Found model with no known type"); Map map = new HashMap(); Object unwrappedModel = DeepUnwrap.permissiveUnwrap(model); - map.put("type", unwrappedModel.getClass().getName()); - map.put("value", unwrappedModel.toString()); + map.put(Key.TYPE.toString(), unwrappedModel.getClass().getName()); + map.put(Key.VALUE.toString(), unwrappedModel.toString()); return map; } diff --git a/webapp/test/freemarker/ext/dump/DumpDirectiveTest.java b/webapp/test/freemarker/ext/dump/DumpDirectiveTest.java index c2a295e83..629bd9716 100644 --- a/webapp/test/freemarker/ext/dump/DumpDirectiveTest.java +++ b/webapp/test/freemarker/ext/dump/DumpDirectiveTest.java @@ -11,7 +11,7 @@ import java.io.StringWriter; import java.sql.Time; import java.sql.Timestamp; import java.util.ArrayList; -import java.util.Collections; +import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.HashSet; @@ -25,6 +25,9 @@ import org.junit.Before; import org.junit.Test; import freemarker.core.Environment; +import freemarker.ext.dump.BaseDumpDirective.Type; +import freemarker.ext.dump.BaseDumpDirective.DateType; +import freemarker.ext.dump.BaseDumpDirective.Key; import freemarker.template.Configuration; import freemarker.template.SimpleCollection; import freemarker.template.Template; @@ -40,6 +43,8 @@ public class DumpDirectiveTest { private Template template; + + @Before public void setUp() { Configuration config = new Configuration(); @@ -62,12 +67,12 @@ public class DumpDirectiveTest { String value = "Rover"; dataModel.put(varName, value); - Map expected = new HashMap(); - expected.put("name", varName); - expected.put("type", "String"); - expected.put("value", 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, expected); + test(varName, dataModel, expectedDump); } @Test @@ -79,12 +84,12 @@ public class DumpDirectiveTest { boolean value = true; dataModel.put(varName, value); - Map expected = new HashMap(); - expected.put("name", varName); - expected.put("type", "Boolean"); - expected.put("value", 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, expected); + test(varName, dataModel, expectedDump); } @Test @@ -96,12 +101,12 @@ public class DumpDirectiveTest { int value = 7; dataModel.put(varName, value); - Map expected = new HashMap(); - expected.put("name", varName); - expected.put("type", "Number"); - expected.put("value", 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, expected); + test(varName, dataModel, expectedDump); } @Test @@ -113,13 +118,13 @@ public class DumpDirectiveTest { Date now = new Date(); dataModel.put(varName, now); - Map expected = new HashMap(); - expected.put("name", varName); - expected.put("type", "Date"); - expected.put("dateType", "Unknown"); - expected.put("value", 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, expected); + test(varName, dataModel, expectedDump); } @Test @@ -131,13 +136,13 @@ public class DumpDirectiveTest { Timestamp ts = new Timestamp(1302297332043L); dataModel.put(varName, ts); - Map expected = new HashMap(); - expected.put("name", varName); - expected.put("type", "Date"); - expected.put("dateType", "DateTime"); - expected.put("value", 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, expected); + test(varName, dataModel, expectedDump); } @Test @@ -149,13 +154,13 @@ public class DumpDirectiveTest { java.sql.Date date = new java.sql.Date(1302297332043L); dataModel.put(varName, date); - Map expected = new HashMap(); - expected.put("name", varName); - expected.put("type", "Date"); - expected.put("dateType", "Date"); - expected.put("value", 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, expected); + test(varName, dataModel, expectedDump); } @Test @@ -167,13 +172,13 @@ public class DumpDirectiveTest { Time time = new Time(1302297332043L); dataModel.put(varName, time); - Map expected = new HashMap(); - expected.put("name", varName); - expected.put("type", "Date"); - expected.put("dateType", "Time"); - expected.put("value", 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, expected); + test(varName, dataModel, expectedDump); } // RY test method and directive types with and without help methods @@ -184,15 +189,15 @@ public class DumpDirectiveTest { String varName = "square"; Map dataModel = new HashMap(); - TemplateMethodModel value = new HelplessMethod(); - dataModel.put(varName, value); + TemplateMethodModel methodModel = new HelplessMethod(); + dataModel.put(varName, methodModel); - Map expected = new HashMap(); - expected.put("name", varName); - expected.put("type", "Method"); - expected.put("help", null); + Map expectedDump = new HashMap(); + expectedDump.put(Key.NAME.toString(), varName); + expectedDump.put(Key.TYPE.toString(), Type.METHOD); + expectedDump.put("help", null); - test(varName, dataModel, expected); + test(varName, dataModel, expectedDump); } @Test @@ -201,15 +206,15 @@ public class DumpDirectiveTest { String varName = "square"; Map dataModel = new HashMap(); - TemplateMethodModel value = new HelpfulMethod(); - dataModel.put(varName, value); + TemplateMethodModel methodModel = new HelpfulMethod(); + dataModel.put(varName, methodModel); - Map expected = new HashMap(); - expected.put("name", varName); - expected.put("type", "Method"); - expected.put("help", getMethodHelp(varName)); + 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, expected); + test(varName, dataModel, expectedDump); } @Test @@ -218,15 +223,15 @@ public class DumpDirectiveTest { String varName = "square"; Map dataModel = new HashMap(); - TemplateMethodModel value = new MethodWithBadHelp(); - dataModel.put(varName, value); + TemplateMethodModel methodModel = new MethodWithBadHelp(); + dataModel.put(varName, methodModel); - Map expected = new HashMap(); - expected.put("name", varName); - expected.put("type", "Method"); - expected.put("help", null); + Map expectedDump = new HashMap(); + expectedDump.put(Key.NAME.toString(), varName); + expectedDump.put(Key.TYPE.toString(), Type.METHOD); + expectedDump.put("help", null); - test(varName, dataModel, expected); + test(varName, dataModel, expectedDump); } @Test @@ -235,15 +240,15 @@ public class DumpDirectiveTest { String varName = "dump"; Map dataModel = new HashMap(); - TemplateDirectiveModel value = new HelplessDirective(); - dataModel.put(varName, value); + TemplateDirectiveModel directiveModel = new HelplessDirective(); + dataModel.put(varName, directiveModel); - Map expected = new HashMap(); - expected.put("name", varName); - expected.put("type", "Directive"); - expected.put("help", null); + Map expectedDump = new HashMap(); + expectedDump.put(Key.NAME.toString(), varName); + expectedDump.put(Key.TYPE.toString(), Type.DIRECTIVE); + expectedDump.put("help", null); - test(varName, dataModel, expected); + test(varName, dataModel, expectedDump); } @Test @@ -252,15 +257,15 @@ public class DumpDirectiveTest { String varName = "dump"; Map dataModel = new HashMap(); - TemplateDirectiveModel value = new HelpfulDirective(); - dataModel.put(varName, value); + TemplateDirectiveModel directiveModel = new HelpfulDirective(); + dataModel.put(varName, directiveModel); - Map expected = new HashMap(); - expected.put("name", varName); - expected.put("type", "Directive"); - expected.put("help", getDirectiveHelp(varName)); + 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, expected); + test(varName, dataModel, expectedDump); } @Test @@ -269,15 +274,15 @@ public class DumpDirectiveTest { String varName = "dump"; Map dataModel = new HashMap(); - TemplateDirectiveModel value = new DirectiveWithBadHelp(); - dataModel.put(varName, value); + TemplateDirectiveModel directiveModel = new DirectiveWithBadHelp(); + dataModel.put(varName, directiveModel); - Map expected = new HashMap(); - expected.put("name", varName); - expected.put("type", "Directive"); - expected.put("help", null); + Map expectedDump = new HashMap(); + expectedDump.put(Key.NAME.toString(), varName); + expectedDump.put(Key.TYPE.toString(), Type.DIRECTIVE); + expectedDump.put("help", null); - test(varName, dataModel, expected); + test(varName, dataModel, expectedDump); } @Test @@ -292,19 +297,19 @@ public class DumpDirectiveTest { list.add("oranges"); dataModel.put(varName, list); - Map expected = new HashMap(); - expected.put("name", varName); - expected.put("type", "Sequence"); - List> dump = new ArrayList>(); + Map expectedDump = new HashMap(); + expectedDump.put(Key.NAME.toString(), varName); + expectedDump.put(Key.TYPE.toString(), Type.SEQUENCE); + List> listDump = new ArrayList>(list.size()); for ( String str : list) { - Map map = new HashMap(); - map.put("type", "String"); - map.put("value", str); - dump.add(map); + Map itemDump = new HashMap(); + itemDump.put(Key.TYPE.toString(), Type.STRING); + itemDump.put(Key.VALUE.toString(), str); + listDump.add(itemDump); } - expected.put("value", dump); + expectedDump.put(Key.VALUE.toString(), listDump); - test(varName, dataModel, expected); + test(varName, dataModel, expectedDump); } @Test @@ -313,22 +318,22 @@ public class DumpDirectiveTest { String varName = "fruit"; Map dataModel = new HashMap(); - String[] list = { "apples", "bananas", "oranges" }; - dataModel.put(varName, list); + String[] arr = { "apples", "bananas", "oranges" }; + dataModel.put(varName, arr); - Map expected = new HashMap(); - expected.put("name", varName); - expected.put("type", "Sequence"); - List> dump = new ArrayList>(); - for ( String str : list) { - Map map = new HashMap(); - map.put("type", "String"); - map.put("value", str); - dump.add(map); + Map expectedDump = new HashMap(); + expectedDump.put(Key.NAME.toString(), varName); + expectedDump.put(Key.TYPE.toString(), Type.SEQUENCE); + List> arrDump = new ArrayList>(arr.length); + for ( String str : arr) { + Map itemDump = new HashMap(); + itemDump.put(Key.TYPE.toString(), Type.STRING); + itemDump.put(Key.VALUE.toString(), str); + arrDump.add(itemDump); } - expected.put("value", dump); + expectedDump.put(Key.VALUE.toString(), arrDump); - test(varName, dataModel, expected); + test(varName, dataModel, expectedDump); } @Test @@ -337,54 +342,61 @@ public class DumpDirectiveTest { String varName = "stuff"; Map dataModel = new HashMap(); - List list = new ArrayList(); - list.add("apples"); - list.add(4); - list.add(false); - List animals = new ArrayList(); - animals.add("dog"); - animals.add("cat"); - animals.add("elephant"); - Collections.sort(animals); - list.add(animals); - dataModel.put(varName, list); + List mixedList = new ArrayList(); - Map expected = new HashMap(); - expected.put("name", varName); - expected.put("type", "Sequence"); + String myString = "apples"; + mixedList.add(myString); - List> dump = new ArrayList>(); + int myInt = 4; + mixedList.add(myInt); - Map stringMap = new HashMap(); - stringMap.put("type", "String"); - stringMap.put("value", "apples"); - dump.add(stringMap); + 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> mixedListDump = new ArrayList>(mixedList.size()); + + Map stringDump = new HashMap(); + stringDump.put(Key.TYPE.toString(), Type.STRING); + stringDump.put(Key.VALUE.toString(), myString); + mixedListDump.add(stringDump); - Map numberMap = new HashMap(); - numberMap.put("type", "Number"); - numberMap.put("value", 4); - dump.add(numberMap); + Map numberDump = new HashMap(); + numberDump.put(Key.TYPE.toString(), Type.NUMBER); + numberDump.put(Key.VALUE.toString(), myInt); + mixedListDump.add(numberDump); - Map booleanMap = new HashMap(); - booleanMap.put("type", "Boolean"); - booleanMap.put("value", false); - dump.add(booleanMap); + Map booleanDump = new HashMap(); + booleanDump.put(Key.TYPE.toString(), Type.BOOLEAN); + booleanDump.put(Key.VALUE.toString(), myBool); + mixedListDump.add(booleanDump); - Map sequenceMap = new HashMap(); - sequenceMap.put("type", "Sequence"); - List> animalDump = new ArrayList>(); - for ( String animal : animals ) { - Map animalMap = new HashMap(); - animalMap.put("type", "String"); - animalMap.put("value", animal); - animalDump.add(animalMap); + Map myListDump = new HashMap(); + myListDump.put(Key.TYPE.toString(), Type.SEQUENCE); + List> itemsDump = 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); + itemsDump.add(itemDump); } - sequenceMap.put("value", animalDump); - dump.add(sequenceMap); + myListDump.put(Key.VALUE.toString(), itemsDump); + mixedListDump.add(myListDump); - expected.put("value", dump); + expectedDump.put(Key.VALUE.toString(), mixedListDump); - test(varName, dataModel, expected); + test(varName, dataModel, expectedDump); } @Test @@ -401,19 +413,19 @@ public class DumpDirectiveTest { } dataModel.put(varName, odds); - Map expected = new HashMap(); - expected.put("name", varName); - expected.put("type", "Sequence"); - List> dump = new ArrayList>(); + Map expectedDump = new HashMap(); + expectedDump.put(Key.NAME.toString(), varName); + expectedDump.put(Key.TYPE.toString(), Type.SEQUENCE); + List> sequenceDump = new ArrayList>(odds.size()); for ( int i : odds ) { - Map map = new HashMap(); - map.put("type", "Number"); - map.put("value", i); - dump.add(map); + Map itemDump = new HashMap(); + itemDump.put(Key.TYPE.toString(), Type.NUMBER); + itemDump.put(Key.VALUE.toString(), i); + sequenceDump.add(itemDump); } - expected.put("value", dump); + expectedDump.put(Key.VALUE.toString(), sequenceDump); - test(varName, dataModel, expected); + test(varName, dataModel, expectedDump); } @Test @@ -431,19 +443,19 @@ public class DumpDirectiveTest { TemplateCollectionModel collection = new SimpleCollection(odds); dataModel.put(varName, collection); - Map expected = new HashMap(); - expected.put("name", varName); - expected.put("type", "Collection"); - List> dump = new ArrayList>(); + Map expectedDump = new HashMap(); + expectedDump.put(Key.NAME.toString(), varName); + expectedDump.put(Key.TYPE.toString(), Type.COLLECTION); + List> collectionDump = new ArrayList>(odds.size()); for ( int i : odds ) { - Map map = new HashMap(); - map.put("type", "Number"); - map.put("value", i); - dump.add(map); + Map itemDump = new HashMap(); + itemDump.put(Key.TYPE.toString(), Type.NUMBER); + itemDump.put(Key.VALUE.toString(), i); + collectionDump.add(itemDump); } - expected.put("value", dump); + expectedDump.put(Key.VALUE.toString(), collectionDump); - test(varName, dataModel, expected); + test(varName, dataModel, expectedDump); } @Test @@ -452,42 +464,165 @@ public class DumpDirectiveTest { } // RY Do these with different BeansWrappers + @Test public void dumpStringToStringMap() { String varName = "capitals"; Map dataModel = new HashMap(); - Map capitals = new HashMap(); - capitals.put("Albany", "New York"); - capitals.put("St. Paul", "Minnesota"); - capitals.put("Austin", "Texas"); - capitals.put("Sacramento", "California"); - capitals.put("Richmond", "Virginia"); - dataModel.put(varName, capitals); + 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 expected = new HashMap(); - expected.put("name", varName); - expected.put("type", "HashEx"); - Map dump = new HashMap(); - for ( String key : capitals.keySet() ) { - Map capitalDump = new HashMap(); - capitalDump.put("type", "String"); - capitalDump.put("value", capitals.get(key)); - dump.put(key, capitalDump); + Map expectedDump = new HashMap(); + expectedDump.put(Key.NAME.toString(), varName); + expectedDump.put(Key.TYPE.toString(), Type.HASH_EX); + Map myMapDump = new HashMap(myMap.size()); + for ( String key : myMap.keySet() ) { + Map itemDump = new HashMap(); + itemDump.put(Key.TYPE.toString(), Type.STRING); + itemDump.put(Key.VALUE.toString(), myMap.get(key)); + myMapDump.put(key, itemDump); } - expected.put("value", dump); + expectedDump.put(Key.VALUE.toString(), myMapDump); - test(varName, dataModel, expected); + test(varName, dataModel, expectedDump); + } + + @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 now = new Date(); + mixedMap.put("myDate", now); + + 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 mixedMapDump = new HashMap(mixedMap.size()); + + Map myStringDump = new HashMap(); + myStringDump.put(Key.TYPE.toString(), Type.STRING); + myStringDump.put(Key.VALUE.toString(), myString); + mixedMapDump.put("myString", myStringDump); + + Map myBooleanDump = new HashMap(); + myBooleanDump.put(Key.TYPE.toString(), Type.BOOLEAN); + myBooleanDump.put(Key.VALUE.toString(), myBool); + mixedMapDump.put("myBoolean", myBooleanDump); + + Map myNumberDump = new HashMap(); + myNumberDump.put(Key.TYPE.toString(), Type.NUMBER); + myNumberDump.put(Key.VALUE.toString(), myInt); + mixedMapDump.put("myNumber", myNumberDump); + + Map myDateDump = new HashMap(); + myDateDump.put(Key.TYPE.toString(), Type.DATE); + myDateDump.put(Key.DATE_TYPE.toString(), DateType.UNKNOWN); + myDateDump.put(Key.VALUE.toString(), now); + mixedMapDump.put("myDate", myDateDump); + + Map myListDump = new HashMap(); + myListDump.put(Key.TYPE.toString(), Type.SEQUENCE); + List> listItemsDump = 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); + listItemsDump.add(itemDump); + } + myListDump.put(Key.VALUE.toString(), listItemsDump); + mixedMapDump.put("myList", myListDump); + + Map myMapDump = new HashMap(); + myMapDump.put(Key.TYPE.toString(), Type.HASH_EX); + Map mapItemsDump = new HashMap(myMap.size()); + for ( String key : myMap.keySet() ) { + Map itemDump = new HashMap(); + itemDump.put(Key.TYPE.toString(), Type.STRING); + itemDump.put(Key.VALUE.toString(), myMap.get(key)); + mapItemsDump.put(key, itemDump); + } + myMapDump.put(Key.VALUE.toString(), mapItemsDump); + mixedMapDump.put("myMap", myMapDump); + + expectedDump.put(Key.VALUE.toString(), mixedMapDump); + + test(varName, dataModel, expectedDump); + } + + @Test + public void dumpObject() { + + String varName = "employee"; + Map dataModel = new HashMap(); + + Calendar c = Calendar.getInstance(); + c.set(75, Calendar.MAY, 5); + Employee jdoe = new Employee("John Doe", c.getTime(), 34523); + + c.set(65, Calendar.AUGUST, 10); + Employee jsmith = new Employee("Jane Smith", c.getTime(), 11111); + + c.set(80, Calendar.JUNE, 20); + Employee mjones = new Employee("Michael Jones", c.getTime(), 22222); + + c.set(81, Calendar.NOVEMBER, 30); + Employee mturner = new Employee("Mary Turner", c.getTime(), 33333); + + List supervisees = new ArrayList(); + supervisees.add(mjones); + supervisees.add(mturner); + jdoe.setSupervisor(jsmith); + jdoe.setSupervisees(supervisees); + jdoe.setSalary(65000); + + dataModel.put("employee", jdoe); + + Map expectedDump = new HashMap(); + } /////////////////////////// Private stub classes and helper methods /////////////////////////// - private void test(String varName, Map dataModel, Map expected) { + private void test(String varName, Map dataModel, Map expectedDump) { try { Environment env = template.createProcessingEnvironment(dataModel, new StringWriter()); Map dumpData = new DumpDirective().getTemplateVariableData(varName, env); - assertEquals(expected, dumpData); + assertEquals(expectedDump, dumpData); } catch (Exception e) { fail(e.getMessage()); } @@ -581,7 +716,7 @@ public class DumpDirectiveTest { private Map getMethodHelp(String name) { Map map = new HashMap(); - map.put("name", name); + map.put(Key.NAME.toString(), name); map.put("returns", "The square of the argument"); @@ -596,5 +731,55 @@ public class DumpDirectiveTest { return map; } + private class Employee { + + private String name; + private Date birthdate; + private int id; + private Employee supervisor; + private List supervisees; + private float salary; + + Employee(String name, Date birthdate, int id) { + this.name = name; + this.birthdate = birthdate; + this.id = id; + } + + String getName() { + return name; + } + + Date getBirthdate() { + return birthdate; + } + + int getId() { + return id; + } + void setSupervisor(Employee supervisor) { + this.supervisor = supervisor; + } + + public Employee getSupervisor() { + return supervisor; + } + + void setSupervisees(List supervisees) { + this.supervisees = supervisees; + } + + public List getSupervisees() { + return supervisees; + } + + void setSalary(float salary) { + this.salary = salary; + } + + float getSalary() { + return salary; + } + } } diff --git a/webapp/web/templates/freemarker/body/partials/dump/dumpvar.ftl b/webapp/web/templates/freemarker/body/partials/dump/dumpvar.ftl new file mode 100644 index 000000000..d1920d020 --- /dev/null +++ b/webapp/web/templates/freemarker/body/partials/dump/dumpvar.ftl @@ -0,0 +1,29 @@ +<#-- $This file is distributed under the terms of the license in /doc/license.txt$ --> + +<#-- Styles here are temporary; move to css file once stylesheets.add() works --> + + + +
+

Variable name: ${var.name}

+

Type: ${var.type}

+ + +

Value: ${var.value}

+
+ +<#-- This will work after we move stylesheets to Configuration sharedVariables +${stylesheets.add('')} +--> \ No newline at end of file