diff --git a/.gitignore b/.gitignore index c6f53fe5a..e007bd854 100644 --- a/.gitignore +++ b/.gitignore @@ -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/ diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListClassGroupsController.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListClassGroupsController.java index 4a45fbe05..1ed6b5d8d 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListClassGroupsController.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListClassGroupsController.java @@ -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(""+publicName+"") + ", "; + json += "{ \"name\": " + JacksonUtils.quote(""+publicName+"") + ", "; } 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(""+vcw.getName()+"") + ", "; + json += "{ \"name\": " + JacksonUtils.quote(""+vcw.getName()+"") + ", "; } 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 diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListDatatypePropertiesController.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListDatatypePropertiesController.java index 550767c23..9dfa6eb54 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListDatatypePropertiesController.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListDatatypePropertiesController.java @@ -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("" + nameStr + "") + ", "; + json += "{ \"name\": " + JacksonUtils.quote("" + nameStr + "") + ", "; } 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\" } }" ; } diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListFauxPropertiesController.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListFauxPropertiesController.java index 124a8f04d..eba0f1c7f 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListFauxPropertiesController.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListFauxPropertiesController.java @@ -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 { diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListPropertyGroupsController.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListPropertyGroupsController.java index f5cfdb223..b6e4704ee 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListPropertyGroupsController.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListPropertyGroupsController.java @@ -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("" + publicName + "") + ", "; + json += "{ \"name\": " + JacksonUtils.quote("" + publicName + "") + ", "; } 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(""+ nameStr +"") + ", "; } catch (Exception e) { - json += JSONUtils.quote(nameStr) + ", "; + json += JacksonUtils.quote(nameStr) + ", "; } } else { json += "\"\", "; diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListPropertyWebappsController.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListPropertyWebappsController.java index 8c6398394..48f63f8a5 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListPropertyWebappsController.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListPropertyWebappsController.java @@ -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("" + json += "{ \"name\": " + JacksonUtils.quote("" + propNameStr + "") + ", "; } 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\" } }" ; } diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListVClassWebappsController.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListVClassWebappsController.java index 05c2c309b..caa2251a5 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListVClassWebappsController.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListVClassWebappsController.java @@ -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(""+cls.getPickListName()+"") + ", "; + json += "{ \"name\": " + JacksonUtils.quote(""+cls.getPickListName()+"") + ", "; } 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++; diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ShowClassHierarchyController.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ShowClassHierarchyController.java index 7a2b1265d..a969c3fd3 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ShowClassHierarchyController.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ShowClassHierarchyController.java @@ -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("" + vcw.getPickListName() + "") +", "; } 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; diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ShowDataPropertyHierarchyController.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ShowDataPropertyHierarchyController.java index e5a47afb4..089bba107 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ShowDataPropertyHierarchyController.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ShowDataPropertyHierarchyController.java @@ -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( "" + nameStr + "") + ", "; - 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\""; } diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ShowObjectPropertyHierarchyController.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ShowObjectPropertyHierarchyController.java index f8622d2c7..62d3981a2 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ShowObjectPropertyHierarchyController.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ShowObjectPropertyHierarchyController.java @@ -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( "" + nameStr + "") + ", "; - 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\""; diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/ManagePageGenerator.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/ManagePageGenerator.java index 8202b6d89..a60bde138 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/ManagePageGenerator.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/ManagePageGenerator.java @@ -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 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); } diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/ManagePagePreprocessor.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/ManagePagePreprocessor.java index e2d5624c9..ebe7964cf 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/ManagePagePreprocessor.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/ManagePagePreprocessor.java @@ -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> transformedLiteralsFromForm = null; private static Map> urisFromForm = null; private static List pageContentUnits = null;//String submission from form - private static List pageContentUnitsJSON = null;//converted to JSON objects that can be read + private static List 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(); + pageContentUnitsJSON = new ArrayList(); //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 literalLabels = pn.getLiteralVarNamesBase(); List uriLabels = pn.getUriVarNamesBase(); for(String literalLabel:literalLabels) { List literalValues = new ArrayList(); - 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) 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 uriValues = new ArrayList(); - 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) 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); diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessClassGroupDataGetterN3.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessClassGroupDataGetterN3.java index 11534b581..624506563 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessClassGroupDataGetterN3.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessClassGroupDataGetterN3.java @@ -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); } } diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessDataGetterN3.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessDataGetterN3.java index 94af2fb11..65fcffb58 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessDataGetterN3.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessDataGetterN3.java @@ -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> retrieveExistingLiteralValues(); public Map> 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); } diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessDataGetterN3Utils.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessDataGetterN3Utils.java index 88490d925..0ea4c72b0 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessDataGetterN3Utils.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessDataGetterN3Utils.java @@ -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 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); diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessFixedHTMLN3.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessFixedHTMLN3.java index 9313b5232..8208300b1 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessFixedHTMLN3.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessFixedHTMLN3.java @@ -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); diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessIndividualsForClassesDataGetterN3.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessIndividualsForClassesDataGetterN3.java index 48b05f90f..47876b520 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessIndividualsForClassesDataGetterN3.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessIndividualsForClassesDataGetterN3.java @@ -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); } diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessSearchIndividualsDataGetterN3.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessSearchIndividualsDataGetterN3.java index eedd1a322..032f16b7d 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessSearchIndividualsDataGetterN3.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessSearchIndividualsDataGetterN3.java @@ -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); diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessSparqlDataGetterN3.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessSparqlDataGetterN3.java index 0b4d1e25a..ae435b2f0 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessSparqlDataGetterN3.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/preprocessors/utils/ProcessSparqlDataGetterN3.java @@ -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", ""); } } diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/utils/json/JacksonUtils.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/utils/json/JacksonUtils.java new file mode 100644 index 000000000..79835f9fc --- /dev/null +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/utils/json/JacksonUtils.java @@ -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) JSONSerializer.toJava(values); + * + * So here is a replacement for that. + */ + public static List jsonArrayToStrings(ArrayNode values) { + List 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); + } + + } +} diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/utils/sparqlrunner/StringResultsMapping.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/utils/sparqlrunner/StringResultsMapping.java index c3c4d46d7..9e6812a53 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/utils/sparqlrunner/StringResultsMapping.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/utils/sparqlrunner/StringResultsMapping.java @@ -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; diff --git a/api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListClassGroupsControllerTest.java b/api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListClassGroupsControllerTest.java new file mode 100644 index 000000000..3e07c68d7 --- /dev/null +++ b/api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListClassGroupsControllerTest.java @@ -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: + * + *
+ * 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
+ * 
+ */ + +public class ListClassGroupsControllerTest extends ListControllerTestBase { + private static final String LINK_FORMAT_GROUP = "%s"; + private static final String LINK_FORMAT_CLASS = "%s"; + 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; + } + +} diff --git a/api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListControllerTestBase.java b/api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListControllerTestBase.java new file mode 100644 index 000000000..b17571957 --- /dev/null +++ b/api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListControllerTestBase.java @@ -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("%s", 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("%s", 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; + } + } +} diff --git a/api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListDatatypePropertiesControllerTest.java b/api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListDatatypePropertiesControllerTest.java new file mode 100644 index 000000000..30bd1ccde --- /dev/null +++ b/api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListDatatypePropertiesControllerTest.java @@ -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: + * + *
+ * 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
+ * 
+ */ +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; + } +} diff --git a/api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListPropertyGroupsControllerTest.java b/api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListPropertyGroupsControllerTest.java new file mode 100644 index 000000000..6e6bb3310 --- /dev/null +++ b/api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListPropertyGroupsControllerTest.java @@ -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: + * + *
+ * 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
+ * 
+ */ + +public class ListPropertyGroupsControllerTest extends ListControllerTestBase { + private static final String LINK_FORMAT_GROUP = "%s"; + private static final String LINK_FORMAT_DATA_PROPERTY = "%s"; + private static final String LINK_FORMAT_OBJECT_PROPERTY = "%s"; + 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; + } + +} diff --git a/api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListPropertyWebappsControllerTest.java b/api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListPropertyWebappsControllerTest.java new file mode 100644 index 000000000..773616d5b --- /dev/null +++ b/api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListPropertyWebappsControllerTest.java @@ -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: + * + *
+ * 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
+ * 
+ */ +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; + } + +} diff --git a/api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListVClassWebappsControllerTest.java b/api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListVClassWebappsControllerTest.java new file mode 100644 index 000000000..6df219b9f --- /dev/null +++ b/api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListVClassWebappsControllerTest.java @@ -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: + * + *
+ * 
+ * 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
+ * 
+ */ + +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; + } +} diff --git a/api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ShowClassHierarchyControllerTest.java b/api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ShowClassHierarchyControllerTest.java new file mode 100644 index 000000000..d64362f67 --- /dev/null +++ b/api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ShowClassHierarchyControllerTest.java @@ -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: + * + *
+ * 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
+ * 
+ */ +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; + } +} diff --git a/api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ShowDataPropertyHierarchyControllerTest.java b/api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ShowDataPropertyHierarchyControllerTest.java new file mode 100644 index 000000000..af7bb0eee --- /dev/null +++ b/api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ShowDataPropertyHierarchyControllerTest.java @@ -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: + * + *
+ * 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
+ * 
+ */ +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; + } + +} diff --git a/api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ShowObjectPropertyHierarchyControllerTest.java b/api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ShowObjectPropertyHierarchyControllerTest.java new file mode 100644 index 000000000..c5acb6871 --- /dev/null +++ b/api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ShowObjectPropertyHierarchyControllerTest.java @@ -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: + * + *
+ * 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
+ * 
+ */ +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); + } + +} diff --git a/api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/json/JsonServletTest.java b/api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/json/JsonServletTest.java index 625f0e598..505930e85 100644 --- a/api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/json/JsonServletTest.java +++ b/api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/json/JsonServletTest.java @@ -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); diff --git a/api/src/test/java/edu/cornell/mannlib/vitro/webapp/utils/json/JacksonUtilsTest.java b/api/src/test/java/edu/cornell/mannlib/vitro/webapp/utils/json/JacksonUtilsTest.java new file mode 100644 index 000000000..6fda141a8 --- /dev/null +++ b/api/src/test/java/edu/cornell/mannlib/vitro/webapp/utils/json/JacksonUtilsTest.java @@ -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); + // } +} diff --git a/api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/DataPropertyDaoStub.java b/api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/DataPropertyDaoStub.java index 1268c3be7..29eaebc08 100644 --- a/api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/DataPropertyDaoStub.java +++ b/api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/DataPropertyDaoStub.java @@ -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 dpMap = new HashMap(); + + 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 dataPropertyMap = new HashMap<>(); + private final Map configFilesMap = new HashMap(); - + 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 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 getRootDataProperties() { + return dataPropertyMap.values().stream().filter(DataPropertyHolder::isRoot) + .map(DataPropertyHolder::getDataProperty).collect(toList()); + } + + @Override + public List 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 getSubPropertyURIs(String propertyURI) { - throw new RuntimeException( - "PropertyDao.getSubPropertyURIs() not implemented."); - } - @Override public List getAllSubPropertyURIs(String propertyURI) { throw new RuntimeException( @@ -172,7 +223,8 @@ public class DataPropertyDaoStub implements DataPropertyDao { } @Override - public List getSuperPropertyURIs(String propertyURI, boolean direct) { + public List getSuperPropertyURIs(String propertyURI, + boolean direct) { throw new RuntimeException( "PropertyDao.getSuperPropertyURIs() not implemented."); } @@ -190,7 +242,8 @@ public class DataPropertyDaoStub implements DataPropertyDao { } @Override - public List getClassesWithRestrictionOnProperty(String propertyURI) { + public List 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 getRootDataProperties() { - throw new RuntimeException( - "DataPropertyDao.getRootDataProperties() not implemented."); - } - @Override public boolean annotateDataPropertyAsExternalIdentifier( String dataPropertyURI) { diff --git a/api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/DatatypeDaoStub.java b/api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/DatatypeDaoStub.java new file mode 100644 index 000000000..87484b287 --- /dev/null +++ b/api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/DatatypeDaoStub.java @@ -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 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 getAllDatatypes() { + throw new RuntimeException( + "DatatypeDaoStub.getAllDatatypes() not implemented."); + } + +} diff --git a/api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/ObjectPropertyDaoStub.java b/api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/ObjectPropertyDaoStub.java index af2737a8a..88fee1e99 100644 --- a/api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/ObjectPropertyDaoStub.java +++ b/api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/ObjectPropertyDaoStub.java @@ -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 opMap = new HashMap(); - private final Map configFilesMap = new HashMap(); + 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 objectPropertyMap = new HashMap<>(); + private final Map 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 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 getRootObjectProperties() { + return objectPropertyMap.values().stream().filter(ObjectPropertyHolder::isRoot) + .map(ObjectPropertyHolder::getObjectProperty).collect(toList()); + } + + @Override + public List 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 getClassesWithRestrictionOnProperty(String propertyURI) { + public List 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 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 getRootObjectProperties() { - throw new RuntimeException( - "ObjectPropertyDaoStub.getRootObjectProperties() not implemented."); - } - @Override public List getObjectPropertyList(Individual subject) { throw new RuntimeException( diff --git a/api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/OntologyDaoStub.java b/api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/OntologyDaoStub.java index e2ec2c77f..68d39441e 100644 --- a/api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/OntologyDaoStub.java +++ b/api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/OntologyDaoStub.java @@ -38,16 +38,15 @@ public class OntologyDaoStub implements OntologyDao { return new ArrayList(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( diff --git a/api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/PropertyGroupDaoStub.java b/api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/PropertyGroupDaoStub.java new file mode 100644 index 000000000..3a73c6287 --- /dev/null +++ b/api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/PropertyGroupDaoStub.java @@ -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 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 getPublicGroups(boolean withProperties) { + List 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 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."); + } + +} diff --git a/api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/PropertyInstanceDaoStub.java b/api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/PropertyInstanceDaoStub.java new file mode 100644 index 000000000..e7ca397dc --- /dev/null +++ b/api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/PropertyInstanceDaoStub.java @@ -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 getAllPossiblePropInstForIndividual( + String individualURI) { + throw new RuntimeException( + "PropertyInstanceDaoStub.getAllPossiblePropInstForIndividual() not implemented."); + } + + @Override + public Collection getAllPropInstByVClass( + String classURI) { + throw new RuntimeException( + "PropertyInstanceDaoStub.getAllPropInstByVClass() not implemented."); + } + + @Override + public Collection 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."); + } + +} diff --git a/api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/VClassDaoStub.java b/api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/VClassDaoStub.java index 8365f47eb..477f25ad4 100644 --- a/api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/VClassDaoStub.java +++ b/api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/VClassDaoStub.java @@ -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 vclassesByUri = new HashMap(); - - 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 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 getAllVclasses() { + return vclassMap.values().stream().map(VClassHolder::getVclass) + .collect(toList()); + } + + // Only direct (one-hop) sub-classes. + @Override + public List 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 getRootClasses() { - throw new RuntimeException( - "VClassDaoStub.getRootClasses() not implemented."); + return vclassMap.values().stream().filter(VClassHolder::isRoot) + .map(VClassHolder::getVclass).collect(toList()); } @Override public List 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 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 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 getSubClassURIs(String classURI) { - throw new RuntimeException( - "VClassDaoStub.getSubClassURIs() not implemented."); - } - @Override public List 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( diff --git a/api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/VClassGroupDaoStub.java b/api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/VClassGroupDaoStub.java new file mode 100644 index 000000000..092df201e --- /dev/null +++ b/api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/VClassGroupDaoStub.java @@ -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 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 getPublicGroupsWithVClasses() { + List list = new ArrayList<>(); + for (VClassGroup group: groups) { + if (!group.isEmpty()) { + list.add(group); + } + } + return groups; + } + + // ---------------------------------------------------------------------- + // Un-implemented methods + // ---------------------------------------------------------------------- + + @Override + public LinkedHashMap getClassGroupMap() { + throw new RuntimeException( + "VClassGroupDaoStub.getClassGroupMap() not implemented."); + } + + @Override + public List getPublicGroupsWithVClasses(boolean displayOrder) { + throw new RuntimeException( + "VClassGroupDaoStub.getPublicGroupsWithVClasses() not implemented."); + } + + @Override + public List getPublicGroupsWithVClasses(boolean displayOrder, + boolean includeUninstantiatedClasses) { + throw new RuntimeException( + "VClassGroupDaoStub.getPublicGroupsWithVClasses() not implemented."); + } + + @Override + public List getPublicGroupsWithVClasses(boolean displayOrder, + boolean includeUninstantiatedClasses, boolean getIndividualCount) { + throw new RuntimeException( + "VClassGroupDaoStub.getPublicGroupsWithVClasses() not implemented."); + } + + @Override + public void sortGroupList(List groupList) { + throw new RuntimeException( + "VClassGroupDaoStub.sortGroupList() not implemented."); + } + + @Override + public int removeUnpopulatedGroups(List 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."); + } + +} diff --git a/api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/WebappDaoFactoryStub.java b/api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/WebappDaoFactoryStub.java index f119e57f5..05f8dfbfd 100644 --- a/api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/WebappDaoFactoryStub.java +++ b/api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/WebappDaoFactoryStub.java @@ -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( diff --git a/dependencies/pom.xml b/dependencies/pom.xml index f69e44187..a8d73d830 100644 --- a/dependencies/pom.xml +++ b/dependencies/pom.xml @@ -147,12 +147,6 @@ - - net.sf.json-lib - json-lib - 2.2.2 - jdk15 - net.sf.saxon Saxon-HE