diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerConfigurationLoader.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerConfigurationLoader.java index 5ef76ca56..40e406ad3 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerConfigurationLoader.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerConfigurationLoader.java @@ -104,10 +104,8 @@ public class FreemarkerConfigurationLoader { // The Freemarker default wrapper exposes set methods and get methods that take // arguments. We block exposure to these methods by default. BeansWrapper wrapper = new DefaultObjectWrapper(); - int defaultExposureLevel = BeansWrapper.EXPOSE_PROPERTIES_ONLY; - wrapper.setExposureLevel(defaultExposureLevel); + wrapper.setExposureLevel(BeansWrapper.EXPOSE_PROPERTIES_ONLY); config.setObjectWrapper(wrapper); - config.setCustomAttribute("defaultExposureLevel", defaultExposureLevel); // Set some formatting defaults. These can be overridden at the template // or environment (template-processing) level, or for an individual diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java index 9c8175206..d4d5ea8c4 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java @@ -286,8 +286,6 @@ public class FreemarkerHttpServlet extends VitroHttpServlet { protected BeansWrapper getNonDefaultBeansWrapper(int exposureLevel) { BeansWrapper wrapper = new DefaultObjectWrapper(); - // Too bad exposure levels are ints instead of enum values; what happens if - // we send an int that's not a defined exposure level? wrapper.setExposureLevel(exposureLevel); return wrapper; } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/dump/DumpHelper.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/dump/DumpHelper.java index 7a92fa74f..50dbee4fd 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/dump/DumpHelper.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/dump/DumpHelper.java @@ -146,14 +146,15 @@ public class DumpHelper { // Get the exposure level of the BeansWrapper that wrapped this object. if (model instanceof BeanModel) { exposureLevel = WrapperExtractor.getWrapperExposureLevel((BeanModel) model); - log.debug("Exposure level for class " + cls.getCanonicalName() + " of type " + model.getClass() + " = " + exposureLevel); + log.debug("Exposure level for class " + cls.getCanonicalName() + " wrapped as " + model.getClass() + " = " + exposureLevel); // We don't expect to get here, since we are dealing only with BaseTemplateModel objects, which get wrapped into BeanModel objects, // but it's here as a safety net. } else { HttpServletRequest request = (HttpServletRequest) env.getCustomAttribute("request"); Configuration config = (Configuration) request.getAttribute("freemarkerConfig"); - exposureLevel = (Integer) config.getCustomAttribute("defaultExposureLevel"); - log.debug("Class " + cls.getCanonicalName() + " of type " + model.getClass() + " uses default exposure level " + exposureLevel); + BeansWrapper wrapper = (BeansWrapper) config.getObjectWrapper(); + exposureLevel = WrapperExtractor.getWrapperExposureLevel(wrapper); + log.debug("Class " + cls.getCanonicalName() + " wrapped as " + model.getClass() + " uses default exposure level " + exposureLevel); } return exposureLevel; @@ -263,5 +264,5 @@ public class DumpHelper { Map map = getTemplateModelValues(model, exposureLevel); return BaseTemplateDirectiveModel.processTemplateToString("dump-var.ftl", map, env); } - + } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/PropertyStatementTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/PropertyStatementTemplateModel.java index 0d4a1603d..5dbb08755 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/PropertyStatementTemplateModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/PropertyStatementTemplateModel.java @@ -24,11 +24,13 @@ public abstract class PropertyStatementTemplateModel extends BaseTemplateModel { private List editAccessList = null; PropertyStatementTemplateModel(String subjectUri, String propertyUri, EditingPolicyHelper policyHelper) { + // Instantiate the list even if not editing, so calls to getEditUrl() and getDeleteUrl() from + // dump methods don't generate an error when they call isEditable() and isDeletable(). + editAccessList = new ArrayList(); if (policyHelper != null) { // we're editing this.subjectUri = subjectUri; - this.propertyUri = propertyUri; - editAccessList = new ArrayList(); + this.propertyUri = propertyUri; } } diff --git a/webapp/src/freemarker/ext/beans/WrapperExtractor.java b/webapp/src/freemarker/ext/beans/WrapperExtractor.java index 808521c7a..7ed256885 100644 --- a/webapp/src/freemarker/ext/beans/WrapperExtractor.java +++ b/webapp/src/freemarker/ext/beans/WrapperExtractor.java @@ -2,11 +2,13 @@ package freemarker.ext.beans; -import freemarker.template.TemplateModel; - /** * Class to extract information about the wrapper used to wrap an object in - * the template model. + * the template model. This is something of a hack: the class belongs to + * package freemarker.ext.beans so we can get at protected members of + * BeanModel and BeansWrapper. The Freemarker API unfortunately provides + * no way to get the wrapper that is used to wrap an object in the + * template data model. */ public class WrapperExtractor { @@ -17,4 +19,9 @@ public class WrapperExtractor { public static int getWrapperExposureLevel(BeanModel model) { return model.wrapper.getExposureLevel(); } + + public static int getWrapperExposureLevel(BeansWrapper wrapper) { + return wrapper.getExposureLevel(); + } + }