diff --git a/productMods/WEB-INF/web.xml b/productMods/WEB-INF/web.xml
new file mode 100644
index 00000000..9247fcc9
--- /dev/null
+++ b/productMods/WEB-INF/web.xml
@@ -0,0 +1,1298 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ jdbc/vitro/connectionType
+
+
+ java.lang.String
+ PROPERTIES_FILE_POOL
+
+
+
+
+ jdbc/vitro/namedDS
+
+ java.lang.String
+ mySharedDBPool
+
+
+
+
+
+
+
+ edu.cornell.mannlib.vitro.webapp.servlet.setup.DefaultThemeSetup
+
+
+
+
+ edu.cornell.mannlib.vitro.webapp.servlet.setup.VitroJenaModelMakerSetup
+
+
+
+
+
+ edu.cornell.mannlib.vitro.webapp.servlet.setup.JenaPersistentDataSourceSetup
+
+
+
+
+
+
+
+
+
+
+
+ edu.cornell.mannlib.vitro.webapp.servlet.setup.JenaDataSourceSetup
+
+
+
+
+
+
+ edu.cornell.mannlib.vitro.webapp.servlet.setup.UpdateKnowledgeBase
+
+
+
+
+ edu.cornell.mannlib.vitro.webapp.filestorage.backend.FileStorageSetup
+
+
+
+
+
+
+
+
+ edu.cornell.mannlib.vitro.webapp.servlet.setup.UpdateUploadedFiles
+
+
+
+
+
+ edu.cornell.mannlib.vitro.webapp.servlet.setup.AttachSubmodels
+
+
+
+
+
+
+
+
+ edu.cornell.mannlib.vitro.webapp.servlet.setup.PelletReasonerSetup
+
+
+
+
+
+
+
+
+
+
+ edu.cornell.mannlib.vitro.webapp.search.lucene.LuceneSetup
+
+
+
+
+ edu.cornell.mannlib.vitro.webapp.auth.policy.setup.VivoPolicySetup
+
+
+
+
+
+
+ edu.cornell.mannlib.vitro.webapp.auth.identifier.UserToIndIdentifierFactorySetup
+
+
+
+
+ edu.cornell.mannlib.vitro.webapp.auth.policy.setup.EditorEditingPolicySetup
+
+
+
+
+ edu.cornell.mannlib.vitro.webapp.auth.policy.setup.CuratorEditingPolicySetup
+
+
+
+
+ edu.cornell.mannlib.vitro.webapp.auth.policy.setup.DbAdminEditingPolicySetup
+
+
+
+
+
+ edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreeMarkerSetup
+
+
+
+
+
+
+ org.apache.commons.fileupload.servlet.FileCleanerCleanup
+
+
+
+
+
+
+
+
+
+ edu.cornell.mannlib.vitro.webapp.servlet.setup.VivoMergedListFilteringSetup
+
+
+
+
+
+
+ Character Set Encoding Filter
+ edu.cornell.mannlib.vitro.webapp.filters.CharsetEncodingFilter
+
+
+ Character Set Encoding Filter
+ /*
+
+
+ JSession Strip Filter
+ edu.cornell.mannlib.vitro.webapp.filters.JSessionStripFilter
+
+
+ JSession Strip Filter
+ /*
+
+
+
+ URL Rewriter Filter
+ edu.cornell.mannlib.vitro.webapp.filters.URLRewriterFilter
+
+
+ URL Rewriter Filter
+ /*
+
+
+ Portal Picker Filter
+ edu.cornell.mannlib.vitro.webapp.filters.PortalPickerFilter
+
+
+ Portal Picker Filter
+ /*
+
+
+
+ VitroRequestPrep
+ edu.cornell.mannlib.vitro.webapp.filters.VitroRequestPrep
+
+
+ VitroRequestPrep
+ /*
+ request
+ forward
+
+
+
+
+
+
+
+
+
+ jsp
+ org.apache.jasper.servlet.JspServlet
+
+ fork
+ false
+
+
+ xpoweredBy
+ false
+
+
+ trimSpaces
+ true
+
+ 3
+
+
+
+ IndexController
+ edu.cornell.mannlib.vitro.webapp.search.controller.IndexController
+
+
+ IndexController
+ /SearchIndex
+
+
+
+
+
+ TestController
+ edu.cornell.mannlib.vitro.webapp.controller.TestController
+
+
+ TestController
+ /test
+
+
+
+
+ fetch
+ edu.cornell.mannlib.vitro.webapp.QueryServlet
+
+
+
+
+ AboutController
+ edu.cornell.mannlib.vitro.webapp.controller.freemarker.AboutController
+
+
+ AboutController
+ /about
+
+
+
+ FreeMarkerTestController
+ edu.cornell.mannlib.vitro.webapp.controller.freemarker.TestController
+
+
+ FreeMarkerTestController
+ /freemarkertest
+
+
+
+ FakeSelfEditController
+ edu.cornell.mannlib.vitro.webapp.controller.FakeSelfEditController
+
+
+ FakeSelfEditController
+ /admin/fakeselfedit
+
+
+
+ SiteAdminController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.SiteAdminController
+
+
+ SiteAdminController
+ /siteAdmin
+
+
+ SiteAdminController
+ /siteAdmin.jsp
+
+
+
+ ImageUploadController
+ edu.cornell.mannlib.vitro.webapp.controller.freemarker.ImageUploadController
+
+
+ ImageUploadController
+ /uploadImages
+
+
+
+ FlagUpdateController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.FlagUpdateController
+
+
+ FlagUpdateController
+ /flagUpdate
+
+
+
+ SitemapIndexController
+ edu.cornell.mannlib.vitro.webapp.controller.SitemapIndexController
+
+
+ SitemapIndexController
+ /sitemap.xml
+
+
+
+ RDFUploadFormController
+ edu.cornell.mannlib.vitro.webapp.controller.jena.RDFUploadFormController
+
+
+ RDFUploadFormController
+ /uploadRDFForm
+
+
+
+ RDFUploadController
+ edu.cornell.mannlib.vitro.webapp.controller.jena.RDFUploadController
+
+
+ RDFUploadController
+ /uploadRDF
+
+
+
+ JenaIngestController
+ edu.cornell.mannlib.vitro.webapp.controller.jena.JenaIngestController
+
+
+ JenaIngestController
+ /ingest
+
+
+
+ JenaExportController
+ edu.cornell.mannlib.vitro.webapp.controller.jena.JenaExportController
+
+
+ JenaExportController
+ /export/*
+
+
+
+ JenaXMLFileUpload
+ edu.cornell.mannlib.vitro.webapp.controller.jena.JenaXMLFileUpload
+
+
+ JenaXMLFileUpload
+ /jenaXmlFileUpload/*
+
+
+
+ OwlImportController
+ edu.cornell.mannlib.vitro.webapp.owl.OwlImportController
+
+
+ OwlImportController
+ /owl
+
+
+
+ OwlImportServlet
+ edu.cornell.mannlib.vitro.webapp.owl.ProtegeOwlImportServlet
+
+
+ OwlImportServlet
+ /importOwl
+
+
+
+ JenaAdminServlet
+ edu.cornell.mannlib.vitro.webapp.controller.jena.JenaAdminActions
+
+
+ JenaAdminServlet
+ /jenaAdmin
+
+
+
+ EditFrontController
+ edu.cornell.mannlib.vedit.controller.EditFrontController
+
+
+ EditFrontController
+ /editForm
+
+
+
+ OperationController
+ edu.cornell.mannlib.vedit.controller.OperationController
+
+
+ OperationController
+ /doEdit
+
+
+
+ EntityEditController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.EntityEditController
+
+
+ EntityEditController
+ /entityEdit
+
+
+
+ VclassEditController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.VclassEditController
+
+
+ VclassEditController
+ /vclassEdit
+
+
+
+ Classes2ClassesOperationController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.Classes2ClassesOperationController
+
+
+ Classes2ClassesOperationController
+ /classes2ClassesOp
+
+
+
+ Properties2PropertiesOperationController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.Properties2PropertiesOperationController
+
+
+ Properties2PropertiesOperationController
+ /props2PropsOp
+
+
+
+ NamespacePrefixOperationController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.NamespacePrefixOperationController
+
+
+ NamespacePrefixOperationController
+ /namespacePrefixOp
+
+
+
+ RefactorOperationController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.RefactorOperationController
+
+
+ RefactorOperationController
+ /refactorOp
+
+
+
+ IndividualTypeOperationController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.IndividualTypeOperationController
+
+
+ IndividualTypeOperationController
+ /individualTypeOp
+
+
+
+ Tabs2TypesOperationController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.Tabs2TypesOperationController
+
+
+ Tabs2TypesOperationController
+ /tabs2TypesOp
+
+
+
+ TabIndividualRelationOperationController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.TabIndividualRelationOperationController
+
+
+ TabIndividualRelationOperationController
+ /tabIndividualRelationOp
+
+
+
+ TabHierarchyOperationController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.TabHierarchyOperationController
+
+
+ TabHierarchyOperationController
+ /doTabHierarchyOperation
+
+
+
+ DatapropEditController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.DatapropEditController
+
+
+ DatapropEditController
+ /datapropEdit
+
+
+
+
+ KeywordEditController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.KeywordEditController
+
+
+ KeywordEditController
+ /keywordEdit
+
+
+
+ TabEditController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.TabEditController
+
+
+ TabEditController
+ /tabEdit
+
+
+
+ UserEditController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.UserEditController
+
+
+ UserEditController
+ /userEdit
+
+
+
+ OntologyEditController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.OntologyEditController
+
+
+ OntologyEditController
+ /ontologyEdit
+
+
+
+ PropertyEditController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.PropertyEditController
+
+
+ PropertyEditController
+ /propertyEdit
+
+
+
+ PortalEditController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.PortalEditController
+
+
+ PortalEditController
+ /portalEdit
+
+
+
+ EntityRetryController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.EntityRetryController
+
+
+ EntityRetryController
+ /entity_retry
+
+
+
+ VclassRetryController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.VclassRetryController
+
+
+ VclassRetryController
+ /vclass_retry
+
+
+
+ DatatypeRetryController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.DatatypeRetryController
+
+
+ DatatypeRetryController
+ /datatype_retry
+
+
+
+ AllTabsForPortalListingController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.listing.AllTabsForPortalListingController
+
+
+ AllTabsForPortalListingController
+ /listTabs
+
+
+
+ AllClassGroupsListingController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.listing.AllClassGroupsListingController
+
+
+ AllClassGroupsListingController
+ /listGroups
+
+
+
+ PropertyGroupsListingController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.listing.PropertyGroupsListingController
+
+
+ PropertyGroupsListingController
+ /listPropertyGroups
+
+
+
+ OntologiesListingController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.listing.OntologiesListingController
+
+
+ OntologiesListingController
+ /listOntologies
+
+
+
+ NamespacesListingController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.listing.jena.NamespacesListingController
+
+
+ NamespacesListingController
+ /listNamespaces
+
+
+
+ RestrictionsListingController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.listing.jena.RestrictionsListingController
+
+
+ RestrictionsListingController
+ /listRestrictions
+
+
+
+ RestrictionOperationController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.RestrictionOperationController
+
+
+ RestrictionOperationController
+ /addRestriction
+
+
+
+ PortalsListingController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.listing.PortalsListingController
+
+
+ PortalsListingController
+ /listPortals
+
+
+
+ UsersListingController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.listing.UsersListingController
+
+
+ UsersListingController
+ /listUsers
+
+
+
+ StatementChangeListingController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.listing.jena.StatementChangeListingController
+
+
+ StatementChangeListingController
+ /statementHistory
+
+
+
+ WriteOutChangesController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.listing.jena.WriteOutChangesController
+
+
+ WriteOutChangesController
+ /writeOutChanges
+
+
+
+ VClassWebappsListingController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.listing.VClassWebappsListingController
+
+
+ VClassWebappsListingController
+ /listVClassWebapps
+
+
+
+ IndividualsListingController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.listing.IndividualsListingController
+
+
+ IndividualsListingController
+ /listIndividuals
+
+
+
+
+ ClassHierarchyListingController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.listing.ClassHierarchyListingController
+
+
+ ClassHierarchyListingController
+ /showClassHierarchy
+
+
+
+ ObjectPropertyHierarchyListingController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.listing.ObjectPropertyHierarchyListingController
+
+
+ ObjectPropertyHierarchyListingController
+ /showObjectPropertyHierarchy
+
+
+
+ DataPropertyHierarchyListingController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.listing.DataPropertyHierarchyListingController
+
+
+ DataPropertyHierarchyListingController
+ /showDataPropertyHierarchy
+
+
+
+ PropertyWebappsListingController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.listing.PropertyWebappsListingController
+
+
+ PropertyWebappsListingController
+ /listPropertyWebapps
+
+
+
+ DatatypePropertiesListingController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.listing.DatatypePropertiesListingController
+
+
+ DatatypePropertiesListingController
+ /listDatatypeProperties
+
+
+
+ DataPropertyStatementListingController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.listing.DataPropertyStatementListingController
+
+
+ DataPropertyStatementListingController
+ /listDataPropertyStatements
+
+
+
+ ObjectPropertyStatementListingController
+ edu.cornell.mannlib.vitro.webapp.controller.edit.listing.ObjectPropertyStatementListingController
+
+
+ ObjectPropertyStatementListingController
+ /listObjectPropertyStatements
+
+
+
+ EntityListController
+ edu.cornell.mannlib.vitro.webapp.controller.EntityListController
+
+
+ EntityListController
+ /entitylist
+
+
+
+ IndividualListController
+ edu.cornell.mannlib.vitro.webapp.controller.freemarker.IndividualListController
+
+
+ IndividualListController
+ /individuallist
+
+
+
+ SearchController
+ edu.cornell.mannlib.vitro.webapp.search.controller.PagedSearchController
+
+
+ SearchController
+ /search
+
+
+
+ SearchController
+ /search.jsp
+
+
+ SearchController
+ /fedsearch
+
+
+ SearchController
+ /searchcontroller
+
+
+
+ AutocompleteController
+ edu.cornell.mannlib.vitro.webapp.search.controller.AutocompleteController
+
+
+ AutocompleteController
+ /autocomplete
+
+
+ AutocompleteController
+ /populateselect
+
+
+
+ AdminController
+ edu.cornell.mannlib.vitro.webapp.controller.AdminController
+
+
+ AdminController
+ /adminCon
+
+
+
+ TermsOfUseController
+ edu.cornell.mannlib.vitro.webapp.controller.freemarker.TermsOfUseController
+
+
+ TermsOfUseController
+ /termsOfUse
+
+
+
+ ContactFormController
+ edu.cornell.mannlib.vitro.webapp.controller.freemarker.ContactFormController
+
+
+ ContactFormController
+ /contact
+
+
+
+ JSON Service
+ edu.cornell.mannlib.vitro.webapp.controller.JSONServlet
+
+
+ JSON Service
+ /dataservice
+
+
+
+ TabEntitiesController
+ edu.cornell.mannlib.vitro.webapp.controller.TabEntitiesController
+
+
+ TabEntitiesController
+ /TabEntitiesController
+
+
+
+
+ TabController
+ edu.cornell.mannlib.vitro.webapp.controller.TabController
+
+
+ TabController
+ /index.jsp
+
+
+
+
+
+ EntityMergedPropertyListController
+ edu.cornell.mannlib.vitro.webapp.controller.EntityMergedPropertyListController
+
+
+ EntityMergedPropertyListController
+ /entityMergedPropList
+
+
+
+ DashboardPropertyListController
+ edu.cornell.mannlib.vitro.webapp.controller.DashboardPropertyListController
+
+
+ DashboardPropertyListController
+ /dashboardPropList
+
+
+
+ dwr-invoker
+ uk.ltd.getahead.dwr.DWRServlet
+
+ debug
+ true
+
+
+ logLevel
+ DEBUG
+
+
+
+ dwr-invoker
+ /dwr/*
+
+
+
+
+ sendmail
+ edu.cornell.mannlib.vitro.webapp.controller.ContactMailServlet
+ 5
+
+
+ sendmail
+ /sendmail
+
+
+
+
+ sendMail
+ edu.cornell.mannlib.vitro.webapp.controller.freemarker.ContactMailController
+ 5
+
+
+ sendMail
+ /submitFeedback
+
+
+
+ mailusers
+ edu.cornell.mannlib.vitro.webapp.controller.MailUsersServlet
+ 5
+
+
+
+ entity
+ edu.cornell.mannlib.vitro.webapp.controller.EntityController
+
+
+
+ updateEntityFlags
+ edu.cornell.mannlib.vitro.webapp.UpdateEntityFlagServlet
+
+
+
+ authenticate
+ edu.cornell.mannlib.vitro.webapp.controller.edit.Authenticate
+
+
+
+ logout
+ edu.cornell.mannlib.vitro.webapp.controller.edit.Logout
+
+ properties
+ WEB-INF/classes/formbeans/Login_forms.properties
+
+
+
+
+
+ browsecontroller
+ edu.cornell.mannlib.vitro.webapp.controller.freemarker.BrowseController
+ 5
+
+
+ browsecontroller
+ /browse
+
+
+
+ pubsbyorg
+ edu.cornell.mannlib.vitro.webapp.controller.vclass.PubsByDepartmentServlet
+
+ workspaceDir
+ /usr/local/services/vivo/logs
+
+
+
+
+
+ coauthors
+ edu.cornell.mannlib.vitro.webapp.controller.vclass.CoAuthorServlet
+
+ workspaceDir
+ /usr/local/services/vivo/logs
+
+
+
+
+
+ generic_create
+ edu.cornell.mannlib.vitro.webapp.GenericDBCreate
+
+
+
+
+ serveFiles
+ edu.cornell.mannlib.vitro.webapp.filestorage.serving.FileServingServlet
+
+
+ serveFiles
+ /file/*
+
+
+
+ generic_editprep
+ edu.cornell.mannlib.vitro.webapp.GenericDBEditPrep
+
+
+
+ generic_update
+ edu.cornell.mannlib.vitro.webapp.GenericDBUpdate
+
+
+
+ generic_delete
+ edu.cornell.mannlib.vitro.webapp.GenericDBDelete
+
+
+
+ SparqlQuery
+ edu.cornell.mannlib.vitro.webapp.controller.SparqlQueryServlet
+
+
+
+ SparqlQuery
+ /admin/sparqlquery
+
+
+
+
+
+ VisualizationController
+ edu.cornell.mannlib.vitro.webapp.controller.visualization.VisualizationController
+
+
+
+ VisualizationController
+ /admin/visQuery
+
+
+
+ authtest
+ edu.cornell.mannlib.vitro.webapp.auth.AuthTestController
+
+
+ authtest
+ /authtest
+
+
+
+ primitiveRdfEdit
+ edu.cornell.mannlib.vitro.webapp.controller.edit.PrimitiveRdfEdit
+
+
+ primitiveRdfEdit
+ /edit/primitiveRdfEdit
+
+
+
+ primitiveDelete
+ edu.cornell.mannlib.vitro.webapp.controller.edit.PrimitiveDelete
+
+
+ primitiveDelete
+ /edit/primitiveDelete
+
+
+
+
+ fetch
+ /fetch
+
+
+ mailusers
+ /mailusers
+
+
+ entity
+ /entity
+
+
+ entity
+ /entity/*
+
+
+ entity
+ /individual/*
+
+
+ entity
+ /display/*
+
+
+ updateEntityFlags
+ /updateEntityFlags
+
+
+ authenticate
+ /authenticate
+
+
+ logout
+ /logout
+
+
+ pubsbyorg
+ /pubsbyorg
+
+
+ coauthors
+ /coauthors
+
+
+ generic_create
+ /generic_create
+
+
+ generic_editprep
+ /generic_editprep
+
+
+ generic_update
+ /generic_update
+
+
+ generic_delete
+ /generic_delete
+
+
+
+
+
+ /WEB-INF/tlds/database.tld
+ /WEB-INF/tlds/database.tld
+
+
+
+ http://java.sun.com/jstl/core
+ /WEB-INF/tlds/c.tld
+
+
+
+ http://java.sun.com/jstl/functions
+ /WEB-INF/tlds/fn.tld
+
+
+
+ http://vitro.mannlib.cornell.edu/edit/tags
+ /WEB-INF/tlds/form.tld
+
+
+
+ http://vitro.mannlib.cornell.edu/vitro/tags
+ /WEB-INF/tlds/vitroForm.tld
+
+
+
+ http://vitro.mannlib.cornell.edu/vitro/tags/PropertyEditLink
+ /WEB-INF/tlds/PropertyEditLink.tld
+
+
+
+ http://mannlib.cornell.edu/vitro/ListSparqlTag/0.1/
+ /WEB-INF/tlds/ListSparqlTag.tld
+
+
+
+ http://jakarta.apache.org/taglibs/string-1.1
+ /WEB-INF/tlds/taglibs-string.tld
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/VivoMergedListFilteringSetup.java b/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/VivoMergedListFilteringSetup.java
new file mode 100644
index 00000000..973d1f43
--- /dev/null
+++ b/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/VivoMergedListFilteringSetup.java
@@ -0,0 +1,116 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package edu.cornell.mannlib.vitro.webapp.servlet.setup;
+
+import javax.servlet.ServletContextEvent;
+
+import net.sf.jga.fn.UnaryFunctor;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.joda.time.DateTime;
+
+import edu.cornell.mannlib.vitro.webapp.beans.DataPropertyStatement;
+import edu.cornell.mannlib.vitro.webapp.beans.Individual;
+import edu.cornell.mannlib.vitro.webapp.beans.ObjectPropertyStatement;
+import edu.cornell.mannlib.vitro.webapp.controller.EntityMergedPropertyListController;
+import edu.cornell.mannlib.vitro.webapp.dao.filtering.IndividualFiltering;
+import edu.cornell.mannlib.vitro.webapp.dao.filtering.filters.VitroFiltersImpl;
+
+/**
+ * This adds an object to the servlet context that will be used by
+ * EntityMergedPropertiesListController to convert the individual that
+ * is specified by the URI of the request to an individual that is filtered.
+ * The object is a function from an Individual to an Individual. The original
+ * Individual is wrapped in an object that will filter out any object property statements
+ * to Individuals of core:Position whos date is in the past.
+ *
+ * This is related to http://issues.library.cornell.edu/browse/NIHVIVO-984
+ *
+ * @author bdc34
+ *
+ */
+public class VivoMergedListFilteringSetup implements javax.servlet.ServletContextListener {
+ private static final Log log = LogFactory.getLog(VivoMergedListFilteringSetup.class);
+
+ @Override
+ public void contextDestroyed(ServletContextEvent arg0) {
+ }
+
+ @Override
+ public void contextInitialized(ServletContextEvent arg0) {
+ log.info("Setting up Vivo Merged List Filtering.");
+
+ UnaryFunctor fn = new UnaryFunctor(){
+
+ @Override
+ public Individual fn(Individual subject) {
+ if( subject != null && subject.isVClass("http://xmlns.com/foaf/0.1/Organization")){
+ return new IndividualFiltering(subject, new VitroFiltersImpl(){
+
+ // @Override
+ // public UnaryFunctor getIndividualFilter(){
+ // return new UnaryFunctor(){
+ // @Override
+ // public Boolean fn(Individual arg) {
+ // return ! isPast(arg);
+ // }
+ // };
+ // }
+
+ /**
+ * This returns true if we should keep the statement, false if we should get rid of the statement
+ */
+ @Override
+ public UnaryFunctor getObjectPropertyStatementFilter(){
+ return new UnaryFunctor(){
+ @Override
+ public Boolean fn(ObjectPropertyStatement arg) {
+ if( "http://vivoweb.org/ontology/core#organizationForPosition".equals(arg.getPropertyURI())){
+ return ! positionInPast(arg.getObject());
+ }else{
+ return true;
+ }
+ }
+ };
+ }
+
+
+ });
+ }else{
+ return subject;
+ }
+ }
+ };
+
+ EntityMergedPropertyListController.setMergedPropertyListFilter(fn, arg0.getServletContext());
+ }
+
+
+ private boolean positionInPast(Individual ind){
+
+ if( ind.isVClass( "http://vivoweb.org/ontology/core#Position" ) ){
+
+ //positionShortView.jsp does not check core:endDate
+// for(DataPropertyStatement stmt : ind.getDataPropertyStatements("http://vivoweb.org/ontology/core#endDate")){
+// DateTime end = new DateTime( stmt.getData() );
+// if( end.isBeforeNow() )
+// return true;
+// }
+
+ for(DataPropertyStatement stmt : ind.getDataPropertyStatements("http://vivoweb.org/ontology/core#endYear")){
+ int endYear = Integer.MAX_VALUE;
+ try{
+ endYear = Integer.parseInt(stmt.getData());
+ }catch(NumberFormatException nfe){
+ log.warn("Could not parse year: " + stmt.getData());
+ }
+ int nowYear = (new DateTime()).getYear();
+
+ //This should use the same logic as positionShortView.jsp
+ return nowYear > endYear;
+ }
+ }
+ return false;
+ }
+}