NIHVIVO-1562 Dump of TemplateCollectionModel and TemplateHashModelEx, along with some unit tests.

This commit is contained in:
ryounes 2011-04-11 15:32:12 +00:00
parent 84b9365ad4
commit 9bfa6acbd5
2 changed files with 176 additions and 40 deletions

View file

@ -7,6 +7,7 @@ import java.io.StringWriter;
import java.io.Writer; import java.io.Writer;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -17,6 +18,7 @@ import org.apache.commons.logging.LogFactory;
import freemarker.core.Environment; import freemarker.core.Environment;
import freemarker.template.Template; import freemarker.template.Template;
import freemarker.template.TemplateBooleanModel; import freemarker.template.TemplateBooleanModel;
import freemarker.template.TemplateCollectionModel;
import freemarker.template.TemplateDateModel; import freemarker.template.TemplateDateModel;
import freemarker.template.TemplateDirectiveModel; import freemarker.template.TemplateDirectiveModel;
import freemarker.template.TemplateException; import freemarker.template.TemplateException;
@ -25,6 +27,7 @@ import freemarker.template.TemplateHashModelEx;
import freemarker.template.TemplateMethodModel; import freemarker.template.TemplateMethodModel;
import freemarker.template.TemplateModel; import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException; import freemarker.template.TemplateModelException;
import freemarker.template.TemplateModelIterator;
import freemarker.template.TemplateNumberModel; import freemarker.template.TemplateNumberModel;
import freemarker.template.TemplateScalarModel; import freemarker.template.TemplateScalarModel;
import freemarker.template.TemplateSequenceModel; import freemarker.template.TemplateSequenceModel;
@ -91,6 +94,11 @@ public abstract class BaseDumpDirective implements TemplateDirectiveModel {
} else if (model instanceof TemplateSequenceModel){ } else if (model instanceof TemplateSequenceModel){
map.putAll( getTemplateModelData( ( TemplateSequenceModel)model ) ); map.putAll( getTemplateModelData( ( TemplateSequenceModel)model ) );
} else if (model instanceof TemplateCollectionModel) {
map.putAll( getTemplateModelData( ( TemplateCollectionModel)model ) );
// Nodes and transforms not included here
} else { } else {
map.putAll( getTemplateModelData( (TemplateModel)model ) ); map.putAll( getTemplateModelData( (TemplateModel)model ) );
} }
@ -146,6 +154,8 @@ public abstract class BaseDumpDirective implements TemplateDirectiveModel {
} }
private Map<String, Object> getTemplateModelData(TemplateHashModel model) throws TemplateModelException { private Map<String, Object> getTemplateModelData(TemplateHashModel model) throws TemplateModelException {
// The data model is a hash; when else do we get here?
log.debug("Dumping model " + model);
Map<String, Object> map = new HashMap<String, Object>(); Map<String, Object> map = new HashMap<String, Object>();
map.put("type", "Hash"); map.put("type", "Hash");
//map.put("value", model.getAsBoolean()); //map.put("value", model.getAsBoolean());
@ -167,8 +177,30 @@ public abstract class BaseDumpDirective implements TemplateDirectiveModel {
private Map<String, Object> getTemplateModelData(TemplateHashModelEx model) throws TemplateModelException { private Map<String, Object> getTemplateModelData(TemplateHashModelEx model) throws TemplateModelException {
Map<String, Object> map = new HashMap<String, Object>(); Map<String, Object> map = new HashMap<String, Object>();
map.put("type", "HashModelEx");; map.put("type", "HashEx");
//map.put("value", model.getAsDate()); Map<String, Object> items = new HashMap<String, Object>();
// keys() gets only values visible to template
TemplateCollectionModel keys = model.keys();
TemplateModelIterator iModel = keys.iterator();
while (iModel.hasNext()) {
String key = iModel.next().toString();
TemplateModel value = model.get(key);
items.put(key, getData(value));
}
map.put("value", items);
return map;
}
private Map<String, Object> getTemplateModelData(TemplateCollectionModel model) throws TemplateModelException {
Map<String, Object> map = new HashMap<String, Object>();
map.put("type", "Collection");
List<Map<String, Object>> items = new ArrayList<Map<String, Object>>();
TemplateModelIterator iModel = model.iterator();
while (iModel.hasNext()) {
TemplateModel m = iModel.next();
items.add(getData(m));
}
map.put("value", items);
return map; return map;
} }
@ -181,7 +213,7 @@ public abstract class BaseDumpDirective implements TemplateDirectiveModel {
private Map<String, Object> getTemplateModelData(TemplateDirectiveModel model, String varName) throws TemplateModelException { private Map<String, Object> getTemplateModelData(TemplateDirectiveModel model, String varName) throws TemplateModelException {
Map<String, Object> map = new HashMap<String, Object>(); Map<String, Object> map = new HashMap<String, Object>();
map.put("type", "Directive");; map.put("type", "Directive");
map.put("help", getHelp(model, varName)); map.put("help", getHelp(model, varName));
return map; return map;
} }

View file

@ -14,8 +14,10 @@ import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import org.apache.log4j.Level; import org.apache.log4j.Level;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
@ -24,7 +26,9 @@ import org.junit.Test;
import freemarker.core.Environment; import freemarker.core.Environment;
import freemarker.template.Configuration; import freemarker.template.Configuration;
import freemarker.template.SimpleCollection;
import freemarker.template.Template; import freemarker.template.Template;
import freemarker.template.TemplateCollectionModel;
import freemarker.template.TemplateDirectiveBody; import freemarker.template.TemplateDirectiveBody;
import freemarker.template.TemplateDirectiveModel; import freemarker.template.TemplateDirectiveModel;
import freemarker.template.TemplateException; import freemarker.template.TemplateException;
@ -53,8 +57,9 @@ public class DumpDirectiveTest {
public void dumpString() { public void dumpString() {
String varName = "dog"; String varName = "dog";
String value = "Rover";
Map<String, Object> dataModel = new HashMap<String, Object>(); Map<String, Object> dataModel = new HashMap<String, Object>();
String value = "Rover";
dataModel.put(varName, value); dataModel.put(varName, value);
Map<String, Object> expected = new HashMap<String, Object>(); Map<String, Object> expected = new HashMap<String, Object>();
@ -68,9 +73,10 @@ public class DumpDirectiveTest {
@Test @Test
public void dumpBoolean() { public void dumpBoolean() {
String varName = "hasSiteAdminAccess"; String varName = "isLoggedIn";
boolean value = true;
Map<String, Object> dataModel = new HashMap<String, Object>(); Map<String, Object> dataModel = new HashMap<String, Object>();
boolean value = true;
dataModel.put(varName, value); dataModel.put(varName, value);
Map<String, Object> expected = new HashMap<String, Object>(); Map<String, Object> expected = new HashMap<String, Object>();
@ -85,8 +91,9 @@ public class DumpDirectiveTest {
public void dumpNumber() { public void dumpNumber() {
String varName = "tabCount"; String varName = "tabCount";
int value = 7;
Map<String, Object> dataModel = new HashMap<String, Object>(); Map<String, Object> dataModel = new HashMap<String, Object>();
int value = 7;
dataModel.put(varName, value); dataModel.put(varName, value);
Map<String, Object> expected = new HashMap<String, Object>(); Map<String, Object> expected = new HashMap<String, Object>();
@ -101,8 +108,9 @@ public class DumpDirectiveTest {
public void dumpSimpleDate() { public void dumpSimpleDate() {
String varName = "now"; String varName = "now";
Date now = new Date();
Map<String, Object> dataModel = new HashMap<String, Object>(); Map<String, Object> dataModel = new HashMap<String, Object>();
Date now = new Date();
dataModel.put(varName, now); dataModel.put(varName, now);
Map<String, Object> expected = new HashMap<String, Object>(); Map<String, Object> expected = new HashMap<String, Object>();
@ -118,8 +126,9 @@ public class DumpDirectiveTest {
public void dumpDateTime() { public void dumpDateTime() {
String varName = "timestamp"; String varName = "timestamp";
Timestamp ts = new Timestamp(1302297332043L);
Map<String, Object> dataModel = new HashMap<String, Object>(); Map<String, Object> dataModel = new HashMap<String, Object>();
Timestamp ts = new Timestamp(1302297332043L);
dataModel.put(varName, ts); dataModel.put(varName, ts);
Map<String, Object> expected = new HashMap<String, Object>(); Map<String, Object> expected = new HashMap<String, Object>();
@ -135,8 +144,9 @@ public class DumpDirectiveTest {
public void dumpSqlDate() { public void dumpSqlDate() {
String varName = "date"; String varName = "date";
java.sql.Date date = new java.sql.Date(1302297332043L);
Map<String, Object> dataModel = new HashMap<String, Object>(); Map<String, Object> dataModel = new HashMap<String, Object>();
java.sql.Date date = new java.sql.Date(1302297332043L);
dataModel.put(varName, date); dataModel.put(varName, date);
Map<String, Object> expected = new HashMap<String, Object>(); Map<String, Object> expected = new HashMap<String, Object>();
@ -152,8 +162,9 @@ public class DumpDirectiveTest {
public void dumpTime() { public void dumpTime() {
String varName = "time"; String varName = "time";
Time time = new Time(1302297332043L);
Map<String, Object> dataModel = new HashMap<String, Object>(); Map<String, Object> dataModel = new HashMap<String, Object>();
Time time = new Time(1302297332043L);
dataModel.put(varName, time); dataModel.put(varName, time);
Map<String, Object> expected = new HashMap<String, Object>(); Map<String, Object> expected = new HashMap<String, Object>();
@ -171,8 +182,9 @@ public class DumpDirectiveTest {
public void dumpHelplessMethod() { public void dumpHelplessMethod() {
String varName = "square"; String varName = "square";
TemplateMethodModel value = new HelplessMethod();
Map<String, Object> dataModel = new HashMap<String, Object>(); Map<String, Object> dataModel = new HashMap<String, Object>();
TemplateMethodModel value = new HelplessMethod();
dataModel.put(varName, value); dataModel.put(varName, value);
Map<String, Object> expected = new HashMap<String, Object>(); Map<String, Object> expected = new HashMap<String, Object>();
@ -187,8 +199,9 @@ public class DumpDirectiveTest {
public void dumpHelpfulMethod() { public void dumpHelpfulMethod() {
String varName = "square"; String varName = "square";
TemplateMethodModel value = new HelpfulMethod();
Map<String, Object> dataModel = new HashMap<String, Object>(); Map<String, Object> dataModel = new HashMap<String, Object>();
TemplateMethodModel value = new HelpfulMethod();
dataModel.put(varName, value); dataModel.put(varName, value);
Map<String, Object> expected = new HashMap<String, Object>(); Map<String, Object> expected = new HashMap<String, Object>();
@ -203,8 +216,9 @@ public class DumpDirectiveTest {
public void dumpMethodWithBadHelp() { public void dumpMethodWithBadHelp() {
String varName = "square"; String varName = "square";
TemplateMethodModel value = new MethodWithBadHelp();
Map<String, Object> dataModel = new HashMap<String, Object>(); Map<String, Object> dataModel = new HashMap<String, Object>();
TemplateMethodModel value = new MethodWithBadHelp();
dataModel.put(varName, value); dataModel.put(varName, value);
Map<String, Object> expected = new HashMap<String, Object>(); Map<String, Object> expected = new HashMap<String, Object>();
@ -219,8 +233,9 @@ public class DumpDirectiveTest {
public void dumpHelplessDirective() { public void dumpHelplessDirective() {
String varName = "dump"; String varName = "dump";
TemplateDirectiveModel value = new HelplessDirective();
Map<String, Object> dataModel = new HashMap<String, Object>(); Map<String, Object> dataModel = new HashMap<String, Object>();
TemplateDirectiveModel value = new HelplessDirective();
dataModel.put(varName, value); dataModel.put(varName, value);
Map<String, Object> expected = new HashMap<String, Object>(); Map<String, Object> expected = new HashMap<String, Object>();
@ -235,8 +250,9 @@ public class DumpDirectiveTest {
public void dumpHelpfulDirective() { public void dumpHelpfulDirective() {
String varName = "dump"; String varName = "dump";
TemplateDirectiveModel value = new HelpfulDirective();
Map<String, Object> dataModel = new HashMap<String, Object>(); Map<String, Object> dataModel = new HashMap<String, Object>();
TemplateDirectiveModel value = new HelpfulDirective();
dataModel.put(varName, value); dataModel.put(varName, value);
Map<String, Object> expected = new HashMap<String, Object>(); Map<String, Object> expected = new HashMap<String, Object>();
@ -251,8 +267,9 @@ public class DumpDirectiveTest {
public void dumpDirectiveWithBadHelp() { public void dumpDirectiveWithBadHelp() {
String varName = "dump"; String varName = "dump";
TemplateDirectiveModel value = new DirectiveWithBadHelp();
Map<String, Object> dataModel = new HashMap<String, Object>(); Map<String, Object> dataModel = new HashMap<String, Object>();
TemplateDirectiveModel value = new DirectiveWithBadHelp();
dataModel.put(varName, value); dataModel.put(varName, value);
Map<String, Object> expected = new HashMap<String, Object>(); Map<String, Object> expected = new HashMap<String, Object>();
@ -268,6 +285,7 @@ public class DumpDirectiveTest {
String varName = "fruit"; String varName = "fruit";
Map<String, Object> dataModel = new HashMap<String, Object>(); Map<String, Object> dataModel = new HashMap<String, Object>();
List<String> list = new ArrayList<String>(); List<String> list = new ArrayList<String>();
list.add("apples"); list.add("apples");
list.add("bananas"); list.add("bananas");
@ -277,36 +295,38 @@ public class DumpDirectiveTest {
Map<String, Object> expected = new HashMap<String, Object>(); Map<String, Object> expected = new HashMap<String, Object>();
expected.put("name", varName); expected.put("name", varName);
expected.put("type", "Sequence"); expected.put("type", "Sequence");
List<Map<String, Object>> listDump = new ArrayList<Map<String, Object>>(); List<Map<String, Object>> dump = new ArrayList<Map<String, Object>>();
for ( String str : list) { for ( String str : list) {
Map<String, Object> map = new HashMap<String, Object>(); Map<String, Object> map = new HashMap<String, Object>();
map.put("type", "String"); map.put("type", "String");
map.put("value", str); map.put("value", str);
listDump.add(map); dump.add(map);
} }
expected.put("value", listDump); expected.put("value", dump);
test(varName, dataModel, expected); test(varName, dataModel, expected);
} }
@Test @Test
public void dumpStringArray() { public void dumpStringArray() {
String varName = "fruit"; String varName = "fruit";
Map<String, Object> dataModel = new HashMap<String, Object>(); Map<String, Object> dataModel = new HashMap<String, Object>();
String[] list = { "apples", "bananas", "oranges" }; String[] list = { "apples", "bananas", "oranges" };
dataModel.put(varName, list); dataModel.put(varName, list);
Map<String, Object> expected = new HashMap<String, Object>(); Map<String, Object> expected = new HashMap<String, Object>();
expected.put("name", varName); expected.put("name", varName);
expected.put("type", "Sequence"); expected.put("type", "Sequence");
List<Map<String, Object>> listDump = new ArrayList<Map<String, Object>>(); List<Map<String, Object>> dump = new ArrayList<Map<String, Object>>();
for ( String str : list) { for ( String str : list) {
Map<String, Object> map = new HashMap<String, Object>(); Map<String, Object> map = new HashMap<String, Object>();
map.put("type", "String"); map.put("type", "String");
map.put("value", str); map.put("value", str);
listDump.add(map); dump.add(map);
} }
expected.put("value", listDump); expected.put("value", dump);
test(varName, dataModel, expected); test(varName, dataModel, expected);
} }
@ -316,6 +336,7 @@ public class DumpDirectiveTest {
String varName = "stuff"; String varName = "stuff";
Map<String, Object> dataModel = new HashMap<String, Object>(); Map<String, Object> dataModel = new HashMap<String, Object>();
List<Object> list = new ArrayList<Object>(); List<Object> list = new ArrayList<Object>();
list.add("apples"); list.add("apples");
list.add(4); list.add(4);
@ -332,36 +353,95 @@ public class DumpDirectiveTest {
expected.put("name", varName); expected.put("name", varName);
expected.put("type", "Sequence"); expected.put("type", "Sequence");
List<Map<String, Object>> listValue = new ArrayList<Map<String, Object>>(); List<Map<String, Object>> dump = new ArrayList<Map<String, Object>>();
Map<String, Object> stringMap = new HashMap<String, Object>(); Map<String, Object> stringMap = new HashMap<String, Object>();
stringMap.put("type", "String"); stringMap.put("type", "String");
stringMap.put("value", "apples"); stringMap.put("value", "apples");
listValue.add(stringMap); dump.add(stringMap);
Map<String, Object> numberMap = new HashMap<String, Object>(); Map<String, Object> numberMap = new HashMap<String, Object>();
numberMap.put("type", "Number"); numberMap.put("type", "Number");
numberMap.put("value", 4); numberMap.put("value", 4);
listValue.add(numberMap); dump.add(numberMap);
Map<String, Object> booleanMap = new HashMap<String, Object>(); Map<String, Object> booleanMap = new HashMap<String, Object>();
booleanMap.put("type", "Boolean"); booleanMap.put("type", "Boolean");
booleanMap.put("value", false); booleanMap.put("value", false);
listValue.add(booleanMap); dump.add(booleanMap);
Map<String, Object> sequenceMap = new HashMap<String, Object>(); Map<String, Object> sequenceMap = new HashMap<String, Object>();
sequenceMap.put("type", "Sequence"); sequenceMap.put("type", "Sequence");
List<Map<String, Object>> animalList = new ArrayList<Map<String, Object>>(); List<Map<String, Object>> animalDump = new ArrayList<Map<String, Object>>();
for ( String animal : animals ) { for ( String animal : animals ) {
Map<String, Object> animalMap = new HashMap<String, Object>(); Map<String, Object> animalMap = new HashMap<String, Object>();
animalMap.put("type", "String"); animalMap.put("type", "String");
animalMap.put("value", animal); animalMap.put("value", animal);
animalList.add(animalMap); animalDump.add(animalMap);
} }
sequenceMap.put("value", animalList); sequenceMap.put("value", animalDump);
listValue.add(sequenceMap); dump.add(sequenceMap);
expected.put("value", listValue); expected.put("value", dump);
test(varName, dataModel, expected);
}
@Test
public void dumpNumberSet() {
String varName = "oddNums";
Map<String, Object> dataModel = new HashMap<String, Object>();
Set<Integer> odds = new HashSet<Integer>();
for (int i=0; i <= 10; i++) {
if (i % 2 == 1) {
odds.add(i);
}
}
dataModel.put(varName, odds);
Map<String, Object> expected = new HashMap<String, Object>();
expected.put("name", varName);
expected.put("type", "Sequence");
List<Map<String, Object>> dump = new ArrayList<Map<String, Object>>();
for ( int i : odds ) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("type", "Number");
map.put("value", i);
dump.add(map);
}
expected.put("value", dump);
test(varName, dataModel, expected);
}
@Test
public void dumpNumberCollection() {
String varName = "oddNums";
Map<String, Object> dataModel = new HashMap<String, Object>();
Set<Integer> odds = new HashSet<Integer>();
for (int i=0; i <= 10; i++) {
if (i % 2 == 1) {
odds.add(i);
}
}
TemplateCollectionModel collection = new SimpleCollection(odds);
dataModel.put(varName, collection);
Map<String, Object> expected = new HashMap<String, Object>();
expected.put("name", varName);
expected.put("type", "Collection");
List<Map<String, Object>> dump = new ArrayList<Map<String, Object>>();
for ( int i : odds ) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("type", "Number");
map.put("value", i);
dump.add(map);
}
expected.put("value", dump);
test(varName, dataModel, expected); test(varName, dataModel, expected);
} }
@ -373,11 +453,35 @@ public class DumpDirectiveTest {
// RY Do these with different BeansWrappers // RY Do these with different BeansWrappers
@Test @Test
public void dumpHashEx() { public void dumpStringToStringMap() {
String varName = "capitals";
Map<String, Object> dataModel = new HashMap<String, Object>();
Map<String, String> capitals = new HashMap<String, String>();
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<String, Object> expected = new HashMap<String, Object>();
expected.put("name", varName);
expected.put("type", "HashEx");
Map<String, Object> dump = new HashMap<String, Object>();
for ( String key : capitals.keySet() ) {
Map<String, String> capitalDump = new HashMap<String, String>();
capitalDump.put("type", "String");
capitalDump.put("value", capitals.get(key));
dump.put(key, capitalDump);
}
expected.put("value", dump);
test(varName, dataModel, expected);
} }
/////////////////////////// Private helper classes and methods /////////////////////////// /////////////////////////// Private stub classes and helper methods ///////////////////////////
private void test(String varName, Map<String, Object> dataModel, Map<String, Object> expected) { private void test(String varName, Map<String, Object> dataModel, Map<String, Object> expected) {
try { try {