From 7e46f1ed026fbb7b343367416201d759a333f39e Mon Sep 17 00:00:00 2001 From: bjl23 Date: Thu, 16 Sep 2010 19:28:34 +0000 Subject: [PATCH] merging picklist optimizations back into trunk --- .../vitro/webapp/beans/Individual.java | 4 ++ .../vitro/webapp/beans/IndividualImpl.java | 6 +++ .../vitro/webapp/dao/IndividualDao.java | 3 +- .../dao/filtering/IndividualFiltering.java | 7 ++- .../dao/filtering/VClassDaoFiltering.java | 16 +++--- .../webapp/dao/jena/IndividualDaoJena.java | 50 ++++++------------- .../vitro/webapp/dao/jena/IndividualJena.java | 26 ++++++++++ .../dao/jena/ObjectPropertyDaoJena.java | 2 +- .../vitro/webapp/dao/jena/VClassDaoJena.java | 2 +- .../edit/n3editing/SelectListGenerator.java | 50 +++++-------------- .../vitro/webapp/web/MiscWebUtils.java | 3 +- .../jsptags/InputElementFormattingTag.java | 15 ++++-- webapp/web/edit/forms/defaultObjPropForm.jsp | 24 +++++++-- 13 files changed, 116 insertions(+), 92 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/Individual.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/Individual.java index 9c5cdb867..422a1cb88 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/Individual.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/Individual.java @@ -10,6 +10,8 @@ import java.util.Map; import org.json.JSONException; import org.json.JSONObject; +import edu.cornell.mannlib.vitro.webapp.search.beans.ProhibitedFromSearch; + /** * User: bdc34 * Date: Oct 18, 2007 @@ -71,6 +73,8 @@ public interface Individual extends ResourceBean, VitroTimeWindowedResource, Com /** Does the individual belong to this class? */ boolean isVClass(String uri); + + public boolean isMemberOfClassProhibitedFromSearch(ProhibitedFromSearch pfs); void setObjectPropertyStatements(List list); List getObjectPropertyStatements(); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/IndividualImpl.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/IndividualImpl.java index 1b315ec95..38c7a5c9a 100755 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/IndividualImpl.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/IndividualImpl.java @@ -6,6 +6,7 @@ import org.json.JSONException; import org.json.JSONObject; import edu.cornell.mannlib.vitro.webapp.filestorage.model.ImageInfo; +import edu.cornell.mannlib.vitro.webapp.search.beans.ProhibitedFromSearch; import java.lang.reflect.Method; import java.sql.Timestamp; @@ -195,6 +196,11 @@ public class IndividualImpl extends BaseResourceBean implements Individual, Comp } return false; } + + public boolean isMemberOfClassProhibitedFromSearch(ProhibitedFromSearch pfs) { + throw new UnsupportedOperationException(this.getClass().getName() + + ".isMemberOfClassProhibitedFromSearch must be overriden by a subclass"); + } public List getVClasses(boolean direct) { if (direct) { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/IndividualDao.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/IndividualDao.java index b39edd587..6ff4bd8a9 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/IndividualDao.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/IndividualDao.java @@ -13,6 +13,7 @@ import edu.cornell.mannlib.vitro.webapp.beans.Individual; import edu.cornell.mannlib.vitro.webapp.beans.Keyword; import edu.cornell.mannlib.vitro.webapp.beans.VClass; import edu.cornell.mannlib.vitro.webapp.search.beans.ObjectSourceIface; +import edu.cornell.mannlib.vitro.webapp.search.beans.ProhibitedFromSearch; public interface IndividualDao extends ObjectSourceIface { @@ -105,7 +106,7 @@ public interface IndividualDao extends ObjectSourceIface { int getCountOfIndividualsInVClass(String vclassURI ); - public boolean isIndividualOfClass(String vclassURI, String indURI); + public boolean isIndividualOfClass(String vclassURI, String indURI); /** * Returns a list of individuals with the given value for the given dataProperty. If diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/IndividualFiltering.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/IndividualFiltering.java index 23eea572f..6464df13f 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/IndividualFiltering.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/IndividualFiltering.java @@ -27,6 +27,7 @@ import edu.cornell.mannlib.vitro.webapp.beans.ObjectPropertyStatement; import edu.cornell.mannlib.vitro.webapp.beans.VClass; import edu.cornell.mannlib.vitro.webapp.beans.BaseResourceBean.RoleLevel; import edu.cornell.mannlib.vitro.webapp.dao.filtering.filters.VitroFilters; +import edu.cornell.mannlib.vitro.webapp.search.beans.ProhibitedFromSearch; /** * A Individual object that will delegate to an inner Individual @@ -517,7 +518,11 @@ public class IndividualFiltering implements Individual { return _innerIndividual.isVClass(uri); } - + @Override + public boolean isMemberOfClassProhibitedFromSearch(ProhibitedFromSearch pfs) { + return _innerIndividual.isMemberOfClassProhibitedFromSearch(pfs); + } + public void setDataPropertyMap(Map propertyMap) { _innerIndividual.setDataPropertyMap(propertyMap); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/VClassDaoFiltering.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/VClassDaoFiltering.java index 46fa600d0..04b171315 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/VClassDaoFiltering.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/VClassDaoFiltering.java @@ -114,17 +114,17 @@ public class VClassDaoFiltering extends BaseFiltering implements VClassDao{ if(list == null ) return null; filter(list,filters.getClassFilter()); - correctVClassCounts(list); + //correctVClassCounts(list); return list; } public List getOntologyRootClasses(String ontologyURI) { - return (List)correctVClassCounts(innerVClassDao.getOntologyRootClasses(ontologyURI)); + return innerVClassDao.getOntologyRootClasses(ontologyURI); } public List getRootClasses() { - return correctVClassCounts(innerVClassDao.getRootClasses()); + return innerVClassDao.getRootClasses(); } @@ -142,13 +142,13 @@ public class VClassDaoFiltering extends BaseFiltering implements VClassDao{ public List getVClassesForProperty(String propertyURI, boolean domainSide) { - List list = innerVClassDao.getVClassesForProperty(propertyURI, domainSide); - return correctVClassCounts(filter(list,filters.getClassFilter())); + return innerVClassDao.getVClassesForProperty(propertyURI, domainSide); + //return correctVClassCounts(filter(list,filters.getClassFilter())); } public List getVClassesForProperty(String vclassURI, String propertyURI) { - List list = innerVClassDao.getVClassesForProperty(vclassURI, propertyURI); - return correctVClassCounts(filter(list,filters.getClassFilter())); + return innerVClassDao.getVClassesForProperty(vclassURI, propertyURI); + //return correctVClassCounts(filter(list,filters.getClassFilter())); } public void insertNewVClass(VClass cls) throws InsertException { @@ -167,7 +167,7 @@ public class VClassDaoFiltering extends BaseFiltering implements VClassDao{ } public void addVClassesToGroup(VClassGroup group, boolean includeUninstantiatedClasses) { - this.addVClassesToGroup(group, includeUninstantiatedClasses, true); + this.addVClassesToGroup(group, includeUninstantiatedClasses, false); } public void addVClassesToGroup(VClassGroup group, diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/IndividualDaoJena.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/IndividualDaoJena.java index 63a47511e..b235e551b 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/IndividualDaoJena.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/IndividualDaoJena.java @@ -140,54 +140,36 @@ public class IndividualDaoJena extends JenaBaseDao implements IndividualDao { } public List getIndividualsByVClassURI(String vclassURI, int offset, int quantity ) { - if (vclassURI==null) { + + if (vclassURI==null) { return null; } + List ents = new ArrayList(); - Resource theClass = null; + + Resource theClass = (vclassURI.indexOf(PSEUDO_BNODE_NS) == 0) + ? getOntModel().createResource(new AnonId(vclassURI.split("#")[1])) + : ResourceFactory.createResource(vclassURI); + getOntModel().enterCriticalSection(Lock.READ); try { - if (vclassURI.indexOf(PSEUDO_BNODE_NS)==0) { - ClosableIterator closeIt = getOntModel().listClasses(); - try { - for (Iterator clsIt = closeIt ; clsIt.hasNext();) { - OntClass cls = (OntClass) clsIt.next(); - if (cls.isAnon() && cls.getId().toString().equals(vclassURI.split("#")[1])) { - theClass = cls; - break; - } - } - } finally { - closeIt.close(); - } - } else { - theClass = getOntModel().getOntClass(vclassURI); - } - } finally { - getOntModel().leaveCriticalSection(); - } - - if (theClass == null) { - theClass = ResourceFactory.createResource(vclassURI); - } - - getOntModel().enterCriticalSection(Lock.READ); - try { - ClosableIterator indIt = getOntModel().listIndividuals(theClass); + StmtIterator stmtIt = getOntModel().listStatements((Resource) null, RDF.type, theClass); try { - while (indIt.hasNext()) { - com.hp.hpl.jena.ontology.Individual ind = (com.hp.hpl.jena.ontology.Individual) indIt.next(); + while (stmtIt.hasNext()) { + Statement stmt = stmtIt.nextStatement(); + OntResource ind = (OntResource) stmt.getSubject().as(OntResource.class); ents.add(new IndividualJena(ind, (WebappDaoFactoryJena) getWebappDaoFactory())); } } finally { - indIt.close(); + stmtIt.close(); } } finally { getOntModel().leaveCriticalSection(); } - java.util.Collections.sort(ents); - return ents; + java.util.Collections.sort(ents); + + return ents; } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/IndividualJena.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/IndividualJena.java index 2d9eaa91f..44b4c4ea5 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/IndividualJena.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/IndividualJena.java @@ -25,6 +25,7 @@ import com.hp.hpl.jena.rdf.model.Literal; import com.hp.hpl.jena.rdf.model.Resource; import com.hp.hpl.jena.rdf.model.ResourceFactory; import com.hp.hpl.jena.rdf.model.Statement; +import com.hp.hpl.jena.rdf.model.StmtIterator; import com.hp.hpl.jena.shared.Lock; import com.hp.hpl.jena.util.iterator.ClosableIterator; import com.hp.hpl.jena.vocabulary.OWL; @@ -42,6 +43,7 @@ import edu.cornell.mannlib.vitro.webapp.beans.VClass; import edu.cornell.mannlib.vitro.webapp.dao.VClassDao; import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary; import edu.cornell.mannlib.vitro.webapp.filestorage.model.ImageInfo; +import edu.cornell.mannlib.vitro.webapp.search.beans.ProhibitedFromSearch; import edu.cornell.mannlib.vitro.webapp.utils.FlagMathUtils; public class IndividualJena extends IndividualImpl implements Individual { @@ -820,6 +822,30 @@ public class IndividualJena extends IndividualImpl implements Individual { } return false; } + + @Override + public boolean isMemberOfClassProhibitedFromSearch(ProhibitedFromSearch pfs) { + ind.getModel().enterCriticalSection(Lock.READ); + try { + StmtIterator stmtIt = ind.listProperties(RDF.type); + try { + while(stmtIt.hasNext()) { + Statement stmt = stmtIt.nextStatement(); + if (stmt.getObject().isURIResource()) { + String typeURI = ((Resource)stmt.getObject()).getURI(); + if (pfs.isClassProhibited(typeURI)) { + return false; + } + } + } + } finally { + stmtIt.close(); + } + return false; + } finally { + ind.getModel().leaveCriticalSection(); + } + } /** * Overriding the base method so that we can do the sorting by arbitrary property here. An diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyDaoJena.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyDaoJena.java index 27977c767..60ebad4d7 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyDaoJena.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyDaoJena.java @@ -410,7 +410,7 @@ public class ObjectPropertyDaoJena extends PropertyDaoJena implements ObjectProp p.setInverseOf(inv); } } catch (Exception e) { - System.out.println("Couldn't set "+prop.getURIInverse()+" as inverse"); + log.debug("Couldn't set "+prop.getURIInverse()+" as inverse"); // BJL: What we really want to do here is create a new property as inverse } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/VClassDaoJena.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/VClassDaoJena.java index 931786f97..4695321ea 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/VClassDaoJena.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/VClassDaoJena.java @@ -768,7 +768,7 @@ public class VClassDaoJena extends JenaBaseDao implements VClassDao { @Deprecated public void addVClassesToGroup(VClassGroup group, boolean includeUninstantiatedClasses) { - addVClassesToGroup(group, includeUninstantiatedClasses, true); + addVClassesToGroup(group, includeUninstantiatedClasses, false); } @Deprecated diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/SelectListGenerator.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/SelectListGenerator.java index 2164062e3..b2581250b 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/SelectListGenerator.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/SelectListGenerator.java @@ -172,15 +172,17 @@ public class SelectListGenerator { if( vclasses.size() == 0 ) log.error("no owl:Class found for predicate " + predicateUri ); - HashMap indMap = new HashMap(); + List individuals = new ArrayList(); + HashSet uriSet = new HashSet(); + long startTime = System.currentTimeMillis(); for ( VClass vclass : vclasses){ for( Individual ind : wDaoFact.getIndividualDao().getIndividualsByVClassURI(vclass.getURI(),-1,-1)) { - if( !indMap.containsKey(ind.getURI())) { - indMap.put(ind.getURI(),ind); + if( !uriSet.contains(ind.getURI())) { + uriSet.add(ind.getURI()); + individuals.add(ind); } } } - List individuals = new ArrayList(indMap.values()); List stmts = subject.getObjectPropertyStatements(); if( stmts == null ) log.error("object properties for subject were null in SelectListGenerator.getOptions()"); @@ -192,24 +194,12 @@ public class SelectListGenerator { for( Individual ind : individuals ){ String uri = ind.getURI(); - if( uri != null ){ - boolean prohibited = false; - if (pfs != null) { - for (VClass vc : ind.getVClasses()) { - if (vc.getURI() != null) { - if (pfs.isClassProhibited(ind.getVClassURI())) { - prohibited = true; - break; - } - } - } - } - if (!prohibited) { - optionsMap.put(uri,ind.getName().trim()); - ++optionsCount; - } + if( uri != null && (pfs == null || !ind.isMemberOfClassProhibitedFromSearch(pfs)) ){ + optionsMap.put(uri,ind.getName().trim()); + ++optionsCount; } } + } } break; @@ -292,23 +282,9 @@ public class SelectListGenerator { ProhibitedFromSearch pfs = editConfig.getProhibitedFromSearch(); for( Individual ind : individuals ) { String uri = ind.getURI(); - if( uri != null ) { - boolean prohibited = false; - if (pfs != null) { - for (VClass vc : ind.getVClasses()) { - if (vc.getURI() != null) { - if (pfs.isClassProhibited(ind.getVClassURI())) { - prohibited = true; - break; - } - - } - } - } - if(!prohibited) { - optionsMap.put(uri,ind.getName().trim()); - ++optionsCount; - } + if( uri != null && (pfs == null || !ind.isMemberOfClassProhibitedFromSearch(pfs)) ) { + optionsMap.put(uri,ind.getName().trim()); + ++optionsCount; } } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/MiscWebUtils.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/MiscWebUtils.java index 0c3e8b10d..21ef4e6b4 100755 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/MiscWebUtils.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/MiscWebUtils.java @@ -80,8 +80,7 @@ public class MiscWebUtils { return (String) contentObj; } - public static String getCustomShortView(HttpServletRequest request) { - + public static String getCustomShortView(HttpServletRequest request) { Individual object = ((ObjectPropertyStatement) request .getAttribute("opStmt")).getObject(); return getCustomShortView(object, request); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/jsptags/InputElementFormattingTag.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/jsptags/InputElementFormattingTag.java index 98b35e0de..3d06814ac 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/jsptags/InputElementFormattingTag.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/jsptags/InputElementFormattingTag.java @@ -481,7 +481,10 @@ public class InputElementFormattingTag extends TagSupport { } else if( getType().equalsIgnoreCase("select")) { String valueStr = doValue(editConfig, editSub); //String sizeStr = getSize(); //"style=\"width:"+getSize()+"%;\""; - Map optionsMap = SelectListGenerator.getOptions(editConfig,getName(), wdf); + Map optionsMap = (Map) pageContext.getRequest().getAttribute("rangeOptions." + getId()); + if (optionsMap == null) { + optionsMap = SelectListGenerator.getOptions(editConfig,getName(), wdf); + } if (optionsMap==null){ log.error("Error in InputElementFormattingTag.doStartTag(): null optionsMap returned from getOptions()"); } @@ -515,7 +518,10 @@ public class InputElementFormattingTag extends TagSupport { } else if( getType().equalsIgnoreCase("checkbox")) { String valueStr = doValue(editConfig, editSub); if (definitionTags) { out.print("
"); } - Map optionsMap = SelectListGenerator.getOptions(editConfig,getName(),wdf); + Map optionsMap = (Map) pageContext.getRequest().getAttribute("rangeOptions." + getId()); + if (optionsMap == null) { + optionsMap = SelectListGenerator.getOptions(editConfig,getName(),wdf); + } if (optionsMap==null){ log.error("Error in InputElementFormattingTag.doStartTag(): null optionsMap returned from getOptions()"); } @@ -534,7 +540,10 @@ public class InputElementFormattingTag extends TagSupport { } else if( getType().equalsIgnoreCase("radio")) { String valueStr = doValue(editConfig, editSub); if (definitionTags) { out.print("
"); } - Map optionsMap = SelectListGenerator.getOptions(editConfig,getName(),wdf); + Map optionsMap = (Map) pageContext.getRequest().getAttribute("rangeOptions." + getId()); + if (optionsMap == null) { + optionsMap = SelectListGenerator.getOptions(editConfig,getName(),wdf); + } if (optionsMap==null){ log.error("Error in InputElementFormattingTag.doStartTag(): null optionsMap returned from getOptions()"); } diff --git a/webapp/web/edit/forms/defaultObjPropForm.jsp b/webapp/web/edit/forms/defaultObjPropForm.jsp index 14b8b5345..62ae719e5 100644 --- a/webapp/web/edit/forms/defaultObjPropForm.jsp +++ b/webapp/web/edit/forms/defaultObjPropForm.jsp @@ -24,7 +24,10 @@ %> <%@page import="edu.cornell.mannlib.vitro.webapp.edit.n3editing.SelectListGenerator"%> -<%@page import="java.util.Map"%> +<%@page import="java.util.Map"%> +<%@page import="com.hp.hpl.jena.ontology.OntModel"%> +<%@page import="edu.cornell.mannlib.vitro.webapp.search.beans.ProhibitedFromSearch"%> +<%@page import="edu.cornell.mannlib.vitro.webapp.web.DisplayVocabulary"%> PREFIX owl: SELECT ?inverse_property WHERE { @@ -131,11 +134,24 @@ } if( prop.getSelectFromExisting() ){ + // set ProhibitedFromSearch object so picklist doesn't show + // individuals from classes that should be hidden from list views + OntModel displayOntModel = + (OntModel) pageContext.getServletContext() + .getAttribute("displayOntModel"); + if (displayOntModel != null) { + ProhibitedFromSearch pfs = new ProhibitedFromSearch( + DisplayVocabulary.PRIMARY_LUCENE_INDEX_URI, displayOntModel); + if( editConfig != null ) + editConfig.setProhibitedFromSearch(pfs); + } Map rangeOptions = SelectListGenerator.getOptions(editConfig, "objectVar" , wdf); - if( rangeOptions != null && rangeOptions.size() > 0 ) + if( rangeOptions != null && rangeOptions.size() > 0 ) { request.setAttribute("rangeOptionsExist", true); - else + request.setAttribute("rangeOptions.objectVar", rangeOptions); + } else { request.setAttribute("rangeOptionsExist",false); + } } %> @@ -150,7 +166,7 @@
- +