diff --git a/webapp/src/freemarker/ext/dump/BaseDumpDirective.java b/webapp/src/freemarker/ext/dump/BaseDumpDirective.java index 915b66b84..265eb09d4 100644 --- a/webapp/src/freemarker/ext/dump/BaseDumpDirective.java +++ b/webapp/src/freemarker/ext/dump/BaseDumpDirective.java @@ -48,7 +48,9 @@ public abstract class BaseDumpDirective implements TemplateDirectiveModel { private static final Log log = LogFactory.getLog(BaseDumpDirective.class); enum Key { + METHODS("methods"), NAME("name"), + PROPERTIES(Key.METHODS.toString()), TYPE("type"), VALUE("value"), DATE_TYPE("dateType"); @@ -285,8 +287,9 @@ public abstract class BaseDumpDirective implements TemplateDirectiveModel { Map map = new HashMap(); map.put(Key.TYPE.toString(), object.getClass().getName()); - // Compile the set of properties and methods available to model - SortedMap availableMethods = new TreeMap(); + // Compile the sets of properties and methods available to template + SortedMap properties = new TreeMap(); + SortedMap methods = new TreeMap(); // keys() gets only values visible to template based on the BeansWrapper used. // Note: if the BeansWrapper exposure level > BeansWrapper.EXPOSE_PROPERTIES_ONLY, @@ -305,12 +308,12 @@ public abstract class BaseDumpDirective implements TemplateDirectiveModel { if (keySet.size() > 0) { Class cls = object.getClass(); - Method[] methods = cls.getMethods(); + Method[] classMethods = cls.getMethods(); // Iterate through the methods rather than the keys, so that we can remove // some keys based on reflection on the methods. We also want to remove duplicates // like name/getName - we'll keep only the first form. - for ( Method method : methods ) { + for ( Method method : classMethods ) { // Eliminate methods declared on Object Class c = method.getDeclaringClass(); @@ -331,16 +334,19 @@ public abstract class BaseDumpDirective implements TemplateDirectiveModel { // If the method is available as a property, use that if (keySet.contains(propertyName)) { TemplateModel value = model.get(propertyName); - availableMethods.put(propertyName, getData(value)); + properties.put(propertyName, getData(value)); // Else look for the entire methodName in the key set } else if (keySet.contains(methodName)) { String methodDisplayName = getMethodDisplayName(method); - availableMethods.put(methodDisplayName, ""); + methods.put(methodDisplayName, ""); } } } - map.put(Key.VALUE.toString(), availableMethods); + Map objectValue = new HashMap(2); + objectValue.put(Key.PROPERTIES.toString(), properties); + objectValue.put(Key.METHODS.toString(), methods); + map.put(Key.VALUE.toString(), objectValue); return map; } diff --git a/webapp/test/freemarker/ext/dump/DumpDirectiveTest.java b/webapp/test/freemarker/ext/dump/DumpDirectiveTest.java index c60cbc70b..71f079fec 100644 --- a/webapp/test/freemarker/ext/dump/DumpDirectiveTest.java +++ b/webapp/test/freemarker/ext/dump/DumpDirectiveTest.java @@ -635,95 +635,38 @@ public class DumpDirectiveTest { @Test public void dumpObjectWithExposeNothingWrapper() { - - String varName = "employee"; - Map dataModel = new HashMap(); - BeansWrapper wrapper = new BeansWrapper(); - wrapper.setExposureLevel(BeansWrapper.EXPOSE_NOTHING); - 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(), new TreeMap()); - test(varName, dataModel, expectedDump); + dumpObject(BeansWrapper.EXPOSE_NOTHING); } @Test public void dumpObjectWithExposePropertiesOnlyWrapper() { - - String varName = "employee"; - Map dataModel = new HashMap(); - BeansWrapper wrapper = new BeansWrapper(); - wrapper.setExposureLevel(BeansWrapper.EXPOSE_PROPERTIES_ONLY); - 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"); - - SortedMap propertiesExpectedDump = getJohnDoePropertiesExpectedDump(); - - expectedDump.put(Key.VALUE.toString(), propertiesExpectedDump); - - Map dump = getDump(varName, dataModel); - assertEquals(expectedDump, dump); - - // Test the sorting of the methods - List expectedKeys = new ArrayList(propertiesExpectedDump.keySet()); - @SuppressWarnings("unchecked") - Map methodsActualDump = (Map) dump.get(Key.VALUE.toString()); - List actualKeys = new ArrayList(methodsActualDump.keySet()); - assertEquals(expectedKeys, actualKeys); + dumpObject(BeansWrapper.EXPOSE_PROPERTIES_ONLY); } @Test public void dumpObjectWithExposeSafeWrapper() { - - String varName = "employee"; - Map dataModel = new HashMap(); - BeansWrapper wrapper = new BeansWrapper(); - wrapper.setExposureLevel(BeansWrapper.EXPOSE_SAFE); - 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"); - - SortedMap methodsExpectedDump = getJohnDoePropertiesExpectedDump(); - // methodsExpectedDump.putAll(...); - expectedDump.put(Key.VALUE.toString(), methodsExpectedDump); - - //Map dump = getDump(varName, dataModel); - //assertEquals(expectedDump, dump); - - // Test the sorting of the methods -// List expectedKeys = new ArrayList(properties.keySet()); -// @SuppressWarnings("unchecked") -// Map methodsActualDump = (Map) dump.get(Key.VALUE.toString()); -// List actualKeys = new ArrayList(methodsActualDump.keySet()); - //assertEquals(expectedKeys, actualKeys); + //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(BeansWrapper.EXPOSE_ALL); + wrapper.setExposureLevel(exposureLevel); try { dataModel.put("employee", wrapper.wrap(getEmployee())); } catch (TemplateModelException e) { @@ -733,28 +676,39 @@ public class DumpDirectiveTest { 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)); - SortedMap methodsExpectedDump = getJohnDoePropertiesExpectedDump(); - // methodsExpectedDump.putAll(...); - expectedDump.put(Key.VALUE.toString(), methodsExpectedDump); - - //Map dump = getDump(varName, dataModel); - //assertEquals(expectedDump, dump); - - // Test the sorting of the methods -// List expectedKeys = new ArrayList(properties.keySet()); -// @SuppressWarnings("unchecked") -// Map methodsActualDump = (Map) dump.get(Key.VALUE.toString()); -// List actualKeys = new ArrayList(methodsActualDump.keySet()); - //assertEquals(expectedKeys, actualKeys); + testObjectDump(varName, dataModel, expectedDump); } - - - /////////////////////////// Private stub classes and helper methods /////////////////////////// - - private void test(String varName, Map dataModel, Map expectedDump) { + + private void testObjectDump(String varName, Map dataModel, Map expectedDump) { + Map dump = getDump(varName, dataModel); - assertEquals(expectedDump, dump); + 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) { @@ -767,6 +721,8 @@ public class DumpDirectiveTest { } } + + private class HelplessMethod implements TemplateMethodModel { @Override @@ -982,117 +938,144 @@ public class DumpDirectiveTest { return jdoe; } - private SortedMap getJohnDoePropertiesExpectedDump() { + private Map getJohnDoeExpectedDump(int exposureLevel) { + + Map expectedDump = new HashMap(); + + // Properties SortedMap propertiesExpectedDump = new TreeMap(); -// 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); + 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"); - 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); + 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); + } - 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(), getJaneSmithPropertiesExpectedDump()); - propertiesExpectedDump.put("supervisor", supervisorExpectedDump); + expectedDump.put(Key.PROPERTIES.toString(), propertiesExpectedDump); - 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); + // Methods - return propertiesExpectedDump; + SortedMap methodsExpectedDump = new TreeMap(); + expectedDump.put(Key.METHODS.toString(), methodsExpectedDump); + + return expectedDump; } - private SortedMap getJaneSmithPropertiesExpectedDump() { + private Map getJaneSmithExpectedDump(int exposureLevel) { + Map expectedDump = new HashMap(); + SortedMap propertiesExpectedDump = new TreeMap(); -// 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); + // 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); + Map fullNameExpectedDump = new HashMap(); + fullNameExpectedDump.put(Key.TYPE.toString(), Type.STRING); + fullNameExpectedDump.put(Key.VALUE.toString(), "Jane Smith"); + propertiesExpectedDump.put("fullName", fullNameExpectedDump); - return propertiesExpectedDump; + 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; } + }