diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualController.java index 529fd887e..b2814b228 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualController.java @@ -140,7 +140,7 @@ public class IndividualController extends FreemarkerHttpServlet { * This is still safe, because we are only putting BaseTemplateModel objects * into the data model: no real data can be modified. */ - //body.put("individual", wrap(itm, BeansWrapper.EXPOSE_SAFE)); + // body.put("individual", wrap(itm, BeansWrapper.EXPOSE_SAFE)); body.put("individual", wrap(itm, new ReadOnlyBeansWrapper())); body.put("headContent", getRdfLinkTag(itm)); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/UrlBuilder.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/UrlBuilder.java index 69003786e..3af2acf0c 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/UrlBuilder.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/UrlBuilder.java @@ -272,7 +272,7 @@ public class UrlBuilder { } if (profileUrl != null) { - HashMap specialParams = getSpecialParams(vreq); + HashMap specialParams = getModelParams(vreq); if(specialParams.size() != 0) { profileUrl = addParams(profileUrl, new ParamMap(specialParams)); } @@ -321,7 +321,7 @@ public class UrlBuilder { //To be used in different property templates so placing method for reuse here //Check if special params included, specifically for menu management and other models - public static HashMap getSpecialParams(VitroRequest vreq) { + public static HashMap getModelParams(VitroRequest vreq) { HashMap specialParams = new HashMap(); if(vreq != null) { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/BaseTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/BaseTemplateModel.java index ad0eabb86..cee818328 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/BaseTemplateModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/BaseTemplateModel.java @@ -58,7 +58,7 @@ public abstract class BaseTemplateModel { AntiScript.cleanMapValues(map, getServletContext()); } - public static ServletContext getServletContext() { + protected static ServletContext getServletContext() { return servletContext; } @@ -66,5 +66,6 @@ public abstract class BaseTemplateModel { servletContext = context; } + /* Template properties */ } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/LinkTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/LinkTemplateModel.java index c0f78ffdd..bab908947 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/LinkTemplateModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/LinkTemplateModel.java @@ -29,10 +29,6 @@ public class LinkTemplateModel extends BaseTemplateModel { setUrl(path, params); } - public String getUrl() { - return cleanTextForDisplay( url ); - } - protected void setUrl(String path) { url = UrlBuilder.getUrl(path); } @@ -45,12 +41,17 @@ public class LinkTemplateModel extends BaseTemplateModel { url = UrlBuilder.getUrl(path, params); } - public String getText() { - return cleanTextForDisplay(text); - } - protected void setText(String text) { this.text = StringEscapeUtils.escapeHtml(text); } + + /* Template properties */ + + public String getUrl() { + return cleanTextForDisplay( url ); + } + public String getText() { + return cleanTextForDisplay(text); + } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/Tags.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/Tags.java index cef5c98a0..cf07516b8 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/Tags.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/Tags.java @@ -15,6 +15,8 @@ public class Tags extends BaseTemplateModel { public Tags(LinkedHashSet tags) { this.tags = tags; } + + /* Template methods */ public void add(String... tags) { for (String tag : tags) { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/User.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/User.java index a86d7b7a7..e326a7ca3 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/User.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/User.java @@ -42,6 +42,10 @@ public class User extends BaseTemplateModel { return url; } + + /* Template methods */ + + /* Template properties */ public boolean isLoggedIn() { return currentUser != null; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/CollatedObjectPropertyTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/CollatedObjectPropertyTemplateModel.java index c1c4e2bbd..1399f9873 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/CollatedObjectPropertyTemplateModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/CollatedObjectPropertyTemplateModel.java @@ -284,7 +284,7 @@ public class CollatedObjectPropertyTemplateModel extends ObjectPropertyTemplateM // } - /* Access methods for templates */ + /* Template properties */ public List getSubclasses() { return subclasses; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/DataPropertyStatementTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/DataPropertyStatementTemplateModel.java index e39fd79d1..a3bbb713b 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/DataPropertyStatementTemplateModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/DataPropertyStatementTemplateModel.java @@ -96,7 +96,10 @@ public class DataPropertyStatementTemplateModel extends PropertyStatementTemplat } - /* Access methods for templates */ + /* Template properties */ + + + /* Template methods */ public String getValue() { return value; @@ -113,11 +116,8 @@ public class DataPropertyStatementTemplateModel extends PropertyStatementTemplat params.put("deleteProhibited", "prohibited"); } - //Check if special parameters being sent - HashMap specialParams = UrlBuilder.getSpecialParams(vreq); - if(specialParams.size() > 0) { - params.putAll(specialParams); - } + params.putAll(UrlBuilder.getModelParams(vreq)); + editUrl = UrlBuilder.getUrl(EDIT_PATH, params); } return editUrl; @@ -132,11 +132,7 @@ public class DataPropertyStatementTemplateModel extends PropertyStatementTemplat "datapropKey", dataPropHash, "cmd", "delete"); - //Check if special parameters being sent - HashMap specialParams = UrlBuilder.getSpecialParams(vreq); - if(specialParams.size() > 0) { - params.putAll(specialParams); - } + params.putAll(UrlBuilder.getModelParams(vreq)); deleteUrl = UrlBuilder.getUrl(EDIT_PATH, params); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/DataPropertyTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/DataPropertyTemplateModel.java index aa0bab920..42689b60a 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/DataPropertyTemplateModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/DataPropertyTemplateModel.java @@ -104,11 +104,8 @@ public class DataPropertyTemplateModel extends PropertyTemplateModel { "subjectUri", subjectUri, "predicateUri", propertyUri); - //Check if special parameters being sent - HashMap specialParams = UrlBuilder.getSpecialParams(vreq); - if(specialParams.size() > 0) { - params.putAll(specialParams); - } + params.putAll(UrlBuilder.getModelParams(vreq)); + addUrl = UrlBuilder.getUrl(EDIT_PATH, params); } return addUrl; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/GroupedPropertyList.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/GroupedPropertyList.java index 287735a43..39c11df47 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/GroupedPropertyList.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/GroupedPropertyList.java @@ -426,11 +426,14 @@ public class GroupedPropertyList extends BaseTemplateModel { return label; } - /* Access methods for templates */ + /* Template properties */ public List getAll() { return groups; } + + + /* Template methods */ public PropertyTemplateModel getProperty(String propertyUri) { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyStatementTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyStatementTemplateModel.java index d61e1a47f..87dc9aab4 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyStatementTemplateModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyStatementTemplateModel.java @@ -82,11 +82,7 @@ public class ObjectPropertyStatementTemplateModel extends PropertyStatementTempl params.put("deleteProhibited", "prohibited"); } - //Check if special parameters being sent - HashMap specialParams = UrlBuilder.getSpecialParams(vreq); - if(specialParams.size() > 0) { - params.putAll(specialParams); - } + params.putAll(UrlBuilder.getModelParams(vreq)); editUrl = UrlBuilder.getUrl(EDIT_PATH, params); } @@ -105,6 +101,7 @@ public class ObjectPropertyStatementTemplateModel extends PropertyStatementTempl "predicateUri", propertyUri, "objectUri", objectUri, "cmd", "delete"); + for ( String key : data.keySet() ) { String value = data.get(key); // Remove an entry with a null value instead of letting it get passed @@ -116,13 +113,10 @@ public class ObjectPropertyStatementTemplateModel extends PropertyStatementTempl params.put("statement_" + key, data.get(key)); } } + params.put("templateName", templateName); - //Check if special parameters being sent - HashMap specialParams = UrlBuilder.getSpecialParams(vreq); - if(specialParams.size() > 0) { - params.putAll(specialParams); - } + params.putAll(UrlBuilder.getModelParams(vreq)); deleteUrl = UrlBuilder.getUrl(EDIT_PATH, params); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyTemplateModel.java index 4f9f1583a..658e23f15 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyTemplateModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyTemplateModel.java @@ -583,12 +583,8 @@ public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel "subjectUri", subjectUri, "predicateUri", propertyUri); - //Check if special parameters being sent - HashMap specialParams = UrlBuilder.getSpecialParams(vreq); - if(specialParams.size() > 0) { - params.putAll(specialParams); - } - + params.putAll(UrlBuilder.getModelParams(vreq)); + addUrl = UrlBuilder.getUrl(EDIT_PATH, params); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/menu/MainMenuItem.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/menu/MainMenuItem.java index 3714f83cc..f7c5d9ad9 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/menu/MainMenuItem.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/menu/MainMenuItem.java @@ -21,6 +21,8 @@ public class MainMenuItem extends MenuItem { this.active = active; } + /* Template properties */ + public boolean isActive() { return active; } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/menu/Menu.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/menu/Menu.java index 9ae142098..67adffee4 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/menu/Menu.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/menu/Menu.java @@ -26,6 +26,8 @@ public class Menu extends BaseTemplateModel { items.add(new MenuItem(text, path)); } + /* Template properties */ + public List getItems() { return items; } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/menu/MenuItem.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/menu/MenuItem.java index 5ddebb875..08d09ce81 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/menu/MenuItem.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/menu/MenuItem.java @@ -26,6 +26,8 @@ public class MenuItem extends BaseTemplateModel { this.active = active; } + /* Template properties */ + public String getLinkText() { return text; } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/searchresult/BaseIndividualSearchResult.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/searchresult/BaseIndividualSearchResult.java index d5c46ad6d..1356a8fa3 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/searchresult/BaseIndividualSearchResult.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/searchresult/BaseIndividualSearchResult.java @@ -43,7 +43,7 @@ public abstract class BaseIndividualSearchResult extends BaseTemplateModel { return models; } - /* Access methods for templates */ + /* Template properties */ public String getProfileUrl() { return UrlBuilder.getIndividualProfileUrl(individual, vreq); diff --git a/webapp/src/freemarker/ext/beans/ReadOnlyBeansWrapper.java b/webapp/src/freemarker/ext/beans/ReadOnlyBeansWrapper.java index 7561c6009..af40a99e2 100644 --- a/webapp/src/freemarker/ext/beans/ReadOnlyBeansWrapper.java +++ b/webapp/src/freemarker/ext/beans/ReadOnlyBeansWrapper.java @@ -33,7 +33,19 @@ public class ReadOnlyBeansWrapper extends BeansWrapper { decision.setExposeMethodAs(null); } else if ( method.getReturnType().getName().equals("void") ) { decision.setExposeMethodAs(null); - } + } } +// For exposing a method as a property (when it's not named getX or isX). Note that this is not +// just a syntactic change in the template from X() to X, but also makes the value get precomputed. +// private void exposeAsProperty(Method method, MethodAppearanceDecision decision) { +// try { +// PropertyDescriptor pd = new PropertyDescriptor(method.getName(), method, null); +// decision.setExposeAsProperty(pd); +// decision.setMethodShadowsProperty(false); +// } catch (IntrospectionException e) { +// log.error(e, e); +// } +// } + } diff --git a/webapp/src/freemarker/ext/beans/WrapperExtractor.java b/webapp/src/freemarker/ext/beans/WrapperExtractor.java new file mode 100644 index 000000000..808521c7a --- /dev/null +++ b/webapp/src/freemarker/ext/beans/WrapperExtractor.java @@ -0,0 +1,20 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package freemarker.ext.beans; + +import freemarker.template.TemplateModel; + +/** + * Class to extract information about the wrapper used to wrap an object in + * the template model. + */ +public class WrapperExtractor { + + public static BeansWrapper getWrapper(BeanModel model) { + return model.wrapper; + } + + public static int getWrapperExposureLevel(BeanModel model) { + return model.wrapper.getExposureLevel(); + } +} diff --git a/webapp/src/freemarker/ext/dump/BaseDumpDirective.java b/webapp/src/freemarker/ext/dump/BaseDumpDirective.java index 1a8d9ce80..b5c41b9bf 100644 --- a/webapp/src/freemarker/ext/dump/BaseDumpDirective.java +++ b/webapp/src/freemarker/ext/dump/BaseDumpDirective.java @@ -321,7 +321,7 @@ public abstract class BaseDumpDirective implements TemplateDirectiveModel { Map map = new HashMap(); map.put(Key.TYPE.toString(), object.getClass().getName()); - // Compile the sets of properties and methods available to template + // Compile the collections of properties and methods available to the template SortedMap properties = new TreeMap(); List methods = new ArrayList(); @@ -379,6 +379,8 @@ public abstract class BaseDumpDirective implements TemplateDirectiveModel { } // Else look for the entire methodName in the key set. Include those // starting with "get" or "is" that were not found above. + // NB This does not properly account for methods exposed as properties + // using BeansWrapper.finetuneMethodAppearance(). if (keySet.contains(methodName)) { String methodDisplayName = getMethodDisplayName(method); methods.add(methodDisplayName); diff --git a/webapp/web/templates/freemarker/lib/lib-properties.ftl b/webapp/web/templates/freemarker/lib/lib-properties.ftl index 66eae3158..2e045dd2c 100644 --- a/webapp/web/templates/freemarker/lib/lib-properties.ftl +++ b/webapp/web/templates/freemarker/lib/lib-properties.ftl @@ -40,7 +40,6 @@ - <#macro objectProperty property editable template=property.template> <#if property.collatedBySubclass> <#-- collated --> <@collatedObjectPropertyList property editable template /> @@ -52,7 +51,6 @@ - <#macro collatedObjectPropertyList property editable template=property.template > <#assign subclasses = property.subclasses> <#list subclasses as subclass>