From 3829f48b0ba54a89028f7db124df4482b71fc214 Mon Sep 17 00:00:00 2001 From: Jim Blake Date: Mon, 22 May 2017 14:42:10 -0400 Subject: [PATCH] VIVO-1319 Remove dependency on sourceforge.net JSON parser. (#60) * VIVO-1246 improve the ConfigurationBeanLoader: Add cardinality parameters minOccurs and maxOccurs Create README.md document in the edu.cornell.mannlib.vitro.webapp.utils.configuration package Split large class of unit tests into separate classes by functionality * VIVO-1247, remove duplicate code used with ConfigurationBeanLoader. Now that the @Property annotation includes cardinality parameters, we can remove a lot of duplicate code. * VIVO-1246 Move unit tests to the new location. * VIVO-1246 The documentation was in the wrong place. * Ignore all /bin/ directories under eclipse * First set of unit tests, along with enhancements to the stubs. * Clean up the unit tests with more expressive power. * VIVO-1319 Full tests on the controller output formats. * Create a Jackson-based quote(), to replace the net.sf.json-based quote() * Eliminate the use of net.sf.json.util.JSONUtils * Use Jackson JSON library instead of net.sf.json JSONNode, JSONArray, JSONObject become JsonNode, ArrayNode, and ObjectNode. No direct replacement for HSONSerializer, so create JacksonUtils Some of the message signatures are different, so adjust accordingly. --- .gitignore | 2 +- .../freemarker/ListClassGroupsController.java | 13 +- .../ListDatatypePropertiesController.java | 15 +- .../ListFauxPropertiesController.java | 10 - .../ListPropertyGroupsController.java | 11 +- .../ListPropertyWebappsController.java | 13 +- .../ListVClassWebappsController.java | 13 +- .../ShowClassHierarchyController.java | 14 +- .../ShowDataPropertyHierarchyController.java | 13 +- ...ShowObjectPropertyHierarchyController.java | 13 +- .../generators/ManagePageGenerator.java | 20 +- .../preprocessors/ManagePagePreprocessor.java | 56 ++-- .../utils/ProcessClassGroupDataGetterN3.java | 47 +-- .../utils/ProcessDataGetterN3.java | 6 +- .../utils/ProcessDataGetterN3Utils.java | 8 +- .../utils/ProcessFixedHTMLN3.java | 19 +- ...cessIndividualsForClassesDataGetterN3.java | 33 +- .../ProcessSearchIndividualsDataGetterN3.java | 19 +- .../utils/ProcessSparqlDataGetterN3.java | 29 +- .../vitro/webapp/utils/json/JacksonUtils.java | 81 +++++ .../sparqlrunner/StringResultsMapping.java | 2 +- .../ListClassGroupsControllerTest.java | 148 +++++++++ .../freemarker/ListControllerTestBase.java | 185 +++++++++++ .../ListDatatypePropertiesControllerTest.java | 255 +++++++++++++++ .../ListPropertyGroupsControllerTest.java | 170 ++++++++++ .../ListPropertyWebappsControllerTest.java | 253 +++++++++++++++ .../ListVClassWebappsControllerTest.java | 233 ++++++++++++++ .../ShowClassHierarchyControllerTest.java | 229 ++++++++++++++ ...owDataPropertyHierarchyControllerTest.java | 286 +++++++++++++++++ ...ObjectPropertyHierarchyControllerTest.java | 292 ++++++++++++++++++ .../controller/json/JsonServletTest.java | 2 +- .../webapp/utils/json/JacksonUtilsTest.java | 73 +++++ .../vitro/webapp/dao/DataPropertyDaoStub.java | 101 ++++-- .../vitro/webapp/dao/DatatypeDaoStub.java | 77 +++++ .../webapp/dao/ObjectPropertyDaoStub.java | 88 ++++-- .../vitro/webapp/dao/OntologyDaoStub.java | 11 +- .../webapp/dao/PropertyGroupDaoStub.java | 96 ++++++ .../webapp/dao/PropertyInstanceDaoStub.java | 80 +++++ .../vitro/webapp/dao/VClassDaoStub.java | 119 ++++--- .../vitro/webapp/dao/VClassGroupDaoStub.java | 115 +++++++ .../webapp/dao/WebappDaoFactoryStub.java | 75 +++-- dependencies/pom.xml | 6 - 42 files changed, 3013 insertions(+), 318 deletions(-) create mode 100644 api/src/main/java/edu/cornell/mannlib/vitro/webapp/utils/json/JacksonUtils.java create mode 100644 api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListClassGroupsControllerTest.java create mode 100644 api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListControllerTestBase.java create mode 100644 api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListDatatypePropertiesControllerTest.java create mode 100644 api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListPropertyGroupsControllerTest.java create mode 100644 api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListPropertyWebappsControllerTest.java create mode 100644 api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ListVClassWebappsControllerTest.java create mode 100644 api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ShowClassHierarchyControllerTest.java create mode 100644 api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ShowDataPropertyHierarchyControllerTest.java create mode 100644 api/src/test/java/edu/cornell/mannlib/vitro/webapp/controller/freemarker/ShowObjectPropertyHierarchyControllerTest.java create mode 100644 api/src/test/java/edu/cornell/mannlib/vitro/webapp/utils/json/JacksonUtilsTest.java create mode 100644 api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/DatatypeDaoStub.java create mode 100644 api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/PropertyGroupDaoStub.java create mode 100644 api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/PropertyInstanceDaoStub.java create mode 100644 api/src/test/java/stubs/edu/cornell/mannlib/vitro/webapp/dao/VClassGroupDaoStub.java 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