NIHVIVO-1341, NIHVIVO-1335 Handle various error conditions in list view config (blank query, blank template name, template doesn't exist)
This commit is contained in:
parent
fd15870f7e
commit
555fd93962
10 changed files with 94 additions and 54 deletions
|
@ -56,5 +56,5 @@ public interface ObjectPropertyDao extends PropertyDao {
|
|||
|
||||
public List<ObjectProperty> getObjectPropertyList(String subjectUri);
|
||||
|
||||
public String getCustomListConfigFilename(ObjectProperty objectProperty);
|
||||
public String getCustomListConfigFileName(ObjectProperty objectProperty);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -76,7 +76,7 @@ public class ObjectPropertyDaoJena extends PropertyDaoJena implements ObjectProp
|
|||
"PREFIX display: <http://vitro.mannlib.cornell.edu/ontologies/display/1.1#>" +
|
||||
"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<ObjectProperty, String>();
|
||||
OntModel displayModel = getOntModelSelector().getDisplayModel();
|
||||
|
|
|
@ -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<String, List<ObjectPropertyStatementTemplateModel>> subclasses;
|
||||
//private List<SubclassList> 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();
|
||||
|
|
|
@ -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<DataPropertyStatementTemplateModel> 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<DataPropertyStatement> dpStatements = dpDao.getDataPropertyStatementsForIndividualByProperty(subject, dp);
|
||||
statements = new ArrayList<DataPropertyStatementTemplateModel>(dpStatements.size());
|
||||
for (DataPropertyStatement dps : dpStatements) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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<PropertyTemplateModel> properties;
|
||||
|
||||
PropertyGroupTemplateModel(WebappDaoFactory wdf, PropertyGroup group, Individual subject) {
|
||||
PropertyGroupTemplateModel(VitroRequest vreq, PropertyGroup group, Individual subject) {
|
||||
this.name = group.getName();
|
||||
|
||||
List<Property> 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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -102,7 +102,7 @@ public class PropertyListBuilder {
|
|||
// Build the template data model from the groupList
|
||||
List<PropertyGroupTemplateModel> groups = new ArrayList<PropertyGroupTemplateModel>(groupList.size());
|
||||
for (PropertyGroup pg : groupList) {
|
||||
groups.add(new PropertyGroupTemplateModel(wdf, pg, subject));
|
||||
groups.add(new PropertyGroupTemplateModel(vreq, pg, subject));
|
||||
}
|
||||
|
||||
return groups;
|
||||
|
|
|
@ -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<ObjectPropertyStatementTemplateModel> 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();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue