diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/ObjectPropertyDao.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/ObjectPropertyDao.java index fd9ab2a51..bee2cdbb9 100755 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/ObjectPropertyDao.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/ObjectPropertyDao.java @@ -56,5 +56,5 @@ public interface ObjectPropertyDao extends PropertyDao { public List getObjectPropertyList(String subjectUri); - public String getCustomListConfigFilename(ObjectProperty objectProperty); + public String getCustomListConfigFileName(ObjectProperty objectProperty); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/ObjectPropertyDaoFiltering.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/ObjectPropertyDaoFiltering.java index 06ce601aa..2b88f6e58 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/ObjectPropertyDaoFiltering.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/ObjectPropertyDaoFiltering.java @@ -216,7 +216,7 @@ class ObjectPropertyDaoFiltering extends BaseFiltering implements ObjectProperty } @Override - public String getCustomListConfigFilename(ObjectProperty objectProperty) { - return innerObjectPropertyDao.getCustomListConfigFilename(objectProperty); + public String getCustomListConfigFileName(ObjectProperty objectProperty) { + return innerObjectPropertyDao.getCustomListConfigFileName(objectProperty); } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyDaoJena.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyDaoJena.java index cf6cbd8dd..54cd5aa55 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyDaoJena.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyDaoJena.java @@ -76,7 +76,7 @@ public class ObjectPropertyDaoJena extends PropertyDaoJena implements ObjectProp "PREFIX display: " + "SELECT ?property ?filename WHERE { \n" + " ?property display:listViewConfigFile ?filename . \n" + - "} LIMIT 1"; + "}"; static protected Query listViewConfigFileQuery; static { @@ -875,7 +875,7 @@ public class ObjectPropertyDaoJena extends PropertyDaoJena implements ObjectProp } @Override - public String getCustomListConfigFilename(ObjectProperty op) { + public String getCustomListConfigFileName(ObjectProperty op) { if (customListViewConfigFileMap == null) { customListViewConfigFileMap = new HashMap(); OntModel displayModel = getOntModelSelector().getDisplayModel(); 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 5c6a9d8ff..4c5d09bf3 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 @@ -2,7 +2,6 @@ package edu.cornell.mannlib.vitro.webapp.web.templatemodels.individual; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -15,6 +14,7 @@ import org.apache.commons.logging.LogFactory; import edu.cornell.mannlib.vitro.webapp.beans.Individual; import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty; import edu.cornell.mannlib.vitro.webapp.beans.VClass; +import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.dao.ObjectPropertyStatementDao; import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; @@ -23,10 +23,9 @@ public class CollatedObjectPropertyTemplateModel extends ObjectPropertyTemplateM private static final Log log = LogFactory.getLog(CollatedObjectPropertyTemplateModel.class); private Map> subclasses; - //private List subclassList; - CollatedObjectPropertyTemplateModel(ObjectProperty op, Individual subject, WebappDaoFactory wdf) throws Exception { - super(op, subject, wdf); + CollatedObjectPropertyTemplateModel(ObjectProperty op, Individual subject, VitroRequest vreq) throws Exception { + super(op, subject, vreq); /* Change the approach to collation: * Custom views can get the subclasses in the query. Must use a term ?subclass - throw error if not. @@ -36,13 +35,6 @@ public class CollatedObjectPropertyTemplateModel extends ObjectPropertyTemplateM * We can also use these for custom views. Throw error if property is collated but there's no subclass term * in the query. (The reverse is okay - uncollated property with a subclass term in the query. */ - String collationTargetError = getCollationTargetError(); - if ( ! collationTargetError.isEmpty()) { - String errorMessage = "Collation target error for collated object property " + getName() + ": " + - collationTargetError + " " + - "Creating uncollated property list instead."; - throw new Exception(errorMessage); - } // RY Temporarily throw an error because collation hasn't been implemented yet. boolean error = true; @@ -50,6 +42,7 @@ public class CollatedObjectPropertyTemplateModel extends ObjectPropertyTemplateM throw new Exception("No collation target specified for collated object property " + getName()); } + WebappDaoFactory wdf = vreq.getWebappDaoFactory(); ObjectPropertyStatementDao opDao = wdf.getObjectPropertyStatementDao(); String subjectUri = subject.getURI(); String propertyUri = op.getURI(); 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 06b42c9e5..a9f366f76 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 @@ -11,6 +11,7 @@ import org.apache.commons.logging.LogFactory; import edu.cornell.mannlib.vitro.webapp.beans.DataProperty; import edu.cornell.mannlib.vitro.webapp.beans.DataPropertyStatement; import edu.cornell.mannlib.vitro.webapp.beans.Individual; +import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.dao.DataPropertyStatementDao; import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; @@ -21,12 +22,12 @@ public class DataPropertyTemplateModel extends PropertyTemplateModel { private static final String TYPE = "data"; private List statements; - DataPropertyTemplateModel(DataProperty dp, Individual subject, WebappDaoFactory wdf) { + DataPropertyTemplateModel(DataProperty dp, Individual subject, VitroRequest vreq) { super(dp); setName(dp.getPublicName()); // Get the data property statements via a sparql query - DataPropertyStatementDao dpDao = wdf.getDataPropertyStatementDao(); + DataPropertyStatementDao dpDao = vreq.getWebappDaoFactory().getDataPropertyStatementDao(); List dpStatements = dpDao.getDataPropertyStatementsForIndividualByProperty(subject, dp); statements = new ArrayList(dpStatements.size()); for (DataPropertyStatement dps : dpStatements) { 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 1ae818187..2ee81ef9f 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 @@ -3,6 +3,7 @@ package edu.cornell.mannlib.vitro.webapp.web.templatemodels.individual; import java.io.File; +import java.io.IOException; import java.lang.reflect.Constructor; import java.util.List; import java.util.Map; @@ -10,6 +11,7 @@ import java.util.Map; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; +import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.w3c.dom.Document; @@ -18,8 +20,11 @@ import org.w3c.dom.NodeList; import edu.cornell.mannlib.vitro.webapp.beans.Individual; import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty; +import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.dao.ObjectPropertyDao; import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; +import freemarker.cache.TemplateLoader; +import freemarker.template.Configuration; public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel { @@ -28,13 +33,13 @@ public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel private PropertyListConfig config; - ObjectPropertyTemplateModel(ObjectProperty op, Individual subject, WebappDaoFactory wdf) { + ObjectPropertyTemplateModel(ObjectProperty op, Individual subject, VitroRequest vreq) { super(op); setName(op.getDomainPublic()); // Get the config for this object property try { - config = new PropertyListConfig(op, wdf); + config = new PropertyListConfig(op, vreq); } catch (Exception e) { log.error(e, e); } @@ -48,16 +53,16 @@ public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel return config.collationTarget; } - protected static ObjectPropertyTemplateModel getObjectPropertyTemplateModel(ObjectProperty op, Individual subject, WebappDaoFactory wdf) { + protected static ObjectPropertyTemplateModel getObjectPropertyTemplateModel(ObjectProperty op, Individual subject, VitroRequest vreq) { if (op.getCollateBySubclass()) { try { - return new CollatedObjectPropertyTemplateModel(op, subject, wdf); + return new CollatedObjectPropertyTemplateModel(op, subject, vreq); } catch (Exception e) { log.error(e, e); - return new UncollatedObjectPropertyTemplateModel(op, subject, wdf); + return new UncollatedObjectPropertyTemplateModel(op, subject, vreq); } } else { - return new UncollatedObjectPropertyTemplateModel(op, subject, wdf); + return new UncollatedObjectPropertyTemplateModel(op, subject, vreq); } } @@ -94,47 +99,86 @@ public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel private String postprocessor; private String editObject; - PropertyListConfig(ObjectProperty op, WebappDaoFactory wdf) throws Exception { + PropertyListConfig(ObjectProperty op, VitroRequest vreq) throws Exception { // Get the custom config filename + WebappDaoFactory wdf = vreq.getWebappDaoFactory(); ObjectPropertyDao opDao = wdf.getObjectPropertyDao(); - String filename = opDao.getCustomListConfigFilename(op); - if (filename == null) { // no custom config; use default config - filename = DEFAULT_CONFIG_FILE; + String configFileName = opDao.getCustomListConfigFileName(op); + if (configFileName == null) { // no custom config; use default config + configFileName = DEFAULT_CONFIG_FILE; } - log.debug("Using custom list view config file " + filename + " for object property " + op.getURI()); + log.debug("Using list view config file " + configFileName + " for object property " + op.getURI()); - String configFilePath = getConfigFilePath(filename); + String configFilePath = getConfigFilePath(configFileName); try { File config = new File(configFilePath); - if (configFilePath != DEFAULT_CONFIG_FILE && ! config.exists()) { + if (configFileName != DEFAULT_CONFIG_FILE && ! config.exists()) { log.warn("Can't find config file " + configFilePath + " for object property " + op.getURI() + "\n" + ". Using default config file instead."); configFilePath = getConfigFilePath(DEFAULT_CONFIG_FILE); // Should we test for the existence of the default, and throw an error if it doesn't exist? - } - - DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); - DocumentBuilder db = dbf.newDocumentBuilder(); - Document doc = db.parse(configFilePath); - // Required values - queryString = getConfigValue(doc, NODE_NAME_QUERY); - templateName = getConfigValue(doc, NODE_NAME_TEMPLATE); - // Optional values - collationTarget = getConfigValue(doc, NODE_NAME_COLLATION_TARGET); - postprocessor = getConfigValue(doc, NODE_NAME_POSTPROCESSOR); - editObject = getConfigValue(doc, NODE_NAME_EDIT_OBJECT); + } + setValuesFromConfigFile(configFilePath); + } catch (Exception e) { log.error("Error processing config file " + configFilePath + " for object property " + op.getURI(), e); // What should we do here? } - if (queryString == null) { - throw new Exception("Invalid custom view configuration: query string not defined."); + if ( ! configFileName.equals(DEFAULT_CONFIG_FILE) ) { + String invalidConfigMessage = checkForInvalidConfig(vreq); + if ( StringUtils.isNotEmpty(invalidConfigMessage) ) { + log.warn("Invalid list view config for object property " + op.getURI() + + " in " + configFilePath + ":\n" + + invalidConfigMessage + " Using default config instead."); + configFilePath = getConfigFilePath(DEFAULT_CONFIG_FILE); + setValuesFromConfigFile(configFilePath); + } } - if (templateName == null) { - throw new Exception("Invalid custom view configuration: template name not defined."); + } + + private String checkForInvalidConfig(VitroRequest vreq) { + String invalidConfigMessage = null; + + if ( StringUtils.isBlank(queryString)) { + invalidConfigMessage = "Missing query specification."; + } else if ( StringUtils.isBlank(templateName)) { + invalidConfigMessage = "Missing template specification."; + } else { + Configuration fmConfig = (Configuration) vreq.getAttribute("freemarkerConfig"); + TemplateLoader tl = fmConfig.getTemplateLoader(); + try { + if ( tl.findTemplateSource(templateName) == null ) { + invalidConfigMessage = "Specified template " + templateName + " does not exist."; + } + } catch (IOException e) { + log.error("Error finding template " + templateName, e); + } } + return invalidConfigMessage; + } + + private void setValuesFromConfigFile(String configFilePath) { + + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder db; + + try { + db = dbf.newDocumentBuilder(); + Document doc = db.parse(configFilePath); + // Required values + queryString = getConfigValue(doc, NODE_NAME_QUERY); + templateName = getConfigValue(doc, NODE_NAME_TEMPLATE); + editObject = getConfigValue(doc, NODE_NAME_EDIT_OBJECT); + + // Optional values + collationTarget = getConfigValue(doc, NODE_NAME_COLLATION_TARGET); + postprocessor = getConfigValue(doc, NODE_NAME_POSTPROCESSOR); + } catch (Exception e) { + log.error("Error processing config file " + configFilePath, e); + // What should we do here? + } } private String getConfigValue(Document doc, String nodeName) { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/PropertyGroupTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/PropertyGroupTemplateModel.java index 425128a36..c0d9e181b 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/PropertyGroupTemplateModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/PropertyGroupTemplateModel.java @@ -13,6 +13,7 @@ import edu.cornell.mannlib.vitro.webapp.beans.Individual; import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty; import edu.cornell.mannlib.vitro.webapp.beans.Property; import edu.cornell.mannlib.vitro.webapp.beans.PropertyGroup; +import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; import edu.cornell.mannlib.vitro.webapp.web.templatemodels.BaseTemplateModel; @@ -23,7 +24,7 @@ public class PropertyGroupTemplateModel extends BaseTemplateModel { private String name; private List properties; - PropertyGroupTemplateModel(WebappDaoFactory wdf, PropertyGroup group, Individual subject) { + PropertyGroupTemplateModel(VitroRequest vreq, PropertyGroup group, Individual subject) { this.name = group.getName(); List propertyList = group.getPropertyList(); @@ -31,9 +32,9 @@ public class PropertyGroupTemplateModel extends BaseTemplateModel { for (Property p : propertyList) { if (p instanceof ObjectProperty) { ObjectProperty op = (ObjectProperty)p; - properties.add(ObjectPropertyTemplateModel.getObjectPropertyTemplateModel(op, subject, wdf)); + properties.add(ObjectPropertyTemplateModel.getObjectPropertyTemplateModel(op, subject, vreq)); } else { - properties.add(new DataPropertyTemplateModel((DataProperty)p, subject, wdf)); + properties.add(new DataPropertyTemplateModel((DataProperty)p, subject, vreq)); } } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/PropertyListBuilder.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/PropertyListBuilder.java index 8308ee2ff..c71cae7cf 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/PropertyListBuilder.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/PropertyListBuilder.java @@ -102,7 +102,7 @@ public class PropertyListBuilder { // Build the template data model from the groupList List groups = new ArrayList(groupList.size()); for (PropertyGroup pg : groupList) { - groups.add(new PropertyGroupTemplateModel(wdf, pg, subject)); + groups.add(new PropertyGroupTemplateModel(vreq, pg, subject)); } return groups; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/UncollatedObjectPropertyTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/UncollatedObjectPropertyTemplateModel.java index 7837259c6..70df1490f 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/UncollatedObjectPropertyTemplateModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/UncollatedObjectPropertyTemplateModel.java @@ -11,6 +11,7 @@ import org.apache.commons.logging.LogFactory; import edu.cornell.mannlib.vitro.webapp.beans.Individual; import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty; +import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.dao.ObjectPropertyStatementDao; import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; @@ -20,8 +21,9 @@ public class UncollatedObjectPropertyTemplateModel extends ObjectPropertyTemplat private List statements; - UncollatedObjectPropertyTemplateModel(ObjectProperty op, Individual subject, WebappDaoFactory wdf) { - super(op, subject, wdf); + UncollatedObjectPropertyTemplateModel(ObjectProperty op, Individual subject, VitroRequest vreq) { + super(op, subject, vreq); + WebappDaoFactory wdf = vreq.getWebappDaoFactory(); ObjectPropertyStatementDao opDao = wdf.getObjectPropertyStatementDao(); String subjectUri = subject.getURI(); String propertyUri = op.getURI(); diff --git a/webapp/web/templates/freemarker/body/test.ftl b/webapp/web/templates/freemarker/body/test.ftl index 9746d2c39..1dc72abb8 100644 --- a/webapp/web/templates/freemarker/body/test.ftl +++ b/webapp/web/templates/freemarker/body/test.ftl @@ -3,4 +3,3 @@ <#-- FreeMarker test cases -->

${title}

-