From 3250efd091a2db70b497a157bc2e58cb6fff6ef5 Mon Sep 17 00:00:00 2001 From: j2blake Date: Wed, 2 May 2012 17:46:08 +0000 Subject: [PATCH] NIHVIVO-3746 Change DataGetter.getData() so it doesn't require VitroRequest. Modify implementations of DataGetter to conform. --- .../freemarker/HomePageController.java | 2 +- .../freemarker/MenuManagementController.java | 2 +- .../controller/freemarker/PageController.java | 6 +-- .../FakeApplicationOntologyService.java | 23 ++++++----- .../shortview/ShortViewServiceImpl.java | 16 +++----- .../utils/dataGetter/BrowseDataGetter.java | 16 +++++--- .../utils/dataGetter/ClassGroupPageData.java | 15 +++++-- .../webapp/utils/dataGetter/DataGetter.java | 41 ++++++++++--------- .../IndividualsForClassesDataGetter.java | 24 +++++------ .../dataGetter/SparqlQueryDataGetter.java | 15 +++++-- 10 files changed, 87 insertions(+), 73 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/HomePageController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/HomePageController.java index 0372725fd..6dfa102d7 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/HomePageController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/HomePageController.java @@ -31,7 +31,7 @@ public class HomePageController extends FreemarkerHttpServlet { List dgList = DataGetterUtils.getDataGettersForPage(vreq, vreq.getDisplayModel(), DisplayVocabulary.HOME_PAGE_URI); for( DataGetter dg : dgList){ - Map moreData = dg.getData(getServletContext(),vreq,body); + Map moreData = dg.getData(body); if( moreData != null ){ body.putAll(moreData); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/MenuManagementController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/MenuManagementController.java index d62f2e91f..d2aa9084f 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/MenuManagementController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/MenuManagementController.java @@ -284,7 +284,7 @@ public class MenuManagementController extends FreemarkerHttpServlet { //TODO: Change so that instantiation here occurs correctly <-- how should data getter be instantiated DataGetter pg = DataGetterUtils.dataGetterForURI(vreq, vreq.getDisplayModel(), dataGetterURI); //TODO: Check template data variable and what that is? - Map pageData = pg.getData(getServletContext(), vreq, templateData); + Map pageData = pg.getData(templateData); //Map pageInfo = vreq.getWebappDaoFactory().getPageDao().getPage(pageURI); SelectDataGetterUtils.processAndRetrieveData(vreq, getServletContext(), pageData, className, templateData); } catch(Exception ex) { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/PageController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/PageController.java index 5db8c7b1a..10ff18f7c 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/PageController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/PageController.java @@ -67,7 +67,7 @@ public class PageController extends FreemarkerHttpServlet{ //executePageDataGetters( pageUri, vreq, getServletContext(), mapForTemplate ); //these should all be data getters now - executeDataGetters( pageUri, vreq, getServletContext(), mapForTemplate); + executeDataGetters( pageUri, vreq, mapForTemplate); mapForTemplate.putAll( getPageControllerValues( pageUri, vreq, getServletContext(), mapForTemplate)); @@ -75,12 +75,12 @@ public class PageController extends FreemarkerHttpServlet{ return rv; } - private void executeDataGetters(String pageUri, VitroRequest vreq, ServletContext context, Map mapForTemplate) + private void executeDataGetters(String pageUri, VitroRequest vreq, Map mapForTemplate) throws Exception { List dgList = DataGetterUtils.getDataGettersForPage(vreq, vreq.getDisplayModel(), pageUri); for( DataGetter dg : dgList){ - Map moreData = dg.getData(context,vreq,mapForTemplate); + Map moreData = dg.getData(mapForTemplate); if( moreData != null ){ mapForTemplate.putAll(moreData); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/services/shortview/FakeApplicationOntologyService.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/services/shortview/FakeApplicationOntologyService.java index 46e322645..7171c73a6 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/services/shortview/FakeApplicationOntologyService.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/services/shortview/FakeApplicationOntologyService.java @@ -46,12 +46,13 @@ public class FakeApplicationOntologyService { * Return the template name and DataGetter instances associated with this * class and this short view context. If none, return null. */ - public TemplateAndDataGetters getShortViewProperties(WebappDaoFactory wadf, + public TemplateAndDataGetters getShortViewProperties(VitroRequest vreq, Individual individual, String classUri, String contextName) { if ((BROWSE.name().equals(contextName)) - && (isClassInPeopleClassGroup(wadf, classUri))) { + && (isClassInPeopleClassGroup(vreq.getWebappDaoFactory(), + classUri))) { return new TemplateAndDataGetters("view-browse-people.ftl", - new FakeVivoPeopleDataGetter(individual.getURI())); + new FakeVivoPeopleDataGetter(vreq, individual.getURI())); } // A mockup of Tammy's use case. // if ((SEARCH.name().equals(contextName)) @@ -117,8 +118,7 @@ public class FakeApplicationOntologyService { private static class FakeFacultyDataGetter implements DataGetter { @Override - public Map getData(ServletContext context, - VitroRequest vreq, Map valueMap) { + public Map getData(Map valueMap) { Map map = new HashMap(); Map extras = new HashMap(); extras.put("departmentName", "Department of Redundancy Department"); @@ -156,19 +156,22 @@ public class FakeApplicationOntologyService { } private String individualUri; + private VitroRequest vreq; + private ServletContext ctx; - public FakeVivoPeopleDataGetter(String individualUri) { - super(fakeDisplayModel, "http://FakeVivoPeopleDataGetter"); + public FakeVivoPeopleDataGetter(VitroRequest vreq, String individualUri) { + super(vreq, fakeDisplayModel, "http://FakeVivoPeopleDataGetter"); this.individualUri = individualUri; + this.vreq = vreq; + this.ctx = vreq.getSession().getServletContext(); } @Override - public Map getData(ServletContext context, - VitroRequest vreq, Map pageData) { + public Map getData(Map pageData) { Map parms = new HashMap(); parms.put("uri", new String[] { individualUri }); - return doQuery(parms, getModel(context, vreq, null)); + return doQuery(parms, getModel(ctx, vreq, null)); } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/services/shortview/ShortViewServiceImpl.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/services/shortview/ShortViewServiceImpl.java index 822577cd7..078ff45a8 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/services/shortview/ShortViewServiceImpl.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/services/shortview/ShortViewServiceImpl.java @@ -11,8 +11,6 @@ import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; -import javax.servlet.ServletContext; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -80,7 +78,7 @@ public class ShortViewServiceImpl implements ShortViewService { ShortViewContext svContext, VitroRequest vreq) { TemplateAndDataGetters tdg = fetchTemplateAndDataGetters(individual, svContext, vreq); - Map gotData = runDataGetters(tdg.getDataGetters(), vreq); + Map gotData = runDataGetters(tdg.getDataGetters()); return new TemplateAndSupplementalDataImpl(tdg.getTemplateName(), gotData); } @@ -103,9 +101,8 @@ public class ShortViewServiceImpl implements ShortViewService { classUris.addAll(figureMostSpecificClassUris(individual)); for (String classUri : classUris) { - TemplateAndDataGetters tdg = faker.getShortViewProperties( - vreq.getWebappDaoFactory(), individual, classUri, - svContext.name()); + TemplateAndDataGetters tdg = faker.getShortViewProperties(vreq, + individual, classUri, svContext.name()); if (tdg != null) { return tdg; } @@ -116,13 +113,10 @@ public class ShortViewServiceImpl implements ShortViewService { } /** Build a data map from the combined results of all data getters. */ - private Map runDataGetters(Set dataGetters, - VitroRequest vreq) { - ServletContext ctx = vreq.getSession().getServletContext(); - + private Map runDataGetters(Set dataGetters) { Map gotData = new HashMap(); for (DataGetter dg : dataGetters) { - gotData.putAll(dg.getData(ctx, vreq, EMPTY_MAP)); + gotData.putAll(dg.getData(EMPTY_MAP)); } return gotData; } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/BrowseDataGetter.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/BrowseDataGetter.java index 6c1192822..34e14477c 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/BrowseDataGetter.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/BrowseDataGetter.java @@ -34,28 +34,34 @@ import edu.cornell.mannlib.vitro.webapp.web.templatemodels.individuallist.Listed public class BrowseDataGetter extends DataGetterBase implements DataGetter { final static Log log = LogFactory.getLog(BrowseDataGetter.class); String dataGetterURI; + VitroRequest vreq; + ServletContext context; /** * Constructor with display model and data getter URI that will be called by reflection. */ - public BrowseDataGetter(Model displayModel, String dataGetterURI){ - this.configure(displayModel,dataGetterURI); + public BrowseDataGetter(VitroRequest vreq, Model displayModel, String dataGetterURI){ + this.configure(vreq, displayModel,dataGetterURI); } /** * Configure this instance based on the URI and display model. */ - protected void configure(Model displayModel, String dataGetterURI) { + protected void configure(VitroRequest vreq, Model displayModel, String dataGetterURI) { + if( vreq == null ) + throw new IllegalArgumentException("VitroRequest may not be null."); if( displayModel == null ) throw new IllegalArgumentException("Display Model may not be null."); if( dataGetterURI == null ) throw new IllegalArgumentException("PageUri may not be null."); - this.dataGetterURI = dataGetterURI; + this.vreq = vreq; + this.context = vreq.getSession().getServletContext(); + this.dataGetterURI = dataGetterURI; } @Override - public Map getData(ServletContext context, VitroRequest vreq, Map pageData) { + public Map getData(Map pageData) { try{ Map params = vreq.getParameterMap(); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/ClassGroupPageData.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/ClassGroupPageData.java index a019d52dc..b1f589c2f 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/ClassGroupPageData.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/ClassGroupPageData.java @@ -32,29 +32,36 @@ public class ClassGroupPageData extends DataGetterBase implements DataGetter{ private static final Log log = LogFactory.getLog(ClassGroupPageData.class); String dataGetterURI; String classGroupUri; + VitroRequest vreq; + ServletContext context; + /** * Constructor with display model and data getter URI that will be called by reflection. */ - public ClassGroupPageData(Model displayModel, String dataGetterURI){ - this.configure(displayModel,dataGetterURI); + public ClassGroupPageData(VitroRequest vreq, Model displayModel, String dataGetterURI){ + this.configure(vreq, displayModel,dataGetterURI); } /** * Configure this instance based on the URI and display model. */ - protected void configure(Model displayModel, String dataGetterURI) { + protected void configure(VitroRequest vreq, Model displayModel, String dataGetterURI) { + if( vreq == null ) + throw new IllegalArgumentException("VitroRequest may not be null."); if( displayModel == null ) throw new IllegalArgumentException("Display Model may not be null."); if( dataGetterURI == null ) throw new IllegalArgumentException("PageUri may not be null."); + this.vreq = vreq; + this.context = vreq.getSession().getServletContext(); this.dataGetterURI = dataGetterURI; this.classGroupUri = DataGetterUtils.getClassGroupForDataGetter(displayModel, dataGetterURI); } @Override - public Map getData(ServletContext context, VitroRequest vreq, Map pageData) { + public Map getData(Map pageData) { HashMap data = new HashMap(); data.put("classGroupUri", this.classGroupUri); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/DataGetter.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/DataGetter.java index 5836692b3..4f1a8857e 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/DataGetter.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/DataGetter.java @@ -3,16 +3,21 @@ package edu.cornell.mannlib.vitro.webapp.utils.dataGetter; import java.util.Map; -import javax.servlet.ServletContext; - -import com.hp.hpl.jena.rdf.model.Model; - -import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; - /** * A class to get data based on configurations in RDF. These are useful for pages bug not specific to pages. * Consider using this interface when you need data based on RDF configuration. * + * Instances should be short-lived, and only used on a single HTTP request. The getData method accepts only + * a value map, so if stat is required from the request (or the servlet context), the request should be + * passed to the constructor. + * + * Constructors: Objects that implement this interface will be constructed by reflection with the following + * constructor signatures in the following order: + * DataGetter( VitroRequest vreq, Model displayModel, String dataGetterURI ) + * DataGetter( Model displayModel, String dataGetterURI ) + * DataGetter( VitroRequest vreq ) + * DataGetter() + * * The main difference between this and PageDataGetter is that these are configured not based on page URI * but on DataGetter URI. This allows a configuration of a DataGetter to be used in multiple situations. * The DataGetter is not passed information about what page it might be associated with. @@ -20,22 +25,18 @@ import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; * Using this interface is preferred over PageDataGetter because then the DataGetter can be associated with * things other than pages. * - * Constructors: Objects that implement this interface will be constructed by reflection with the following - * constructor signatures in the following order: - * DataGetter( Model displayModel, String dataGetterURI ) - * DataGetter() - * */ public interface DataGetter { - /** - * Get data. Throwing an Exception is acceptable. - * - * @param context - servlet context to get state from - * @param vreq - request to get state from - * @param valueMap - any values already generated by data getters or the controller. - * @return data to add to valueMap. Should not be null. - */ - Map getData(ServletContext context, VitroRequest vreq, Map valueMap ); + /** + * Get data. Throwing an Exception is acceptable. + * + * @param valueMap + * any values already generated by data getters or the controller. + * Might be immutable, and should not be modified within the method. + * + * @return data to add to valueMap. Might be empty, but should not be null. + */ + Map getData( Map valueMap ); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/IndividualsForClassesDataGetter.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/IndividualsForClassesDataGetter.java index 7a0ae2ef7..1d5c10a3d 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/IndividualsForClassesDataGetter.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/IndividualsForClassesDataGetter.java @@ -5,7 +5,6 @@ package edu.cornell.mannlib.vitro.webapp.utils.dataGetter; import java.net.URLEncoder; import java.util.ArrayList; import java.util.Collections; -import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -17,30 +16,21 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.json.JSONObject; -import com.hp.hpl.jena.query.Query; import com.hp.hpl.jena.query.QueryExecution; import com.hp.hpl.jena.query.QueryExecutionFactory; -import com.hp.hpl.jena.query.QueryFactory; import com.hp.hpl.jena.query.QuerySolution; import com.hp.hpl.jena.query.QuerySolutionMap; import com.hp.hpl.jena.query.ResultSet; import com.hp.hpl.jena.rdf.model.Model; -import com.hp.hpl.jena.rdf.model.RDFNode; import com.hp.hpl.jena.rdf.model.ResourceFactory; -import com.hp.hpl.jena.rdf.model.Statement; -import com.hp.hpl.jena.rdf.model.StmtIterator; import com.hp.hpl.jena.shared.Lock; -import edu.cornell.mannlib.vitro.webapp.beans.Individual; 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 edu.cornell.mannlib.vitro.webapp.controller.freemarker.IndividualListController; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder; import edu.cornell.mannlib.vitro.webapp.dao.DisplayVocabulary; -import edu.cornell.mannlib.vitro.webapp.dao.PageDao; import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary; -import edu.cornell.mannlib.vitro.webapp.dao.jena.ModelContext; import edu.cornell.mannlib.vitro.webapp.dao.jena.VClassGroupCache; import edu.cornell.mannlib.vitro.webapp.web.templatemodels.VClassGroupTemplateModel; @@ -52,6 +42,8 @@ import edu.cornell.mannlib.vitro.webapp.web.templatemodels.VClassGroupTemplateMo public class IndividualsForClassesDataGetter extends DataGetterBase implements DataGetter{ private static final Log log = LogFactory.getLog(IndividualsForClassesDataGetter.class); protected static String restrictClassesTemplateName = null; + VitroRequest vreq; + ServletContext context; String dataGetterURI; String classGroupURI; Map classIntersectionsMap; @@ -59,19 +51,23 @@ public class IndividualsForClassesDataGetter extends DataGetterBase implements D /** * Constructor with display model and data getter URI that will be called by reflection. */ - public IndividualsForClassesDataGetter(Model displayModel, String dataGetterURI){ - this.configure(displayModel,dataGetterURI); + public IndividualsForClassesDataGetter(VitroRequest vreq, Model displayModel, String dataGetterURI){ + this.configure(vreq,displayModel,dataGetterURI); } /** * Configure this instance based on the URI and display model. */ - protected void configure(Model displayModel, String dataGetterURI) { + protected void configure(VitroRequest vreq, Model displayModel, String dataGetterURI) { + if( vreq == null ) + throw new IllegalArgumentException("VitroRequest may not be null."); if( displayModel == null ) throw new IllegalArgumentException("Display Model may not be null."); if( dataGetterURI == null ) throw new IllegalArgumentException("PageUri may not be null."); + this.vreq = vreq; + this.context = vreq.getSession().getServletContext(); this.dataGetterURI = dataGetterURI; this.classGroupURI = DataGetterUtils.getClassGroupForDataGetter(displayModel, dataGetterURI); this.classIntersectionsMap = getClassIntersectionsMap(displayModel); @@ -122,7 +118,7 @@ public class IndividualsForClassesDataGetter extends DataGetterBase implements D } @Override - public Map getData(ServletContext context, VitroRequest vreq, Map pageData) { + public Map getData(Map pageData) { this.setTemplateName(); HashMap data = new HashMap(); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/SparqlQueryDataGetter.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/SparqlQueryDataGetter.java index 8563e97f6..ebfe75890 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/SparqlQueryDataGetter.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/SparqlQueryDataGetter.java @@ -35,30 +35,37 @@ public class SparqlQueryDataGetter extends DataGetterBase implements DataGetter{ String queryText; String saveToVar; String modelURI; + VitroRequest vreq; + ServletContext context; + final static Log log = LogFactory.getLog(SparqlQueryDataGetter.class); /** * Constructor with display model and data getter URI that will be called by reflection. */ - public SparqlQueryDataGetter(Model displayModel, String dataGetterURI){ - this.configure(displayModel,dataGetterURI); + public SparqlQueryDataGetter(VitroRequest vreq, Model displayModel, String dataGetterURI){ + this.configure(vreq, displayModel,dataGetterURI); } @Override - public Map getData(ServletContext context, VitroRequest vreq, Map pageData) { + public Map getData(Map pageData) { return doQuery( vreq.getParameterMap(), getModel(context, vreq, modelURI)); } /** * Configure this instance based on the URI and display model. */ - protected void configure(Model displayModel, String dataGetterURI) { + protected void configure(VitroRequest vreq, Model displayModel, String dataGetterURI) { + if( vreq == null ) + throw new IllegalArgumentException("VitroRequest may not be null."); if( displayModel == null ) throw new IllegalArgumentException("Display Model may not be null."); if( dataGetterURI == null ) throw new IllegalArgumentException("PageUri may not be null."); + this.vreq = vreq; + this.context = vreq.getSession().getServletContext(); this.dataGetterURI = dataGetterURI; QuerySolutionMap initBindings = new QuerySolutionMap();