From 3582d32ef3e79182228bfe711927daf3dce6a5b6 Mon Sep 17 00:00:00 2001 From: bdc34 Date: Tue, 23 Mar 2010 22:01:36 +0000 Subject: [PATCH] Sorting Object property statements by class, NIHVIVO-118. Removed redundant comments. Fixed other comments. --- .../controller/EntityListController.java | 6 - .../EntityMergedPropertyListController.java | 202 ++++++++++++++---- .../EntityPropertyListController.java | 6 - .../filtering/ObjectPropertyFiltering.java | 11 + 4 files changed, 169 insertions(+), 56 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/EntityListController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/EntityListController.java index a39a97a27..374bdb8fe 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/EntityListController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/EntityListController.java @@ -18,12 +18,6 @@ import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -/** - * Handles requests for entity information. - * The methods for sorting Property/ObjectPropertyStatement Lists are here also. - * @author bdc34 - * - */ public class EntityListController extends VitroHttpServlet { long startTime = -1; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/EntityMergedPropertyListController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/EntityMergedPropertyListController.java index 99d8133b4..a2f9e7de2 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/EntityMergedPropertyListController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/EntityMergedPropertyListController.java @@ -2,49 +2,50 @@ package edu.cornell.mannlib.vitro.webapp.controller; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import javax.servlet.RequestDispatcher; +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import net.sf.jga.fn.UnaryFunctor; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import edu.cornell.mannlib.vitro.webapp.beans.DataProperty; +import edu.cornell.mannlib.vitro.webapp.beans.Individual; +import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty; +import edu.cornell.mannlib.vitro.webapp.beans.ObjectPropertyStatement; +import edu.cornell.mannlib.vitro.webapp.beans.Property; +import edu.cornell.mannlib.vitro.webapp.beans.PropertyGroup; +import edu.cornell.mannlib.vitro.webapp.beans.PropertyInstance; +import edu.cornell.mannlib.vitro.webapp.beans.VClass; +import edu.cornell.mannlib.vitro.webapp.dao.DataPropertyDao; +import edu.cornell.mannlib.vitro.webapp.dao.ObjectPropertyDao; +import edu.cornell.mannlib.vitro.webapp.dao.PropertyGroupDao; +import edu.cornell.mannlib.vitro.webapp.dao.PropertyInstanceDao; +import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; +import edu.cornell.mannlib.vitro.webapp.servlet.setup.PropertyMaskingSetup; -import javax.servlet.RequestDispatcher; -import javax.servlet.ServletException; -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import net.sf.jga.fn.UnaryFunctor; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import edu.cornell.mannlib.vitro.webapp.beans.DataProperty; -import edu.cornell.mannlib.vitro.webapp.beans.Individual; -import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty; -import edu.cornell.mannlib.vitro.webapp.beans.Property; -import edu.cornell.mannlib.vitro.webapp.beans.PropertyGroup; -import edu.cornell.mannlib.vitro.webapp.beans.PropertyInstance; -import edu.cornell.mannlib.vitro.webapp.dao.DataPropertyDao; -import edu.cornell.mannlib.vitro.webapp.dao.ObjectPropertyDao; -import edu.cornell.mannlib.vitro.webapp.dao.PropertyGroupDao; -import edu.cornell.mannlib.vitro.webapp.dao.PropertyInstanceDao; -import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; -import edu.cornell.mannlib.vitro.webapp.servlet.setup.PropertyMaskingSetup; - -/** - * Handles requests for entity information. - * The methods for sorting Property/ObjectPropertyStatement Lists are here also. - * @author bdc34 - * - */ public class EntityMergedPropertyListController extends VitroHttpServlet { /** * This gets the Entity object in the requestScope "entity" and - * sets up a merged property list for it, including Object and Data properties - * to be sortable and displayable along with other properties. + * sets up a merged property list for it. This merged list includes + * Object and Data properties. + * * After that a jsp is called to draw the data. * * Expected parameters: @@ -52,7 +53,7 @@ public class EntityMergedPropertyListController extends VitroHttpServlet { * Expected Attributes: * entity - set to entity to display properties for. * - * @author bdc34, then jc55 + * @author jc55 forked this file from EntityPropertyListController */ private static final Log log = LogFactory.getLog(EntityMergedPropertyListController.class.getName()); @@ -172,7 +173,11 @@ public class EntityMergedPropertyListController extends VitroHttpServlet { Collections.sort(mergedPropertyList,new PropertyRanker(vreq)); } catch (Exception ex) { log.error("Exception sorting merged property list: " + ex.getMessage()); - } + } + + //deal with collateBySubclass annotations on object properties + mergedPropertyList = collateBySubclass( mergedPropertyList ); + if (groupedMode) { int groupsCount=0; try { @@ -211,7 +216,8 @@ public class EntityMergedPropertyListController extends VitroHttpServlet { } mergedPropertyList.clear(); } - } + } + if (groupedMode) { req.setAttribute("groupsList",groupsList); } else { @@ -235,8 +241,8 @@ public class EntityMergedPropertyListController extends VitroHttpServlet { rd.include(req, res); } } - - public void doPost(HttpServletRequest request, HttpServletResponse response) + + public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException { doGet(request, response); } @@ -411,5 +417,113 @@ public class EntityMergedPropertyListController extends VitroHttpServlet { } return 0; } - } + } + + + private List collateBySubclass(List mergedPropertyList) { + for( Property prop : mergedPropertyList){ + if( prop instanceof ObjectProperty && ((ObjectProperty)prop).getCollateBySubclass() ){ + collateBySubclass((ObjectProperty)prop); + } + } + return mergedPropertyList; + } + + /** + * Sort the object property statements for each property so that they + * are sorted first by subclass and then by rdfs:label. + * + * This will be tricky since "subclass" is vaguely defined. Here directly + * asserted classes are used. + */ + private void collateBySubclass(ObjectProperty prop) { + List orgStmtList = prop.getObjectPropertyStatements(); + if( orgStmtList == null ) + return; + Map directClasses = getDirectClasses( getObjectsFromStmts( orgStmtList ) ); + //don't do collateBySubclass if there is only one class + if( directClasses.size() < 2 ) + prop.setCollateBySubclass(false); //this overrides the value from the model + else{ + System.out.println("statements for object property: " + orgStmtList.size()); + //get list of direct classes and sort them + List vclasses = new LinkedList(directClasses.values()); + Collections.sort( + vclasses, + new Comparator(){ + public int compare(VClass o1, VClass o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + + //order object property statements by sorted direct class list + List sortedStmtList = new LinkedList(); + for (VClass clazz : vclasses) { + // get all obj prop stmts with objects of this class + List stmtsForClass = new ArrayList(); + + System.out.println("statements for object property: " + orgStmtList.size()); + Iterator it = orgStmtList.iterator(); + while( it.hasNext()){ + ObjectPropertyStatement stmt = it.next(); + //if (stmt.getObject().getVClasses(true).contains(clazz)) { + + Individual obj = stmt.getObject(); + List vclassesForObj = obj.getVClasses(true); + if (vclassesForObj != null && vclassesForObj.contains(clazz)) { + System.out.println("adding " + stmt + " to class " + + clazz.getURI()); + System.out.println("subjectURI " + stmt.getSubjectURI() + + " objectURI" + stmt.getObject().getURI()); + System.out.println("stmtsForclass size: " + + stmtsForClass.size()); + System.out.println("stmtsForclass size: " + + stmtsForClass.size()); + + stmtsForClass.add(stmt); + } + } + + Collections.sort(stmtsForClass, + new Comparator() { + public int compare(ObjectPropertyStatement o1, + ObjectPropertyStatement o2) { + return o1.getObject().getName().compareTo( + o2.getObject().getName()); + } + }); + System.out.println("stmtsForclass size after sort: " + + stmtsForClass.size()); + System.out.println("sortedStmtList size before add: " + + sortedStmtList.size()); + sortedStmtList.addAll(stmtsForClass); + System.out.println("sortedStmtList size after add: " + + sortedStmtList.size()); + } + prop.setObjectPropertyStatements(sortedStmtList); + } + + } + + + + private List getObjectsFromStmts(List orgStmtList) { + List individuals = new LinkedList(); + for( ObjectPropertyStatement stmt : orgStmtList ){ + individuals.add( stmt.getObject() ); + } + return individuals; + } + + private Map getDirectClasses(List objectsFromStmts) { + Map directClasses = new HashMap(); + + for (Individual ind : objectsFromStmts) { + for (VClass clazz : ind.getVClasses(true)) { + directClasses.put(clazz.getURI(),clazz); + } + } + return directClasses; + } + } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/EntityPropertyListController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/EntityPropertyListController.java index 49956dac8..36398cf52 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/EntityPropertyListController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/EntityPropertyListController.java @@ -12,12 +12,6 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; -/** - * Handles requests for entity information. - * The methods for sorting Property/ObjectPropertyStatement Lists are here also. - * @author bdc34 - * - */ public class EntityPropertyListController extends VitroHttpServlet { /** diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/ObjectPropertyFiltering.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/ObjectPropertyFiltering.java index 9278f3353..8c2edded9 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/ObjectPropertyFiltering.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/ObjectPropertyFiltering.java @@ -554,4 +554,15 @@ public class ObjectPropertyFiltering extends ObjectProperty { innerObjectProperty.setForceStubObjectDeletion(b); } + @Override + public boolean getCollateBySubclass() { + return innerObjectProperty.getCollateBySubclass(); + } + + @Override + public void setCollateBySubclass(boolean collate) { + innerObjectProperty.setCollateBySubclass(collate); + } + + }