VIVO-1319 Remove dependency on sourceforge.net JSON parser. (#60)

* VIVO-1246 improve the ConfigurationBeanLoader:

Add cardinality parameters minOccurs and maxOccurs
Create README.md document in the edu.cornell.mannlib.vitro.webapp.utils.configuration package
Split large class of unit tests into separate classes by functionality

* VIVO-1247, remove duplicate code used with ConfigurationBeanLoader.

Now that the @Property annotation includes cardinality parameters, we can remove a lot of duplicate code.

* VIVO-1246 Move unit tests to the new location.

* VIVO-1246 The documentation was in the wrong place.

* Ignore all /bin/ directories under eclipse

* First set of unit tests, along with enhancements to the stubs.

* Clean up the unit tests with more expressive power.

* VIVO-1319 Full tests on the controller output formats.

* Create a Jackson-based quote(), to replace the net.sf.json-based quote()

* Eliminate the use of net.sf.json.util.JSONUtils

* Use Jackson JSON library instead of net.sf.json

JSONNode, JSONArray, JSONObject become JsonNode, ArrayNode, and ObjectNode.
No direct replacement for HSONSerializer, so create JacksonUtils

Some of the message signatures are different, so adjust accordingly.
This commit is contained in:
Jim Blake 2017-05-22 14:42:10 -04:00 committed by grahamtriggs
parent a8bd8829db
commit 3829f48b0b
42 changed files with 3013 additions and 318 deletions

2
.gitignore vendored
View file

@ -2,7 +2,6 @@
/.classpath
/.project
/.settings
/bin/
/webapp/config/deploy.properties
/webapp/config/build.properties
/webapp/config/runtime.properties
@ -22,3 +21,4 @@ utilities/sdb_to_tdb/.work
**/.settings
**/.classpath
**/.project
**/bin/

View file

@ -7,8 +7,6 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import net.sf.json.util.JSONUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@ -21,6 +19,7 @@ import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues;
import edu.cornell.mannlib.vitro.webapp.dao.VClassGroupDao;
import edu.cornell.mannlib.vitro.webapp.utils.json.JacksonUtils;
import edu.cornell.mannlib.vitro.webapp.web.URLEncoder;
@ -61,9 +60,9 @@ public class ListClassGroupsController extends FreemarkerHttpServlet {
publicName = "(unnamed group)";
}
try {
json += "{ \"name\": " + JSONUtils.quote("<a href='./editForm?uri="+URLEncoder.encode(vcg.getURI())+"&amp;controller=Classgroup'>"+publicName+"</a>") + ", ";
json += "{ \"name\": " + JacksonUtils.quote("<a href='./editForm?uri="+URLEncoder.encode(vcg.getURI())+"&amp;controller=Classgroup'>"+publicName+"</a>") + ", ";
} catch (Exception e) {
json += "{ \"name\": " + JSONUtils.quote(publicName) + ", ";
json += "{ \"name\": " + JacksonUtils.quote(publicName) + ", ";
}
Integer t;
@ -77,16 +76,16 @@ public class ListClassGroupsController extends FreemarkerHttpServlet {
VClass vcw = classIt.next();
if (vcw.getName() != null && vcw.getURI() != null) {
try {
json += "{ \"name\": " + JSONUtils.quote("<a href='vclassEdit?uri="+URLEncoder.encode(vcw.getURI())+"'>"+vcw.getName()+"</a>") + ", ";
json += "{ \"name\": " + JacksonUtils.quote("<a href='vclassEdit?uri="+URLEncoder.encode(vcw.getURI())+"'>"+vcw.getName()+"</a>") + ", ";
} catch (Exception e) {
json += "" + JSONUtils.quote(vcw.getName()) + ", ";
json += "" + JacksonUtils.quote(vcw.getName()) + ", ";
}
} else {
json += "\"\", ";
}
String shortDefStr = (vcw.getShortDef() == null) ? "" : vcw.getShortDef();
json += "\"data\": { \"shortDef\": " + JSONUtils.quote(shortDefStr) + "}, \"children\": [] ";
json += "\"data\": { \"shortDef\": " + JacksonUtils.quote(shortDefStr) + "}, \"children\": [] ";
if (classIt.hasNext())
json += "} , ";
else

View file

@ -10,8 +10,6 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import net.sf.json.util.JSONUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@ -28,6 +26,7 @@ import edu.cornell.mannlib.vitro.webapp.dao.DataPropertyDao;
import edu.cornell.mannlib.vitro.webapp.dao.DatatypeDao;
import edu.cornell.mannlib.vitro.webapp.dao.PropertyGroupDao;
import edu.cornell.mannlib.vitro.webapp.dao.VClassDao;
import edu.cornell.mannlib.vitro.webapp.utils.json.JacksonUtils;
import edu.cornell.mannlib.vitro.webapp.web.URLEncoder;
public class ListDatatypePropertiesController extends FreemarkerHttpServlet {
@ -113,12 +112,12 @@ public class ListDatatypePropertiesController extends FreemarkerHttpServlet {
String nameStr = prop.getPickListName()==null ? prop.getName()==null ? prop.getURI()==null ? "(no name)" : prop.getURI() : prop.getName() : prop.getPickListName();
try {
json += "{ \"name\": " + JSONUtils.quote("<a href='datapropEdit?uri="+ URLEncoder.encode(prop.getURI())+"'>" + nameStr + "</a>") + ", ";
json += "{ \"name\": " + JacksonUtils.quote("<a href='datapropEdit?uri="+ URLEncoder.encode(prop.getURI())+"'>" + nameStr + "</a>") + ", ";
} catch (Exception e) {
json += "{ \"name\": " + JSONUtils.quote(nameStr) + ", ";
json += "{ \"name\": " + JacksonUtils.quote(nameStr) + ", ";
}
json += "\"data\": { \"internalName\": " + JSONUtils.quote(prop.getPickListName()) + ", ";
json += "\"data\": { \"internalName\": " + JacksonUtils.quote(prop.getPickListName()) + ", ";
/* VClass vc = null;
String domainStr="";
@ -138,15 +137,15 @@ public class ListDatatypePropertiesController extends FreemarkerHttpServlet {
dpLangNeut = prop;
}
String domainStr = getVClassNameFromURI(dpLangNeut.getDomainVClassURI(), vcDao, vcDaoLangNeut);
json += "\"domainVClass\": " + JSONUtils.quote(domainStr) + ", " ;
json += "\"domainVClass\": " + JacksonUtils.quote(domainStr) + ", " ;
Datatype rangeDatatype = dDao.getDatatypeByURI(prop.getRangeDatatypeURI());
String rangeDatatypeStr = (rangeDatatype==null)?prop.getRangeDatatypeURI():rangeDatatype.getName();
json += "\"rangeVClass\": " + JSONUtils.quote(rangeDatatypeStr) + ", " ;
json += "\"rangeVClass\": " + JacksonUtils.quote(rangeDatatypeStr) + ", " ;
if (prop.getGroupURI() != null) {
PropertyGroup pGroup = pgDao.getGroupByURI(prop.getGroupURI());
json += "\"group\": " + JSONUtils.quote((pGroup == null) ? "unknown group" : pGroup.getName()) + " } } " ;
json += "\"group\": " + JacksonUtils.quote((pGroup == null) ? "unknown group" : pGroup.getName()) + " } } " ;
} else {
json += "\"group\": \"unspecified\" } }" ;
}

View file

@ -2,19 +2,12 @@
package edu.cornell.mannlib.vitro.webapp.controller.freemarker;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import net.sf.json.util.JSONUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@ -23,15 +16,12 @@ import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.AuthorizationReques
import edu.cornell.mannlib.vitro.webapp.beans.FauxProperty;
import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty;
import edu.cornell.mannlib.vitro.webapp.beans.PropertyGroup;
import edu.cornell.mannlib.vitro.webapp.beans.VClass;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues;
import edu.cornell.mannlib.vitro.webapp.dao.FauxPropertyDao;
import edu.cornell.mannlib.vitro.webapp.dao.ObjectPropertyDao;
import edu.cornell.mannlib.vitro.webapp.dao.PropertyGroupDao;
import edu.cornell.mannlib.vitro.webapp.dao.VClassDao;
import edu.cornell.mannlib.vitro.webapp.web.URLEncoder;
public class ListFauxPropertiesController extends FreemarkerHttpServlet {

View file

@ -8,8 +8,6 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import net.sf.json.util.JSONUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@ -24,6 +22,7 @@ import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues;
import edu.cornell.mannlib.vitro.webapp.dao.PropertyGroupDao;
import edu.cornell.mannlib.vitro.webapp.utils.json.JacksonUtils;
public class ListPropertyGroupsController extends FreemarkerHttpServlet {
@ -62,9 +61,9 @@ public class ListPropertyGroupsController extends FreemarkerHttpServlet {
publicName = "(unnamed group)";
}
try {
json += "{ \"name\": " + JSONUtils.quote("<a href='./editForm?uri="+URLEncoder.encode(pg.getURI(),"UTF-8")+"&amp;controller=PropertyGroup'>" + publicName + "</a>") + ", ";
json += "{ \"name\": " + JacksonUtils.quote("<a href='./editForm?uri="+URLEncoder.encode(pg.getURI(),"UTF-8")+"&amp;controller=PropertyGroup'>" + publicName + "</a>") + ", ";
} catch (Exception e) {
json += "{ \"name\": " + JSONUtils.quote(publicName) + ", ";
json += "{ \"name\": " + JacksonUtils.quote(publicName) + ", ";
}
Integer t;
@ -89,10 +88,10 @@ public class ListPropertyGroupsController extends FreemarkerHttpServlet {
}
if (prop.getURI() != null) {
try {
json += "{ \"name\": " + JSONUtils.quote("<a href='" + controllerStr
json += "{ \"name\": " + JacksonUtils.quote("<a href='" + controllerStr
+ "?uri="+URLEncoder.encode(prop.getURI(),"UTF-8")+"'>"+ nameStr +"</a>") + ", ";
} catch (Exception e) {
json += JSONUtils.quote(nameStr) + ", ";
json += JacksonUtils.quote(nameStr) + ", ";
}
} else {
json += "\"\", ";

View file

@ -11,8 +11,6 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import net.sf.json.util.JSONUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@ -32,6 +30,7 @@ import edu.cornell.mannlib.vitro.webapp.dao.PropertyGroupDao;
import edu.cornell.mannlib.vitro.webapp.dao.PropertyInstanceDao;
import edu.cornell.mannlib.vitro.webapp.dao.VClassDao;
import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary;
import edu.cornell.mannlib.vitro.webapp.utils.json.JacksonUtils;
import edu.cornell.mannlib.vitro.webapp.web.URLEncoder;
public class ListPropertyWebappsController extends FreemarkerHttpServlet {
@ -154,27 +153,27 @@ public class ListPropertyWebappsController extends FreemarkerHttpServlet {
String propNameStr = ShowObjectPropertyHierarchyController.getDisplayLabel(prop);
try {
json += "{ \"name\": " + JSONUtils.quote("<a href='./propertyEdit?uri="+URLEncoder.encode(prop.getURI())+"'>"
json += "{ \"name\": " + JacksonUtils.quote("<a href='./propertyEdit?uri="+URLEncoder.encode(prop.getURI())+"'>"
+ propNameStr + "</a>") + ", ";
} catch (Exception e) {
json += "{ \"name\": \"" + propNameStr + "\", ";
}
json += "\"data\": { \"internalName\": " + JSONUtils.quote(prop.getLocalNameWithPrefix()) + ", ";
json += "\"data\": { \"internalName\": " + JacksonUtils.quote(prop.getLocalNameWithPrefix()) + ", ";
ObjectProperty opLangNeut = opDaoLangNeut.getObjectPropertyByURI(prop.getURI());
if(opLangNeut == null) {
opLangNeut = prop;
}
String domainStr = getVClassNameFromURI(opLangNeut.getDomainVClassURI(), vcDao, vcDaoLangNeut);
json += "\"domainVClass\": " + JSONUtils.quote(domainStr) + ", " ;
json += "\"domainVClass\": " + JacksonUtils.quote(domainStr) + ", " ;
String rangeStr = getVClassNameFromURI(opLangNeut.getRangeVClassURI(), vcDao, vcDaoLangNeut);
json += "\"rangeVClass\": " + JSONUtils.quote(rangeStr) + ", " ;
json += "\"rangeVClass\": " + JacksonUtils.quote(rangeStr) + ", " ;
if (prop.getGroupURI() != null) {
PropertyGroup pGroup = pgDao.getGroupByURI(prop.getGroupURI());
json += "\"group\": " + JSONUtils.quote((pGroup == null) ? "unknown group" : pGroup.getName()) + " } } " ;
json += "\"group\": " + JacksonUtils.quote((pGroup == null) ? "unknown group" : pGroup.getName()) + " } } " ;
} else {
json += "\"group\": \"unspecified\" } }" ;
}

View file

@ -8,8 +8,6 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import net.sf.json.util.JSONUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@ -26,6 +24,7 @@ import edu.cornell.mannlib.vitro.webapp.dao.PropertyDao;
import edu.cornell.mannlib.vitro.webapp.dao.VClassDao;
import edu.cornell.mannlib.vitro.webapp.dao.VClassGroupDao;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
import edu.cornell.mannlib.vitro.webapp.utils.json.JacksonUtils;
public class ListVClassWebappsController extends FreemarkerHttpServlet {
@ -90,15 +89,15 @@ public class ListVClassWebappsController extends FreemarkerHttpServlet {
if ( (ontologyURI==null) || ( (ontologyURI != null) && (cls.getNamespace()!=null) && (ontologyURI.equals(cls.getNamespace())) ) ) {
if (cls.getName() != null)
try {
json += "{ \"name\": " + JSONUtils.quote("<a href='./vclassEdit?uri="+URLEncoder.encode(cls.getURI(),"UTF-8")+"'>"+cls.getPickListName()+"</a>") + ", ";
json += "{ \"name\": " + JacksonUtils.quote("<a href='./vclassEdit?uri="+URLEncoder.encode(cls.getURI(),"UTF-8")+"'>"+cls.getPickListName()+"</a>") + ", ";
} catch (Exception e) {
json += "{ \"name\": " + JSONUtils.quote(cls.getPickListName()) + ", ";
json += "{ \"name\": " + JacksonUtils.quote(cls.getPickListName()) + ", ";
}
else
json += "{ \"name\": \"\"";
String shortDef = (cls.getShortDef() == null) ? "" : cls.getShortDef();
json += "\"data\": { \"shortDef\": " + JSONUtils.quote(shortDef) + ", ";
json += "\"data\": { \"shortDef\": " + JacksonUtils.quote(shortDef) + ", ";
// get group name
WebappDaoFactory wadf = vreq.getUnfilteredWebappDaoFactory();
@ -113,7 +112,7 @@ public class ListVClassWebappsController extends FreemarkerHttpServlet {
}
}
json += "\"classGroup\": " + JSONUtils.quote(groupName) + ", ";
json += "\"classGroup\": " + JacksonUtils.quote(groupName) + ", ";
// get ontology name
OntologyDao ontDao = wadf.getOntologyDao();
@ -122,7 +121,7 @@ public class ListVClassWebappsController extends FreemarkerHttpServlet {
if (ont != null && ont.getName() != null) {
ontName = ont.getName();
}
json += "\"ontology\": " + JSONUtils.quote(ontName) + "} }";
json += "\"ontology\": " + JacksonUtils.quote(ontName) + "} }";
counter++;

View file

@ -10,11 +10,8 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import net.sf.json.util.JSONUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.jena.vocabulary.OWL;
import edu.cornell.mannlib.vitro.webapp.auth.permissions.SimplePermission;
@ -29,6 +26,7 @@ import edu.cornell.mannlib.vitro.webapp.dao.OntologyDao;
import edu.cornell.mannlib.vitro.webapp.dao.VClassDao;
import edu.cornell.mannlib.vitro.webapp.dao.VClassGroupDao;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
import edu.cornell.mannlib.vitro.webapp.utils.json.JacksonUtils;
public class ShowClassHierarchyController extends FreemarkerHttpServlet {
@ -196,16 +194,16 @@ public class ShowClassHierarchyController extends FreemarkerHttpServlet {
tempString += "}, { \"name\": ";
}
try {
tempString += JSONUtils.quote("<a href='vclassEdit?uri=" +
tempString += JacksonUtils.quote("<a href='vclassEdit?uri=" +
URLEncoder.encode(vcw.getURI(),"UTF-8") + "'>" +
vcw.getPickListName() + "</a>") +", ";
} catch (Exception e) {
tempString += JSONUtils.quote(((vcw.getPickListName() == null)
tempString += JacksonUtils.quote(((vcw.getPickListName() == null)
? "" : vcw.getPickListName())) + ", ";
}
String shortDef = ((vcw.getShortDef() == null) ? "" : vcw.getShortDef()) ;
tempString += "\"data\": { \"shortDef\": " + JSONUtils.quote(shortDef) + ", ";
tempString += "\"data\": { \"shortDef\": " + JacksonUtils.quote(shortDef) + ", ";
// Get group name if it exists
VClassGroupDao groupDao= wadf.getVClassGroupDao();
@ -218,7 +216,7 @@ public class ShowClassHierarchyController extends FreemarkerHttpServlet {
groupName = classGroup.getPublicName();
}
}
tempString += "\"classGroup\": " + JSONUtils.quote(
tempString += "\"classGroup\": " + JacksonUtils.quote(
(groupName == null) ? "" : groupName) + ", ";
// Get ontology name
OntologyDao ontDao = wadf.getOntologyDao();
@ -227,7 +225,7 @@ public class ShowClassHierarchyController extends FreemarkerHttpServlet {
if (ont != null && ont.getName() != null) {
ontName = ont.getName();
}
tempString += "\"ontology\": " + JSONUtils.quote(
tempString += "\"ontology\": " + JacksonUtils.quote(
(ontName == null) ? "" : ontName) + "}, \"children\": [";
previous_posn = position;

View file

@ -9,8 +9,6 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import net.sf.json.util.JSONUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@ -27,6 +25,7 @@ import edu.cornell.mannlib.vitro.webapp.dao.DataPropertyDao;
import edu.cornell.mannlib.vitro.webapp.dao.DatatypeDao;
import edu.cornell.mannlib.vitro.webapp.dao.PropertyGroupDao;
import edu.cornell.mannlib.vitro.webapp.dao.VClassDao;
import edu.cornell.mannlib.vitro.webapp.utils.json.JacksonUtils;
import edu.cornell.mannlib.vitro.webapp.web.URLEncoder;
public class ShowDataPropertyHierarchyController extends FreemarkerHttpServlet {
@ -211,11 +210,11 @@ public class ShowDataPropertyHierarchyController extends FreemarkerHttpServlet {
? dp.getURI() == null
? "(no name)" : dp.getURI() : dp.getName() : dp.getPickListName();
tempString += JSONUtils.quote(
tempString += JacksonUtils.quote(
"<a href='datapropEdit?uri=" + URLEncoder.encode(
dp.getURI()) + "'>" + nameStr + "</a>") + ", ";
tempString += "\"data\": { \"internalName\": " + JSONUtils.quote(
tempString += "\"data\": { \"internalName\": " + JacksonUtils.quote(
dp.getPickListName()) + ", ";
DataProperty dpLangNeut = dpDaoLangNeut.getDataPropertyByURI(dp.getURI());
@ -225,20 +224,20 @@ public class ShowDataPropertyHierarchyController extends FreemarkerHttpServlet {
String domainStr = getVClassNameFromURI(dpLangNeut.getDomainVClassURI(), vcDao, vcDaoLangNeut);
try {
tempString += "\"domainVClass\": " + JSONUtils.quote(domainStr) + ", " ;
tempString += "\"domainVClass\": " + JacksonUtils.quote(domainStr) + ", " ;
} catch (NullPointerException e) {
tempString += "\"domainVClass\": \"\",";
}
try {
Datatype rangeDatatype = dDao.getDatatypeByURI(dp.getRangeDatatypeURI());
String rangeDatatypeStr = (rangeDatatype==null)?dp.getRangeDatatypeURI():rangeDatatype.getName();
tempString += "\"rangeVClass\": " + JSONUtils.quote((rangeDatatypeStr != null) ? rangeDatatypeStr : "") + ", " ;
tempString += "\"rangeVClass\": " + JacksonUtils.quote((rangeDatatypeStr != null) ? rangeDatatypeStr : "") + ", " ;
} catch (NullPointerException e) {
tempString += "\"rangeVClass\": \"\",";
}
if (dp.getGroupURI() != null) {
PropertyGroup pGroup = pgDao.getGroupByURI(dp.getGroupURI());
tempString += "\"group\": " + JSONUtils.quote((pGroup == null) ? "unknown group" : pGroup.getName());
tempString += "\"group\": " + JacksonUtils.quote((pGroup == null) ? "unknown group" : pGroup.getName());
} else {
tempString += "\"group\": \"unspecified\"";
}

View file

@ -12,8 +12,6 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import net.sf.json.util.JSONUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@ -28,6 +26,7 @@ import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.Tem
import edu.cornell.mannlib.vitro.webapp.dao.ObjectPropertyDao;
import edu.cornell.mannlib.vitro.webapp.dao.PropertyGroupDao;
import edu.cornell.mannlib.vitro.webapp.dao.VClassDao;
import edu.cornell.mannlib.vitro.webapp.utils.json.JacksonUtils;
import edu.cornell.mannlib.vitro.webapp.web.URLEncoder;
public class ShowObjectPropertyHierarchyController extends FreemarkerHttpServlet {
@ -210,11 +209,11 @@ public class ShowObjectPropertyHierarchyController extends FreemarkerHttpServlet
String nameStr = getDisplayLabel(op) == null ? "(no name)" : getDisplayLabel(op);
tempString += JSONUtils.quote(
tempString += JacksonUtils.quote(
"<a href='propertyEdit?uri=" + URLEncoder.encode(
op.getURI()) + "'>" + nameStr + "</a>") + ", ";
tempString += "\"data\": { \"internalName\": " + JSONUtils.quote(
tempString += "\"data\": { \"internalName\": " + JacksonUtils.quote(
op.getLocalNameWithPrefix()) + ", ";
ObjectProperty opLangNeut = opDaoLangNeut.getObjectPropertyByURI(op.getURI());
@ -225,18 +224,18 @@ public class ShowObjectPropertyHierarchyController extends FreemarkerHttpServlet
String rangeStr = getVClassNameFromURI(opLangNeut.getRangeVClassURI(), vcDao, vcDaoLangNeut);
try {
tempString += "\"domainVClass\": " + JSONUtils.quote(domainStr) + ", " ;
tempString += "\"domainVClass\": " + JacksonUtils.quote(domainStr) + ", " ;
} catch (NullPointerException e) {
tempString += "\"domainVClass\": \"\",";
}
try {
tempString += "\"rangeVClass\": " + JSONUtils.quote(rangeStr) + ", " ;
tempString += "\"rangeVClass\": " + JacksonUtils.quote(rangeStr) + ", " ;
} catch (NullPointerException e) {
tempString += "\"rangeVClass\": \"\",";
}
if (op.getGroupURI() != null) {
PropertyGroup pGroup = pgDao.getGroupByURI(op.getGroupURI());
tempString += "\"group\": " + JSONUtils.quote(
tempString += "\"group\": " + JacksonUtils.quote(
(pGroup == null) ? "unknown group" : pGroup.getName());
} else {
tempString += "\"group\": \"unspecified\"";

View file

@ -12,12 +12,8 @@ import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.jena.ontology.OntModel;
import org.apache.jena.query.Query;
import org.apache.jena.query.QueryExecution;
@ -31,6 +27,10 @@ import org.apache.jena.rdf.model.Resource;
import org.apache.jena.rdf.model.ResourceFactory;
import org.apache.jena.vocabulary.XSD;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import edu.cornell.mannlib.vitro.webapp.beans.VClass;
import edu.cornell.mannlib.vitro.webapp.beans.VClassGroup;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
@ -258,7 +258,7 @@ public class ManagePageGenerator extends BaseEditConfigurationGenerator implemen
String pageUri,
OntModel queryModel) {
//Create json array to be set within form specific data
JSONArray jsonArray = new JSONArray();
ArrayNode jsonArray = new ObjectMapper().createArrayNode();
String querystr = getExistingDataGettersQuery();
//Bind pageUri to query
QuerySolutionMap initialBindings = new QuerySolutionMap();
@ -291,7 +291,7 @@ public class ManagePageGenerator extends BaseEditConfigurationGenerator implemen
}
}
private void addJSONArrayToFormSpecificData(JSONArray jsonArray, EditConfigurationVTwo editConfig) {
private void addJSONArrayToFormSpecificData(ArrayNode jsonArray, EditConfigurationVTwo editConfig) {
HashMap<String, Object> data = editConfig.getFormSpecificData();
data.put("existingPageContentUnits", jsonArray.toString());
//Experimenting with putting actual array in
@ -300,7 +300,7 @@ public class ManagePageGenerator extends BaseEditConfigurationGenerator implemen
}
private void processExistingDataGetter(int counter, String dataGetterURI, String dgClassName,
EditConfigurationVTwo editConfig, OntModel queryModel, JSONArray jsonArray, ServletContext context) {
EditConfigurationVTwo editConfig, OntModel queryModel, ArrayNode jsonArray, ServletContext context) {
ProcessDataGetterN3 pn = ProcessDataGetterN3Utils.getDataGetterProcessorN3(dgClassName, null);
//Add N3 Optional as well
@ -323,10 +323,10 @@ public class ManagePageGenerator extends BaseEditConfigurationGenerator implemen
//including: (i) The JSON object representing the existing information to be returned to template
//Takes data getter information, packs within JSON object to send back to the form
private void addDataGetterSpecificFormData(String dataGetterURI, ProcessDataGetterN3 pn, OntModel queryModel, JSONArray jsonArray, ServletContext context) {
JSONObject jo = pn.getExistingValuesJSON(dataGetterURI, queryModel, context);
private void addDataGetterSpecificFormData(String dataGetterURI, ProcessDataGetterN3 pn, OntModel queryModel, ArrayNode jsonArray, ServletContext context) {
ObjectNode jo = pn.getExistingValuesJSON(dataGetterURI, queryModel, context);
//Add dataGetterURI to jsonObject
jo.element("URI", dataGetterURI);
jo.put("URI", dataGetterURI);
jsonArray.add(jo);
}

View file

@ -8,15 +8,14 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JSONSerializer;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.jena.rdf.model.Literal;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.BaseEditSubmissionPreprocessorVTwo;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.EditConfigurationUtils;
@ -27,6 +26,7 @@ import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.EditConfigu
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.generators.ManagePageGenerator;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.preprocessors.utils.ProcessDataGetterN3;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.preprocessors.utils.ProcessDataGetterN3Utils;
import edu.cornell.mannlib.vitro.webapp.utils.json.JacksonUtils;
public class ManagePagePreprocessor extends
BaseEditSubmissionPreprocessorVTwo {
@ -39,7 +39,7 @@ public class ManagePagePreprocessor extends
private static Map<String, List<String>> transformedLiteralsFromForm = null;
private static Map<String, List<String>> urisFromForm = null;
private static List<String> pageContentUnits = null;//String submission from form
private static List<JSONObject> pageContentUnitsJSON = null;//converted to JSON objects that can be read
private static List<ObjectNode> pageContentUnitsJSON = null;//converted to JSON objects that can be read
// String datatype
// Will be editing the edit configuration as well as edit submission here
@ -131,7 +131,7 @@ public class ManagePagePreprocessor extends
private void processDataGetters() {
convertToJson();
int counter = 0;
for(JSONObject jsonObject:pageContentUnitsJSON) {
for(ObjectNode jsonObject:pageContentUnitsJSON) {
String dataGetterClass = getDataGetterClass(jsonObject);
ProcessDataGetterN3 pn = ProcessDataGetterN3Utils.getDataGetterProcessorN3(dataGetterClass, jsonObject);
//UPDATE: using class type to indicate class type/ could also get it from
@ -175,12 +175,12 @@ public class ManagePagePreprocessor extends
private void convertToJson() {
//Iterate through list of inputs
pageContentUnitsJSON = new ArrayList<JSONObject>();
pageContentUnitsJSON = new ArrayList<ObjectNode>();
//page content units might return null in case self-contained template is selected
//otherwise there should be page content units returned from the form
if(pageContentUnits != null) {
for(String pageContentUnit: pageContentUnits) {
JSONObject jsonObject = (JSONObject) JSONSerializer.toJSON( pageContentUnit );
ObjectNode jsonObject = (ObjectNode) JacksonUtils.parseJson(pageContentUnit);
pageContentUnitsJSON.add(jsonObject);
}
}
@ -190,29 +190,29 @@ public class ManagePagePreprocessor extends
//Each field name will correspond to the names of the fileds/uris on form/literals on form
//generated here
private void addInputsToSubmission(ProcessDataGetterN3 pn, int counter, JSONObject jsonObject) {
private void addInputsToSubmission(ProcessDataGetterN3 pn, int counter, ObjectNode jsonObject) {
List<String> literalLabels = pn.getLiteralVarNamesBase();
List<String> uriLabels = pn.getUriVarNamesBase();
for(String literalLabel:literalLabels) {
List<String> literalValues = new ArrayList<String>();
Object jsonValue = jsonObject.get(literalLabel);
JsonNode jsonValue = jsonObject.get(literalLabel);
//Var names will depend on which data getter object this is on the page, so depends on counter
String submissionLiteralName = pn.getVarName(literalLabel, counter);
//Single value
if(jsonValue instanceof String) {
if(jsonValue.isTextual()) {
//TODO: Deal with multiple submission values
//This retrieves the value for this particular json object
String jsonString = jsonObject.getString(literalLabel);
String jsonString = jsonObject.get(literalLabel).asText();
jsonString = pn.replaceEncodedQuotesWithEscapedQuotes(jsonString);
literalValues.add(jsonString);
} else if(jsonValue instanceof JSONArray) {
JSONArray values = jsonObject.getJSONArray(literalLabel);
literalValues = (List<String>) JSONSerializer.toJava(values);
} else if(jsonValue.isArray()) {
ArrayNode values = (ArrayNode) jsonObject.get(literalLabel);
literalValues = JacksonUtils.jsonArrayToStrings(values);
//Replacing encoded quotes here as well
this.replaceEncodedQuotesInList(pn, literalValues);
} else if(jsonValue instanceof Boolean) {
Boolean booleanValue = jsonObject.getBoolean(literalLabel);
} else if(jsonValue.isBoolean()) {
Boolean booleanValue = jsonObject.get(literalLabel).asBoolean();
//Adds string version
literalValues.add(booleanValue.toString());
}
@ -227,19 +227,19 @@ public class ManagePagePreprocessor extends
for(String uriLabel:uriLabels) {
List<String> uriValues = new ArrayList<String>();
Object jsonValue = jsonObject.get(uriLabel);
JsonNode jsonValue = jsonObject.get(uriLabel);
//Var names will depend on which data getter object this is on the page, so depends on counter
String submissionUriName = pn.getVarName(uriLabel, counter);
//if single value, then, add to values
if(jsonValue instanceof String) {
if(jsonValue.isTextual()) {
//Var names will depend on which data getter object this is on the page, so depends on counter
//This retrieves the value for this particular json object and adds to list
uriValues.add(jsonObject.getString(uriLabel));
uriValues.add(jsonObject.get(uriLabel).asText());
} else if(jsonValue instanceof JSONArray) {
} else if(jsonValue.isArray()) {
//multiple values
JSONArray values = jsonObject.getJSONArray(uriLabel);
uriValues = (List<String>) JSONSerializer.toJava(values);
ArrayNode values = (ArrayNode) jsonObject.get(uriLabel);
uriValues = JacksonUtils.jsonArrayToStrings(values);
} else {
//This may include JSON Objects but no way to deal with these right now
@ -257,8 +257,8 @@ public class ManagePagePreprocessor extends
//Although this is editing an existing page, new content might have been added which would not include
//existing data getter URIs, so important to check whether the key exists within the json object in the first place
String dataGetterURISubmissionName = pn.getDataGetterVarName(counter);
if(jsonObject.containsKey("URI")) {
String URIValue = jsonObject.getString("URI");
if(jsonObject.has("URI")) {
String URIValue = jsonObject.get("URI").asText();
if(URIValue != null) {
log.debug("Existing URI for data getter found: " + URIValue);
submission.addUriToForm(editConfiguration, dataGetterURISubmissionName, new String[]{URIValue});
@ -366,8 +366,8 @@ public class ManagePagePreprocessor extends
//Each JSON Object will indicate the type of the data getter within it
private String getDataGetterClass(JSONObject jsonObject) {
String javaURI = jsonObject.getString("dataGetterClass");
private String getDataGetterClass(ObjectNode jsonObject) {
String javaURI = jsonObject.get("dataGetterClass").asText();
return getQualifiedDataGetterName(javaURI);

View file

@ -8,12 +8,8 @@ import java.util.List;
import javax.servlet.ServletContext;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.jena.ontology.OntModel;
import org.apache.jena.query.Query;
import org.apache.jena.query.QueryExecution;
@ -23,6 +19,10 @@ import org.apache.jena.query.QuerySolution;
import org.apache.jena.query.ResultSet;
import org.apache.jena.rdf.model.Resource;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import edu.cornell.mannlib.vitro.webapp.beans.VClass;
import edu.cornell.mannlib.vitro.webapp.beans.VClassGroup;
import edu.cornell.mannlib.vitro.webapp.dao.DisplayVocabulary;
@ -153,10 +153,10 @@ public class ProcessClassGroupDataGetterN3 extends ProcessDataGetterAbstract {
return query;
}
public JSONObject getExistingValuesJSON(String dataGetterURI, OntModel queryModel, ServletContext context) {
JSONObject jObject = new JSONObject();
jObject.element("dataGetterClass", classType);
jObject.element(classTypeVarBase, classType);
public ObjectNode getExistingValuesJSON(String dataGetterURI, OntModel queryModel, ServletContext context) {
ObjectNode jObject = new ObjectMapper().createObjectNode();
jObject.put("dataGetterClass", classType);
jObject.put(classTypeVarBase, classType);
//Get class group
getExistingClassGroup(dataGetterURI, jObject, queryModel);
//Get classes within class group
@ -164,7 +164,7 @@ public class ProcessClassGroupDataGetterN3 extends ProcessDataGetterAbstract {
return jObject;
}
private void getExistingClassGroup(String dataGetterURI, JSONObject jObject, OntModel queryModel) {
private void getExistingClassGroup(String dataGetterURI, ObjectNode jObject, OntModel queryModel) {
String querystr = getExistingValuesClassGroup(dataGetterURI);
QueryExecution qe = null;
try{
@ -175,7 +175,7 @@ public class ProcessClassGroupDataGetterN3 extends ProcessDataGetterAbstract {
QuerySolution qs = results.nextSolution();
Resource classGroupResource = qs.getResource("classGroup");
//Put both literals in existing literals
jObject.element(classGroupVarBase, classGroupResource.getURI());
jObject.put(classGroupVarBase, classGroupResource.getURI());
}
} catch(Exception ex) {
log.error("Exception occurred in retrieving existing values with query " + querystr, ex);
@ -186,10 +186,10 @@ public class ProcessClassGroupDataGetterN3 extends ProcessDataGetterAbstract {
//Assumes JSON Object received will have the class group resource URI within it
//TODO: Refactor to take advantage of existing code that uses OTHER JSON library
protected void getExistingClassesInClassGroup(ServletContext context, String dataGetterURI, JSONObject jObject) {
protected void getExistingClassesInClassGroup(ServletContext context, String dataGetterURI, ObjectNode jObject) {
//Check for class group resource within json object
if(jObject.containsKey(classGroupVarBase)) {
String classGroupURI = jObject.getString(classGroupVarBase);
if(jObject.has(classGroupVarBase)) {
String classGroupURI = jObject.get(classGroupVarBase).asText();
//Get classes for classGroupURI and include in
VClassGroupCache vcgc = VClassGroupCache.getVClassGroupCache(context);
VClassGroup group = vcgc.getGroup(classGroupURI);
@ -201,20 +201,21 @@ public class ProcessClassGroupDataGetterN3 extends ProcessDataGetterAbstract {
//JSONObject will include results JSON object that will include classes JSON Arrya as well as
//class group information
protected void populateClassesInClassGroupJSON(JSONObject jObject, VClassGroup group) {
JSONArray classes = new JSONArray();
protected void populateClassesInClassGroupJSON(ObjectNode jObject, VClassGroup group) {
ObjectMapper mapper = new ObjectMapper();
ArrayNode classes = mapper.createArrayNode();
for( VClass vc : group){
JSONObject vcObj = new JSONObject();
vcObj.element("name", vc.getName());
vcObj.element("URI", vc.getURI());
ObjectNode vcObj = mapper.createObjectNode();
vcObj.put("name", vc.getName());
vcObj.put("URI", vc.getURI());
classes.add(vcObj);
}
JSONObject results = new JSONObject();
ObjectNode results = mapper.createObjectNode();
results.element("classes", classes);
results.element("classGroupName", group.getPublicName());
results.element("classGroupUri", group.getURI());
jObject.element("results", results);
results.set("classes", classes);
results.put("classGroupName", group.getPublicName());
results.put("classGroupUri", group.getURI());
jObject.set("results", results);
}
}

View file

@ -2,16 +2,16 @@
package edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.preprocessors.utils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import net.sf.json.JSONObject;
import javax.servlet.ServletContext;
import org.apache.jena.ontology.OntModel;
import org.apache.jena.rdf.model.Literal;
import com.fasterxml.jackson.databind.node.ObjectNode;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.fields.FieldVTwo;
//Returns the appropriate n3 based on data getter
@ -36,7 +36,7 @@ public interface ProcessDataGetterN3 {
public Map<String, List<Literal>> retrieveExistingLiteralValues();
public Map<String, List<String>> retrieveExistingUriValues();
public void populateExistingValues(String dataGetterURI, int counter, OntModel queryModel);
public JSONObject getExistingValuesJSON(String dataGetterURI, OntModel queryModel, ServletContext context);
public ObjectNode getExistingValuesJSON(String dataGetterURI, OntModel queryModel, ServletContext context);
public String replaceEncodedQuotesWithEscapedQuotes(String inputStr);
}

View file

@ -5,18 +5,18 @@ package edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.preprocess
import java.lang.reflect.Constructor;
import java.util.HashMap;
import net.sf.json.JSONObject;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.fasterxml.jackson.databind.node.ObjectNode;
/*
* This class determines what n3 should be returned for a particular data getter and can be overwritten or extended in VIVO.
*/
public class ProcessDataGetterN3Utils {
private static final Log log = LogFactory.getLog(ProcessDataGetterN3Utils.class);
public static ProcessDataGetterN3 getDataGetterProcessorN3(String dataGetterClass, JSONObject jsonObject) {
public static ProcessDataGetterN3 getDataGetterProcessorN3(String dataGetterClass, ObjectNode jsonObject) {
HashMap<String, String> map = ProcessDataGetterN3Map.getDataGetterTypeToProcessorMap();
//
if(map.containsKey(dataGetterClass)) {
@ -32,7 +32,7 @@ public class ProcessDataGetterN3Utils {
return null;
}
private static ProcessDataGetterN3 instantiateClass(String processorClass, JSONObject jsonObject) {
private static ProcessDataGetterN3 instantiateClass(String processorClass, ObjectNode jsonObject) {
ProcessDataGetterN3 pn = null;
try {
Class<?> clz = Class.forName(processorClass);

View file

@ -5,13 +5,11 @@ package edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.preprocess
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.servlet.ServletContext;
import net.sf.json.JSONObject;
import javax.servlet.ServletContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.jena.ontology.OntModel;
import org.apache.jena.query.Query;
import org.apache.jena.query.QueryExecution;
@ -21,6 +19,9 @@ import org.apache.jena.query.QuerySolution;
import org.apache.jena.query.ResultSet;
import org.apache.jena.rdf.model.Literal;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.fields.FieldVTwo;
//Returns the appropriate n3 based on data getter
public class ProcessFixedHTMLN3 extends ProcessDataGetterAbstract {
@ -136,10 +137,10 @@ public class ProcessFixedHTMLN3 extends ProcessDataGetterAbstract {
//Method to create a JSON object with existing values to return to form
//There may be a better way to do this without having to run the query twice
//TODO: Refactor code if required
public JSONObject getExistingValuesJSON(String dataGetterURI, OntModel queryModel, ServletContext context) {
JSONObject jObject = new JSONObject();
jObject.element("dataGetterClass", classType);
jObject.element(classTypeVarBase, classType);
public ObjectNode getExistingValuesJSON(String dataGetterURI, OntModel queryModel, ServletContext context) {
ObjectNode jObject = new ObjectMapper().createObjectNode();
jObject.put("dataGetterClass", classType);
jObject.put(classTypeVarBase, classType);
String querystr = getExistingValuesSparqlQuery(dataGetterURI);
QueryExecution qe = null;
try{
@ -152,9 +153,9 @@ public class ProcessFixedHTMLN3 extends ProcessDataGetterAbstract {
Literal htmlValueLiteral = qs.getLiteral("htmlValue");
String htmlValueString = htmlValueLiteral.getString();
htmlValueString = this.replaceQuotes(htmlValueString);
jObject.element("saveToVar", saveToVarLiteral.getString());
jObject.put("saveToVar", saveToVarLiteral.getString());
//TODO: Handle single and double quotes within string and escape properlyu
jObject.element("htmlValue", htmlValueString);
jObject.put("htmlValue", htmlValueString);
}
} catch(Exception ex) {
log.error("Exception occurred in retrieving existing values with query " + querystr, ex);

View file

@ -2,16 +2,14 @@
package edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.preprocessors.utils;
import java.util.Collection;
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.List;
import javax.servlet.ServletContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.jena.ontology.OntModel;
import org.apache.jena.query.Query;
import org.apache.jena.query.QueryExecution;
@ -19,16 +17,15 @@ import org.apache.jena.query.QueryExecutionFactory;
import org.apache.jena.query.QueryFactory;
import org.apache.jena.query.QuerySolution;
import org.apache.jena.query.ResultSet;
import org.apache.jena.rdf.model.Literal;
import org.apache.jena.rdf.model.Resource;
import javax.servlet.ServletContext;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import edu.cornell.mannlib.vitro.webapp.dao.DisplayVocabulary;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.fields.FieldVTwo;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JSONSerializer;
//Returns the appropriate n3 for selection of classes from within class group
public class ProcessIndividualsForClassesDataGetterN3 extends ProcessClassGroupDataGetterN3 {
private static String classType = "java:edu.cornell.mannlib.vitro.webapp.utils.dataGetter.IndividualsForClassesDataGetter";
@ -174,11 +171,11 @@ public class ProcessIndividualsForClassesDataGetterN3 extends ProcessClassGroup
}
public JSONObject getExistingValuesJSON(String dataGetterURI, OntModel queryModel, ServletContext context) {
JSONObject jObject = new JSONObject();
jObject.element("dataGetterClass", classType);
public ObjectNode getExistingValuesJSON(String dataGetterURI, OntModel queryModel, ServletContext context) {
ObjectNode jObject = new ObjectMapper().createObjectNode();
jObject.put("dataGetterClass", classType);
//Update to include class type as variable
jObject.element(classTypeVarBase, classType);
jObject.put(classTypeVarBase, classType);
//Get selected class group and which classes were selected
getExistingClassGroupAndIndividuals(dataGetterURI, jObject, queryModel);
//Get all classes within the class group
@ -186,14 +183,14 @@ public class ProcessIndividualsForClassesDataGetterN3 extends ProcessClassGroup
return jObject;
}
private void getExistingClassGroupAndIndividuals(String dataGetterURI, JSONObject jObject, OntModel queryModel) {
private void getExistingClassGroupAndIndividuals(String dataGetterURI, ObjectNode jObject, OntModel queryModel) {
String querystr = getExistingValuesIndividualsForClasses(dataGetterURI);
QueryExecution qe = null;
try{
Query query = QueryFactory.create(querystr);
qe = QueryExecutionFactory.create(query, queryModel);
ResultSet results = qe.execSelect();
JSONArray individualsForClasses = new JSONArray();
ArrayNode individualsForClasses = new ObjectMapper().createArrayNode();
String classGroupURI = null;
while( results.hasNext()){
QuerySolution qs = results.nextSolution();
@ -207,9 +204,9 @@ public class ProcessIndividualsForClassesDataGetterN3 extends ProcessClassGroup
}
jObject.element("classGroup", classGroupURI);
jObject.put("classGroup", classGroupURI);
//this is a json array
jObject.element(individualClassVarNameBase, individualsForClasses);
jObject.set(individualClassVarNameBase, individualsForClasses);
} catch(Exception ex) {
log.error("Exception occurred in retrieving existing values with query " + querystr, ex);
}

View file

@ -5,13 +5,11 @@ package edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.preprocess
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.servlet.ServletContext;
import net.sf.json.JSONObject;
import javax.servlet.ServletContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.jena.ontology.OntModel;
import org.apache.jena.query.Query;
import org.apache.jena.query.QueryExecution;
@ -22,6 +20,9 @@ import org.apache.jena.query.ResultSet;
import org.apache.jena.rdf.model.Literal;
import org.apache.jena.rdf.model.Resource;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.fields.FieldVTwo;
//Returns the appropriate n3 based on data getter
public class ProcessSearchIndividualsDataGetterN3 extends ProcessDataGetterAbstract {
@ -138,10 +139,10 @@ public class ProcessSearchIndividualsDataGetterN3 extends ProcessDataGetterAbst
//Method to create a JSON object with existing values to return to form
//There may be a better way to do this without having to run the query twice
//TODO: Refactor code if required
public JSONObject getExistingValuesJSON(String dataGetterURI, OntModel queryModel, ServletContext context) {
JSONObject jObject = new JSONObject();
jObject.element("dataGetterClass", classType);
jObject.element(classTypeVarBase, classType);
public ObjectNode getExistingValuesJSON(String dataGetterURI, OntModel queryModel, ServletContext context) {
ObjectNode jObject = new ObjectMapper().createObjectNode();
jObject.put("dataGetterClass", classType);
jObject.put(classTypeVarBase, classType);
String querystr = getExistingValuesSparqlQuery(dataGetterURI);
QueryExecution qe = null;
try{
@ -153,9 +154,9 @@ public class ProcessSearchIndividualsDataGetterN3 extends ProcessDataGetterAbst
Literal saveToVarLiteral = qs.getLiteral("saveToVar");
Resource vclassUriResource = qs.getResource("vclassUri");
String vclassUriString = vclassUriResource.getURI();
jObject.element("saveToVar", saveToVarLiteral.getString());
jObject.put("saveToVar", saveToVarLiteral.getString());
//TODO: Handle single and double quotes within string and escape properlyu
jObject.element("vclassUri", vclassUriString);
jObject.put("vclassUri", vclassUriString);
}
} catch(Exception ex) {
log.error("Exception occurred in retrieving existing values with query " + querystr, ex);

View file

@ -2,15 +2,14 @@
package edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.preprocessors.utils;
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.List;
import javax.servlet.ServletContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.jena.ontology.OntModel;
import org.apache.jena.query.Query;
import org.apache.jena.query.QueryExecution;
@ -20,12 +19,12 @@ import org.apache.jena.query.QuerySolution;
import org.apache.jena.query.ResultSet;
import org.apache.jena.rdf.model.Literal;
import org.apache.jena.rdf.model.Resource;
import javax.servlet.ServletContext;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.fields.FieldVTwo;
import net.sf.json.JSONObject;
import net.sf.json.JSONSerializer;
//Returns the appropriate n3 based on data getter
public class ProcessSparqlDataGetterN3 extends ProcessDataGetterAbstract {
private static String classType = "java:edu.cornell.mannlib.vitro.webapp.utils.dataGetter.SparqlQueryDataGetter";
@ -157,10 +156,10 @@ public class ProcessSparqlDataGetterN3 extends ProcessDataGetterAbstract {
public JSONObject getExistingValuesJSON(String dataGetterURI, OntModel queryModel, ServletContext context) {
JSONObject jObject = new JSONObject();
jObject.element("dataGetterClass", classType);
jObject.element(classTypeVarBase, classType);
public ObjectNode getExistingValuesJSON(String dataGetterURI, OntModel queryModel, ServletContext context) {
ObjectNode jObject = new ObjectMapper().createObjectNode();
jObject.put("dataGetterClass", classType);
jObject.put(classTypeVarBase, classType);
String querystr = getExistingValuesSparqlQuery(dataGetterURI);
QueryExecution qe = null;
try{
@ -179,12 +178,12 @@ public class ProcessSparqlDataGetterN3 extends ProcessDataGetterAbstract {
//or incorrect html
queryString = replaceQuotes(queryString);
Resource queryModelResource = qs.getResource("queryModel");
jObject.element("saveToVar", saveToVarLiteral.getString());
jObject.element("query",queryString);
jObject.put("saveToVar", saveToVarLiteral.getString());
jObject.put("query", queryString);
if(queryModelResource != null) {
jObject.element("queryModel", queryModelResource.getURI());
jObject.put("queryModel", queryModelResource.getURI());
} else {
jObject.element("queryModel", "");
jObject.put("queryModel", "");
}
}

View file

@ -0,0 +1,81 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.utils.json;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.core.io.JsonStringEncoder;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
/**
* Some utility methods to ease the transition from net.sf.json to Jackson.
*/
public class JacksonUtils {
private static final String QUOTE = "\"";
/**
* A "clean room" replacement for net.sf.json.util.JSONUtils.quote().
*/
public static String quote(String raw) {
if (raw == null) {
// Null string is treated like an empty string.
return QUOTE + QUOTE;
} else {
return new StringBuilder(QUOTE)
.append(JsonStringEncoder.getInstance().quoteAsString(raw))
.append(QUOTE).toString();
}
}
/**
* net.sf.json could parse a JSON string without throwing a checked
* exception. Make it so we can do the same with Jackson.
*/
public static JsonNode parseJson(String json) {
try {
return new ObjectMapper().readTree(json);
} catch (IOException e) {
throw new JacksonUtilsException(e);
}
}
/**
* net.sf.json provided this method (assuming that 'values' is an array of
* JSON objects that contain Strings.
*
* literalValues = (List<String>) JSONSerializer.toJava(values);
*
* So here is a replacement for that.
*/
public static List<String> jsonArrayToStrings(ArrayNode values) {
List<String> strings = new ArrayList<>();
for (JsonNode node : values) {
strings.add(node.asText());
}
return strings;
}
public static class JacksonUtilsException extends RuntimeException {
public JacksonUtilsException() {
super();
}
public JacksonUtilsException(String message, Throwable cause) {
super(message, cause);
}
public JacksonUtilsException(String message) {
super(message);
}
public JacksonUtilsException(Throwable cause) {
super(cause);
}
}
}

View file

@ -11,7 +11,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.jena.query.QuerySolution;
import org.apache.jena.query.ResultSet;
import org.apache.jena.rdf.model.RDFNode;

View file

@ -0,0 +1,148 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.controller.freemarker;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.PolicyOption.POLICY_NEUTRAL;
import org.junit.Before;
import org.junit.Test;
import com.fasterxml.jackson.databind.JsonNode;
import edu.cornell.mannlib.vitro.webapp.beans.VClass;
import edu.cornell.mannlib.vitro.webapp.beans.VClassGroup;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.VClassGroupDaoStub;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactoryStub;
import stubs.edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccessFactoryStub;
import stubs.javax.servlet.http.HttpServletRequestStub;
/**
* Not a well-formed set of unit tests. But it's a pretty good exercise of the
* different possibilities in the output stage.
*
* Test plan:
*
* <pre>
* No data - roots is null -- NONSENSICAL
* No data - roots is empty
*
* name
* no name
*
* displayRank
* no displayRank
*
* no child classes
* child classes
*
* child class has name
* child class has no name
*
* child class has shortDef
* child class has no shortDef
*
* G1 no name, displayRank, no classes
* G2 name, no displayRank, classes
* G2C1 no name, no shortDef
* G2C2 name, shortdef
*
* Try once with no data
* Try with all data
* </pre>
*/
public class ListClassGroupsControllerTest extends ListControllerTestBase {
private static final String LINK_FORMAT_GROUP = "<a href='./editForm?uri=%s&amp;controller=Classgroup'>%s</a>";
private static final String LINK_FORMAT_CLASS = "<a href='vclassEdit?uri=%s'>%s</a>";
private static final String GROUP1 = "http://ont1/group1";
private static final String GROUP2 = "http://ont1/group2";
private static final String CLASS1 = "http://ont1/class1";
private static final String CLASS2 = "http://ont1/class2";
private static final String CLASS2_NAME = "The Second Class";
private static final String CLASS2_SHORT_DEF = "A Marvelous Class";
private static final int GROUP1_RANK = 5;
private static final String GROUP2_NAME = "The Second Group";
private static final JsonNode JSON_EMPTY_RESPONSE = arrayOf();
private static final JsonNode JSON_FULL_RESPONSE = arrayOf(
groupListNode(LINK_FORMAT_GROUP, GROUP1, "(unnamed group)",
"" + GROUP1_RANK),
groupListNode(LINK_FORMAT_GROUP, GROUP2, GROUP2_NAME, "",
groupMemberNode("", "", "", ""),
groupMemberNode(LINK_FORMAT_CLASS, CLASS2, CLASS2_NAME,
CLASS2_SHORT_DEF)));
private ListClassGroupsController controller;
private HttpServletRequestStub req;
private ModelAccessFactoryStub modelsFactory;
private WebappDaoFactoryStub wadf;
private VClassGroupDaoStub vcgDao;
@Before
public void setup() {
controller = new ListClassGroupsController();
req = new HttpServletRequestStub();
vcgDao = new VClassGroupDaoStub();
wadf = new WebappDaoFactoryStub();
wadf.setVClassGroupDao(vcgDao);
modelsFactory = new ModelAccessFactoryStub();
modelsFactory.get(req).setWebappDaoFactory(wadf, POLICY_NEUTRAL);
}
// ----------------------------------------------------------------------
// The tests
// ----------------------------------------------------------------------
@Test
public void noData() throws Exception {
assertMatchingJson(controller, req, JSON_EMPTY_RESPONSE);
}
@Test
public void basicJsonTest() throws Exception {
populate();
/*
* The controller attempts to handle the case of a class with no name,
* but instead it returns invalid json.
*/
String rawResponse = getJsonFromController(controller, req);
String kluged = rawResponse.replace("[\"\"", "[ {\"name\": \"\"");
assertKlugedJson(JSON_FULL_RESPONSE, kluged);
// assertMatchingJson(controller, req, JSON_FULL_RESPONSE);
}
// ----------------------------------------------------------------------
// Helper methods
// ----------------------------------------------------------------------
private void populate() {
vcgDao.setGroups(vClassGroup(GROUP1, null, GROUP1_RANK),
vClassGroup(GROUP2, GROUP2_NAME, -1, vclass(CLASS1, null, null),
vclass(CLASS2, CLASS2_NAME, CLASS2_SHORT_DEF)));
}
private VClassGroup vClassGroup(String uri, String name, int rank,
VClass... vClasses) {
VClassGroup group = new VClassGroup(uri, name, rank);
for (VClass vClass : vClasses) {
group.add(vClass);
}
return group;
}
private VClass vclass(String uri, String name, String shortDef) {
VClass vc = new VClass(uri);
vc.setName(name);
vc.setShortDef(shortDef);
return vc;
}
}

View file

@ -0,0 +1,185 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.controller.freemarker;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import javax.servlet.http.HttpServletRequest;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import edu.cornell.mannlib.vitro.testing.AbstractTestClass;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues;
/**
* Some useful methods for assembling JSON structures that will match the test
* results.
*
* Also, some methods for running the tests, with and without kluging the
* results.
*/
public class ListControllerTestBase extends AbstractTestClass {
protected static ObjectMapper mapper = new ObjectMapper();
/**
* Create a JSON array from nodes.
*/
protected static ArrayNode arrayOf(JsonNode... nodes) {
ArrayNode array = mapper.createArrayNode();
for (JsonNode node : nodes) {
array.add(node);
}
return array;
}
/**
* Show a DataProperty or an ObjectProperty in a list.
*/
protected static ObjectNode propertyListNode(String path, String uri,
String name, String internalName, String domainVClass,
String rangeVClass, String group) {
String nameString = String.format("<a href='%s?uri=%s'>%s</a>", path,
urlEncode(uri), name);
ObjectNode propNode = mapper.createObjectNode().put("name", nameString);
propNode.putObject("data").put("internalName", internalName)
.put("domainVClass", domainVClass)
.put("rangeVClass", rangeVClass).put("group", group);
return propNode;
}
/**
* Show a DataProperty or an ObjectProperty in a hierarchy.
*/
protected static ObjectNode propertyHierarchyNode(String path, String uri,
String name, String internalName, String domainVClass,
String rangeVClass, String group, ObjectNode... children) {
ObjectNode propNode = propertyListNode(path, uri, name, internalName,
domainVClass, rangeVClass, group);
propNode.set("children", arrayOf(children));
return propNode;
}
/**
* Show a VClass in a list.
*/
protected static ObjectNode degenerateVclassListNode(String name,
String shortDef, String classGroup, String ontology) {
ObjectNode vcNode = mapper.createObjectNode().put("name", name);
vcNode.putObject("data").put("shortDef", shortDef)
.put("classGroup", classGroup).put("ontology", ontology);
return vcNode;
}
/**
* Show a VClass in a list.
*/
protected static ObjectNode vclassListNode(String path, String uri,
String name, String shortDef, String classGroup, String ontology) {
String nameString = String.format("<a href='%s?uri=%s'>%s</a>", path,
urlEncode(uri), name);
ObjectNode vcNode = mapper.createObjectNode().put("name", nameString);
vcNode.putObject("data").put("shortDef", shortDef)
.put("classGroup", classGroup).put("ontology", ontology);
return vcNode;
}
/**
* Show a VClass in a hierarchy.
*/
protected static ObjectNode vclassHierarchyNode(String path, String uri,
String name, String shortDef, String classGroup, String ontology,
ObjectNode... children) {
ObjectNode vcNode = vclassListNode(path, uri, name, shortDef,
classGroup, ontology);
vcNode.set("children", arrayOf(children));
return vcNode;
}
/**
* Show a ClassGroup or PropertyGroup in a list.
*/
protected static ObjectNode groupListNode(String linkFormat, String uri,
String name, String displayRank, ObjectNode... children) {
String nameString = String.format(linkFormat, urlEncode(uri), name);
ObjectNode gNode = mapper.createObjectNode().put("name", nameString);
gNode.putObject("data").put("displayRank", displayRank);
gNode.set("children", arrayOf(children));
return gNode;
}
/**
* Show a Class or Property as part of a Group.
*/
protected static ObjectNode groupMemberNode(String linkFormat, String uri,
String name, String shortDef, ObjectNode... children) {
String nameString = String.format(linkFormat, urlEncode(uri), name);
ObjectNode memberNode = mapper.createObjectNode().put("name",
nameString);
memberNode.putObject("data").put("shortDef", shortDef);
memberNode.set("children", arrayOf(children));
return memberNode;
}
/**
* Based on the fact that each of these controllers returns a
* TemplateResponseValues object with a "jsonTree" in the body map.
*
* That jsonTree would be an standard JSON array, except that it is missing
* the enclosing brackets, so we need to add them before comparing to the
* expected value.
*
* Add the brackets, read the strings, and compare.
*/
protected static void assertMatchingJson(FreemarkerHttpServlet controller,
HttpServletRequest req, JsonNode expected) throws Exception {
String jsonString = getJsonFromController(controller, req);
JsonNode actual = mapper.readTree("[" + jsonString + "]");
assertEquals(expected, actual);
}
/**
* Some of the controllers have edge cases that produce invalid JSON, even
* when wrapped in enclosing brackets. For those cases, call this method,
* massage the result to form valid JSON, and call assertKlugedJson().
*/
protected static String getJsonFromController(
FreemarkerHttpServlet controller, HttpServletRequest req)
throws Exception {
ResponseValues rv = controller.processRequest(new VitroRequest(req));
assertTrue(rv instanceof TemplateResponseValues);
TemplateResponseValues trv = (TemplateResponseValues) rv;
Object o = trv.getMap().get("jsonTree");
assertTrue(o instanceof String);
String jsonString = (String) o;
return jsonString;
}
/**
* If it was necessary to manipulate the response from the controller, this
* is how to test it.
*/
protected void assertKlugedJson(JsonNode expected,
String klugedActualString) throws Exception {
JsonNode actual = mapper.readTree("[" + klugedActualString + "]");
assertEquals(expected, actual);
}
private static String urlEncode(String uri) {
try {
return URLEncoder.encode(uri, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return uri;
}
}
}

View file

@ -0,0 +1,255 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.controller.freemarker;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.LanguageOption.LANGUAGE_NEUTRAL;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.PolicyOption.POLICY_NEUTRAL;
import java.text.Collator;
import org.junit.Before;
import org.junit.Test;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import edu.cornell.mannlib.vitro.webapp.beans.DataProperty;
import edu.cornell.mannlib.vitro.webapp.beans.Datatype;
import edu.cornell.mannlib.vitro.webapp.beans.PropertyGroup;
import edu.cornell.mannlib.vitro.webapp.beans.VClass;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.DataPropertyDaoStub;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.DatatypeDaoStub;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.PropertyGroupDaoStub;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.VClassDaoStub;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactoryStub;
import stubs.edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccessFactoryStub;
import stubs.javax.servlet.http.HttpServletRequestStub;
/**
* Not a well-formed set of unit tests. But it's a pretty good exercise of the
* different possibilities in the output stage.
*
* Test plan:
*
* <pre>
* No data - roots is null -- NONSENSICAL
* No data - roots is empty
*
* Ontology is not specified
* Ontology is specified and matches
* Ontology is specified and does not match
* DataProperty does not match Ontology, but has child properties that do.
*
* Name from picklistName
* Name from getName
* Name from getUri
* Name no URL? -- NONSENSICAL
*
* InternalName from picklistName
* InternalName missing.
*
* Domain class no class URI
* Domain class no class for URI
* Domain class get picklistName from Language Aware DAO
* Domain class use picklistName from Language Neutral DAO
*
* Range no range URI
* Range no datatype for URI
* Range datatype has no name
* Range has a name
*
* Group no group URI
* Group no group for URI
* Group no name
* Group has a name
*
* DP1 Ont1, no name, no picklistName, no domainClass, no RangeClass, no GroupURI
* DP2 Ont2, name, no picklistName, no domain class for URI, no range datatype for URI, no group for GroupURI
* DP3 Ont1, picklistname, domainclass no picklistname, range datatype with no name, group has no name
* DP4 Ont1, picklistname, domainclass w/picklistname, range datatype with name, group with name
*
* Try once with no data
* Try with all data and no ontology specified
* Try with all data and Ont1, Ont2, Ont3
* </pre>
*/
public class ListDatatypePropertiesControllerTest
extends ListControllerTestBase {
private static final String PATH = "datapropEdit";
private static final String ONT1 = "http://ont1/";
private static final String ONT2 = "http://ont2/";
private static final String ONT3 = "http://ont3/";
private static final String DP1 = ONT1 + "first";
private static final String DP2 = ONT2 + "second";
private static final String DP3 = ONT1 + "third";
private static final String DP4 = ONT1 + "fourth";
private static final String DP2_NAME = "TWO";
private static final String DP3_NAME = "THREE";
private static final String DP4_NAME = "FOUR";
private static final String DP3_PICK_NAME = "The third one";
private static final String DP4_PICK_NAME = "The fourth one";
private static final String DOMAIN_NONE = "http://domain/noSuchDomain";
private static final String DOMAIN_NO_NAME = "http://domain/domainWithNoName";
private static final String DOMAIN_W_NAME = "http://domain/namedDomain";
private static final String NAME_DOMAIN = "An excellent domain";
private static final String RANGE_NONE = "http://domain/noSuchRange";
private static final String RANGE_NO_NAME = "http://domain/rangeWithNoName";
private static final String RANGE_W_NAME = "http://domain/namedRange";
private static final String NAME_RANGE = "Home on the range";
private static final String GROUP_NONE = "http://domain/noSuchGroup";
private static final String GROUP_NO_NAME = "http://domain/groupWithNoName";
private static final String GROUP_W_NAME = "http://domain/namedGroup";
private static final String NAME_GROUP = "The Groupsters";
private static final ArrayNode NO_DATA_RESPONSE = arrayOf(
mapper.createObjectNode().put("name", "No data properties found"));
private static final JsonNode RESPONSE_UNFILTERED = arrayOf(
propertyListNode(PATH, DP1, "first", "first", "", "",
"unspecified"),
propertyListNode(PATH, DP2, "second", "second", "", RANGE_NONE,
"unknown group"),
propertyListNode(PATH, DP4, DP4_PICK_NAME, DP4_PICK_NAME,
NAME_DOMAIN, NAME_RANGE, NAME_GROUP),
propertyListNode(PATH, DP3, DP3_PICK_NAME, DP3_PICK_NAME,
"domainWithNoName", "", ""));
private static final JsonNode RESPONSE_FILTERED_BY_ONT1 = arrayOf(
propertyListNode(PATH, DP1, "first", "first", "", "",
"unspecified"),
propertyListNode(PATH, DP4, DP4_PICK_NAME, DP4_PICK_NAME,
NAME_DOMAIN, NAME_RANGE, NAME_GROUP),
propertyListNode(PATH, DP3, DP3_PICK_NAME, DP3_PICK_NAME,
"domainWithNoName", "", ""));
private static final JsonNode RESPONSE_FILTERED_BY_ONT2 = arrayOf(
propertyListNode(PATH, DP2, "second", "second", "", RANGE_NONE,
"unknown group"));
private static final JsonNode RESPONSE_FILTERED_BY_ONT3 = arrayOf(
mapper.createObjectNode().put("name", "No data properties found"));
private ListDatatypePropertiesController controller;
private HttpServletRequestStub req;
private ModelAccessFactoryStub modelsFactory;
private WebappDaoFactoryStub wadf;
private DataPropertyDaoStub dpdao;
private DatatypeDaoStub dtdao;
private VClassDaoStub vcdao;
private PropertyGroupDaoStub pgdao;
@Before
public void setup() {
controller = new ListDatatypePropertiesController();
req = new HttpServletRequestStub();
new VitroRequest(req).setCollator(Collator.getInstance());
dpdao = new DataPropertyDaoStub();
dtdao = new DatatypeDaoStub();
vcdao = new VClassDaoStub();
pgdao = new PropertyGroupDaoStub();
wadf = new WebappDaoFactoryStub();
wadf.setDataPropertyDao(dpdao);
wadf.setDatatypeDao(dtdao);
wadf.setVClassDao(vcdao);
wadf.setPropertyGroupDao(pgdao);
modelsFactory = new ModelAccessFactoryStub();
modelsFactory.get(req).setWebappDaoFactory(wadf, POLICY_NEUTRAL);
modelsFactory.get(req).setWebappDaoFactory(wadf, LANGUAGE_NEUTRAL,
POLICY_NEUTRAL);
}
// ----------------------------------------------------------------------
// The tests
// ----------------------------------------------------------------------
@Test
public void noDataProperties() throws Exception {
assertMatchingJson(controller, req, NO_DATA_RESPONSE);
}
@Test
public void unfiltered() throws Exception {
populate();
assertMatchingJson(controller, req, RESPONSE_UNFILTERED);
}
@Test
public void filteredByOnt1() throws Exception {
populate();
req.addParameter("ontologyUri", ONT1);
assertMatchingJson(controller, req, RESPONSE_FILTERED_BY_ONT1);
}
@Test
public void filteredByOnt2() throws Exception {
populate();
req.addParameter("ontologyUri", ONT2);
assertMatchingJson(controller, req, RESPONSE_FILTERED_BY_ONT2);
}
@Test
public void filteredByOnt3() throws Exception {
populate();
req.addParameter("ontologyUri", ONT3);
assertMatchingJson(controller, req, RESPONSE_FILTERED_BY_ONT3);
}
// ----------------------------------------------------------------------
// Helper methods
// ----------------------------------------------------------------------
private void populate() {
vcdao.setVClass(vclass(DOMAIN_NO_NAME, null));
vcdao.setVClass(vclass(DOMAIN_W_NAME, NAME_DOMAIN));
dtdao.addDatatype(datatype(RANGE_NO_NAME, null));
dtdao.addDatatype(datatype(RANGE_W_NAME, NAME_RANGE));
pgdao.addPropertyGroup(propertyGroup(GROUP_NO_NAME, null));
pgdao.addPropertyGroup(propertyGroup(GROUP_W_NAME, NAME_GROUP));
dpdao.addDataProperty(dataProperty(DP1, null, null, null, null, null));
dpdao.addDataProperty(dataProperty(DP2, DP2_NAME, null, DOMAIN_NONE,
RANGE_NONE, GROUP_NONE));
dpdao.addDataProperty(dataProperty(DP3, DP3_NAME, DP3_PICK_NAME,
DOMAIN_NO_NAME, RANGE_NO_NAME, GROUP_NO_NAME));
dpdao.addDataProperty(dataProperty(DP4, DP4_NAME, DP4_PICK_NAME,
DOMAIN_W_NAME, RANGE_W_NAME, GROUP_W_NAME));
}
private DataProperty dataProperty(String uri, String name,
String pickListName, String domainClassUri, String rangeDatatypeUri,
String groupUri) {
DataProperty dp = new DataProperty();
dp.setURI(uri);
dp.setName(name);
dp.setPickListName(pickListName);
dp.setDomainClassURI(domainClassUri);
dp.setRangeDatatypeURI(rangeDatatypeUri);
dp.setGroupURI(groupUri);
return dp;
}
private Datatype datatype(String uri, String name) {
Datatype dt = new Datatype();
dt.setUri(uri);
dt.setName(name);
return dt;
}
private VClass vclass(String uri, String pickListName) {
VClass vc = new VClass();
vc.setURI(uri);
vc.setPickListName(pickListName);
return vc;
}
private PropertyGroup propertyGroup(String uri, String name) {
PropertyGroup pg = new PropertyGroup();
pg.setURI(uri);
pg.setName(name);
return pg;
}
}

View file

@ -0,0 +1,170 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.controller.freemarker;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.PolicyOption.POLICY_NEUTRAL;
import java.util.ArrayList;
import java.util.Arrays;
import org.junit.Before;
import org.junit.Test;
import com.fasterxml.jackson.databind.JsonNode;
import edu.cornell.mannlib.vitro.webapp.beans.DataProperty;
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 stubs.edu.cornell.mannlib.vitro.webapp.dao.PropertyGroupDaoStub;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactoryStub;
import stubs.edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccessFactoryStub;
import stubs.javax.servlet.http.HttpServletRequestStub;
/**
* Not a well-formed set of unit tests. But it's a pretty good exercise of the
* different possibilities in the output stage.
*
* Test plan:
*
* <pre>
* No data - roots is null -- NONSENSICAL
* No data - roots is empty
*
* name
* no name - (unnamed group)
*
* display rank
* no display rank
*
* no child properties
* child property is data property
* child properti is object property
*
* child data property has no name
* child data property has name
* child object property has no domainPublic
* child object property has domainPublic
*
* G1 no name, displayRank, no classes
* G2 name, no displayRank, classes
* G2DP1 no name, no shortDef
* G2DP2 name, shortdef
* G2OP1 no domainPublic, no shortDef
* G2OP2 domainPublic, shortdef
*
* Try once with no data
* Try with all data
* </pre>
*/
public class ListPropertyGroupsControllerTest extends ListControllerTestBase {
private static final String LINK_FORMAT_GROUP = "<a href='./editForm?uri=%s&amp;controller=PropertyGroup'>%s</a>";
private static final String LINK_FORMAT_DATA_PROPERTY = "<a href='datapropEdit?uri=%s'>%s</a>";
private static final String LINK_FORMAT_OBJECT_PROPERTY = "<a href='propertyEdit?uri=%s'>%s</a>";
private static final String GROUP1 = "http://ont1/group1";
private static final String GROUP2 = "http://ont1/group2";
private static final String DP1 = "http://ont1/dp1";
private static final String DP2 = "http://ont1/dp2";
private static final String OP1 = "http://ont1/op1";
private static final String OP2 = "http://ont1/op2";
private static final String DP2_NAME = "A second data property";
private static final String OP2_DOMAIN_PUBLIC = "The second domain";
private static final int GROUP1_RANK = 5;
private static final String GROUP2_NAME = "The Second Group";
private static final JsonNode JSON_EMPTY_RESPONSE = arrayOf();
private static final JsonNode JSON_FULL_RESPONSE = arrayOf(
groupListNode(LINK_FORMAT_GROUP, GROUP2, GROUP2_NAME, "",
groupMemberNode(LINK_FORMAT_DATA_PROPERTY, DP1, null, ""),
groupMemberNode(LINK_FORMAT_DATA_PROPERTY, DP2, DP2_NAME,
""),
groupMemberNode(LINK_FORMAT_OBJECT_PROPERTY, OP1, null, ""),
groupMemberNode(LINK_FORMAT_OBJECT_PROPERTY, OP2,
OP2_DOMAIN_PUBLIC, "")),
groupListNode(LINK_FORMAT_GROUP, GROUP1, "(unnamed group)",
"" + GROUP1_RANK));
private ListPropertyGroupsController controller;
private HttpServletRequestStub req;
private ModelAccessFactoryStub modelsFactory;
private WebappDaoFactoryStub wadf;
private PropertyGroupDaoStub pgdao;
@Before
public void setup() {
controller = new ListPropertyGroupsController();
req = new HttpServletRequestStub();
pgdao = new PropertyGroupDaoStub();
wadf = new WebappDaoFactoryStub();
wadf.setPropertyGroupDao(pgdao);
modelsFactory = new ModelAccessFactoryStub();
modelsFactory.get(req).setWebappDaoFactory(wadf, POLICY_NEUTRAL);
}
// ----------------------------------------------------------------------
// The tests
// ----------------------------------------------------------------------
@Test
public void noData() throws Exception {
assertMatchingJson(controller, req, JSON_EMPTY_RESPONSE);
}
@Test
public void basicJsonTest() throws Exception {
populate();
// /*
// * The controller attempts to handle the case of a class with no name,
// * but instead it returns invalid json.
// */
// String rawResponse = getJsonFromController(controller, req);
// String kluged = rawResponse.replace("[\"\"", "[ {\"name\": \"\"");
// assertKlugedJson(JSON_FULL_RESPONSE, kluged);
assertMatchingJson(controller, req, JSON_FULL_RESPONSE);
}
// ----------------------------------------------------------------------
// Helper methods
// ----------------------------------------------------------------------
private void populate() {
pgdao.addPropertyGroup(propertyGroup(GROUP1, "", GROUP1_RANK));
pgdao.addPropertyGroup(
propertyGroup(GROUP2, GROUP2_NAME, -1, dataProperty(DP1, null),
dataProperty(DP2, DP2_NAME), objectProperty(OP1, null),
objectProperty(OP2, OP2_DOMAIN_PUBLIC)));
}
private PropertyGroup propertyGroup(String uri, String name,
int displayRank, Property... properties) {
PropertyGroup pg = new PropertyGroup();
pg.setURI(uri);
pg.setName(name);
pg.setDisplayRank(displayRank);
pg.setPropertyList(new ArrayList<>(Arrays.asList(properties)));
return pg;
}
private ObjectProperty objectProperty(String uri, String name) {
ObjectProperty op = new ObjectProperty();
op.setURI(uri);
op.setDomainPublic(name);
return op;
}
private DataProperty dataProperty(String uri, String name) {
DataProperty dp = new DataProperty();
dp.setURI(uri);
dp.setName(name);
return dp;
}
}

View file

@ -0,0 +1,253 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.controller.freemarker;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.LanguageOption.LANGUAGE_NEUTRAL;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.PolicyOption.POLICY_NEUTRAL;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Arrays;
import org.junit.Before;
import org.junit.Test;
import com.fasterxml.jackson.databind.JsonNode;
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.beans.VClass;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.ObjectPropertyDaoStub;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.OntologyDaoStub;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.PropertyGroupDaoStub;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.VClassDaoStub;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactoryStub;
import stubs.edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccessFactoryStub;
import stubs.javax.servlet.http.HttpServletRequestStub;
/**
* Not a well-formed set of unit tests. But it's a pretty good exercise of the
* different possibilities in the output stage.
*
* Test plan:
*
* <pre>
* No data - roots is null -- NONSENSICAL
* No data - roots is empty
*
* Ontology is not specified
* Ontology is specified and matches
* Ontology is specified and does not match
* DataProperty does not match Ontology, but has child properties that do.
*
* Name from picklistName
* Name from getUri
* Name no URL? -- NONSENSICAL
*
* InternalName from localNameWithPrefix
* InternalName from localName
* InternalName from URI
*
* Domain class no class URI
* Domain class no class for URI
* Domain class use picklistName
*
* Range class no class URI
* Range class no class for URI
* Range class use picklistName
*
* Group no group URI
* Group no group for URI
* Group no name
* Group has a name
*
* OP1 Ont1, no picklistName, no localNameWithPrefix, no domainClass, no rangeClass, no GroupURI
* OP2 Ont2, picklistName, no localNameWithPrefix, no domain class for URI, no range class for URI, no group for GroupURI
* OP3 Ont1, picklistName, localNameWithPrefix, domainclass no picklistname, range class no picklistname, group has no name
* OP4 Ont1, picklistName, localNameWithPrefix, domainclass w/picklistname, range class w/picklistname, group with name
*
* Try once with no data
* Try with all data and no ontology specified
* Try with all data and Ont1, Ont2, Ont3
* </pre>
*/
public class ListPropertyWebappsControllerTest extends ListControllerTestBase {
private static final String PATH = "./propertyEdit";
private static final String ONT1 = "http://ont1/";
private static final String ONT2 = "http://ont2/";
private static final String ONT3 = "http://ont3/";
private static final String OP1 = ONT1 + "first";
private static final String OP2 = ONT2 + "second";
private static final String OP3 = ONT1 + "third";
private static final String OP4 = ONT1 + "fourth";
private static final String OP2_PICK_NAME = "The second one";
private static final String OP3_PICK_NAME = "The third one";
private static final String OP4_PICK_NAME = "The fourth one";
private static final String OP3_LOCALNAME_W_PREFIX = "ontology1:third";
private static final String OP4_LOCALNAME_W_PREFIX = "ontology1:fourth";
private static final String DOMAIN_NONE = "http://domain/noSuchDomain";
private static final String DOMAIN_NO_NAME = "http://domain/domainWithNoName";
private static final String DOMAIN_W_NAME = "http://domain/namedDomain";
private static final String NAME_DOMAIN = "An excellent domain";
private static final String RANGE_NONE = "http://domain/noSuchRange";
private static final String RANGE_NO_NAME = "http://domain/rangeWithNoName";
private static final String RANGE_W_NAME = "http://domain/namedRange";
private static final String NAME_RANGE = "Home on the range";
private static final String GROUP_NONE = "http://domain/noSuchGroup";
private static final String GROUP_NO_NAME = "http://domain/groupWithNoName";
private static final String GROUP_W_NAME = "http://domain/namedGroup";
private static final String NAME_GROUP = "The Groupsters";
private static final JsonNode NO_DATA_RESPONSE = arrayOf(mapper
.createObjectNode().put("name", "No object properties found"));
private static final JsonNode RESPONSE_UNFILTERED = arrayOf(
propertyListNode(PATH, OP1, "first", "first", "", "",
"unspecified"),
propertyListNode(PATH, OP4, OP4_PICK_NAME, OP4_LOCALNAME_W_PREFIX,
NAME_DOMAIN, NAME_RANGE, NAME_GROUP),
propertyListNode(PATH, OP2, OP2_PICK_NAME, "second", "", "",
"unknown group"),
propertyListNode(PATH, OP3, OP3_PICK_NAME, OP3_LOCALNAME_W_PREFIX,
"domainWithNoName", "rangeWithNoName", ""));
private static final JsonNode RESPONSE_FILTERED_BY_ONT1 = arrayOf(
propertyListNode(PATH, OP1, "first", "first", "", "",
"unspecified"),
propertyListNode(PATH, OP4, OP4_PICK_NAME, OP4_LOCALNAME_W_PREFIX,
NAME_DOMAIN, NAME_RANGE, NAME_GROUP),
propertyListNode(PATH, OP3, OP3_PICK_NAME, OP3_LOCALNAME_W_PREFIX,
"domainWithNoName", "rangeWithNoName", ""));
private static final JsonNode RESPONSE_FILTERED_BY_ONT2 = arrayOf(
propertyListNode(PATH, OP2, OP2_PICK_NAME, "second", "", "",
"unknown group"));
private static final JsonNode RESPONSE_FILTERED_BY_ONT3 = arrayOf(mapper
.createObjectNode().put("name", "No object properties found"));
private ListPropertyWebappsController controller;
private HttpServletRequestStub req;
private ModelAccessFactoryStub modelsFactory;
private WebappDaoFactoryStub wadf;
private ObjectPropertyDaoStub opdao;
private OntologyDaoStub odao;
private PropertyGroupDaoStub pgdao;
private VClassDaoStub vcdao;
@Before
public void setup() {
controller = new ListPropertyWebappsController();
req = new HttpServletRequestStub();
new VitroRequest(req).setCollator(Collator.getInstance());
opdao = new ObjectPropertyDaoStub();
odao = new OntologyDaoStub();
pgdao = new PropertyGroupDaoStub();
vcdao = new VClassDaoStub();
wadf = new WebappDaoFactoryStub();
wadf.setObjectPropertyDao(opdao);
wadf.setOntologyDao(odao);
wadf.setPropertyGroupDao(pgdao);
wadf.setVClassDao(vcdao);
modelsFactory = new ModelAccessFactoryStub();
modelsFactory.get(req).setWebappDaoFactory(wadf, POLICY_NEUTRAL);
modelsFactory.get(req).setWebappDaoFactory(wadf, POLICY_NEUTRAL,
LANGUAGE_NEUTRAL);
}
// ----------------------------------------------------------------------
// The tests
// ----------------------------------------------------------------------
@Test
public void noDataProperties() throws Exception {
assertMatchingJson(controller, req, NO_DATA_RESPONSE);
}
@Test
public void unfiltered() throws Exception {
populate();
assertMatchingJson(controller, req, RESPONSE_UNFILTERED);
}
@Test
public void filteredByOnt1() throws Exception {
populate();
req.addParameter("ontologyUri", ONT1);
assertMatchingJson(controller, req, RESPONSE_FILTERED_BY_ONT1);
}
@Test
public void filteredByOnt2() throws Exception {
populate();
req.addParameter("ontologyUri", ONT2);
assertMatchingJson(controller, req, RESPONSE_FILTERED_BY_ONT2);
}
@Test
public void filteredByOnt3() throws Exception {
populate();
req.addParameter("ontologyUri", ONT3);
assertMatchingJson(controller, req, RESPONSE_FILTERED_BY_ONT3);
}
// ----------------------------------------------------------------------
// Helper methods
// ----------------------------------------------------------------------
private void populate() {
vcdao.setVClass(vclass(DOMAIN_NO_NAME, null));
vcdao.setVClass(vclass(DOMAIN_W_NAME, NAME_DOMAIN));
vcdao.setVClass(vclass(RANGE_NO_NAME, null));
vcdao.setVClass(vclass(RANGE_W_NAME, NAME_RANGE));
pgdao.addPropertyGroup(propertyGroup(GROUP_NO_NAME, null, 5));
pgdao.addPropertyGroup(propertyGroup(GROUP_W_NAME, NAME_GROUP, 3));
opdao.addObjectProperty(
objectProperty(OP1, null, null, null, null, null));
opdao.addObjectProperty(objectProperty(OP2, OP2_PICK_NAME, null,
DOMAIN_NONE, RANGE_NONE, GROUP_NONE));
opdao.addObjectProperty(
objectProperty(OP3, OP3_PICK_NAME, OP3_LOCALNAME_W_PREFIX,
DOMAIN_NO_NAME, RANGE_NO_NAME, GROUP_NO_NAME));
opdao.addObjectProperty(
objectProperty(OP4, OP4_PICK_NAME, OP4_LOCALNAME_W_PREFIX,
DOMAIN_W_NAME, RANGE_W_NAME, GROUP_W_NAME));
}
private PropertyGroup propertyGroup(String uri, String name,
int displayRank, Property... properties) {
PropertyGroup pg = new PropertyGroup();
pg.setURI(uri);
pg.setName(name);
pg.setDisplayRank(displayRank);
pg.setPropertyList(new ArrayList<>(Arrays.asList(properties)));
return pg;
}
private ObjectProperty objectProperty(String uri, String name,
String localNameWithPrefix, String domainVClass, String rangeVClass,
String propertyGroup) {
ObjectProperty op = new ObjectProperty();
op.setURI(uri);
op.setPickListName(name);
op.setLocalNameWithPrefix(localNameWithPrefix);
op.setRangeVClassURI(rangeVClass);
op.setDomainVClassURI(domainVClass);
op.setGroupURI(propertyGroup);
return op;
}
private VClass vclass(String uri, String name) {
VClass vc = new VClass();
vc.setURI(uri);
vc.setPickListName(name);
return vc;
}
}

View file

@ -0,0 +1,233 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.controller.freemarker;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.PolicyOption.POLICY_NEUTRAL;
import java.text.Collator;
import org.junit.Before;
import org.junit.Test;
import com.fasterxml.jackson.databind.JsonNode;
import edu.cornell.mannlib.vitro.webapp.beans.Ontology;
import edu.cornell.mannlib.vitro.webapp.beans.VClass;
import edu.cornell.mannlib.vitro.webapp.beans.VClassGroup;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.OntologyDaoStub;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.VClassDaoStub;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.VClassGroupDaoStub;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactoryStub;
import stubs.edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccessFactoryStub;
import stubs.javax.servlet.http.HttpServletRequestStub;
/**
* Not a well-formed set of unit tests. But it's a pretty good exercise of the
* different possibilities in the output stage.
*
* Test plan:
*
* <pre>
*
* Ontology is not specified
* Ontology is specified and matches
* Ontology is specified and does not match
*
* classes = empty
* classes = null -- UNREALISTIC
*
* no pickListName
* pickListName
*
* shortDef
* no shortDef
*
* no group uri
* no group for uri
* no name for group
* group with name
*
* ontology not found
* ontology no name
* ontology with name
*
* VC1 - Ont1, no pickListName, no shortDef, no GroupURI, no matching Ontology
* VC2 - Ont2, pickListName, shortDef, no group for GroupURI, ontology has no name
* VC3 - Ont2, pickListName, shortDef, group has no name, ontology with name
* VC4 - Ont1, pickListName, shortDef, group with name, no matching Ontology
*
* Try once with no data
* Try with all data and no ontology specified
* Try with all data and Ont1, Ont2, Ont3
* Sorted by picklist
* </pre>
*/
public class ListVClassWebappsControllerTest extends ListControllerTestBase {
private static final String PATH = "./vclassEdit";
private static final String ONT1 = "http://ont1/";
private static final String ONT2 = "http://ont2/";
private static final String ONT3 = "http://ont3/";
private static final String ONT2_NAME = "Fabulous Ontology";
private static final String VC1 = ONT1 + "vc1";
private static final String VC2 = ONT2 + "vc2";
private static final String VC3 = ONT2 + "vc3";
private static final String VC4 = ONT1 + "vc4";
private static final String VC2_NAME = "Carol";
private static final String VC3_NAME = "Ted";
private static final String VC4_NAME = "ALice";
private static final String VC2_SHORT_DEF = "Short Carol";
private static final String VC3_SHORT_DEF = "Tiny Ted";
private static final String VC4_SHORT_DEF = "Wee ALice";
private static final String GROUP_NONE = "http://domain/noSuchGroup";
private static final String GROUP_NO_NAME = "http://domain/groupWithNoName";
private static final String GROUP_W_NAME = "http://domain/namedGroup";
private static final String NAME_GROUP = "The Groupsters";
private static final JsonNode JSON_EMPTY_RESPONSE = arrayOf();
private static final JsonNode RESPONSE_UNFILTERED = arrayOf(
vclassListNode(PATH, VC4, VC4_NAME, VC4_SHORT_DEF, NAME_GROUP,
ONT1),
vclassListNode(PATH, VC2, VC2_NAME, VC2_SHORT_DEF, "", ONT2_NAME),
vclassListNode(PATH, VC3, VC3_NAME, VC3_SHORT_DEF, "", ONT2_NAME),
degenerateVclassListNode("", "", "", ONT1) // VC1
);
private static final JsonNode RESPONSE_FILTERED_BY_ONT1 = arrayOf(
vclassListNode(PATH, VC4, VC4_NAME, VC4_SHORT_DEF, NAME_GROUP,
ONT1),
degenerateVclassListNode("", "", "", ONT1) // VC1
);
private static final JsonNode RESPONSE_FILTERED_BY_ONT2 = arrayOf(
vclassListNode(PATH, VC2, VC2_NAME, VC2_SHORT_DEF, "", ONT2_NAME),
vclassListNode(PATH, VC3, VC3_NAME, VC3_SHORT_DEF, "", ONT2_NAME));
private static final JsonNode RESPONSE_FILTERED_BY_ONT3 = arrayOf();
private ListVClassWebappsController controller;
private HttpServletRequestStub req;
private ModelAccessFactoryStub modelsFactory;
private WebappDaoFactoryStub wadf;
private OntologyDaoStub odao;
private VClassDaoStub vcdao;
private VClassGroupDaoStub vcgdao;
@Before
public void setup() {
controller = new ListVClassWebappsController();
req = new HttpServletRequestStub();
new VitroRequest(req).setCollator(Collator.getInstance());
odao = new OntologyDaoStub();
vcdao = new VClassDaoStub();
vcgdao = new VClassGroupDaoStub();
wadf = new WebappDaoFactoryStub();
wadf.setOntologyDao(odao);
wadf.setVClassDao(vcdao);
wadf.setVClassGroupDao(vcgdao);
modelsFactory = new ModelAccessFactoryStub();
modelsFactory.get(req).setWebappDaoFactory(wadf, POLICY_NEUTRAL);
// modelsFactory.get(req).setWebappDaoFactory(wadf, LANGUAGE_NEUTRAL,
// POLICY_NEUTRAL);
}
// ----------------------------------------------------------------------
// The tests
// ----------------------------------------------------------------------
@Test
public void noData() throws Exception {
assertMatchingJson(controller, req, JSON_EMPTY_RESPONSE);
}
@Test
public void unfiltered() throws Exception {
populate();
// No name produces invalid JSON so we kluge it for easy comparison
String rawResponse = getJsonFromController(controller, req);
String kluged = rawResponse.replace("\"\"\"", "\"\",\"");
assertKlugedJson(RESPONSE_UNFILTERED, kluged);
}
@Test
public void filteredByOnt1() throws Exception {
populate();
req.addParameter("ontologyUri", ONT1);
// No name produces invalid JSON so we kluge it for easy comparison
// Filtered out classes leave their commas behind, so remove them
String rawResponse = getJsonFromController(controller, req);
String kluged = rawResponse.replace("\"\"\"", "\"\",\"")
.replace(", , ,", ",");
assertKlugedJson(RESPONSE_FILTERED_BY_ONT1, kluged);
}
@Test
public void filteredByOnt2() throws Exception {
populate();
req.addParameter("ontologyUri", ONT2);
// Filtered out classes leave their commas behind, so remove them
String rawResponse = getJsonFromController(controller, req);
String kluged = rawResponse.replaceAll(", $", " ");
assertKlugedJson(RESPONSE_FILTERED_BY_ONT2, kluged);
}
@Test
public void filteredByOnt3() throws Exception {
populate();
req.addParameter("ontologyUri", ONT3);
assertMatchingJson(controller, req, RESPONSE_FILTERED_BY_ONT3);
}
// ----------------------------------------------------------------------
// Helper methods
// ----------------------------------------------------------------------
private void populate() {
odao.insertNewOntology(ontology(ONT2, ONT2_NAME));
odao.insertNewOntology(ontology(ONT3, null));
vcgdao.setGroups(vclassGroup(GROUP_NO_NAME, null));
vcgdao.setGroups(vclassGroup(GROUP_W_NAME, NAME_GROUP));
vcdao.setVClass(vclass(VC1, null, null, null));
vcdao.setVClass(vclass(VC2, VC2_NAME, VC2_SHORT_DEF, GROUP_NONE));
vcdao.setVClass(vclass(VC3, VC3_NAME, VC3_SHORT_DEF, GROUP_NO_NAME));
vcdao.setVClass(vclass(VC4, VC4_NAME, VC4_SHORT_DEF, GROUP_W_NAME));
}
private VClass vclass(String uri, String name, String shortDef,
String groupURI) {
VClass vc = new VClass();
vc.setURI(uri);
if (name != null) {
vc.setName(name);
vc.setPickListName(name);
}
if (shortDef != null) {
vc.setShortDef(shortDef);
}
if (groupURI != null) {
vc.setGroupURI(groupURI);
}
return vc;
}
private VClassGroup vclassGroup(String uri, String name) {
VClassGroup vcg = new VClassGroup();
vcg.setURI(uri);
vcg.setPublicName(name);
return vcg;
}
private Ontology ontology(String uri, String name) {
Ontology o = new Ontology();
o.setURI(uri);
o.setName(name);
return o;
}
}

View file

@ -0,0 +1,229 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.controller.freemarker;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.ASSERTIONS_ONLY;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.POLICY_NEUTRAL;
import java.text.Collator;
import org.junit.Before;
import org.junit.Test;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import edu.cornell.mannlib.vitro.webapp.beans.Ontology;
import edu.cornell.mannlib.vitro.webapp.beans.VClass;
import edu.cornell.mannlib.vitro.webapp.beans.VClassGroup;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.OntologyDaoStub;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.VClassDaoStub;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.VClassGroupDaoStub;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactoryStub;
import stubs.edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccessFactoryStub;
import stubs.javax.servlet.http.HttpServletRequestStub;
/**
* Not a well-formed set of unit tests. But it's a pretty good exercise of the
* different possibilities in the output stage.
*
* Test plan:
*
* <pre>
* No data - roots is null -- NONSENSICAL
* No data - roots is empty
*
* Ontology is not specified
* Ontology is specified and matches
* Ontology is specified and does not match
* VClass does not match Ontology, but has child properties that do.
*
* pickListName
* no pickListName
*
* shortDef
* no shortDef
*
* Group no group URI
* Group no group for URI
* Group no name
* Group has a name
*
* No ontology for namespace
* Ontology but no name
* Ontology with name
*
* DP_1A Ont1, no pickListName, no shortDef, no GroupURI, no matching Ontology
* DP_1B Ont2, pickListName, shortDef, no group for GroupURI, ontology has no name
* DP_1B2A Ont3, pickListName, shortDef, group has no name, ontology with name
* DP_1B2B Ont1, pickListName, shortDef, group with name, no matching Ontology
*
* Try once with no data
* Try with all data and no ontology specified
* Try with all data and Ont1, Ont2, Ont3
* </pre>
*/
public class ShowClassHierarchyControllerTest extends ListControllerTestBase {
private static final String PATH = "vclassEdit";
private static final String ONT1 = "http://ont1/";
private static final String ONT2 = "http://ont2/";
private static final String ONT3 = "http://ont3/";
private static final String ONT3_NAME = "Fabulous Ontology";
private static final String URI_GREATAUNT = ONT1 + "greatAunt";
private static final String URI_GRANDMOTHER = ONT2 + "grandmother";
private static final String URI_AUNT = ONT3 + "aunt";
private static final String URI_MOTHER = ONT1 + "mother";
private static final String NAME_GRANDMOTHER = "GrandMother";
private static final String NAME_AUNT = "Aunt";
private static final String NAME_MOTHER = "Mother";
private static final String SHORT_DEF_GRANDMOTHER = "My GrandMother";
private static final String SHORT_DEF_AUNT = "My Aunt";
private static final String SHORT_DEF_MOTHER = "My Mother";
private static final String GROUP_NONE = "http://domain/noSuchGroup";
private static final String GROUP_NO_NAME = "http://domain/groupWithNoName";
private static final String GROUP_W_NAME = "http://domain/namedGroup";
private static final String NAME_GROUP = "The Groupsters";
private static final ArrayNode JSON_EMPTY_RESPONSE = arrayOf(
vclassHierarchyNode(PATH,
"http://www.w3.org/1999/02/22-rdf-syntax-ns#Resource",
"Resource", "", "",
"http://www.w3.org/1999/02/22-rdf-syntax-ns#"));
private static final JsonNode RESPONSE_UNFILTERED = arrayOf(
vclassHierarchyNode(PATH,URI_GRANDMOTHER, NAME_GRANDMOTHER,
SHORT_DEF_GRANDMOTHER, "", ONT2,
vclassHierarchyNode(PATH,URI_AUNT, NAME_AUNT, SHORT_DEF_AUNT, "",
ONT3_NAME),
vclassHierarchyNode(PATH,URI_MOTHER, NAME_MOTHER,
SHORT_DEF_MOTHER, NAME_GROUP, ONT1)),
vclassHierarchyNode(PATH,URI_GREATAUNT, "greatAunt", "", "", ONT1));
private static final JsonNode RESPONSE_FILTERED_BY_ONT1 = arrayOf(
vclassHierarchyNode(PATH,URI_GREATAUNT, "greatAunt", "", "", ONT1));
private static final JsonNode RESPONSE_FILTERED_BY_ONT2 = arrayOf(
vclassHierarchyNode(PATH,URI_GRANDMOTHER, NAME_GRANDMOTHER,
SHORT_DEF_GRANDMOTHER, "", ONT2));
private static final JsonNode RESPONSE_FILTERED_BY_ONT3 = arrayOf();
private ShowClassHierarchyController controller;
private HttpServletRequestStub req;
private ModelAccessFactoryStub modelsFactory;
private OntologyDaoStub ontdao;
private VClassDaoStub vcdao;
private VClassGroupDaoStub vcgdao;
private WebappDaoFactoryStub wadf;
@Before
public void setup() {
controller = new ShowClassHierarchyController();
req = new HttpServletRequestStub();
new VitroRequest(req).setCollator(Collator.getInstance());
ontdao = new OntologyDaoStub();
vcdao = new VClassDaoStub();
vcgdao = new VClassGroupDaoStub();
wadf = new WebappDaoFactoryStub();
wadf.setOntologyDao(ontdao);
wadf.setVClassDao(vcdao);
wadf.setVClassGroupDao(vcgdao);
modelsFactory = new ModelAccessFactoryStub();
modelsFactory.get(req).setWebappDaoFactory(wadf, POLICY_NEUTRAL);
modelsFactory.get(req).setWebappDaoFactory(wadf, POLICY_NEUTRAL,
ASSERTIONS_ONLY);
}
// ----------------------------------------------------------------------
// The tests
// ----------------------------------------------------------------------
@Test
public void noData() throws Exception {
assertMatchingJson(controller, req, JSON_EMPTY_RESPONSE);
}
@Test
public void unfiltered() throws Exception {
populate();
assertMatchingJson(controller, req, RESPONSE_UNFILTERED);
}
@Test
public void filteredByOnt1() throws Exception {
populate();
req.addParameter("ontologyUri", ONT1);
assertMatchingJson(controller, req, RESPONSE_FILTERED_BY_ONT1);
}
@Test
public void filteredByOnt2() throws Exception {
populate();
req.addParameter("ontologyUri", ONT2);
assertMatchingJson(controller, req, RESPONSE_FILTERED_BY_ONT2);
}
@Test
public void filteredByOnt3() throws Exception {
populate();
req.addParameter("ontologyUri", ONT3);
assertMatchingJson(controller, req, RESPONSE_FILTERED_BY_ONT3);
}
// ----------------------------------------------------------------------
// Helper methods
// ----------------------------------------------------------------------
private void populate() {
ontdao.insertNewOntology(ontology(ONT2, null));
ontdao.insertNewOntology(ontology(ONT3, ONT3_NAME));
vcgdao.setGroups(vclassGroup(GROUP_NO_NAME, null));
vcgdao.setGroups(vclassGroup(GROUP_W_NAME, NAME_GROUP));
vcdao.setVClass(vclass(URI_GREATAUNT, null, null, null));
vcdao.setVClass(vclass(URI_GRANDMOTHER, NAME_GRANDMOTHER, GROUP_NONE,
SHORT_DEF_GRANDMOTHER));
vcdao.setVClass(
vclass(URI_AUNT, NAME_AUNT, GROUP_NO_NAME, SHORT_DEF_AUNT),
URI_GRANDMOTHER);
vcdao.setVClass(
vclass(URI_MOTHER, NAME_MOTHER, GROUP_W_NAME, SHORT_DEF_MOTHER),
URI_GRANDMOTHER);
}
private VClass vclass(String uri, String name, String groupUri,
String shortDef) {
VClass vc = new VClass();
vc.setURI(uri);
vc.setPickListName(name);
vc.setShortDef(shortDef);
vc.setGroupURI(groupUri);
VClassGroup group = vcgdao.getGroupByURI(groupUri);
if (group != null) {
group.add(vc);
}
return vc;
}
private Ontology ontology(String uri, String name) {
Ontology o = new Ontology();
o.setURI(uri);
o.setName(name);
return o;
}
private VClassGroup vclassGroup(String uri, String name) {
VClassGroup vcg = new VClassGroup();
vcg.setURI(uri);
vcg.setPublicName(name);
return vcg;
}
}

View file

@ -0,0 +1,286 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.controller.freemarker;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.ASSERTIONS_ONLY;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.LANGUAGE_NEUTRAL;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.POLICY_NEUTRAL;
import java.text.Collator;
import org.junit.Before;
import org.junit.Test;
import com.fasterxml.jackson.databind.node.ArrayNode;
import edu.cornell.mannlib.vitro.webapp.beans.DataProperty;
import edu.cornell.mannlib.vitro.webapp.beans.Datatype;
import edu.cornell.mannlib.vitro.webapp.beans.PropertyGroup;
import edu.cornell.mannlib.vitro.webapp.beans.VClass;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.DataPropertyDaoStub;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.DatatypeDaoStub;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.PropertyGroupDaoStub;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.VClassDaoStub;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactoryStub;
import stubs.edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccessFactoryStub;
import stubs.javax.servlet.http.HttpServletRequestStub;
/**
* Not a well-formed set of unit tests. But it's a pretty good exercise of the
* different possibilities in the output stage.
*
* Test plan:
*
* <pre>
* No data - roots is null -- NONSENSICAL
* No data - roots is empty
*
* Ontology is not specified
* Ontology is specified and matches
* Ontology is specified and does not match
* DataProperty does not match Ontology, but has child properties that do.
*
* Name from picklistName
* Name from getName
* Name from getUri
* Name no URL? -- NONSENSICAL
*
* InternalName from picklistName
* InternalName missing.
*
* Domain class no class URI
* Domain class no class for URI
* Domain class get picklistName from Language Aware DAO
* Domain class use picklistName from Language Neutral DAO
*
* Range no range URI
* Range no datatype for URI
* Range datatype has no name
* Range has a name
*
* Group no group URI
* Group no group for URI
* Group no name
* Group has a name
*
* Children no children
* Children sorted by picklist
*
* DP_1A Ont1, no name, no picklistName, no domainClass, no RangeClass, no GroupURI
* DP_1B Ont2, name, no picklistName, no domain class for URI, no range datatype for URI, no group for GroupURI
* DP_1B2A Ont1, picklistname, domainclass no picklistname, range datatype with no name, group has no name
* DP_1B2B Ont1, picklistname(less than 1B2A), domainclass w/picklistname, range datatype with name, group with name
*
* Try once with no data
* Try with all data and no ontology specified
* Try with all data and Ont1, Ont2, Ont3
* </pre>
*/
public class ShowDataPropertyHierarchyControllerTest
extends ListControllerTestBase {
private static final String PATH = "datapropEdit";
private static final String ONT1 = "http://ont1/";
private static final String ONT2 = "http://ont2/";
private static final String ONT3 = "http://ont3/";
private static final String URI_GREATAUNT = ONT1 + "greatAunt";
private static final String URI_GRANDMOTHER = ONT2 + "grandmother";
private static final String URI_AUNT = ONT1 + "aunt";
private static final String URI_MOTHER = ONT1 + "mother";
private static final String URI_DAUGHTER = ONT2 + "daughter";
private static final String NAME_GRANDMOTHER = "GrandMother";
private static final String NAME_AUNT = "Aunt";
private static final String NAME_MOTHER = "Mother";
private static final String NAME_DAUGHTER = "Me";
private static final String PICK_NAME_AUNT = "Old Aunt Agnes";
private static final String PICK_NAME_MOTHER = "My Mother";
private static final String DOMAIN_NONE = "http://domain/noSuchDomain";
private static final String DOMAIN_NO_NAME = "http://domain/domainWithNoName";
private static final String DOMAIN_W_NAME = "http://domain/namedDomain";
private static final String NAME_DOMAIN = "An excellent domain";
private static final String RANGE_NONE = "http://domain/noSuchRange";
private static final String RANGE_NO_NAME = "http://domain/rangeWithNoName";
private static final String RANGE_W_NAME = "http://domain/namedRange";
private static final String NAME_RANGE = "Home on the range";
private static final String GROUP_NONE = "http://domain/noSuchGroup";
private static final String GROUP_NO_NAME = "http://domain/groupWithNoName";
private static final String GROUP_W_NAME = "http://domain/namedGroup";
private static final String NAME_GROUP = "The Groupsters";
private static final ArrayNode NO_DATA_RESPONSE = arrayOf( //
propertyHierarchyNode(PATH, "nullfake", "ullfake", "ullfake", "",
"", "unspecified"));
private static final ArrayNode RESPONSE_UNFILTERED = arrayOf(
propertyHierarchyNode(PATH, URI_GRANDMOTHER, "grandmother",
"grandmother", "", "http://domain/noSuchRange",
"unknown group",
propertyHierarchyNode(PATH, URI_MOTHER, PICK_NAME_MOTHER,
"My Mother", "namedDomain", "Home on the range",
"The Groupsters",
propertyHierarchyNode(PATH, URI_DAUGHTER,
"daughter", "daughter", "", "",
"unspecified")),
propertyHierarchyNode(PATH, URI_AUNT, PICK_NAME_AUNT,
"Old Aunt Agnes", "domainWithNoName", "", "")),
propertyHierarchyNode(PATH, URI_GREATAUNT, "greatAunt", "greatAunt",
"", "", "unspecified"));
private static final ArrayNode RESPONSE_FILTERED_BY_ONT1 = arrayOf(
propertyHierarchyNode(PATH, URI_GREATAUNT, "greatAunt", "greatAunt",
"", "", "unspecified"));
private static final ArrayNode RESPONSE_FILTERED_BY_ONT2 = arrayOf(
propertyHierarchyNode(PATH, URI_GRANDMOTHER, "grandmother",
"grandmother", "", "http://domain/noSuchRange",
"unknown group", propertyHierarchyNode(PATH, URI_DAUGHTER,
"daughter", "daughter", "", "", "unspecified")));
private static final ArrayNode RESPONSE_FILTERED_BY_ONT3 = arrayOf();
private ShowDataPropertyHierarchyController controller;
private HttpServletRequestStub req;
private ModelAccessFactoryStub modelsFactory;
private WebappDaoFactoryStub wadf;
private DatatypeDaoStub ddao;
private DataPropertyDaoStub dpdao;
private PropertyGroupDaoStub pgdao;
private VClassDaoStub vcdao;
@Before
public void setup() {
controller = new ShowDataPropertyHierarchyController();
req = new HttpServletRequestStub();
new VitroRequest(req).setCollator(Collator.getInstance());
ddao = new DatatypeDaoStub();
dpdao = new DataPropertyDaoStub();
pgdao = new PropertyGroupDaoStub();
vcdao = new VClassDaoStub();
wadf = new WebappDaoFactoryStub();
wadf.setDatatypeDao(ddao);
wadf.setDataPropertyDao(dpdao);
wadf.setPropertyGroupDao(pgdao);
wadf.setVClassDao(vcdao);
modelsFactory = new ModelAccessFactoryStub();
modelsFactory.get(req).setWebappDaoFactory(wadf, POLICY_NEUTRAL);
modelsFactory.get(req).setWebappDaoFactory(wadf, POLICY_NEUTRAL,
ASSERTIONS_ONLY);
modelsFactory.get(req).setWebappDaoFactory(wadf, POLICY_NEUTRAL,
LANGUAGE_NEUTRAL);
}
// ----------------------------------------------------------------------
// The tests
// ----------------------------------------------------------------------
@Test
public void noDataTest() throws Exception {
// The NO DATA response is not valid JSON unless we kluge it.
String rawResponse = getJsonFromController(controller, req);
String kluged = rawResponse + "]}";
assertKlugedJson(NO_DATA_RESPONSE, kluged);
// assertMatchingJson(controller, req, NO_DATA_RESPONSE);
}
@Test
public void unfiltered() throws Exception {
populate();
assertMatchingJson(controller, req, RESPONSE_UNFILTERED);
}
@Test
public void filteredByOnt1() throws Exception {
populate();
req.addParameter("ontologyUri", ONT1);
assertMatchingJson(controller, req, RESPONSE_FILTERED_BY_ONT1);
}
@Test
public void filteredByOnt2() throws Exception {
populate();
req.addParameter("ontologyUri", ONT2);
assertMatchingJson(controller, req, RESPONSE_FILTERED_BY_ONT2);
}
@Test
public void filteredByOnt3() throws Exception {
populate();
req.addParameter("ontologyUri", ONT3);
assertMatchingJson(controller, req, RESPONSE_FILTERED_BY_ONT3);
}
// ----------------------------------------------------------------------
// Helper methods
// ----------------------------------------------------------------------
private void populate() {
vcdao.setVClass(vclass(DOMAIN_NO_NAME, null));
vcdao.setVClass(vclass(DOMAIN_W_NAME, NAME_DOMAIN));
ddao.addDatatype(datatype(RANGE_NO_NAME, null));
ddao.addDatatype(datatype(RANGE_W_NAME, NAME_RANGE));
pgdao.addPropertyGroup(propertyGroup(GROUP_NO_NAME, null));
pgdao.addPropertyGroup(propertyGroup(GROUP_W_NAME, NAME_GROUP));
dpdao.addDataProperty(
dataProperty(URI_GREATAUNT, null, null, null, null, null));
dpdao.addDataProperty(dataProperty(URI_GRANDMOTHER, NAME_GRANDMOTHER,
null, DOMAIN_NONE, RANGE_NONE, GROUP_NONE));
dpdao.addDataProperty(
dataProperty(URI_AUNT, NAME_AUNT, PICK_NAME_AUNT,
DOMAIN_NO_NAME, RANGE_NO_NAME, GROUP_NO_NAME),
URI_GRANDMOTHER);
dpdao.addDataProperty(
dataProperty(URI_MOTHER, NAME_MOTHER, PICK_NAME_MOTHER,
DOMAIN_W_NAME, RANGE_W_NAME, GROUP_W_NAME),
URI_GRANDMOTHER);
dpdao.addDataProperty(dataProperty(URI_DAUGHTER, NAME_DAUGHTER, null,
null, null, null), URI_MOTHER);
}
private DataProperty dataProperty(String uri, String name,
String pickListName, String domainClassUri, String rangeDatatypeUri,
String groupUri) {
DataProperty dp = new DataProperty();
dp.setURI(uri);
dp.setName(name);
dp.setPickListName(pickListName);
dp.setDomainClassURI(domainClassUri);
dp.setRangeDatatypeURI(rangeDatatypeUri);
dp.setGroupURI(groupUri);
return dp;
}
private Datatype datatype(String uri, String name) {
Datatype d = new Datatype();
d.setUri(uri);
d.setName(name);
return d;
}
private PropertyGroup propertyGroup(String uri, String name) {
PropertyGroup pg = new PropertyGroup();
pg.setURI(uri);
pg.setName(name);
return pg;
}
private VClass vclass(String uri) {
VClass vc = new VClass();
vc.setURI(uri);
return vc;
}
private VClass vclass(String uri, String name) {
VClass vc = vclass(uri);
vc.setName(name);
return vc;
}
}

View file

@ -0,0 +1,292 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.controller.freemarker;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.ASSERTIONS_ONLY;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.LANGUAGE_NEUTRAL;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.POLICY_NEUTRAL;
import java.text.Collator;
import org.junit.Before;
import org.junit.Test;
import com.fasterxml.jackson.databind.node.ArrayNode;
import edu.cornell.mannlib.vitro.webapp.beans.Datatype;
import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty;
import edu.cornell.mannlib.vitro.webapp.beans.PropertyGroup;
import edu.cornell.mannlib.vitro.webapp.beans.VClass;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.DatatypeDaoStub;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.ObjectPropertyDaoStub;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.PropertyGroupDaoStub;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.VClassDaoStub;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactoryStub;
import stubs.edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccessFactoryStub;
import stubs.javax.servlet.http.HttpServletRequestStub;
/**
* Not a well-formed set of unit tests. But it's a pretty good exercise of the
* different possibilities in the output stage.
*
* Test plan:
*
* <pre>
* No data - roots is null -- NONSENSICAL
* No data - roots is empty
*
* Ontology is not specified
* Ontology is specified and matches
* Ontology is specified and does not match
* ObjectProperty does not match Ontology, but has child properties that do.
*
* Name from picklistName
* Name from getLocalName
* Name no URL? -- NONSENSICAL
*
* InternalName from localNameWithPrefix
* InternalName from localName
*
* Domain class no class URI
* Domain class no class for URI
* Domain class get picklistName from Language Aware DAO
* Domain class use picklistName from Language Neutral DAO
*
* Range class no class URI
* Range class no class for URI
* Range class get picklistName from Language Aware DAO
* Range class use picklistName from Language Neutral DAO
*
* Group no group URI
* Group no group for URI
* Group no name
* Group has a name
*
* Children no children
* Children sorted by picklist
*
* DP_1A Ont1, no name, no localnamewithprefix, no picklistName, no domainClass, no RangeClass, no GroupURI
* DP_1B Ont2, name, no localnamewithprefix, no picklistName, no domain class for URI, no range clqss for URI, no group for GroupURI
* DP_1B2A Ont1, name, localnamewithprefix, picklistname, domainclass no picklistname, range class with no picklistname, group has no name
* DP_1B2B Ont1, name, localnamewithprefix, picklistname(less than 1B2A), domain class w/picklistname, range class w/picklistname, group with name
*
* Try once with no data
* Try with all data and no ontology specified
* Try with all data and Ont1, Ont2, Ont3
* </pre>
*/
public class ShowObjectPropertyHierarchyControllerTest
extends ListControllerTestBase {
private static final String PATH = "propertyEdit";
private static final String ONT1 = "http://ont1/";
private static final String ONT2 = "http://ont2/";
private static final String ONT3 = "http://ont3/";
private static final String URI_GREATAUNT = ONT1 + "greatAunt";
private static final String URI_GRANDMOTHER = ONT2 + "grandmother";
private static final String URI_AUNT = ONT1 + "aunt";
private static final String URI_MOTHER = ONT1 + "mother";
private static final String URI_DAUGHTER = ONT2 + "daughter";
private static final String NAME_GRANDMOTHER = "GrandMother";
private static final String NAME_AUNT = "Aunt";
private static final String NAME_MOTHER = "Mother";
private static final String NAME_DAUGHTER = "Me";
private static final String LOCAL_NAME_WITH_PREFIX_AUNT = "family:aunt";
private static final String LOCAL_NAME_WITH_PREFIX_MOTHER = "family:mother";
private static final String DOMAIN_NONE = "http://domain/noSuchDomain";
private static final String DOMAIN_NO_NAME = "http://domain/domainWithNoName";
private static final String DOMAIN_W_NAME = "http://domain/namedDomain";
private static final String NAME_DOMAIN = "An excellent domain";
private static final String RANGE_NONE = "http://domain/noSuchRange";
private static final String RANGE_NO_NAME = "http://domain/rangeWithNoName";
private static final String RANGE_W_NAME = "http://domain/namedRange";
private static final String NAME_RANGE = "Home on the range";
private static final String GROUP_NONE = "http://domain/noSuchGroup";
private static final String GROUP_NO_NAME = "http://domain/groupWithNoName";
private static final String GROUP_W_NAME = "http://domain/namedGroup";
private static final String NAME_GROUP = "The Groupsters";
private static final ArrayNode NO_DATA_RESPONSE = arrayOf( //
propertyHierarchyNode(PATH, "nullfake", "ullfake", "ullfake", "",
"", "unspecified"));
private static final ArrayNode RESPONSE_UNFILTERED = arrayOf(
propertyHierarchyNode(PATH, URI_GRANDMOTHER, NAME_GRANDMOTHER,
"grandmother", "", "", "unknown group",
propertyHierarchyNode(PATH, URI_AUNT, NAME_AUNT,
"family:aunt", "domainWithNoName", "", ""),
propertyHierarchyNode(PATH, URI_MOTHER, NAME_MOTHER,
"family:mother", "namedDomain", "",
"The Groupsters",
propertyHierarchyNode(PATH, URI_DAUGHTER,
NAME_DAUGHTER, "daughter", "", "",
"unspecified"))),
propertyHierarchyNode(PATH, URI_GREATAUNT, "greatAunt", "greatAunt",
"", "", "unspecified"));
private static final ArrayNode RESPONSE_FILTERED_BY_ONT1 = arrayOf(
propertyHierarchyNode(PATH, URI_GREATAUNT, "greatAunt", "greatAunt",
"", "", "unspecified"));
private static final ArrayNode RESPONSE_FILTERED_BY_ONT2 = arrayOf(
propertyHierarchyNode(PATH, URI_GRANDMOTHER, NAME_GRANDMOTHER,
"grandmother", "", "", "unknown group",
propertyHierarchyNode(PATH, URI_DAUGHTER, NAME_DAUGHTER,
"daughter", "", "", "unspecified")));
private static final ArrayNode RESPONSE_FILTERED_BY_ONT3 = arrayOf();
private ShowObjectPropertyHierarchyController controller;
private HttpServletRequestStub req;
private ModelAccessFactoryStub modelsFactory;
private WebappDaoFactoryStub wadf;
private DatatypeDaoStub ddao;
private ObjectPropertyDaoStub opdao;
private PropertyGroupDaoStub pgdao;
private VClassDaoStub vcdao;
@Before
public void setup() {
controller = new ShowObjectPropertyHierarchyController();
req = new HttpServletRequestStub();
new VitroRequest(req).setCollator(Collator.getInstance());
ddao = new DatatypeDaoStub();
opdao = new ObjectPropertyDaoStub();
pgdao = new PropertyGroupDaoStub();
vcdao = new VClassDaoStub();
wadf = new WebappDaoFactoryStub();
wadf.setDatatypeDao(ddao);
wadf.setObjectPropertyDao(opdao);
wadf.setPropertyGroupDao(pgdao);
wadf.setVClassDao(vcdao);
modelsFactory = new ModelAccessFactoryStub();
modelsFactory.get(req).setWebappDaoFactory(wadf, POLICY_NEUTRAL);
modelsFactory.get(req).setWebappDaoFactory(wadf, POLICY_NEUTRAL,
ASSERTIONS_ONLY);
modelsFactory.get(req).setWebappDaoFactory(wadf, POLICY_NEUTRAL,
LANGUAGE_NEUTRAL);
}
// ----------------------------------------------------------------------
// The tests
// ----------------------------------------------------------------------
@Test
public void noDataTest() throws Exception {
// The NO DATA response is not valid JSON unless we kluge it.
String rawResponse = getJsonFromController(controller, req);
String kluged = rawResponse + "]}";
assertKlugedJson(NO_DATA_RESPONSE, kluged);
// assertMatchingJson(controller, req, NO_DATA_RESPONSE);
}
@Test
public void unfiltered() throws Exception {
populate();
assertMatchingJson(controller, req, RESPONSE_UNFILTERED);
}
@Test
public void filteredByOnt1() throws Exception {
populate();
req.addParameter("ontologyUri", ONT1);
assertMatchingJson(controller, req, RESPONSE_FILTERED_BY_ONT1);
}
@Test
public void filteredByOnt2() throws Exception {
populate();
req.addParameter("ontologyUri", ONT2);
assertMatchingJson(controller, req, RESPONSE_FILTERED_BY_ONT2);
}
@Test
public void filteredByOnt3() throws Exception {
populate();
req.addParameter("ontologyUri", ONT3);
assertMatchingJson(controller, req, RESPONSE_FILTERED_BY_ONT3);
}
// ----------------------------------------------------------------------
// Helper methods
// ----------------------------------------------------------------------
private void populate() {
vcdao.setVClass(vclass(DOMAIN_NO_NAME, null));
vcdao.setVClass(vclass(DOMAIN_W_NAME, NAME_DOMAIN));
ddao.addDatatype(datatype(RANGE_NO_NAME, null));
ddao.addDatatype(datatype(RANGE_W_NAME, NAME_RANGE));
pgdao.addPropertyGroup(propertyGroup(GROUP_NO_NAME, null));
pgdao.addPropertyGroup(propertyGroup(GROUP_W_NAME, NAME_GROUP));
opdao.addObjectProperty(
objectProperty(URI_GREATAUNT, null, null, null, null, null));
opdao.addObjectProperty(objectProperty(URI_GRANDMOTHER,
NAME_GRANDMOTHER, null, DOMAIN_NONE, RANGE_NONE, GROUP_NONE));
opdao.addObjectProperty(
objectProperty(URI_AUNT, NAME_AUNT, LOCAL_NAME_WITH_PREFIX_AUNT,
DOMAIN_NO_NAME, RANGE_NO_NAME, GROUP_NO_NAME),
URI_GRANDMOTHER);
opdao.addObjectProperty(objectProperty(URI_MOTHER, NAME_MOTHER,
LOCAL_NAME_WITH_PREFIX_MOTHER, DOMAIN_W_NAME, RANGE_W_NAME,
GROUP_W_NAME), URI_GRANDMOTHER);
opdao.addObjectProperty(objectProperty(URI_DAUGHTER, NAME_DAUGHTER,
null, null, null, null), URI_MOTHER);
}
private ObjectProperty objectProperty(String uri, String name,
String localNameWithPrefix, String domainClassUri,
String rangeDatatypeUri, String groupUri) {
ObjectProperty op = new ObjectProperty();
op.setURI(uri);
op.setPickListName(name);
op.setLocalNameWithPrefix(localNameWithPrefix);
op.setDomainVClassURI(domainClassUri);
op.setDomainPublic(getLocalName(domainClassUri));
op.setRangeVClassURI(rangeDatatypeUri);
op.setGroupURI(groupUri);
return op;
}
private Datatype datatype(String uri, String name) {
Datatype d = new Datatype();
d.setUri(uri);
d.setName(name);
return d;
}
private PropertyGroup propertyGroup(String uri, String name) {
PropertyGroup pg = new PropertyGroup();
pg.setURI(uri);
pg.setName(name);
return pg;
}
private VClass vclass(String uri) {
VClass vc = new VClass();
vc.setURI(uri);
return vc;
}
private VClass vclass(String uri, String name) {
VClass vc = vclass(uri);
vc.setName(name);
return vc;
}
private String getLocalName(String uri) {
if (uri == null) {
return null;
}
int delimiter = Math.max(uri.lastIndexOf('#'), uri.lastIndexOf('/'));
return uri.substring(delimiter + 1);
}
}

View file

@ -196,7 +196,7 @@ public class JsonServletTest extends AbstractTestClass {
setLoggerLevel(JsonServlet.class, Level.FATAL);
setLoggerLevel(ModelAccess.class, Level.ERROR);
String vclassId = "http://myVclass";
vcDao.setVClass(vclassId, new VClass(vclassId));
vcDao.setVClass(new VClass(vclassId));
req.addParameter(GET_SEARCH_INDIVIDUALS_BY_VCLASS, "true");
req.addParameter(VCLASS_ID, vclassId);

View file

@ -0,0 +1,73 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.utils.json;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import edu.cornell.mannlib.vitro.testing.AbstractTestClass;
/**
* quotes,\, \r, \n, \b, \f, \t and other control characters.
*
*
*/
public class JacksonUtilsTest extends AbstractTestClass {
// ----------------------------------------------------------------------
// Tests for quote()
// quotes,\, \r, \n, \b, \f, \t and other control characters.
// Originally written as direct comparisons to the net.sf.json version.
// ----------------------------------------------------------------------
@Test
public void quoteNull() {
assertJacksonQuoted(null, "");
// assertNetSfJsonQuoted(null, "");
}
@Test
public void quoteQuote() {
assertJacksonQuoted("\"", "\\\"");
// assertNetSfJsonQuoted("\"", "\\\"");
}
@Test
public void quoteBackslash() {
assertJacksonQuoted("\\", "\\\\");
// assertNetSfJsonQuoted("\\", "\\\\");
}
@Test
public void quoteReturn() {
assertJacksonQuoted("\r", "\\r");
// assertNetSfJsonQuoted("\r", "\\r");
}
@Test
public void quoteUnicode() {
assertJacksonQuoted("\u0007", "\\u0007");
// assertNetSfJsonQuoted("\u0007", "\\u0007");
}
@Test
public void quoteAssorted() {
assertJacksonQuoted("\n\b\f\t", "\\n\\b\\f\\t");
// assertNetSfJsonQuoted("\n\b\f\t", "\\n\\b\\f\\t");
}
// ----------------------------------------------------------------------
// Helper methods
// ----------------------------------------------------------------------
private void assertJacksonQuoted(String raw, String expected) {
String actual = JacksonUtils.quote(raw);
assertEquals("\"" + expected + "\"", actual);
}
// private void assertNetSfJsonQuoted(String raw, String expected) {
// String actual = net.sf.json.util.JSONUtils.quote(raw);
// assertEquals("\"" + expected + "\"", actual);
// }
}

View file

@ -2,12 +2,15 @@
package stubs.edu.cornell.mannlib.vitro.webapp.dao;
import java.util.ArrayList;
import static java.util.stream.Collectors.toList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.google.common.base.Objects;
import edu.cornell.mannlib.vitro.webapp.beans.DataProperty;
import edu.cornell.mannlib.vitro.webapp.beans.Individual;
import edu.cornell.mannlib.vitro.webapp.beans.Property;
@ -25,47 +28,86 @@ public class DataPropertyDaoStub implements DataPropertyDao {
// ----------------------------------------------------------------------
// Stub infrastructure
// ----------------------------------------------------------------------
private final Map<String, DataProperty> dpMap = new HashMap<String, DataProperty>();
private static class DataPropertyHolder {
final DataProperty dprop;
final String parentUri;
DataPropertyHolder(DataProperty dprop, String parentUri) {
this.dprop = dprop;
this.parentUri = parentUri;
}
public DataProperty getDataProperty() {
return dprop;
}
public String getParentUri() {
return parentUri;
}
boolean isRoot() {
return parentUri == null;
}
boolean inOntology(String ontologyUri) {
return Objects.equal(ontologyUri, dprop.getNamespace());
}
}
private final Map<String, DataPropertyHolder> dataPropertyMap = new HashMap<>();
private final Map<String, String> configFilesMap = new HashMap<String, String>();
public void addDataProperty(DataProperty dataProperty) {
addDataProperty(dataProperty, null);
}
public void addDataProperty(DataProperty dataProperty, String parentUri) {
if (dataProperty == null) {
throw new NullPointerException("dataProperty may not be null.");
}
String uri = dataProperty.getURI();
if (uri == null) {
throw new NullPointerException("uri may not be null.");
}
dpMap.put(uri, dataProperty);
dataPropertyMap.put(uri,
new DataPropertyHolder(dataProperty, parentUri));
}
public void setCustomListViewConfigFileName(DataProperty property, String filename) {
public void setCustomListViewConfigFileName(DataProperty property,
String filename) {
if (property == null) {
throw new NullPointerException("property may not be null.");
}
String uri = property.getURI();
if (uri == null) {
throw new NullPointerException("uri may not be null.");
}
configFilesMap.put(uri, filename);
}
// ----------------------------------------------------------------------
// Stub methods
// ----------------------------------------------------------------------
@Override
public List<DataProperty> getAllDataProperties() {
return new ArrayList<>(dpMap.values());
return dataPropertyMap.values().stream()
.map(DataPropertyHolder::getDataProperty).collect(toList());
}
@Override
public DataProperty getDataPropertyByURI(String dataPropertyURI) {
return dpMap.get(dataPropertyURI);
if (dataPropertyMap.containsKey(dataPropertyURI)) {
return dataPropertyMap.get(dataPropertyURI).getDataProperty();
} else {
return null;
}
}
@Override
@ -79,6 +121,20 @@ public class DataPropertyDaoStub implements DataPropertyDao {
}
return configFilesMap.get(uri);
}
@Override
public List<DataProperty> getRootDataProperties() {
return dataPropertyMap.values().stream().filter(DataPropertyHolder::isRoot)
.map(DataPropertyHolder::getDataProperty).collect(toList());
}
@Override
public List<String> getSubPropertyURIs(String propertyURI) {
return dataPropertyMap.values().stream()
.filter(dph -> propertyURI.equals(dph.getParentUri()))
.map(dph -> dph.getDataProperty().getURI()).collect(toList());
}
// ----------------------------------------------------------------------
// Un-implemented methods
// ----------------------------------------------------------------------
@ -102,7 +158,8 @@ public class DataPropertyDaoStub implements DataPropertyDao {
}
@Override
public void removeSuperproperty(String propertyURI, String superpropertyURI) {
public void removeSuperproperty(String propertyURI,
String superpropertyURI) {
throw new RuntimeException(
"PropertyDao.removeSuperproperty() not implemented.");
}
@ -159,12 +216,6 @@ public class DataPropertyDaoStub implements DataPropertyDao {
"PropertyDao.removeEquivalentProperty() not implemented.");
}
@Override
public List<String> getSubPropertyURIs(String propertyURI) {
throw new RuntimeException(
"PropertyDao.getSubPropertyURIs() not implemented.");
}
@Override
public List<String> getAllSubPropertyURIs(String propertyURI) {
throw new RuntimeException(
@ -172,7 +223,8 @@ public class DataPropertyDaoStub implements DataPropertyDao {
}
@Override
public List<String> getSuperPropertyURIs(String propertyURI, boolean direct) {
public List<String> getSuperPropertyURIs(String propertyURI,
boolean direct) {
throw new RuntimeException(
"PropertyDao.getSuperPropertyURIs() not implemented.");
}
@ -190,7 +242,8 @@ public class DataPropertyDaoStub implements DataPropertyDao {
}
@Override
public List<VClass> getClassesWithRestrictionOnProperty(String propertyURI) {
public List<VClass> getClassesWithRestrictionOnProperty(
String propertyURI) {
throw new RuntimeException(
"PropertyDao.getClassesWithRestrictionOnProperty() not implemented.");
}
@ -252,12 +305,6 @@ public class DataPropertyDaoStub implements DataPropertyDao {
"DataPropertyDao.deleteDataProperty() not implemented.");
}
@Override
public List<DataProperty> getRootDataProperties() {
throw new RuntimeException(
"DataPropertyDao.getRootDataProperties() not implemented.");
}
@Override
public boolean annotateDataPropertyAsExternalIdentifier(
String dataPropertyURI) {

View file

@ -0,0 +1,77 @@
package stubs.edu.cornell.mannlib.vitro.webapp.dao;
import java.util.ArrayList;
import java.util.List;
import com.google.common.base.Objects;
import edu.cornell.mannlib.vitro.webapp.beans.Datatype;
import edu.cornell.mannlib.vitro.webapp.dao.DatatypeDao;
public class DatatypeDaoStub implements DatatypeDao {
private final List<Datatype> dtList = new ArrayList<>();
// ----------------------------------------------------------------------
// Stub infrastructure
// ----------------------------------------------------------------------
public void addDatatype(Datatype dt) {
dtList.add(dt);
}
// ----------------------------------------------------------------------
// Stub methods
// ----------------------------------------------------------------------
@Override
public Datatype getDatatypeByURI(String uri) {
for (Datatype dt : dtList) {
if (Objects.equal(dt.getUri(), uri)) {
return dt;
}
}
return null;
}
// ----------------------------------------------------------------------
// Un-implemented methods
// ----------------------------------------------------------------------
@Override
public void updateDatatype(Datatype dtp) {
throw new RuntimeException(
"DatatypeDaoStub.updateDatatype() not implemented.");
}
@Override
public void deleteDatatype(Datatype dtp) {
throw new RuntimeException(
"DatatypeDaoStub.deleteDatatype() not implemented.");
}
@Override
public void deleteDatatype(int id) {
throw new RuntimeException(
"DatatypeDaoStub.deleteDatatype() not implemented.");
}
@Override
public Datatype getDatatypeById(int id) {
throw new RuntimeException(
"DatatypeDaoStub.getDatatypeById() not implemented.");
}
@Override
public int getDatatypeIdByURI(String uri) {
throw new RuntimeException(
"DatatypeDaoStub.getDatatypeIdByURI() not implemented.");
}
@Override
public List<Datatype> getAllDatatypes() {
throw new RuntimeException(
"DatatypeDaoStub.getAllDatatypes() not implemented.");
}
}

View file

@ -2,14 +2,16 @@
package stubs.edu.cornell.mannlib.vitro.webapp.dao;
import java.util.ArrayList;
import static java.util.stream.Collectors.toList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.google.common.base.Objects;
import edu.cornell.mannlib.vitro.webapp.beans.Individual;
import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty;
import edu.cornell.mannlib.vitro.webapp.beans.ObjectPropertyStatement;
import edu.cornell.mannlib.vitro.webapp.beans.Property;
import edu.cornell.mannlib.vitro.webapp.beans.VClass;
import edu.cornell.mannlib.vitro.webapp.dao.InsertException;
@ -26,12 +28,42 @@ public class ObjectPropertyDaoStub implements ObjectPropertyDao {
// Stub infrastructure
// ----------------------------------------------------------------------
private final Map<String, ObjectProperty> opMap = new HashMap<String, ObjectProperty>();
private final Map<String, String> configFilesMap = new HashMap<String, String>();
private static class ObjectPropertyHolder {
final ObjectProperty oprop;
final String parentUri;
ObjectPropertyHolder(ObjectProperty oprop, String parentUri) {
this.oprop = oprop;
this.parentUri = parentUri;
}
public ObjectProperty getObjectProperty() {
return oprop;
}
public String getParentUri() {
return parentUri;
}
boolean isRoot() {
return parentUri == null;
}
boolean inOntology(String ontologyUri) {
return Objects.equal(ontologyUri, oprop.getNamespace());
}
}
private final Map<String, ObjectPropertyHolder> objectPropertyMap = new HashMap<>();
private final Map<String, String> configFilesMap = new HashMap<>();
public void addObjectProperty(ObjectProperty property) {
addObjectProperty(property, null);
}
public void addObjectProperty(ObjectProperty property, String parentUri) {
if (property == null) {
throw new NullPointerException("predicate may not be null.");
throw new NullPointerException("property may not be null.");
}
String uri = property.getURI();
@ -39,7 +71,8 @@ public class ObjectPropertyDaoStub implements ObjectPropertyDao {
throw new NullPointerException("uri may not be null.");
}
opMap.put(uri, property);
objectPropertyMap.put(uri,
new ObjectPropertyHolder(property, parentUri));
}
public void setCustomListViewConfigFileName(ObjectProperty property,
@ -62,7 +95,8 @@ public class ObjectPropertyDaoStub implements ObjectPropertyDao {
@Override
public List<ObjectProperty> getAllObjectProperties() {
return new ArrayList<>(opMap.values());
return objectPropertyMap.values().stream()
.map(ObjectPropertyHolder::getObjectProperty).collect(toList());
}
@Override
@ -70,7 +104,11 @@ public class ObjectPropertyDaoStub implements ObjectPropertyDao {
if (objectPropertyURI == null) {
return null;
}
return opMap.get(objectPropertyURI);
if (objectPropertyMap.containsKey(objectPropertyURI)) {
return objectPropertyMap.get(objectPropertyURI).getObjectProperty();
} else {
return null;
}
}
@Override
@ -86,7 +124,21 @@ public class ObjectPropertyDaoStub implements ObjectPropertyDao {
}
@Override
public String getCustomListViewConfigFileName(ObjectProperty objectProperty) {
public List<ObjectProperty> getRootObjectProperties() {
return objectPropertyMap.values().stream().filter(ObjectPropertyHolder::isRoot)
.map(ObjectPropertyHolder::getObjectProperty).collect(toList());
}
@Override
public List<String> getSubPropertyURIs(String objectPropertyURI) {
return objectPropertyMap.values().stream()
.filter(oph -> objectPropertyURI.equals(oph.getParentUri()))
.map(oph -> oph.getObjectProperty().getURI()).collect(toList());
}
@Override
public String getCustomListViewConfigFileName(
ObjectProperty objectProperty) {
if (objectProperty == null) {
return null;
}
@ -120,7 +172,8 @@ public class ObjectPropertyDaoStub implements ObjectPropertyDao {
}
@Override
public void removeSuperproperty(String propertyURI, String superpropertyURI) {
public void removeSuperproperty(String propertyURI,
String superpropertyURI) {
throw new RuntimeException(
"ObjectPropertyDaoStub.removeSuperproperty() not implemented.");
}
@ -196,7 +249,8 @@ public class ObjectPropertyDaoStub implements ObjectPropertyDao {
}
@Override
public List<VClass> getClassesWithRestrictionOnProperty(String propertyURI) {
public List<VClass> getClassesWithRestrictionOnProperty(
String propertyURI) {
throw new RuntimeException(
"ObjectPropertyDaoStub.getClassesWithRestrictionOnProperty() not implemented.");
}
@ -215,12 +269,6 @@ public class ObjectPropertyDaoStub implements ObjectPropertyDao {
"ObjectPropertyDaoStub.getSuperPropertyURIs() not implemented.");
}
@Override
public List<String> getSubPropertyURIs(String objectPropertyURI) {
throw new RuntimeException(
"ObjectPropertyDaoStub.getSubPropertyURIs() not implemented.");
}
@Override
public void fillObjectPropertiesForIndividual(Individual individual) {
throw new RuntimeException(
@ -258,12 +306,6 @@ public class ObjectPropertyDaoStub implements ObjectPropertyDao {
"ObjectPropertyDaoStub.skipEditForm() not implemented.");
}
@Override
public List<ObjectProperty> getRootObjectProperties() {
throw new RuntimeException(
"ObjectPropertyDaoStub.getRootObjectProperties() not implemented.");
}
@Override
public List<ObjectProperty> getObjectPropertyList(Individual subject) {
throw new RuntimeException(

View file

@ -38,16 +38,15 @@ public class OntologyDaoStub implements OntologyDao {
return new ArrayList<Ontology>(ontologies.values());
}
@Override
public Ontology getOntologyByURI(String ontologyURI) {
return ontologies.get(ontologyURI);
}
// ----------------------------------------------------------------------
// Un-implemented methods
// ----------------------------------------------------------------------
@Override
public Ontology getOntologyByURI(String ontologyURI) {
throw new RuntimeException(
"OntologyDaoStub.getOntologyByURI() not implemented.");
}
@Override
public void updateOntology(Ontology ontology) {
throw new RuntimeException(

View file

@ -0,0 +1,96 @@
package stubs.edu.cornell.mannlib.vitro.webapp.dao;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import edu.cornell.mannlib.vitro.webapp.beans.PropertyGroup;
import edu.cornell.mannlib.vitro.webapp.dao.PropertyGroupDao;
public class PropertyGroupDaoStub implements PropertyGroupDao {
// ----------------------------------------------------------------------
// Stub infrastructure
// ----------------------------------------------------------------------
private final Map<String, PropertyGroup> map = new HashMap<>();
public void addPropertyGroup(PropertyGroup group) {
map.put(group.getURI(), group);
}
// ----------------------------------------------------------------------
// Stub methods
// ----------------------------------------------------------------------
@Override
public PropertyGroup getGroupByURI(String uri) {
return (uri == null) ? null : copyGroup(map.get(uri), false);
}
@Override
public List<PropertyGroup> getPublicGroups(boolean withProperties) {
List<PropertyGroup> list = new ArrayList<>();
for (PropertyGroup group: map.values()) {
list.add(copyGroup(group, withProperties));
}
return list;
}
private PropertyGroup copyGroup(PropertyGroup source, boolean withProperties) {
if (source == null) {
return null;
}
PropertyGroup target = new PropertyGroup();
target.setURI(source.getURI());
target.setPickListName(source.getPickListName());
target.setDisplayRank(source.getDisplayRank());
target.setName(source.getName());
target.setStatementCount(source.getStatementCount());
target.setPublicDescription(source.getPublicDescription());
if (withProperties) {
target.setPropertyList(source.getPropertyList());
}
return target;
}
// ----------------------------------------------------------------------
// Un-implemented methods
// ----------------------------------------------------------------------
@Override
public int removeUnpopulatedGroups(List<PropertyGroup> groups) {
throw new RuntimeException(
"PropertyGroupDaoStub.removeUnpopulatedGroups() not implemented.");
}
@Override
public PropertyGroup createDummyPropertyGroup(String name, int rank) {
throw new RuntimeException(
"PropertyGroupDaoStub.createDummyPropertyGroup() not implemented.");
}
@Override
public String insertNewPropertyGroup(PropertyGroup group) {
throw new RuntimeException(
"PropertyGroupDaoStub.insertNewPropertyGroup() not implemented.");
}
@Override
public void updatePropertyGroup(PropertyGroup group) {
throw new RuntimeException(
"PropertyGroupDaoStub.updatePropertyGroup() not implemented.");
}
@Override
public void deletePropertyGroup(PropertyGroup group) {
throw new RuntimeException(
"PropertyGroupDaoStub.deletePropertyGroup() not implemented.");
}
}

View file

@ -0,0 +1,80 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package stubs.edu.cornell.mannlib.vitro.webapp.dao;
import java.util.Collection;
import edu.cornell.mannlib.vitro.webapp.beans.PropertyInstance;
import edu.cornell.mannlib.vitro.webapp.beans.PropertyInstanceIface;
import edu.cornell.mannlib.vitro.webapp.dao.PropertyInstanceDao;
/**
* TODO
*/
public class PropertyInstanceDaoStub implements PropertyInstanceDao {
// ----------------------------------------------------------------------
// Stub infrastructure
// ----------------------------------------------------------------------
// ----------------------------------------------------------------------
// Stub methods
// ----------------------------------------------------------------------
// ----------------------------------------------------------------------
// Un-implemented methods
// ----------------------------------------------------------------------
@Override
public void deleteObjectPropertyStatement(String subjectURI,
String propertyURI, String objectURI) {
throw new RuntimeException(
"PropertyInstanceDaoStub.deleteObjectPropertyStatement() not implemented.");
}
@Override
public Collection<PropertyInstance> getAllPossiblePropInstForIndividual(
String individualURI) {
throw new RuntimeException(
"PropertyInstanceDaoStub.getAllPossiblePropInstForIndividual() not implemented.");
}
@Override
public Collection<PropertyInstance> getAllPropInstByVClass(
String classURI) {
throw new RuntimeException(
"PropertyInstanceDaoStub.getAllPropInstByVClass() not implemented.");
}
@Override
public Collection<PropertyInstance> getExistingProperties(String entityURI,
String propertyURI) {
throw new RuntimeException(
"PropertyInstanceDaoStub.getExistingProperties() not implemented.");
}
@Override
public PropertyInstance getProperty(String subjectURI, String predicateURI,
String objectURI) {
throw new RuntimeException(
"PropertyInstanceDaoStub.getProperty() not implemented.");
}
@Override
public int insertProp(PropertyInstanceIface prop) {
throw new RuntimeException(
"PropertyInstanceDaoStub.insertProp() not implemented.");
}
@Override
public void insertPropertyInstance(PropertyInstance prop) {
throw new RuntimeException(
"PropertyInstanceDaoStub.insertPropertyInstance() not implemented.");
}
@Override
public void deletePropertyInstance(PropertyInstance prop) {
throw new RuntimeException(
"PropertyInstanceDaoStub.deletePropertyInstance() not implemented.");
}
}

View file

@ -2,10 +2,16 @@
package stubs.edu.cornell.mannlib.vitro.webapp.dao;
import static java.util.stream.Collectors.toList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.jena.vocabulary.RDF;
import com.google.common.base.Objects;
import edu.cornell.mannlib.vitro.webapp.beans.Classes2Classes;
import edu.cornell.mannlib.vitro.webapp.beans.VClass;
import edu.cornell.mannlib.vitro.webapp.beans.VClassGroup;
@ -13,48 +19,95 @@ import edu.cornell.mannlib.vitro.webapp.dao.InsertException;
import edu.cornell.mannlib.vitro.webapp.dao.VClassDao;
public class VClassDaoStub implements VClassDao {
// ----------------------------------------------------------------------
// Stub infrastructure
// ----------------------------------------------------------------------
// ----------------------------------------------------------------------
// Stub infrastructure
// ----------------------------------------------------------------------
private final Map<String, VClass> vclassesByUri = new HashMap<String, VClass>();
public void setVClass(String uri, VClass vclass) {
vclassesByUri.put(uri, vclass);
private static class VClassHolder {
final VClass vclass;
final String parentUri;
VClassHolder(VClass vclass, String parentUri) {
this.vclass = vclass;
this.parentUri = parentUri;
}
public VClass getVclass() {
return vclass;
}
public String getParentUri() {
return parentUri;
}
boolean isRoot() {
return parentUri == null;
}
boolean inOntology(String ontologyUri) {
return Objects.equal(ontologyUri, vclass.getNamespace());
}
}
private final Map<String, VClassHolder> vclassMap = new HashMap<>();
public void setVClass(VClass vclass) {
setVClass(vclass, null);
}
public void setVClass(VClass vclass, String parentUri) {
vclassMap.put(vclass.getURI(), new VClassHolder(vclass, parentUri));
}
// ----------------------------------------------------------------------
// Stub methods
// ----------------------------------------------------------------------
@Override
public List<VClass> getAllVclasses() {
return vclassMap.values().stream().map(VClassHolder::getVclass)
.collect(toList());
}
// Only direct (one-hop) sub-classes.
@Override
public List<String> getSubClassURIs(String classURI) {
return vclassMap.values().stream()
.filter(vch -> vch.parentUri == classURI)
.map(vch -> vch.getVclass().getURI()).collect(toList());
}
// ----------------------------------------------------------------------
// Stub methods
// ----------------------------------------------------------------------
@Override
public VClass getVClassByURI(String URI) {
return vclassesByUri.get(URI);
VClassHolder vch = vclassMap.get(URI);
return vch == null ? null : vch.getVclass();
}
// ----------------------------------------------------------------------
// Un-implemented methods
// ----------------------------------------------------------------------
@Override
public List<VClass> getRootClasses() {
throw new RuntimeException(
"VClassDaoStub.getRootClasses() not implemented.");
return vclassMap.values().stream().filter(VClassHolder::isRoot)
.map(VClassHolder::getVclass).collect(toList());
}
@Override
public List<VClass> getOntologyRootClasses(String ontologyURI) {
throw new RuntimeException(
"VClassDaoStub.getOntologyRootClasses() not implemented.");
return getRootClasses().stream()
.filter(vc -> Objects.equal(ontologyURI, vc.getNamespace()))
.collect(toList());
}
@Override
public List<VClass> getAllVclasses() {
throw new RuntimeException(
"VClassDaoStub.getAllVclasses() not implemented.");
public VClass getTopConcept() {
VClass top = new VClass();
top.setURI(RDF.getURI() + "Resource");
top.setName(top.getLocalName());
return top;
}
// ----------------------------------------------------------------------
// Un-implemented methods
// ----------------------------------------------------------------------
@Override
public List<String> getDisjointWithClassURIs(String vclassURI) {
throw new RuntimeException(
@ -116,7 +169,8 @@ public class VClassDaoStub implements VClassDao {
}
@Override
public void removeDisjointWithClass(String classURI, String disjointClassURI) {
public void removeDisjointWithClass(String classURI,
String disjointClassURI) {
throw new RuntimeException(
"VClassDaoStub.removeDisjointWithClass() not implemented.");
}
@ -134,17 +188,12 @@ public class VClassDaoStub implements VClassDao {
}
@Override
public void removeEquivalentClass(String classURI, String equivalentClassURI) {
public void removeEquivalentClass(String classURI,
String equivalentClassURI) {
throw new RuntimeException(
"VClassDaoStub.removeEquivalentClass() not implemented.");
}
@Override
public List<String> getSubClassURIs(String classURI) {
throw new RuntimeException(
"VClassDaoStub.getSubClassURIs() not implemented.");
}
@Override
public List<String> getAllSubClassURIs(String classURI) {
throw new RuntimeException(
@ -251,12 +300,6 @@ public class VClassDaoStub implements VClassDao {
"VClassDaoStub.isSubClassOf() not implemented.");
}
@Override
public VClass getTopConcept() {
throw new RuntimeException(
"VClassDaoStub.getTopConcept() not implemented.");
}
@Override
public VClass getBottomConcept() {
throw new RuntimeException(

View file

@ -0,0 +1,115 @@
package stubs.edu.cornell.mannlib.vitro.webapp.dao;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import org.apache.jena.ext.com.google.common.base.Objects;
import edu.cornell.mannlib.vitro.webapp.beans.VClassGroup;
import edu.cornell.mannlib.vitro.webapp.dao.VClassGroupDao;
public class VClassGroupDaoStub implements VClassGroupDao {
// ----------------------------------------------------------------------
// Stub infrastructure
// ----------------------------------------------------------------------
private List<VClassGroup> groups = new ArrayList<>();
public void setGroups(VClassGroup... groups) {
this.groups = new ArrayList<>(Arrays.asList(groups));
}
// ----------------------------------------------------------------------
// Stub methods
// ----------------------------------------------------------------------
@Override
public VClassGroup getGroupByURI(String uri) {
for (VClassGroup group: groups) {
if (Objects.equal(group.getURI(), uri)) {
return group;
}
}
return null;
}
@Override
public List<VClassGroup> getPublicGroupsWithVClasses() {
List<VClassGroup> list = new ArrayList<>();
for (VClassGroup group: groups) {
if (!group.isEmpty()) {
list.add(group);
}
}
return groups;
}
// ----------------------------------------------------------------------
// Un-implemented methods
// ----------------------------------------------------------------------
@Override
public LinkedHashMap<String, VClassGroup> getClassGroupMap() {
throw new RuntimeException(
"VClassGroupDaoStub.getClassGroupMap() not implemented.");
}
@Override
public List<VClassGroup> getPublicGroupsWithVClasses(boolean displayOrder) {
throw new RuntimeException(
"VClassGroupDaoStub.getPublicGroupsWithVClasses() not implemented.");
}
@Override
public List<VClassGroup> getPublicGroupsWithVClasses(boolean displayOrder,
boolean includeUninstantiatedClasses) {
throw new RuntimeException(
"VClassGroupDaoStub.getPublicGroupsWithVClasses() not implemented.");
}
@Override
public List<VClassGroup> getPublicGroupsWithVClasses(boolean displayOrder,
boolean includeUninstantiatedClasses, boolean getIndividualCount) {
throw new RuntimeException(
"VClassGroupDaoStub.getPublicGroupsWithVClasses() not implemented.");
}
@Override
public void sortGroupList(List<VClassGroup> groupList) {
throw new RuntimeException(
"VClassGroupDaoStub.sortGroupList() not implemented.");
}
@Override
public int removeUnpopulatedGroups(List<VClassGroup> groups) {
throw new RuntimeException(
"VClassGroupDaoStub.removeUnpopulatedGroups() not implemented.");
}
@Override
public int insertNewVClassGroup(VClassGroup vcg) {
throw new RuntimeException(
"VClassGroupDaoStub.insertNewVClassGroup() not implemented.");
}
@Override
public void updateVClassGroup(VClassGroup vcg) {
throw new RuntimeException(
"VClassGroupDaoStub.updateVClassGroup() not implemented.");
}
@Override
public void deleteVClassGroup(VClassGroup vcg) {
throw new RuntimeException(
"VClassGroupDaoStub.deleteVClassGroup() not implemented.");
}
@Override
public VClassGroup getGroupByName(String vcgName) {
throw new RuntimeException(
"VClassGroupDaoStub.getGroupByName() not implemented.");
}
}

View file

@ -38,14 +38,18 @@ public class WebappDaoFactoryStub implements WebappDaoFactory {
private String defaultNamespace;
private ApplicationDao applicationDao;
private DataPropertyDao dataPropertyDao;
private DatatypeDao datatypeDao;
private FauxPropertyDao fauxPropertyDao;
private IndividualDao individualDao;
private MenuDao menuDao;
private ObjectPropertyDao objectPropertyDao;
private ObjectPropertyStatementDao objectPropertyStatementDao;
private FauxPropertyDao fauxPropertyDao;
private OntologyDao ontologyDao;
private PropertyGroupDao propertyGroupDao;
private PropertyInstanceDao propertyInstanceDao;
private UserAccountsDao userAccountsDao;
private VClassDao vClassDao;
private VClassGroupDao vClassGroupDao;
public void setDefaultNamespace(String defaultNamespace) {
this.defaultNamespace = defaultNamespace;
@ -59,6 +63,14 @@ public class WebappDaoFactoryStub implements WebappDaoFactory {
this.dataPropertyDao = dataPropertyDao;
}
public void setDatatypeDao(DatatypeDao datatypeDao) {
this.datatypeDao = datatypeDao;
}
public void setFauxPropertyDao(FauxPropertyDao fauxPropertyDao) {
this.fauxPropertyDao = fauxPropertyDao;
}
public void setIndividualDao(IndividualDao individualDao) {
this.individualDao = individualDao;
}
@ -76,14 +88,19 @@ public class WebappDaoFactoryStub implements WebappDaoFactory {
this.objectPropertyStatementDao = objectPropertyStatementDao;
}
public void setFauxPropertyDao(FauxPropertyDao fauxPropertyDao) {
this.fauxPropertyDao = fauxPropertyDao;
}
public void setOntologyDao(OntologyDao ontologyDao) {
this.ontologyDao = ontologyDao;
}
public void setPropertyGroupDao(PropertyGroupDao propertyGroupDao) {
this.propertyGroupDao = propertyGroupDao;
}
public void setPropertyInstanceDao(
PropertyInstanceDao propertyInstanceDao) {
this.propertyInstanceDao = propertyInstanceDao;
}
public void setUserAccountsDao(UserAccountsDao userAccountsDao) {
this.userAccountsDao = userAccountsDao;
}
@ -92,6 +109,10 @@ public class WebappDaoFactoryStub implements WebappDaoFactory {
this.vClassDao = vClassDao;
}
public void setVClassGroupDao(VClassGroupDao vClassGroupDao) {
this.vClassGroupDao = vClassGroupDao;
}
// ----------------------------------------------------------------------
// Stub methods
// ----------------------------------------------------------------------
@ -111,6 +132,11 @@ public class WebappDaoFactoryStub implements WebappDaoFactory {
return this.dataPropertyDao;
}
@Override
public DatatypeDao getDatatypeDao() {
return this.datatypeDao;
}
@Override
public IndividualDao getIndividualDao() {
return this.individualDao;
@ -141,6 +167,16 @@ public class WebappDaoFactoryStub implements WebappDaoFactory {
return this.ontologyDao;
}
@Override
public PropertyGroupDao getPropertyGroupDao() {
return this.propertyGroupDao;
}
@Override
public PropertyInstanceDao getPropertyInstanceDao() {
return this.propertyInstanceDao;
}
@Override
public UserAccountsDao getUserAccountsDao() {
return this.userAccountsDao;
@ -151,6 +187,11 @@ public class WebappDaoFactoryStub implements WebappDaoFactory {
return this.vClassDao;
}
@Override
public VClassGroupDao getVClassGroupDao() {
return this.vClassGroupDao;
}
// ----------------------------------------------------------------------
// Un-implemented methods
// ----------------------------------------------------------------------
@ -203,12 +244,6 @@ public class WebappDaoFactoryStub implements WebappDaoFactory {
"WebappDaoFactory.getUserURI() not implemented.");
}
@Override
public DatatypeDao getDatatypeDao() {
throw new RuntimeException(
"WebappDaoFactory.getDatatypeDao() not implemented.");
}
@Override
public DataPropertyStatementDao getDataPropertyStatementDao() {
throw new RuntimeException(
@ -221,24 +256,6 @@ public class WebappDaoFactoryStub implements WebappDaoFactory {
"WebappDaoFactory.getDisplayModelDao() not implemented.");
}
@Override
public VClassGroupDao getVClassGroupDao() {
throw new RuntimeException(
"WebappDaoFactory.getVClassGroupDao() not implemented.");
}
@Override
public PropertyGroupDao getPropertyGroupDao() {
throw new RuntimeException(
"WebappDaoFactory.getPropertyGroupDao() not implemented.");
}
@Override
public PropertyInstanceDao getPropertyInstanceDao() {
throw new RuntimeException(
"WebappDaoFactory.getPropertyInstanceDao() not implemented.");
}
@Override
public PageDao getPageDao() {
throw new RuntimeException(

View file

@ -147,12 +147,6 @@
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.2.2</version>
<classifier>jdk15</classifier>
</dependency>
<dependency>
<groupId>net.sf.saxon</groupId>
<artifactId>Saxon-HE</artifactId>