diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/individuallist/IndividualJsonWrapper.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/individuallist/IndividualJsonWrapper.java
deleted file mode 100644
index 3c5a629c..00000000
--- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/individuallist/IndividualJsonWrapper.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/* $This file is distributed under the terms of the license in /doc/license.txt$ */
-
-package edu.cornell.mannlib.vitro.webapp.controller.individuallist;
-
-import java.util.Collection;
-import java.util.Map;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import com.hp.hpl.jena.query.QuerySolution;
-import com.hp.hpl.jena.query.ResultSet;
-
-import edu.cornell.mannlib.vitro.webapp.beans.Individual;
-import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
-import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder;
-import edu.cornell.mannlib.vitro.webapp.dao.ObjectPropertyStatementDao;
-import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
-import edu.cornell.mannlib.vitro.webapp.dao.jena.QueryUtils;
-
-/**
- * Wrap an Individual in a JSON object for display by the script.
- *
- * This overrides the Vitro version so we can have more info in the display.
- */
-public class IndividualJsonWrapper {
- private static final Log log = LogFactory
- .getLog(IndividualJsonWrapper.class);
-
- private static String VCARD_DATA_QUERY = ""
- + "PREFIX obo: \n"
- + "PREFIX vcard: \n"
- + "SELECT DISTINCT ?title \n" + "WHERE { \n"
- + " ?subject obo:ARG_2000028 ?vIndividual . \n"
- + " ?vIndividual vcard:hasTitle ?vTitle . \n"
- + " ?vTitle vcard:title ?title . \n" + "} ";
-
- static JSONObject packageIndividualAsJson(VitroRequest vreq, Individual ind)
- throws JSONException {
- // need an unfiltered dao to get firstnames and lastnames
- WebappDaoFactory fullWdf = vreq.getUnfilteredWebappDaoFactory();
-
- JSONObject jo = new JSONObject();
- jo.put("URI", ind.getURI());
- jo.put("label", ind.getRdfsLabel());
- jo.put("name", ind.getName());
- jo.put("thumbUrl", ind.getThumbUrl());
- jo.put("imageUrl", ind.getImageUrl());
- jo.put("profileUrl", UrlBuilder.getIndividualProfileUrl(ind, vreq));
- jo.put("mostSpecificTypes", getMostSpecificTypes(ind, fullWdf));
- jo.put("preferredTitle", findPreferredTitle(vreq, ind));
- return jo;
- }
-
- private static String findPreferredTitle(VitroRequest vreq, Individual ind) {
- String queryStr = QueryUtils.subUriForQueryVar(VCARD_DATA_QUERY,
- "subject", ind.getURI());
- log.debug("queryStr = " + queryStr);
- String value = "";
- try {
- ResultSet results = QueryUtils.getQueryResults(queryStr, vreq);
- while (results.hasNext()) {
- QuerySolution soln = results.nextSolution();
- String t = QueryUtils.nodeToString(soln.get("title"));
- if (StringUtils.isNotBlank(t)) {
- value = t;
- }
- }
- } catch (Exception e) {
- log.error(e, e);
- }
- return value;
- }
-
- public static Collection getMostSpecificTypes(
- Individual individual, WebappDaoFactory wdf) {
- ObjectPropertyStatementDao opsDao = wdf.getObjectPropertyStatementDao();
- Map mostSpecificTypes = opsDao
- .getMostSpecificTypesInClassgroupsForIndividual(individual
- .getURI());
- return mostSpecificTypes.values();
- }
-
-}
diff --git a/api/src/main/java/org/vivoweb/webapp/startup/JSONWrapperSetup.java b/api/src/main/java/org/vivoweb/webapp/startup/JSONWrapperSetup.java
new file mode 100644
index 00000000..fb3e6f13
--- /dev/null
+++ b/api/src/main/java/org/vivoweb/webapp/startup/JSONWrapperSetup.java
@@ -0,0 +1,70 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package org.vivoweb.webapp.startup;
+
+import com.hp.hpl.jena.query.QuerySolution;
+import com.hp.hpl.jena.query.ResultSet;
+import edu.cornell.mannlib.vitro.webapp.beans.Individual;
+import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
+import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder;
+import edu.cornell.mannlib.vitro.webapp.controller.individuallist.IndividualJsonWrapper;
+import edu.cornell.mannlib.vitro.webapp.dao.ObjectPropertyStatementDao;
+import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
+import edu.cornell.mannlib.vitro.webapp.dao.jena.QueryUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+import java.util.Collection;
+import java.util.Map;
+
+public class JSONWrapperSetup implements ServletContextListener {
+ private static final Log log = LogFactory.getLog(JSONWrapperSetup.class);
+
+ @Override
+ public void contextInitialized(ServletContextEvent servletContextEvent) {
+ IndividualJsonWrapper.setAddJSONFields(new IndividualJsonWrapper.AddJSONFields() {
+ @Override
+ public void add(JSONObject jo, VitroRequest vreq, Individual ind) throws JSONException {
+ jo.put("preferredTitle", findPreferredTitle(vreq, ind));
+ }
+
+ private String VCARD_DATA_QUERY = ""
+ + "PREFIX obo: \n"
+ + "PREFIX vcard: \n"
+ + "SELECT DISTINCT ?title \n" + "WHERE { \n"
+ + " ?subject obo:ARG_2000028 ?vIndividual . \n"
+ + " ?vIndividual vcard:hasTitle ?vTitle . \n"
+ + " ?vTitle vcard:title ?title . \n" + "} ";
+
+ private String findPreferredTitle(VitroRequest vreq, Individual ind) {
+ String queryStr = QueryUtils.subUriForQueryVar(VCARD_DATA_QUERY,
+ "subject", ind.getURI());
+ log.debug("queryStr = " + queryStr);
+ String value = "";
+ try {
+ ResultSet results = QueryUtils.getQueryResults(queryStr, vreq);
+ while (results.hasNext()) {
+ QuerySolution soln = results.nextSolution();
+ String t = QueryUtils.nodeToString(soln.get("title"));
+ if (StringUtils.isNotBlank(t)) {
+ value = t;
+ }
+ }
+ } catch (Exception e) {
+ log.error(e, e);
+ }
+ return value;
+ }
+ });
+ }
+
+ @Override
+ public void contextDestroyed(ServletContextEvent servletContextEvent) {
+
+ }
+}
diff --git a/webapp/src/main/webapp/WEB-INF/resources/startup_listeners.txt b/webapp/src/main/webapp/WEB-INF/resources/startup_listeners.txt
index d626eb21..e4964492 100644
--- a/webapp/src/main/webapp/WEB-INF/resources/startup_listeners.txt
+++ b/webapp/src/main/webapp/WEB-INF/resources/startup_listeners.txt
@@ -59,6 +59,7 @@ edu.cornell.mannlib.vitro.webapp.visualization.setup.VisualizationSetup
org.vivoweb.webapp.startup.DataGetterN3Setup
org.vivoweb.webapp.startup.GeneratorSetup
+org.vivoweb.webapp.startup.JSONWrapperSetup
org.vivoweb.webapp.startup.MenuManagementSetup
org.vivoweb.webapp.startup.TemplateModelSetup
org.vivoweb.webapp.startup.SearchResultTemplateModelSetup