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 f4fcf7cf4..4a5cd08c1 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 @@ -27,11 +27,23 @@ public class CollatedObjectPropertyTemplateModel extends ObjectPropertyTemplateM private static final Log log = LogFactory.getLog(CollatedObjectPropertyTemplateModel.class); private static final String DEFAULT_CONFIG_FILE = "listViewConfig-default-collated.xml"; + private static final Pattern QUERY_PATTERN = Pattern.compile("SELECT[^{]*\\?subclass\\b"); private SortedMap> subclasses; - CollatedObjectPropertyTemplateModel(ObjectProperty op, Individual subject, VitroRequest vreq) throws Exception { + CollatedObjectPropertyTemplateModel(ObjectProperty op, Individual subject, VitroRequest vreq) + throws InvalidConfigurationException { + super(op, subject, vreq); + + /* Make sure the query contains a subclass variable. If not, throw an exception so the caller will create + * an UncollatedObjectPropertyTemplateModel instead. + */ + String queryString = getQueryString(); + Matcher m = QUERY_PATTERN.matcher(queryString); + if ( ! m.find()) { + throw new InvalidConfigurationException("Invalid configuration: Query does not select a subclass variable."); + } /* Get the data */ WebappDaoFactory wdf = vreq.getWebappDaoFactory(); 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 39dcc0d39..dd7345cda 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 @@ -64,7 +64,7 @@ public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel if (op.getCollateBySubclass()) { try { return new CollatedObjectPropertyTemplateModel(op, subject, vreq); - } catch (Exception e) { + } catch (InvalidConfigurationException e) { log.error(e, e); return new UncollatedObjectPropertyTemplateModel(op, subject, vreq); } @@ -209,6 +209,15 @@ public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel } } + protected class InvalidConfigurationException extends Exception { + + private static final long serialVersionUID = 1L; + + protected InvalidConfigurationException(String s) { + super(s); + } + } + /* Access methods for templates */ public String getType() { diff --git a/webapp/web/templates/freemarker/body/samples.ftl b/webapp/web/templates/freemarker/body/samples.ftl index 75f82499e..f46d01c70 100644 --- a/webapp/web/templates/freemarker/body/samples.ftl +++ b/webapp/web/templates/freemarker/body/samples.ftl @@ -55,6 +55,10 @@

${year?number?c}

+

Raw String Literals

+

${r"#{title}"}

+

${r"${title}"}

+ <@dump var="now" /> <@dump var="urls" /> <@dump var="fruit" />