From 4d212a4aecf469df476cac8176d9e5e9bb9db511 Mon Sep 17 00:00:00 2001 From: hjkhjk54 Date: Tue, 2 Aug 2011 15:22:21 +0000 Subject: [PATCH] Changes for NHVIVO-3086, NIHVIVO-2980 and its subtasks: restructuring page data getters and extracting any internal class data getter or setup code from VITRO. --- webapp/config/web.xml | 9 - webapp/ontologies/app/menu.n3 | 8 +- webapp/ontologies/app/menuload/displayTBOX.n3 | 5 +- .../controller/edit/MenuManagementEdit.java | 83 +----- .../freemarker/HomePageController.java | 27 +- .../InstitutionalInternalClassController.java | 261 ------------------ .../freemarker/MenuManagementController.java | 163 ++--------- .../controller/freemarker/PageController.java | 35 +-- .../vitro/webapp/dao/DisplayVocabulary.java | 6 +- .../mannlib/vitro/webapp/dao/PageDao.java | 4 +- .../vitro/webapp/dao/jena/PageDaoJena.java | 71 +++-- .../pageDataGetter/ClassGroupPageData.java | 2 +- .../utils/pageDataGetter/DataGetterUtils.java | 180 +++++++----- .../IndividualsForClassesDataGetter.java | 60 +++- .../InternalClassesDataGetter.java | 99 ------- .../MenuManagementDataUtils.java | 62 +++++ .../pageDataGetter/ProcessClassGroup.java | 76 +++++ .../pageDataGetter/ProcessDataGetter.java | 23 ++ .../ProcessIndividualsForClasses.java | 140 ++++++++++ .../pageDataGetter/SelectDataGetterUtils.java | 98 +++++++ 20 files changed, 676 insertions(+), 736 deletions(-) delete mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/InstitutionalInternalClassController.java delete mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/InternalClassesDataGetter.java create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/MenuManagementDataUtils.java create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/ProcessClassGroup.java create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/ProcessDataGetter.java create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/ProcessIndividualsForClasses.java create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/SelectDataGetterUtils.java diff --git a/webapp/config/web.xml b/webapp/config/web.xml index c449fa232..3760ea3c6 100644 --- a/webapp/config/web.xml +++ b/webapp/config/web.xml @@ -362,15 +362,6 @@ /processEditDisplayModel - - InstitutionalInternalClassController - edu.cornell.mannlib.vitro.webapp.controller.freemarker.InstitutionalInternalClassController - - - InstitutionalInternalClassController - /processInstitutionalInternalClass - - ajaxSparqlQuery edu.cornell.mannlib.vitro.webapp.controller.ajax.SparqlQueryAjaxController diff --git a/webapp/ontologies/app/menu.n3 b/webapp/ontologies/app/menu.n3 index 8398fb48c..098fc8a74 100644 --- a/webapp/ontologies/app/menu.n3 +++ b/webapp/ontologies/app/menu.n3 @@ -26,4 +26,10 @@ display:Home a display:HomePage ; a display:Page ; display:title "Home" ; - display:urlMapping "/" . \ No newline at end of file + display:urlMapping "/" ; + display:hasDataGetter display:homeDataGetter . + +########## Data Getter ############ + + + a . \ No newline at end of file diff --git a/webapp/ontologies/app/menuload/displayTBOX.n3 b/webapp/ontologies/app/menuload/displayTBOX.n3 index 61b26b0e5..14d647f80 100644 --- a/webapp/ontologies/app/menuload/displayTBOX.n3 +++ b/webapp/ontologies/app/menuload/displayTBOX.n3 @@ -99,7 +99,8 @@ owl:versionInfo a owl:DatatypeProperty . - + + a owl:DatatypeProperty . ######### Object Properties######### @@ -171,3 +172,5 @@ owl:topObjectProperty a owl:ObjectProperty . + + diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/MenuManagementEdit.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/MenuManagementEdit.java index 5bddc639c..148198b6b 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/MenuManagementEdit.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/MenuManagementEdit.java @@ -2,32 +2,21 @@ package edu.cornell.mannlib.vitro.webapp.controller.edit; -import java.io.File; + import java.io.IOException; -import java.io.StringReader; import java.io.StringWriter; import java.io.Writer; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Random; -import javax.servlet.RequestDispatcher; -import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; -import org.apache.commons.fileupload.FileItem; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.json.JSONObject; import com.hp.hpl.jena.ontology.OntModel; -import com.hp.hpl.jena.ontology.OntModelSpec; -import com.hp.hpl.jena.rdf.model.Literal; + import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.Statement; import com.hp.hpl.jena.rdf.model.ModelFactory; @@ -38,21 +27,10 @@ import com.hp.hpl.jena.shared.Lock; import com.hp.hpl.jena.vocabulary.RDF; import com.hp.hpl.jena.rdf.model.RDFNode; - -import edu.cornell.mannlib.vedit.beans.LoginStatusBean; -import edu.cornell.mannlib.vitro.webapp.beans.UserAccount; -import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties; import edu.cornell.mannlib.vitro.webapp.controller.VitroHttpServlet; import edu.cornell.mannlib.vitro.webapp.dao.DisplayVocabulary; -import edu.cornell.mannlib.vitro.webapp.dao.jena.event.EditEvent; -import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.EditConfiguration; -import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.Field; -import edu.cornell.mannlib.vitro.webapp.edit.n3editing.processEdit.EditN3Generator; -import edu.cornell.mannlib.vitro.webapp.edit.n3editing.processEdit.EditN3Utils; -import edu.cornell.mannlib.vitro.webapp.edit.n3editing.processEdit.EditSubmission; -import edu.cornell.mannlib.vitro.webapp.filestorage.uploadrequest.FileUploadServletRequest; -import edu.cornell.mannlib.vitro.webapp.utils.MailUtil; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; +import edu.cornell.mannlib.vitro.webapp.utils.pageDataGetter.SelectDataGetterUtils; /** *Process edits from display model editing, so form should submit to this page which should @@ -349,63 +327,12 @@ public class MenuManagementEdit extends VitroHttpServlet { dataGetterResource, ResourceFactory.createProperty(DisplayVocabulary.FOR_CLASSGROUP), classGroupResource)); - //If "All selected" then use class group else use individuals for classes - Model dataGetterModel = ModelFactory.createDefaultModel(); - if(!internalClassSelected(vreq) && allClassesSelected(vreq)) { - dataGetterModel = getClassGroupDataGetter(vreq, dataGetterResource, addModel, displayModel); - } else { - dataGetterModel = getIndividualsForClassesDataGetter(vreq, dataGetterResource, addModel, displayModel, pageResource); - } - + //Get the model corresponding to the data getter to be employed and return + Model dataGetterModel = SelectDataGetterUtils.createDataGetterModel(vreq, dataGetterResource); addModel.add(dataGetterModel); } } - - private boolean allClassesSelected(VitroRequest vreq) { - String allClasses = vreq.getParameter("allSelected"); - return (allClasses != null && !allClasses.isEmpty()); - } - - private boolean internalClassSelected(VitroRequest vreq) { - String internalClass = vreq.getParameter("display-internalClass"); - return (internalClass != null && !internalClass.isEmpty()); - } - - private Model getIndividualsForClassesDataGetter(VitroRequest vreq, Resource dataGetterResource, - Model addModel, OntModel displayModel, Resource pageResource) { - String[] selectedClasses = vreq.getParameterValues("classInClassGroup"); - Model dgModel = ModelFactory.createDefaultModel(); - dgModel.add(dgModel.createStatement(dataGetterResource, - RDF.type, - ResourceFactory.createResource(DisplayVocabulary.CLASSINDIVIDUALS_INTERNAL_TYPE))); - for(String classUri: selectedClasses) { - dgModel.add(dgModel.createStatement( - dataGetterResource, - ResourceFactory.createProperty(DisplayVocabulary.GETINDIVIDUALS_FOR_CLASS), - ResourceFactory.createResource(classUri))); - } - - //Also check if internal class checked - if(internalClassSelected(vreq)) { - String internalClass = vreq.getParameter("display-internalClass"); - //The value should be the internal class uri - dgModel.add(dgModel.createStatement( - dataGetterResource, - ResourceFactory.createProperty(DisplayVocabulary.RESTRICT_RESULTS_BY_INTERNAL), - dgModel.createLiteral("true"))); - } - return dgModel; - } - - private Model getClassGroupDataGetter(VitroRequest vreq, Resource dataGetterResource, Model addModel, - OntModel displayModel) { - Model dgModel = ModelFactory.createDefaultModel(); - dgModel.add(dgModel.createStatement(dataGetterResource, - RDF.type, - ResourceFactory.createResource(DisplayVocabulary.CLASSGROUP_PAGE_TYPE))); - return dgModel; - } //For now returning the first "data getter" we have - this will be a more complex operation //if multiple data getters possible as then will have to determine which data getter required 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 c1ff65ee3..acf31d121 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 @@ -4,7 +4,7 @@ package edu.cornell.mannlib.vitro.webapp.controller.freemarker; import java.util.HashMap; import java.util.Map; - +import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -13,6 +13,7 @@ import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.Res import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues; import edu.cornell.mannlib.vitro.webapp.dao.DisplayVocabulary; import edu.cornell.mannlib.vitro.webapp.utils.pageDataGetter.PageDataGetter; +import edu.cornell.mannlib.vitro.webapp.utils.pageDataGetter.DataGetterUtils; public class HomePageController extends FreemarkerHttpServlet { @@ -25,20 +26,16 @@ public class HomePageController extends FreemarkerHttpServlet { protected ResponseValues processRequest(VitroRequest vreq) { Map body = new HashMap(); -// VClassGroupCache vcgc = VClassGroupCache.getVClassGroupCache( getServletContext() ); -// List vClassGroups = vcgc.getGroups(vreq.getPortalId()); -// body.put("vClassGroups", vClassGroups); - - PageDataGetter dataGetter = - PageController.getPageDataGetterMap(getServletContext()) - .get(DisplayVocabulary.HOME_PAGE_TYPE); - if( dataGetter != null ){ - String uriOfPageInDisplayModel = "not defined"; - Map pageData = - dataGetter.getData(getServletContext(), vreq, - uriOfPageInDisplayModel, body); - if(pageData != null) - body.putAll(pageData); + List dataGetters = DataGetterUtils.getDataGetterObjects(vreq, DisplayVocabulary.HOME_PAGE_URI); + for(PageDataGetter dataGetter: dataGetters) { + if( dataGetter != null ){ + String uriOfPageInDisplayModel = "not defined"; + Map pageData = + dataGetter.getData(getServletContext(), vreq, + uriOfPageInDisplayModel, body); + if(pageData != null) + body.putAll(pageData); + } } body.put("dataServiceUrlVClassesForVClassGroup", UrlBuilder.getUrl("/dataservice?getVClassesForVClassGroup=1&classgroupUri=")); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/InstitutionalInternalClassController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/InstitutionalInternalClassController.java deleted file mode 100644 index 4b7fbf1ff..000000000 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/InstitutionalInternalClassController.java +++ /dev/null @@ -1,261 +0,0 @@ -/* $This file is distributed under the terms of the license in /doc/license.txt$ */ - -package edu.cornell.mannlib.vitro.webapp.controller.freemarker; - -import java.util.HashMap; -import java.util.Map; -import java.util.List; -import java.util.ArrayList; - -import javax.servlet.http.HttpServletResponse; - -import com.hp.hpl.jena.ontology.OntModel; -import com.hp.hpl.jena.rdf.model.Model; -import com.hp.hpl.jena.rdf.model.ResourceFactory; -import com.hp.hpl.jena.rdf.model.StmtIterator; -import com.hp.hpl.jena.shared.Lock; -import com.hp.hpl.jena.rdf.model.RDFNode; -import com.hp.hpl.jena.rdf.model.Statement; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - - -import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.Actions; -import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.usepages.ManageMenus; -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.RedirectResponseValues; -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.DisplayVocabulary; -import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary; -import edu.cornell.mannlib.vitro.webapp.dao.jena.VClassGroupCache; - -import edu.cornell.mannlib.vitro.webapp.dao.jena.ModelContext; -import edu.cornell.mannlib.vitro.webapp.dao.jena.event.EditEvent; -import edu.cornell.mannlib.vitro.webapp.controller.edit.utils.LocalNamespaceClassUtils; -/* - * Custom controller for menu management. This will be replaced later once N3 Editing - * has been successfully refactored and integrated with menu management. - */ -public class InstitutionalInternalClassController extends FreemarkerHttpServlet { - private static final Log log = LogFactory.getLog(InstitutionalInternalClassController.class); - - private static final String EDIT_FORM = "/processInstitutionalInternalClass"; - public final static Actions REQUIRED_ACTIONS = new Actions(new ManageMenus()); - private static final String DISPLAY_FORM = "/institutionalInternalClassForm.ftl"; - private static HashMap localNamespaces = new HashMap(); - private static HashMap localNamespaceClasses = new HashMap(); - private static final String CREATE_CLASS_PARAM = "createClass"; - private static final String REDIRECT_PAGE = "/siteAdmin"; - @Override - protected Actions requiredActions(VitroRequest vreq) { - return REQUIRED_ACTIONS; - } - - @Override - protected ResponseValues processRequest(VitroRequest vreq) { - - //Based on existing of local namespaces and number of local classes present - //as well as command parameter, execute command - - Map data = new HashMap(); - //Get all local classes and namespace information - retrieveLocalClasses(vreq, data); - if(isSubmission(vreq)){ - processSubmission(vreq, data); - } else if(isCreateNewClass(vreq)) { - //Local namespace(s) exist and user wishes to create a new class - //Either cmd = create new or no local classes exist at all and one must be created - processCreateNewClass(vreq, data); - } else if(isSelectExistingClass(vreq)) { - //Local namespace(s) exist and user can select an existing class - processSelectExistingClass(vreq, data); - } else if(isCreateOntologies(vreq)) { - //Not being handled expliclity but message will display indicating - //no local namespaces exist and one must be created - processCreateOntologies(vreq, data); - } else { - - } - //Retrieve local namespaces - - - //Check if existing local namespaces - - data.put("formUrl", vreq.getContextPath() + EDIT_FORM); - data.put("cancelUrl", vreq.getContextPath() + REDIRECT_PAGE); - - //if no local namespaces, then provide message to display - //if existing namespace(s), then check - //if single namespace, retrieve all classes belonging to that local namespace - //if multiple namespaces, generate select list with namespaces - //for instertion: VClassDaoJena.insertVClass - // - if(isSubmission(vreq)){ - return redirectToSiteAdmin(); - } - return new TemplateResponseValues(DISPLAY_FORM, data); - - } - - private boolean isSubmission(VitroRequest vreq) { - String submit = vreq.getParameter("submitForm"); - return(submit!= null && !submit.isEmpty()); - } - - private void processCreateOntologies(VitroRequest vreq, Map data) { - data.put("submitAction", ""); - - } - - private boolean isCreateOntologies(VitroRequest vreq) { - //no local namespaces - return (localNamespaces.size() == 0); - - } - - private void processCreateNewClass(VitroRequest vreq, Map data) { - //this may need to be changed on the basis of how new classes interact with new ontologies - data.put("submitAction", "Create Class"); - data.put("createNewClass", true); - } - - private boolean isCreateNewClass(VitroRequest vreq) { - String command = vreq.getParameter("cmd"); - if(command != null && command.equals(CREATE_CLASS_PARAM)) { - return true; - } - //If local namespace exists but no classes in local namespaces, then need to enable creation of new classes - return(localNamespaces.size() > 0 && localNamespaceClasses.size() == 0); - } - - private void processSelectExistingClass(VitroRequest vreq, Map data) { - //Check if local classes exist and use for selection - data.put("useExistingLocalClass", true); - data.put("submitAction", "Save"); - } - - private boolean isSelectExistingClass(VitroRequest vreq) { - //Local namespaces exist and there are existing classes within those namespaces - return (localNamespaces.size() > 0 && localNamespaceClasses.size() > 0); - } - - - - private void retrieveLocalClasses(VitroRequest vreq, Map data) { - localNamespaces = LocalNamespaceClassUtils.getLocalOntologyNamespaces(vreq); - //Get classes for local namespaces - localNamespaceClasses = LocalNamespaceClassUtils.getLocalNamespacesClasses(vreq, localNamespaces); - data.put("existingLocalClasses", localNamespaceClasses); - data.put("existingLocalNamespaces", localNamespaces); - String noLocalOntologiesMessage = "There are currently no local ontologies. You must create a new ontology"; - data.put("noLocalOntologiesMessage", noLocalOntologiesMessage); - if(localNamespaces.size() == 0) { - data.put("ontologiesExist", false); - } - else { - data.put("ontologiesExist", true); - if(localNamespaces.size() > 1) { - data.put("multipleLocalNamespaces", true); - } else { - data.put("multipleLocalNamespaces", false); - data.put("existingLocalNamespace", localNamespaces.keySet().iterator().next()); - } - //Get current internal class if it exists - data.put("existingInternalClass", retrieveCurrentInternalClass()); - } - //Place default namespace within data to pass back to template - String defaultNamespace = vreq.getWebappDaoFactory().getDefaultNamespace(); - data.put("defaultNamespace", defaultNamespace); - } - - - //Process submission on submitting form - private void processSubmission(VitroRequest vreq, Map data) { - //If new class, need to generate new class - String classUri = null; - if(isNewClassSubmission(vreq)){ - VClass v= generateNewVClass(vreq.getParameter("localClassName"), vreq.getParameter("existingLocalNamespaces")); - classUri = v.getURI(); - try { - vreq.getWebappDaoFactory().getVClassDao().insertNewVClass(v); - } catch(Exception ex) { - log.error("Insertion of new class " + vreq.getParameter("name") + " resulted in error ", ex); - } - } else { - //Existing class so get URI from that - classUri = getExistingClassUri(vreq); - } - //If existing class, need to simply add a statement specifying existing class is an internal class - if(classUri != null && !classUri.isEmpty()) { - Model writeModel = ModelContext.getBaseOntModelSelector(getServletContext()).getTBoxModel(); - writeModel.enterCriticalSection(Lock.WRITE); - writeModel.notifyEvent(new EditEvent(null,true)); - try { - log.debug("Should be removing these statements " + writeModel.listStatements(null, - ResourceFactory.createProperty(VitroVocabulary.IS_INTERNAL_CLASSANNOT), - (RDFNode) null).toList().toString()); - //remove existing internal classes if there are any as assuming only one - writeModel.removeAll(null, - ResourceFactory.createProperty(VitroVocabulary.IS_INTERNAL_CLASSANNOT), - (RDFNode) null); - log.debug("Are there any statements left for internal class annotation: " + writeModel.listStatements(null, - ResourceFactory.createProperty(VitroVocabulary.IS_INTERNAL_CLASSANNOT), - (RDFNode) null).toList().toString()); - writeModel.add( - writeModel.createStatement( - ResourceFactory.createResource(classUri), - ResourceFactory.createProperty(VitroVocabulary.IS_INTERNAL_CLASSANNOT), - writeModel.createLiteral("true"))); - } catch(Exception ex) { - log.error("Error occurred in adding statement for " + classUri + " becoming internal class", ex); - } finally { - writeModel.notifyEvent(new EditEvent(null,true)); - writeModel.leaveCriticalSection(); - } - } - } - - private VClass generateNewVClass(String newClassName, String namespace) { - VClass newClass = new VClass(); - newClass.setName(newClassName); - newClass.setNamespace(namespace); - String uri = namespace + newClassName.replaceAll(" ", ""); - newClass.setURI(uri); - //How to g - return newClass; - } - - private boolean isNewClassSubmission(VitroRequest vreq) { - String localName = vreq.getParameter("localClassName"); - return (localName != null && !localName.isEmpty()); - } - - private String getExistingClassUri(VitroRequest vreq) { - return vreq.getParameter("existingLocalClasses"); - - } - - private RedirectResponseValues redirectToSiteAdmin() { - return new RedirectResponseValues(REDIRECT_PAGE, HttpServletResponse.SC_SEE_OTHER); - } - - //Get current internal class - private String retrieveCurrentInternalClass() { - String internalClassUri = ""; - Model mainModel = ModelContext.getBaseOntModelSelector(getServletContext()).getTBoxModel();; - StmtIterator internalIt = mainModel.listStatements(null, - ResourceFactory.createProperty(VitroVocabulary.IS_INTERNAL_CLASSANNOT), - (RDFNode) null); - while(internalIt.hasNext()){ - Statement s = internalIt.nextStatement(); - //The class IS an internal class so the subject is what we're looking for - internalClassUri = s.getSubject().getURI(); - log.debug("Found internal class uri " + internalClassUri); - } - return internalClassUri; - } - -} 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 07e615d7c..43b5e7fda 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 @@ -10,6 +10,8 @@ import java.util.ArrayList; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import edu.cornell.mannlib.vitro.webapp.utils.pageDataGetter.MenuManagementDataUtils; + import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.Actions; import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.usepages.ManageMenus; import edu.cornell.mannlib.vitro.webapp.beans.VClass; @@ -30,6 +32,10 @@ import com.hp.hpl.jena.rdf.model.Statement; import com.hp.hpl.jena.rdf.model.StmtIterator; import com.hp.hpl.jena.vocabulary.RDF; +import edu.cornell.mannlib.vitro.webapp.utils.pageDataGetter.PageDataGetter; +import edu.cornell.mannlib.vitro.webapp.utils.pageDataGetter.DataGetterUtils; +import edu.cornell.mannlib.vitro.webapp.utils.pageDataGetter.SelectDataGetterUtils; + /* * Custom controller for menu management. This will be replaced later once N3 Editing * has been successfully refactored and integrated with menu management. @@ -84,8 +90,7 @@ public class MenuManagementController extends FreemarkerHttpServlet { private void initializeData(Map data, VitroRequest vreq) { data.put("formUrls", vreq.getContextPath() + SUBMIT_FORM); data.put("cancelUrl", vreq.getContextPath() + CANCEL_FORM); - data.put("internalClassUri", ""); - + MenuManagementDataUtils.includeRequiredSystemData(getServletContext(), data); } //Based on parameters, ascertain command @@ -116,7 +121,7 @@ public class MenuManagementController extends FreemarkerHttpServlet { //not a page already assigned a class group data.put("isClassGroupPage", false); data.put("includeAllClasses", false); - data.put("classGroups", this.getClassGroups()); + data.put("classGroups", DataGetterUtils.getClassGroups(getServletContext())); data.put("selectedTemplateType", "default"); // this.getMenuItemData(vreq, menuItem, data); @@ -136,11 +141,9 @@ public class MenuManagementController extends FreemarkerHttpServlet { //not a page already assigned a class group data.put("isClassGroupPage", false); data.put("includeAllClasses", false); - data.put("classGroups", this.getClassGroups()); + data.put("classGroups", DataGetterUtils.getClassGroups(getServletContext())); data.put("selectedTemplateType", "default"); //defaults to regular class group page - //Check whether institutional internal class exists - this.checkInstitutionalInternalClass(data); } private void processEditMenuItem(VitroRequest vreq, Map data) { @@ -153,9 +156,7 @@ public class MenuManagementController extends FreemarkerHttpServlet { data.put("menuItem", menuItem); data.put("menuAction", "Edit"); //Get All class groups - data.put("classGroups", this.getClassGroups()); - //Check whether institutional internal class exists - this.checkInstitutionalInternalClass(data); + data.put("classGroups", DataGetterUtils.getClassGroups(getServletContext())); //Get data for menu item and associated page this.getMenuItemData(vreq, menuItem, data); this.getPageData(vreq, data); @@ -219,7 +220,7 @@ public class MenuManagementController extends FreemarkerHttpServlet { this.getCustomTemplate(writeModel, page, data); //retrieve information for page based on the data getter, with class group and individuals for classes getting different information //the browse page does not have a "data getter" - this.getPageDataGetterInfo(writeModel, page, data); + this.getPageDataGetterInfo(vreq, writeModel, page, data); //This is an all statement iterator log.debug("Debug statements: all statements in model for debugger"); StmtIterator debugIt = writeModel.listStatements(page, null, (RDFNode) null); @@ -261,9 +262,7 @@ public class MenuManagementController extends FreemarkerHttpServlet { //Get data getter related info //All items will have data getter except for Browse or Home page //Home can be edited but not removed - private void getPageDataGetterInfo(OntModel writeModel, Resource page, Map data) { - - + private void getPageDataGetterInfo(VitroRequest vreq, OntModel writeModel, Resource page, Map data) { //Alternative is to do this via sparql query StmtIterator dataGetterIt = writeModel.listStatements(page, ResourceFactory.createProperty(DisplayVocabulary.HAS_DATA_GETTER), (RDFNode) null); while(dataGetterIt.hasNext()) { @@ -273,141 +272,31 @@ public class MenuManagementController extends FreemarkerHttpServlet { StmtIterator dataGetterTypes = writeModel.listStatements(dataGetter, RDF.type, (RDFNode) null); while(dataGetterTypes.hasNext()) { String dataGetterType = dataGetterTypes.nextStatement().getResource().getURI(); - if(dataGetterType.equals(DisplayVocabulary.CLASSGROUP_PAGE_TYPE)) { - this.retrieveClassGroupPage(writeModel, dataGetter, data); - } else if(dataGetterType.equals(DisplayVocabulary.CLASSINDIVIDUALS_INTERNAL_TYPE)) { - this.retrieveIndividualsForClassesPage(writeModel, dataGetter, data); - } else { - //Not sure what to do here - } + this.retrieveData(vreq, page, dataGetterType, data); } } } - //Based on institutional internal page and not general individualsForClasses - private void retrieveIndividualsForClassesPage(OntModel writeModel, - Resource dataGetter, Map data) { - data.put("isIndividualsForClassesPage", true); - data.put("isClassGroupPage", false); - data.put("includeAllClasses", false); - //Get the classes and put them here - this.getClassesForInternalDataGetter(writeModel, dataGetter, data); - //Also save the class group for display - this.getClassGroupForDataGetter(writeModel, dataGetter, data); - this.checkIfPageInternal(writeModel, data); - - } + private void retrieveData(VitroRequest vreq, Resource page, String dataGetterType, Map templateData) { + //Data Getter type is now a class name + String className = DataGetterUtils.getClassNameFromUri(dataGetterType); + try{ + String pageURI = page.getURI(); + PageDataGetter pg = (PageDataGetter) Class.forName(className).newInstance(); + Map pageInfo = DataGetterUtils.getMapForPage( vreq, pageURI ); - private void checkIfPageInternal(OntModel writeModel, - Map data) { - //if internal class exists, and data getter indicates page is internal - if(data.containsKey("internalClass") && data.containsKey("isInternal")) { - data.put("pageInternalOnly", true); - - } - - } - - private void retrieveClassGroupPage(OntModel writeModel, Resource dataGetter, - Map data) { - //This is a class group page so - data.put("isClassGroupPage", true); - data.put("includeAllClasses", true); - - //Get the class group - this.getClassGroupForDataGetter(writeModel, dataGetter, data); - - } - - //Instead of returning vclasses, just returning class Uris as vclasses appear to need their own template - //to show up correctly - private void getClassesForInternalDataGetter(OntModel writeModel, Resource dataGetter, - Map data) { + Map pageData = DataGetterUtils.getAdditionalData(pageURI, dataGetterType, pageInfo, vreq, pg, getServletContext()); + SelectDataGetterUtils.processAndRetrieveData(vreq, getServletContext(), pageData, className, templateData); + } catch(Exception ex) { + log.error("Exception occurred in instantiation page data getter for " + className, ex); + } - - StmtIterator classesIt = writeModel.listStatements(dataGetter, - ResourceFactory.createProperty(DisplayVocabulary.GETINDIVIDUALS_FOR_CLASS), - (RDFNode) null); - - //Just need the class uris - List classUris = new ArrayList(); - - while(classesIt.hasNext()) { - String classUri = classesIt.nextStatement().getResource().getURI(); - classUris.add(classUri); - } - data.put("includeClasses", classUris); - - //This checks whether restrict classes returned and include institutional internal class - //TODO: Create separate method to get restricted classes - //Get restrict classes - specifically internal class - - StmtIterator internalIt = writeModel.listStatements(dataGetter, - ResourceFactory.createProperty(DisplayVocabulary.RESTRICT_RESULTS_BY_INTERNAL), - (RDFNode) null); - if(internalIt.hasNext()) { - data.put("isInternal", internalIt.nextStatement().getLiteral().getString()); - } - - } - - - //Check whether any classes exist with internal class restrictions - private void checkInstitutionalInternalClass(Map data) { - //TODO: replace with more generic ModelContext retrieval method - OntModel mainModel = (OntModel) getServletContext().getAttribute("jenaOntModel"); - StmtIterator internalIt = mainModel.listStatements(null, ResourceFactory.createProperty(VitroVocabulary.IS_INTERNAL_CLASSANNOT), (RDFNode) null); - //List internalClasses = new ArrayList(); - if(internalIt.hasNext()) { - String internalClass = internalIt.nextStatement().getSubject().getURI(); - data.put("internalClass", internalClass); - data.put("internalClassUri", internalClass); - } } - //Get the class page - private void getClassGroupForDataGetter(OntModel writeModel, Resource dataGetter, - Map data) { - StmtIterator classGroupIt = writeModel.listStatements(dataGetter, - ResourceFactory.createProperty(DisplayVocabulary.FOR_CLASSGROUP), - (RDFNode) null); - //Assuming just one class group per page/item - if(classGroupIt.hasNext()) { - String classGroup = classGroupIt.nextStatement().getResource().getURI(); - VClassGroup vclassGroup = getClassGroup(classGroup); - data.put("classGroup", vclassGroup); - data.put("associatedPage", vclassGroup.getPublicName()); - data.put("associatedPageURI", vclassGroup.getURI()); - } - - } - - //Get classes in class group, useful in case of edit - private VClassGroup getClassGroup(String classGroupUri) { - VClassGroupCache vcgc = VClassGroupCache.getVClassGroupCache(getServletContext()); - VClassGroup group = vcgc.getGroup(classGroupUri); - return group; - } - //Get All VClass Groups - private List> getClassGroups() { - //Wanted this to be - VClassGroupCache vcgc = VClassGroupCache.getVClassGroupCache(getServletContext()); - List vcgList = vcgc.getGroups(); - //For now encoding as hashmap with label and URI as trying to retrieve class group - //results in errors for some reason - //TODO: Check how to do this properly - List> classGroups = new ArrayList>(); - for(VClassGroup vcg: vcgList) { - HashMap hs = new HashMap(); - hs.put("publicName", vcg.getPublicName()); - hs.put("URI", vcg.getURI()); - classGroups.add(hs); - } - return classGroups; - } + 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 086aaf1d6..f098d4711 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 @@ -2,14 +2,10 @@ package edu.cornell.mannlib.vitro.webapp.controller.freemarker; -import java.util.Collections; + import java.util.HashMap; -import java.util.List; import java.util.Map; -import javax.servlet.ServletConfig; -import javax.servlet.ServletContext; -import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -20,11 +16,6 @@ import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ExceptionResponseValues; 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.utils.pageDataGetter.BrowseDataGetter; -import edu.cornell.mannlib.vitro.webapp.utils.pageDataGetter.PageDataGetter; -import edu.cornell.mannlib.vitro.webapp.utils.pageDataGetter.ClassGroupPageData; -import edu.cornell.mannlib.vitro.webapp.utils.pageDataGetter.IndividualsForClassesDataGetter; -import edu.cornell.mannlib.vitro.webapp.utils.pageDataGetter.InternalClassesDataGetter; import edu.cornell.mannlib.vitro.webapp.utils.pageDataGetter.DataGetterUtils; /** * Controller for getting data for pages defined in the display model. @@ -121,33 +112,11 @@ public class PageController extends FreemarkerHttpServlet{ else throw new Exception("no page found for " + vreq.getRequestURI() ); } - - public static Map getPageDataGetterMap(ServletContext sc){ - setupDataGetters(sc); - return (Map)sc.getAttribute(DATA_GETTER_MAP); - } + public static void putPageUri(HttpServletRequest req, String pageUri){ req.setAttribute("pageURI", pageUri); } - - public static void setupDataGetters(ServletContext context ){ - if( context != null && context.getAttribute(DATA_GETTER_MAP) == null ){ - context.setAttribute(DATA_GETTER_MAP, new HashMap()); - - /* register all page data getters with the PageController servlet. - * There should be a better way of doing this. */ - ClassGroupPageData cgpd = new ClassGroupPageData(); - getPageDataGetterMap(context).put(cgpd.getType(), cgpd); - BrowseDataGetter bdg = new BrowseDataGetter(); - getPageDataGetterMap(context).put(bdg.getType(), bdg); - IndividualsForClassesDataGetter cidg = new IndividualsForClassesDataGetter(); - getPageDataGetterMap(context).put(cidg.getType(), cidg); - InternalClassesDataGetter internalCdg = new InternalClassesDataGetter(); - getPageDataGetterMap(context).put(internalCdg.getType(), internalCdg); - - } - } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/DisplayVocabulary.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/DisplayVocabulary.java index 6fc82eb84..1ba46e224 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/DisplayVocabulary.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/DisplayVocabulary.java @@ -27,6 +27,7 @@ public class DisplayVocabulary { /* Individuals */ public static final String DEFAULT_MENU = NS + "DefaultMenu"; + public static final String HOME_PAGE_URI = NS + "Home"; public static final String SEARCH_INDEX_URI = NS + "SearchIndex"; //bk392 for extracting properties beyond context nodes. @@ -36,16 +37,19 @@ public class DisplayVocabulary { //Corresponding to statements in menu management that define class of data getter to be used public static final String PAGE_TYPE = NS + "Page"; public static final String HOME_PAGE_TYPE = NS + "HomePage"; + + public static final String CLASSGROUP_PAGE_TYPE = NS + "ClassGroupPage"; public static final String CLASSINDIVIDUALS_PAGE_TYPE = NS + "IndividualsForClassesPage"; public static final String CLASSINDIVIDUALS_INTERNAL_TYPE = NS + "InternalClassesPage"; - + /* Object Properties */ public static final String FOR_CLASSGROUP = NS + "forClassGroup"; public static final String CLASS_INTERSECTION = NS + "intersectsWithClass"; public static final String HAS_CLASS_INTERSECTION = NS + "hasClassIntersection"; public static final String ITEM_TO_PAGE = NS + "toPage"; public static final String HAS_ELEMENT = NS + "hasElement"; + public static final String USES_DATAGETTER_CLASS = NS + "usesDataGetterClass"; /**Data Getter object properties **/ public static final String HAS_DATA_GETTER = NS + "hasDataGetter"; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/PageDao.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/PageDao.java index 94c3bbf6a..b08f559d1 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/PageDao.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/PageDao.java @@ -23,8 +23,10 @@ public interface PageDao { String getClassGroupPage(String pageUri); - Map> getClassesAndRestrictionsForPage(String pageUri); + Map getClassesAndRestrictionsForPage(String pageUri); Map getClassesAndCheckInternal(String pageUri); + + List getDataGetterClass(String pageUri); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/PageDaoJena.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/PageDaoJena.java index 580b14777..5b0a4166a 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/PageDaoJena.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/PageDaoJena.java @@ -25,6 +25,7 @@ import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.RDFNode; import com.hp.hpl.jena.rdf.model.Resource; import com.hp.hpl.jena.rdf.model.ResourceFactory; +import com.hp.hpl.jena.vocabulary.RDF; import edu.cornell.mannlib.vitro.webapp.dao.DisplayVocabulary; import edu.cornell.mannlib.vitro.webapp.dao.PageDao; @@ -45,7 +46,7 @@ public class PageDaoJena extends JenaBaseDao implements PageDao { static protected Query individualsForClassesRestrictedQuery; static protected Query institutionalInternalClassQuery; static protected Query individualsForClassesInternalQuery; - + static protected Query dataGetterClassQuery; static final String prefixes = "PREFIX rdf: <" + VitroVocabulary.RDF +"> \n" + @@ -89,26 +90,22 @@ public class PageDaoJena extends JenaBaseDao implements PageDao { " ?pageUri rdf:type <" + DisplayVocabulary.HOME_PAGE_TYPE + "> .\n"+ "} \n" ; - /* - static final protected String classGroupPageQueryString = - prefixes + "\n" + - "SELECT ?classGroup WHERE { ?pageUri <" + DisplayVocabulary.FOR_CLASSGROUP + "> ?classGroup . }"; - */ - //Updated class group page query string + + //Updated class group page query string so no longer check for type, as types have changed + static final protected String classGroupPageQueryString = prefixes + "\n" + "SELECT ?classGroup WHERE {\n" + - " ?pageUri display:hasDataGetter ?dg .\n"+ - " ?dg rdf:type <" + DisplayVocabulary.CLASSGROUP_PAGE_TYPE + ">. \n" + + " ?pageUri display:hasDataGetter ?dg .\n"+ " ?dg <" + DisplayVocabulary.FOR_CLASSGROUP + "> ?classGroup . \n" + "} \n" ; //Query to get what classes are to be employed on the page + //TODO: Commented out type but check if should include correct type static final protected String individualsForClassesDataGetterQueryString = prefixes + "\n" + "SELECT ?dg ?class ?restrictClass WHERE {\n" + - " ?pageUri display:hasDataGetter ?dg .\n"+ - " ?dg rdf:type <" + DisplayVocabulary.CLASSINDIVIDUALS_PAGE_TYPE + ">. \n" + + " ?pageUri display:hasDataGetter ?dg .\n"+ //" ?dg rdf:type <" + DisplayVocabulary.CLASSINDIVIDUALS_PAGE_TYPE + ">. \n" + " ?dg <" + DisplayVocabulary.GETINDIVIDUALS_FOR_CLASS + "> ?class . \n" + " OPTIONAL {?dg <"+ DisplayVocabulary.RESTRICT_RESULTS_BY + "> ?restrictClass } .\n" + "} \n" ; @@ -129,16 +126,21 @@ public class PageDaoJena extends JenaBaseDao implements PageDao { //Query to get classes employed on internal class page //and restriction classes if they exist + //TODO: Check if need to substitute class name type instead static final protected String individualsForClassesInternalQueryString = prefixes + "\n" + "SELECT ?dg ?class ?isInternal WHERE {\n" + - " ?pageUri display:hasDataGetter ?dg .\n"+ - " ?dg rdf:type <" + DisplayVocabulary.CLASSINDIVIDUALS_INTERNAL_TYPE + ">. \n" + + " ?pageUri display:hasDataGetter ?dg .\n"+ // " ?dg rdf:type <" + DisplayVocabulary.CLASSINDIVIDUALS_INTERNAL_TYPE + ">. \n" + " ?dg <" + DisplayVocabulary.GETINDIVIDUALS_FOR_CLASS + "> ?class . \n" + " OPTIONAL { ?dg <"+ DisplayVocabulary.RESTRICT_RESULTS_BY_INTERNAL + "> ?isInternal } .\n" + "} \n" ; - + static final protected String usesDataGetterClassQueryString = + prefixes + "\n" + + "SELECT ?dgClass WHERE {\n" + + " ?pageUri display:hasDataGetter ?dg .\n"+ + " ?dg <" + RDF.type.getURI() + "> ?dgClass . \n" + + "} \n" ; static{ try{ pageQuery=QueryFactory.create(pageQueryString); @@ -203,6 +205,13 @@ public class PageDaoJena extends JenaBaseDao implements PageDao { log.error("could not create SPARQL query for individualsForClassesInternalQuery " + th.getMessage()); log.error(individualsForClassesInternalQueryString); } + //Check what class to use for data getter - returns java class name + try{ + dataGetterClassQuery = QueryFactory.create(usesDataGetterClassQueryString); + }catch(Throwable th){ + log.error("could not create SPARQL query for dataGetterClassQuery " + th.getMessage()); + log.error(usesDataGetterClassQueryString); + } @@ -379,8 +388,8 @@ public class PageDaoJena extends JenaBaseDao implements PageDao { * Although to be used specifically for internal class filtering and will usually be one class returned, * allowing for multiple classes to be returned. */ - public Map> getClassesAndRestrictionsForPage(String pageUri) { - Map> classesAndRestrictions = new HashMap>(); + public Map getClassesAndRestrictionsForPage(String pageUri) { + Map classesAndRestrictions = new HashMap(); QuerySolutionMap initialBindings = new QuerySolutionMap(); initialBindings.add("pageUri", ResourceFactory.createResource(pageUri)); List classes = new ArrayList(); @@ -460,6 +469,36 @@ public class PageDaoJena extends JenaBaseDao implements PageDao { } } + public List getDataGetterClass(String pageUri) { + QuerySolutionMap initialBindings = new QuerySolutionMap(); + initialBindings.add("pageUri", ResourceFactory.createResource(pageUri)); + List dataGetterClasses = new ArrayList(); + + Model displayModel = getOntModelSelector().getDisplayModel(); + displayModel.enterCriticalSection(false); + try{ + QueryExecution qexec = QueryExecutionFactory.create( dataGetterClassQuery, displayModel , initialBindings); + try{ + ResultSet resultSet = qexec.execSelect(); + while(resultSet.hasNext()){ + QuerySolution soln = resultSet.next(); + dataGetterClasses.add( nodeToString(soln.get("dgClass")) ); + } + if( dataGetterClasses.size() == 0 ){ + log.debug("No data getter classes defined for "+ pageUri); + return null; + } + + + }finally{ + qexec.close(); + } + }finally{ + displayModel.leaveCriticalSection(); + } + return dataGetterClasses; + } + /* *************************** Utility methods ********************************* */ diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/ClassGroupPageData.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/ClassGroupPageData.java index 5212fccad..8e5957ea8 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/ClassGroupPageData.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/ClassGroupPageData.java @@ -121,7 +121,7 @@ public class ClassGroupPageData implements PageDataGetter{ } public String getType(){ - return DisplayVocabulary.CLASSGROUP_PAGE_TYPE; + return DataGetterUtils.generateDataGetterTypeURI(ClassGroupPageData.class.getName()); } //Get data servuice diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/DataGetterUtils.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/DataGetterUtils.java index aa0ba5687..8f79fb671 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/DataGetterUtils.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/DataGetterUtils.java @@ -29,6 +29,7 @@ import edu.cornell.mannlib.vitro.webapp.controller.freemarker.IndividualListCont 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.WebappDaoFactory; +import edu.cornell.mannlib.vitro.webapp.dao.jena.VClassGroupCache; public class DataGetterUtils { protected static final String DATA_GETTER_MAP = "pageTypeToDataGetterMap"; @@ -37,26 +38,18 @@ public class DataGetterUtils { public static Map getDataForPage(String pageUri, VitroRequest vreq, ServletContext context) { //Based on page type get the appropriate data getter Map page = getMapForPage(vreq, pageUri); - //Get data getters map - Map dataGetterMap = getPageDataGetterMap(context); - //Get types associated with page Map data = new HashMap(); - List dataGetters = (List)page.get("dataGetters"); - log.debug("Retrieved data getters for Page " + pageUri + " = " + dataGetters.toString()); - if( dataGetters != null ){ - for( String dataGetter : dataGetters){ + List dataGetters = getDataGetterObjects(vreq, pageUri); + for(PageDataGetter getter: dataGetters) { + try{ Map moreData = null; - PageDataGetter getter = dataGetterMap.get(dataGetter); - log.debug("Retrieved data getter for " + dataGetter); - try{ - moreData = getAdditionalData(pageUri, dataGetter, page, vreq, getter, context); - if( moreData != null) - data.putAll(moreData); - }catch(Throwable th){ - log.error(th,th); - } - } - } + moreData = getAdditionalData(pageUri, getter.getType(), page, vreq, getter, context); + if( moreData != null) + data.putAll(moreData); + }catch(Throwable th){ + log.error(th,th); + } + } return data; } @@ -68,33 +61,29 @@ public class DataGetterUtils { public static JSONObject covertDataToJSONForPage(String pageUri, Map data, VitroRequest vreq, ServletContext context) { //Based on page type get the appropriate data getter Map page = getMapForPage(vreq, pageUri); - //Get data getters map - Map dataGetterMap = getPageDataGetterMap(context); //Get types associated with page JSONObject rObj = null; List types = (List)page.get("types"); - if( types != null ){ - for( String type : types){ - JSONObject typeObj = null; - PageDataGetter getter = dataGetterMap.get(type); - try{ - typeObj = getter.convertToJSON(data, vreq); - if( typeObj != null) { - //Copy over everything from this type Obj to - //TODO: Review how to handle duplicate keys, etc. - if(rObj != null) { - //For now, just nests as separate entry - rObj.put(type, typeObj); - } else { - rObj = typeObj; - } - } - - }catch(Throwable th){ - log.error(th,th); - } - } - } + List dataGetters = getDataGetterObjects(vreq, pageUri); + for(PageDataGetter getter: dataGetters) { + JSONObject typeObj = null; + try{ + typeObj = getter.convertToJSON(data, vreq); + if( typeObj != null) { + //Copy over everything from this type Obj to + //TODO: Review how to handle duplicate keys, etc. + if(rObj != null) { + //For now, just nests as separate entry + rObj.put(getter.getType(), typeObj); + } else { + rObj = typeObj; + } + } + + } catch(Throwable th){ + log.error(th,th); + } + } return rObj; } /* @@ -105,38 +94,7 @@ public class DataGetterUtils { return vreq.getWebappDaoFactory().getPageDao().getPage(pageUri); } - public static void setupDataGetters(ServletContext context){ - if( context != null && context.getAttribute(DATA_GETTER_MAP) == null ){ - context.setAttribute(DATA_GETTER_MAP, new HashMap()); - - /* register all page data getters with the PageController servlet. - * There should be a better way of doing this. */ - ClassGroupPageData cgpd = new ClassGroupPageData(); - getPageDataGetterMap(context).put(cgpd.getType(), cgpd); - BrowseDataGetter bdg = new BrowseDataGetter(); - getPageDataGetterMap(context).put(bdg.getType(), bdg); - //TODO: Check if can include by type here - IndividualsForClassesDataGetter cidg = new IndividualsForClassesDataGetter(); - getPageDataGetterMap(context).put(cidg.getType(), cidg); - InternalClassesDataGetter internalCdg = new InternalClassesDataGetter(); - getPageDataGetterMap(context).put(internalCdg.getType(), internalCdg); - - } - } - - public static Map getPageDataGetterMap(ServletContext sc){ - setupDataGetters(sc); - return (Map)sc.getAttribute(DATA_GETTER_MAP); - } - /* - //Based on page Uri, do conversions - public static PageDataGetter getDataGetterForType(String type, ServletContext sc) { - Map map = getPageDataGetterMap(sc); - PageDataGetter pdg = (PageDataGetter) map.get(type); - return pdg; - }*/ - - protected static Map getAdditionalData( + public static Map getAdditionalData( String pageUri, String dataGetterName, Map page, VitroRequest vreq, PageDataGetter getter, ServletContext context) { if(dataGetterName == null || dataGetterName.isEmpty()) return Collections.emptyMap(); @@ -155,6 +113,42 @@ public class DataGetterUtils { } } + /*** + * For the page, get the actual Data Getters to be employed + */ + public static List getDataGetterObjects(VitroRequest vreq, String pageUri) { + List dataGetterObjects = new ArrayList(); + try { + List dataGetterClassNames = vreq.getWebappDaoFactory().getPageDao().getDataGetterClass(pageUri); + + + for(String dgClassName: dataGetterClassNames) { + String className = getClassNameFromUri(dgClassName); + PageDataGetter pg = (PageDataGetter) Class.forName(className).newInstance(); + if(pg != null) { + dataGetterObjects.add(pg); + } else { + log.error("Data getter does not exist for " + className); + } + } + } + catch(Exception ex) { + log.error("Error occurred in retrieving data getter class names for "+ pageUri, ex); + } + return dataGetterObjects; + } + + //Class uris returned include "java:" and to instantiate object need to remove java: portion + public static String getClassNameFromUri(String dataGetterClassUri) { + if(dataGetterClassUri.contains("java:")) { + String[] splitArray = dataGetterClassUri.split("java:"); + if(splitArray.length > 1) { + return splitArray[1]; + } + } + return dataGetterClassUri; + } + /** * Get Individual count for Solr query for intersection of multiple classes */ @@ -305,6 +299,44 @@ public class DataGetterUtils { return map; } + + //Get All VClass Groups information + //Used within menu management and processing + //TODO: Check if more appropriate location possible + public static List> getClassGroups(ServletContext context) { + //Wanted this to be + VClassGroupCache vcgc = VClassGroupCache.getVClassGroupCache(context); + List vcgList = vcgc.getGroups(); + //For now encoding as hashmap with label and URI as trying to retrieve class group + //results in errors for some reason + List> classGroups = new ArrayList>(); + for(VClassGroup vcg: vcgList) { + HashMap hs = new HashMap(); + hs.put("publicName", vcg.getPublicName()); + hs.put("URI", vcg.getURI()); + classGroups.add(hs); + } + return classGroups; + } + //Return data getter type to be employed in display model + public static String generateDataGetterTypeURI(String dataGetterClassName) { + return "java:" + dataGetterClassName; + } + + //TODO: Check whether this needs to be put here or elsewhere, as this is data getter specific + //with respect to class groups + //Need to use VClassGroupCache to retrieve class group information - this is the information returned from "for class group" + public static void getClassGroupForDataGetter(ServletContext context, Map pageData, Map templateData) { + //Get the class group from VClassGroup, this is the same as the class group for the class group page data getter + //and the associated class group (not custom) for individuals datagetter + String classGroupUri = (String) pageData.get("classGroupUri"); + VClassGroupCache vcgc = VClassGroupCache.getVClassGroupCache(context); + VClassGroup group = vcgc.getGroup(classGroupUri); + + templateData.put("classGroup", group); + templateData.put("associatedPage", group.getPublicName()); + templateData.put("associatedPageURI", group.getURI()); + } } \ No newline at end of file diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/IndividualsForClassesDataGetter.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/IndividualsForClassesDataGetter.java index a3d367957..af89883c9 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/IndividualsForClassesDataGetter.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/IndividualsForClassesDataGetter.java @@ -17,6 +17,12 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.json.JSONObject; +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 edu.cornell.mannlib.vitro.webapp.beans.Individual; import edu.cornell.mannlib.vitro.webapp.beans.VClass; import edu.cornell.mannlib.vitro.webapp.beans.VClassGroup; @@ -24,6 +30,9 @@ 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; @@ -34,35 +43,64 @@ import edu.cornell.mannlib.vitro.webapp.web.templatemodels.VClassGroupTemplateMo */ public class IndividualsForClassesDataGetter implements PageDataGetter{ private static final Log log = LogFactory.getLog(IndividualsForClassesDataGetter.class); - protected static String restrictClassesTemplateName = "restricted"; + protected static String restrictClassesTemplateName = null; public Map getData(ServletContext context, VitroRequest vreq, String pageUri, Map page ){ - HashMap data = new HashMap(); + this.setTemplateName(); + HashMap data = new HashMap(); //This is the old technique of getting class intersections - Map> classIntersectionsMap = vreq.getWebappDaoFactory().getPageDao().getClassesAndRestrictionsForPage(pageUri); + PageDao pageDao = vreq.getWebappDaoFactory().getPageDao(); + Map classIntersectionsMap = getClassIntersectionsMap(pageDao, pageUri); try{ - List classes = classIntersectionsMap.get("classes"); - List restrictClasses = classIntersectionsMap.get("restrictClasses"); + List classes = retrieveClasses(context, classIntersectionsMap); + List restrictClasses = retrieveRestrictClasses(context, classIntersectionsMap); log.debug("Retrieving classes for " + classes.toString() + " and restricting by " + restrictClasses.toString()); processClassesAndRestrictions(vreq, context, data, classes, restrictClasses); //Also add data service url //Hardcoding for now, need a more dynamic way of doing this data.put("dataServiceUrlIndividualsByVClass", this.getDataServiceUrl()); + //this is the class group associated with the data getter utilized for display on menu editing, not the custom one created + data.put("classGroupUri", pageDao.getClassGroupPage(pageUri)); } catch(Exception ex) { log.error("An error occurred retrieving Vclass Intersection individuals", ex); } return data; } + + protected void setTemplateName() { + this.restrictClassesTemplateName = "restricted"; + } + + protected Map getClassIntersectionsMap(PageDao pageDao, + String pageUri) { + // TODO Auto-generated method stub + return pageDao.getClassesAndRestrictionsForPage(pageUri); + } + + protected List retrieveClasses( + ServletContext context, Map classIntersectionsMap) { + List restrictClasses = (List) classIntersectionsMap.get("classes"); + return restrictClasses; + } + + protected List retrieveRestrictClasses( + ServletContext context, Map classIntersectionsMap) { + List restrictClasses = (List) classIntersectionsMap.get("restrictClasses"); + return restrictClasses; + } protected void processClassesAndRestrictions(VitroRequest vreq, ServletContext context, HashMap data, List classes, List restrictClasses ) { processClassesForDisplay(context, data, classes); processRestrictionClasses(vreq, context, data, restrictClasses); processIntersections(vreq, context, data); + } - //At this point, data specifices whether or not intersections included + + + //At this point, data specifices whether or not intersections included private void processIntersections(VitroRequest vreq, ServletContext context, HashMap data) { VClassGroup classesGroup = (VClassGroup) data.get("vClassGroup"); @@ -122,7 +160,6 @@ public class IndividualsForClassesDataGetter implements PageDataGetter{ VClassGroupCache vcgc = VClassGroupCache.getVClassGroupCache(context); for(String classUri: classes) { - //VClass vclass = vreq.getWebappDaoFactory().getVClassDao().getVClassByURI(classUri); //Retrieve vclass from cache to get the count VClass vclass = vcgc.getCachedVClass(classUri); if(vclass != null) { @@ -152,10 +189,15 @@ public class IndividualsForClassesDataGetter implements PageDataGetter{ List restrictVClasses = new ArrayList(); List urlEncodedRestrictClasses = new ArrayList(); + VClassGroupCache vcgc = VClassGroupCache.getVClassGroupCache(context); + if(restrictClasses.size() > 0) { //classes for restriction are not displayed so don't need to include their class individual counts for(String restrictClassUri: restrictClasses) { - VClass vclass = vreq.getWebappDaoFactory().getVClassDao().getVClassByURI(restrictClassUri); + //Also uses cache to remain consistent with process classes and also allow + //vclasses to be returned even if switched to display model, although + //uris used within display model editing and not vclass objects + VClass vclass = vcgc.getCachedVClass(restrictClassUri); if(vclass != null) { log.debug("Found restrict class and adding to list " + restrictClassUri); restrictVClasses.add(vclass); @@ -226,7 +268,7 @@ public class IndividualsForClassesDataGetter implements PageDataGetter{ } public String getType(){ - return DisplayVocabulary.CLASSINDIVIDUALS_PAGE_TYPE; + return DataGetterUtils.generateDataGetterTypeURI(IndividualsForClassesDataGetter.class.getName()); } //Get data servuice diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/InternalClassesDataGetter.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/InternalClassesDataGetter.java deleted file mode 100644 index 17128056e..000000000 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/InternalClassesDataGetter.java +++ /dev/null @@ -1,99 +0,0 @@ -/* $This file is distributed under the terms of the license in /doc/license.txt$ */ - -package edu.cornell.mannlib.vitro.webapp.utils.pageDataGetter; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.servlet.ServletContext; - -import org.apache.commons.lang.StringUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.json.JSONObject; - -import com.hp.hpl.jena.ontology.OntModel; -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 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.UrlBuilder; -import edu.cornell.mannlib.vitro.webapp.dao.DisplayVocabulary; -import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary; -import edu.cornell.mannlib.vitro.webapp.dao.jena.VClassGroupCache; -import edu.cornell.mannlib.vitro.webapp.web.templatemodels.VClassGroupTemplateModel; -import edu.cornell.mannlib.vitro.webapp.dao.jena.ModelContext; - -/** - * This will pass these variables to the template: - * classGroupUri: uri of the classgroup associated with this page. - * vClassGroup: a data structure that is the classgroup associated with this page. - */ -public class InternalClassesDataGetter extends IndividualsForClassesDataGetter{ - private static final Log log = LogFactory.getLog(InternalClassesDataGetter.class); - - - @Override - public Map getData(ServletContext context, VitroRequest vreq, String pageUri, Map page ){ - //Set restricted classes template - super.restrictClassesTemplateName = "internalClass"; - HashMap data = new HashMap(); - //This is the old technique of getting class intersections - Map classIntersectionsMap = vreq.getWebappDaoFactory().getPageDao().getClassesAndCheckInternal(pageUri); - - - //Use Individual List Controller to get all the individuals and related data - List inds = new ArrayList(); - try{ - List classes = (List)classIntersectionsMap.get("classes"); - List restrictClasses = retrieveRestrictClasses(context, classIntersectionsMap); - log.debug("Retrieving classes for " + classes.toString() + " and restricting by " + restrictClasses.toString()); - processClassesAndRestrictions(vreq, context, data, classes, restrictClasses); - //Also add data service url - //Hardcoding for now, need a more dynamic way of doing this - data.put("dataServiceUrlIndividualsByVClass", this.getDataServiceUrl()); - log.debug("Using data service url " + this.getDataServiceUrl()); - } catch(Exception ex) { - log.error("An error occurred retrieving Vclass Intersection individuals", ex); - } - - return data; - } - - private List retrieveRestrictClasses( - ServletContext context, Map classIntersectionsMap) { - List restrictClasses = new ArrayList(); - String internalClass = (String) classIntersectionsMap.get("isInternal"); - //if internal class restriction specified and is true - if(internalClass != null && internalClass.equals("true")) { - //Get internal class - Model mainModel = ModelContext.getBaseOntModelSelector(context).getTBoxModel();; - StmtIterator internalIt = mainModel.listStatements(null, ResourceFactory.createProperty(VitroVocabulary.IS_INTERNAL_CLASSANNOT), (RDFNode) null); - //Checks for just one statement - if(internalIt.hasNext()){ - Statement s = internalIt.nextStatement(); - //The class IS an internal class so the subject is what we're looking for - String internalClassUri = s.getSubject().getURI(); - log.debug("Found internal class uri " + internalClassUri); - restrictClasses.add(internalClassUri); - } - } - - return restrictClasses; - } - - @Override - public String getType(){ - return DisplayVocabulary.CLASSINDIVIDUALS_INTERNAL_TYPE; - } - -} \ No newline at end of file diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/MenuManagementDataUtils.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/MenuManagementDataUtils.java new file mode 100644 index 000000000..5b5770ff0 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/MenuManagementDataUtils.java @@ -0,0 +1,62 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.utils.pageDataGetter; + +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.ServletContext; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONArray; +import org.json.JSONObject; + +import com.hp.hpl.jena.ontology.OntModel; +import com.hp.hpl.jena.rdf.model.Model; +import com.hp.hpl.jena.rdf.model.ModelFactory; +import com.hp.hpl.jena.rdf.model.RDFNode; +import com.hp.hpl.jena.rdf.model.Resource; +import com.hp.hpl.jena.rdf.model.ResourceFactory; +import com.hp.hpl.jena.rdf.model.StmtIterator; +import com.hp.hpl.jena.vocabulary.RDF; + +import edu.cornell.mannlib.vitro.webapp.beans.DataProperty; +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.Controllers; +import edu.cornell.mannlib.vitro.webapp.controller.JsonServlet; +import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.IndividualListController.PageRecord; +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.VitroVocabulary; +import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; +import edu.cornell.mannlib.vitro.webapp.dao.jena.ModelContext; +import edu.cornell.mannlib.vitro.webapp.dao.jena.VClassGroupCache; + +/* + * This class includes methods that help in selecting a data getter based on + * parameters, and VIVO will have its own version or extend this + */ +public class MenuManagementDataUtils { + private static final Log log = LogFactory.getLog(MenuManagementDataUtils.class); + + //Data that is to be returned to template that does not involve data getters + //e.g. what are the current class groups, etc. + public static void includeRequiredSystemData(ServletContext context, Map templateData) { + + + } + + + +} \ No newline at end of file diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/ProcessClassGroup.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/ProcessClassGroup.java new file mode 100644 index 000000000..5323dde01 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/ProcessClassGroup.java @@ -0,0 +1,76 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.utils.pageDataGetter; + +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.ServletContext; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONArray; +import org.json.JSONObject; + +import com.hp.hpl.jena.ontology.OntModel; +import com.hp.hpl.jena.rdf.model.Model; +import com.hp.hpl.jena.rdf.model.ModelFactory; +import com.hp.hpl.jena.rdf.model.RDFNode; +import com.hp.hpl.jena.rdf.model.Resource; +import com.hp.hpl.jena.rdf.model.ResourceFactory; +import com.hp.hpl.jena.rdf.model.StmtIterator; +import com.hp.hpl.jena.vocabulary.RDF; + +import edu.cornell.mannlib.vitro.webapp.beans.DataProperty; +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.Controllers; +import edu.cornell.mannlib.vitro.webapp.controller.JsonServlet; +import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.IndividualListController.PageRecord; +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.VitroVocabulary; +import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; +import edu.cornell.mannlib.vitro.webapp.dao.jena.VClassGroupCache; + +/* + * Handle processing of data retrieved from ClassGroupPage data getter to return to form template + * and handle processing of form submission to create the appropriate individuals for classes data getter + */ +public class ProcessClassGroup implements ProcessDataGetter{ + private static final Log log = LogFactory.getLog(ProcessClassGroup.class); + + //template data represents what needs to be modified and returned to template + //page data is data retrieved from data getter + public void populateTemplate(ServletContext context, Map pageData, Map templateData) { + //This is a class group page so + templateData.put("isClassGroupPage", true); + templateData.put("includeAllClasses", true); + + //Get the class group from VClassGroup + DataGetterUtils.getClassGroupForDataGetter(context, pageData, templateData); + } + + + //Process submission + + public Model processSubmission(VitroRequest vreq, Resource dataGetterResource) { + ClassGroupPageData cpg = new ClassGroupPageData(); + Model dgModel = ModelFactory.createDefaultModel(); + String dataGetterTypeUri = cpg.getType(); + dgModel.add(dgModel.createStatement(dataGetterResource, + RDF.type, + ResourceFactory.createResource(dataGetterTypeUri))); + return dgModel; + } + +} \ No newline at end of file diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/ProcessDataGetter.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/ProcessDataGetter.java new file mode 100644 index 000000000..f9d481665 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/ProcessDataGetter.java @@ -0,0 +1,23 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.utils.pageDataGetter; + +import java.util.Map; + +import javax.servlet.ServletContext; + +import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder; + +import org.json.JSONObject; + +import com.hp.hpl.jena.rdf.model.Model; +import com.hp.hpl.jena.rdf.model.Resource; + +public interface ProcessDataGetter{ + public void populateTemplate(ServletContext context, Map pageData, Map templateData); + + public Model processSubmission(VitroRequest vreq, Resource dataGetterResource); + + +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/ProcessIndividualsForClasses.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/ProcessIndividualsForClasses.java new file mode 100644 index 000000000..387499b9d --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/ProcessIndividualsForClasses.java @@ -0,0 +1,140 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.utils.pageDataGetter; + +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.ServletContext; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONArray; +import org.json.JSONObject; + +import com.hp.hpl.jena.ontology.OntModel; +import com.hp.hpl.jena.rdf.model.Model; +import com.hp.hpl.jena.rdf.model.ModelFactory; +import com.hp.hpl.jena.rdf.model.RDFNode; +import com.hp.hpl.jena.rdf.model.Resource; +import com.hp.hpl.jena.rdf.model.ResourceFactory; +import com.hp.hpl.jena.rdf.model.StmtIterator; +import com.hp.hpl.jena.vocabulary.RDF; + +import edu.cornell.mannlib.vitro.webapp.beans.DataProperty; +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.Controllers; +import edu.cornell.mannlib.vitro.webapp.controller.JsonServlet; +import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.IndividualListController.PageRecord; +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.VitroVocabulary; +import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; +import edu.cornell.mannlib.vitro.webapp.dao.jena.VClassGroupCache; + +/* + * Handle processing of data retrieved from IndividualsForClasses data getter to return to form template + * and handle processing of form submission to create the appropriate individuals for classes data getter + */ +public class ProcessIndividualsForClasses implements ProcessDataGetter { + private static final Log log = LogFactory.getLog(ProcessIndividualsForClasses.class); + + /**Retrieve and populate**/ + + //Based on institutional internal page and not general individualsForClasses + public void populateTemplate(ServletContext context, Map pageData, Map templateData) { + initTemplateData(templateData); + populateIncludedClasses(pageData, templateData); + populateRestrictedClasses(pageData, templateData); + //Also save the class group for display + DataGetterUtils.getClassGroupForDataGetter(context, pageData, templateData); + + } + + protected void initTemplateData(Map templateData) { + templateData.put("isIndividualsForClassesPage", true); + templateData.put("isClassGroupPage", false); + templateData.put("includeAllClasses", false); + } + + protected void populateIncludedClasses(Map pageData, Map templateData) { + //what classes are to be included on page, note this should be a list of string uris + VClassGroup includedClasses = (VClassGroup) pageData.get("vClassGroup"); + templateData.put("includeClasses", getClassUrisAsList(includedClasses)); + } + + protected void populateRestrictedClasses(Map pageData, Map templateData) { + VClassGroup restrictedClasses = (VClassGroup) pageData.get("restrictVClassGroup"); + templateData.put("restricted", getClassUrisAsList(restrictedClasses)); + } + + protected List getClassUrisAsList(VClassGroup includedClasses) { + List classUris = new ArrayList(); + List classList = includedClasses.getVitroClassList(); + for(VClass v:classList) { + classUris.add(v.getURI()); + } + return classUris; + } + + /**Process submission**/ + //Check and see if we should use this process + //Use this if either internal class is selected or all classes have been selected + //No separate inputs for classes to restrict by yet so check if this includes a subset of classes + public boolean useProcessor(VitroRequest vreq) { + return(!allClassesSelected(vreq)); + } + public Model processSubmission(VitroRequest vreq, Resource dataGetterResource) { + String[] selectedClasses = vreq.getParameterValues("classInClassGroup"); + String dataGetterTypeUri = new IndividualsForClassesDataGetter().getType(); + Model dgModel = ModelFactory.createDefaultModel(); + dgModel.add(dgModel.createStatement(dataGetterResource, + RDF.type, + ResourceFactory.createResource(dataGetterTypeUri))); + for(String classUri: selectedClasses) { + dgModel.add(dgModel.createStatement( + dataGetterResource, + ResourceFactory.createProperty(DisplayVocabulary.GETINDIVIDUALS_FOR_CLASS), + ResourceFactory.createResource(classUri))); + } + + //This code can be uncommented when the form includes inputs for restricted class uris + //At that time, use the input that returns the uris for restriction classes and replace below + /* + if(restrictionClassesSelected(vreq)) { + String[] restrictedClasses = vreq.getParameterValues("restrictedClassUris"); + for(String restrictedClassUri: restrictedClasses) { + dgModel.add(dgModel.createStatement( + dataGetterResource, + ResourceFactory.createProperty(DisplayVocabulary.RESTRICT_RESULTS_BY), + dgModel.createLiteral(restrictedClassUri))); + } + }*/ + return dgModel; + } + + private boolean allClassesSelected(VitroRequest vreq) { + String allClasses = vreq.getParameter("allSelected"); + return (allClasses != null && !allClasses.isEmpty()); + } + + //This code can be uncommented when the form includes inputs for restricted class uris + //At that time, use the input that returns the uris for restriction classes and replace below + /* + private boolean restrictionClassesSelected(VitroRequest vreq) { + String restrictedClasses = vreq.getParameter("restrictedClassUri"); + return (restrictedClasses != null && !restrictedClasses.isEmpty()); + } + */ + +} \ No newline at end of file diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/SelectDataGetterUtils.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/SelectDataGetterUtils.java new file mode 100644 index 000000000..387e4f9bf --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/SelectDataGetterUtils.java @@ -0,0 +1,98 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.utils.pageDataGetter; + +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.ServletContext; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONArray; +import org.json.JSONObject; + +import com.hp.hpl.jena.ontology.OntModel; +import com.hp.hpl.jena.rdf.model.Model; +import com.hp.hpl.jena.rdf.model.ModelFactory; +import com.hp.hpl.jena.rdf.model.RDFNode; +import com.hp.hpl.jena.rdf.model.Resource; +import com.hp.hpl.jena.rdf.model.ResourceFactory; +import com.hp.hpl.jena.rdf.model.StmtIterator; +import com.hp.hpl.jena.vocabulary.RDF; + +import edu.cornell.mannlib.vitro.webapp.beans.DataProperty; +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.Controllers; +import edu.cornell.mannlib.vitro.webapp.controller.JsonServlet; +import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.IndividualListController.PageRecord; +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.WebappDaoFactory; +import edu.cornell.mannlib.vitro.webapp.dao.jena.VClassGroupCache; + +/* + * This class includes methods that help in selecting a data getter based on + * parameters, and VIVO will have its own version or extend this + */ +public class SelectDataGetterUtils { + private static final Log log = LogFactory.getLog(SelectDataGetterUtils.class); + + /**Get data for an existing page and set variables for the template accordingly**/ + + + public static void processAndRetrieveData(VitroRequest vreq, ServletContext context, Map pageData, String dataGetterClass, Map templateData) { + //The type of the data getter will show how to process the data from the data getter + ProcessDataGetter processor = selectProcessor(dataGetterClass); + processor.populateTemplate(context, pageData, templateData); + } + + //This will be different in VIVO than in VITRO + private static ProcessDataGetter selectProcessor(String dataGetterClass) { + if(dataGetterClass.equals(ClassGroupPageData.class.getName())) { + return new ProcessClassGroup(); + } else if(dataGetterClass.equals(IndividualsForClassesDataGetter.class.getName())) { + //below should be for vitro specific version + return new ProcessIndividualsForClasses(); + } + return null; + } + + + + + /**Process parameters from form and select appropriate data getter on this basis **/ + public static Model createDataGetterModel(VitroRequest vreq, Resource dataGetterResource) { + Model dataGetterModel = null; + if(dataGetterResource != null) { + //If "All selected" then use class group else use individuals for classes + dataGetterModel = ModelFactory.createDefaultModel(); + + ProcessIndividualsForClasses individualsProcess = new ProcessIndividualsForClasses(); + + ProcessClassGroup classGroupProcess = new ProcessClassGroup(); + if(individualsProcess.useProcessor(vreq)) { + dataGetterModel = individualsProcess.processSubmission(vreq, dataGetterResource); + } else { + dataGetterModel = classGroupProcess.processSubmission(vreq, dataGetterResource); + } + + + } else { + log.error("Data getter is null "); + } + return dataGetterModel; + + } + +} \ No newline at end of file