diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/DataPropertyDaoJena.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/DataPropertyDaoJena.java index 996e68710..ce01884eb 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/DataPropertyDaoJena.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/DataPropertyDaoJena.java @@ -27,6 +27,7 @@ import com.hp.hpl.jena.ontology.SomeValuesFromRestriction; import com.hp.hpl.jena.query.Query; import com.hp.hpl.jena.query.QueryFactory; import com.hp.hpl.jena.query.QuerySolution; +import com.hp.hpl.jena.query.ResultSet; import com.hp.hpl.jena.rdf.model.Property; import com.hp.hpl.jena.rdf.model.RDFNode; import com.hp.hpl.jena.rdf.model.Resource; @@ -783,7 +784,7 @@ public class DataPropertyDaoJena extends PropertyDaoJena implements } log.debug("Data property query string:\n" + query); - Iterator results = getPropertyQueryResults(query); + ResultSet results = getPropertyQueryResults(query); List properties = new ArrayList(); while (results.hasNext()) { QuerySolution sol = results.next(); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/DataPropertyStatementDaoJena.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/DataPropertyStatementDaoJena.java index b11f46cc4..a688c9820 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/DataPropertyStatementDaoJena.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/DataPropertyStatementDaoJena.java @@ -338,8 +338,9 @@ public class DataPropertyStatementDaoJena extends JenaBaseDao implements DataPro DatasetWrapper w = dwf.getDatasetWrapper(); Dataset dataset = w.getDataset(); dataset.getLock().enterCriticalSection(Lock.READ); + QueryExecution qexec = null; try { - QueryExecution qexec = QueryExecutionFactory.create( + qexec = QueryExecutionFactory.create( queryString, dataset); ResultSet results = qexec.execSelect(); @@ -351,6 +352,9 @@ public class DataPropertyStatementDaoJena extends JenaBaseDao implements DataPro } finally { dataset.getLock().leaveCriticalSection(); w.close(); + if (qexec != null) { + qexec.close(); + } } return values; } 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 ad8b6aa6e..5e274775e 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 @@ -871,7 +871,7 @@ public class ObjectPropertyDaoJena extends PropertyDaoJena implements ObjectProp } log.debug("Object property query:\n" + query); - Iterator results = getPropertyQueryResults(query); + ResultSet results = getPropertyQueryResults(query); List properties = new ArrayList(); while (results.hasNext()) { QuerySolution soln = results.next(); @@ -916,7 +916,8 @@ public class ObjectPropertyDaoJena extends PropertyDaoJena implements ObjectProp ObjectProperty prop = getObjectPropertyByURI(soln.getResource("property").getURI()); String filename = soln.getLiteral("filename").getLexicalForm(); customListViewConfigFileMap.put(prop, filename); - } + } + qexec.close(); } return customListViewConfigFileMap.get(op); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyStatementDaoJena.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyStatementDaoJena.java index f35522620..e4bcdedcd 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyStatementDaoJena.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyStatementDaoJena.java @@ -302,9 +302,10 @@ public class ObjectPropertyStatementDaoJena extends JenaBaseDao implements Objec DatasetWrapper w = dwf.getDatasetWrapper(); Dataset dataset = w.getDataset(); dataset.getLock().enterCriticalSection(Lock.READ); + QueryExecution qexec = null; try { - QueryExecution qexec = (constructedModel == null) + qexec = (constructedModel == null) ? QueryExecutionFactory.create( query, dataset, initialBindings) : QueryExecutionFactory.create( @@ -323,6 +324,9 @@ public class ObjectPropertyStatementDaoJena extends JenaBaseDao implements Objec } finally { dataset.getLock().leaveCriticalSection(); w.close(); + if (qexec != null) { + qexec.close(); + } } return list; } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/PropertyDaoJena.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/PropertyDaoJena.java index 5be1a58dd..737778619 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/PropertyDaoJena.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/PropertyDaoJena.java @@ -20,15 +20,13 @@ import com.hp.hpl.jena.query.Dataset; import com.hp.hpl.jena.query.Query; import com.hp.hpl.jena.query.QueryExecution; import com.hp.hpl.jena.query.QueryExecutionFactory; -import com.hp.hpl.jena.query.QuerySolution; -import com.hp.hpl.jena.query.QuerySolutionMap; import com.hp.hpl.jena.query.ResultSet; 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.Statement; import com.hp.hpl.jena.rdf.model.StmtIterator; import com.hp.hpl.jena.shared.Lock; +import com.hp.hpl.jena.sparql.resultset.ResultSetMem; import com.hp.hpl.jena.vocabulary.OWL; import com.hp.hpl.jena.vocabulary.RDFS; @@ -404,7 +402,7 @@ public class PropertyDaoJena extends JenaBaseDao implements PropertyDao { return classSet; } - protected Iterator getPropertyQueryResults(Query query) { + protected ResultSet getPropertyQueryResults(Query query) { log.debug("SPARQL query:\n" + query.toString()); // RY Removing prebinding due to Jena bug: when isLiteral(?object) or @@ -417,17 +415,12 @@ public class PropertyDaoJena extends JenaBaseDao implements PropertyDao { DatasetWrapper w = dwf.getDatasetWrapper(); Dataset dataset = w.getDataset(); dataset.getLock().enterCriticalSection(Lock.READ); + ResultSet rs = null; try { QueryExecution qexec = QueryExecutionFactory.create( query, dataset); //, subjectBinding); try { - ResultSet rs = qexec.execSelect(); - // consume iterator before wrapper w is closed in finally block - List results = new ArrayList(); - while (rs.hasNext()) { - results.add(rs.next()); - } - return results.iterator(); + rs = new ResultSetMem(qexec.execSelect()); } finally { qexec.close(); } @@ -435,6 +428,7 @@ public class PropertyDaoJena extends JenaBaseDao implements PropertyDao { dataset.getLock().leaveCriticalSection(); w.close(); } + return rs; } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/QueryUtils.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/QueryUtils.java index 188f1314f..58643a080 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/QueryUtils.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/QueryUtils.java @@ -18,6 +18,7 @@ import com.hp.hpl.jena.rdf.model.Literal; import com.hp.hpl.jena.rdf.model.RDFNode; import com.hp.hpl.jena.rdf.model.Resource; import com.hp.hpl.jena.shared.Lock; +import com.hp.hpl.jena.sparql.resultset.ResultSetMem; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; @@ -30,6 +31,8 @@ public class QueryUtils { private static final Log log = LogFactory.getLog(QueryUtils.class); + private QueryUtils() { } + protected static Map querySolutionToObjectValueMap( QuerySolution soln){ Map map = new HashMap(); Iterator varNames = soln.varNames(); @@ -110,12 +113,11 @@ public class QueryUtils { Dataset dataset = vreq.getDataset(); dataset.getLock().enterCriticalSection(Lock.READ); -queryStr = " SELECT ?x WHERE { ?x ?p ?y } LIMIT 10"; QueryExecution qexec = null; ResultSet results = null; try { qexec = QueryExecutionFactory.create(queryStr, dataset); - results = qexec.execSelect(); + results = new ResultSetMem(qexec.execSelect()); } catch (Exception e) { log.error(e, e); } finally { @@ -124,32 +126,8 @@ queryStr = " SELECT ?x WHERE { ?x ?p ?y } LIMIT 10"; qexec.close(); } } - try { - /* DEBUGGING */ - int maxRank = 0; - if (results.hasNext()) { // there is at most one result - log.debug("found a rank"); - QuerySolution soln = results.next(); - RDFNode node = soln.get("rank"); - if (node != null && node.isLiteral()) { - log.debug("node value =" + node.asLiteral().getLexicalForm()); - try { - int rank = node.asLiteral().getInt(); - if (rank > maxRank) { - log.debug("setting maxRank to " + rank); - maxRank = rank; - } - } catch (Exception e) { - log.error("Error getting int value for rank: " + e.getMessage()); - } - } - } - } catch (Exception e) { - log.error(e, e); - } return results; } - } diff --git a/webapp/web/edit/forms/addMissingWithMonikerAndLink.jsp b/webapp/web/edit/forms/addMissingWithMonikerAndLink.jsp deleted file mode 100644 index 1e669fee5..000000000 --- a/webapp/web/edit/forms/addMissingWithMonikerAndLink.jsp +++ /dev/null @@ -1,264 +0,0 @@ -<%-- $This file is distributed under the terms of the license in /doc/license.txt$ --%> - -<%@ page import="edu.cornell.mannlib.vitro.webapp.controller.VitroRequest" %> -<%@ page import="edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory" %> -<%@ page import="edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty" %> -<%@ page import="edu.cornell.mannlib.vitro.webapp.beans.VClass" %> -<%@ page import="com.hp.hpl.jena.rdf.model.Literal" %> -<%@ page import="com.hp.hpl.jena.rdf.model.Model" %> -<%@ page import="edu.cornell.mannlib.vitro.webapp.beans.Individual" %> -<%@ page import="edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.EditConfiguration" %> -<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> -<%@ taglib prefix="v" uri="http://vitro.mannlib.cornell.edu/vitro/tags" %> -<% - Individual subject = (Individual)request.getAttribute("subject"); - ObjectProperty prop = (ObjectProperty)request.getAttribute("predicate"); - if (prop == null) throw new Error("no object property specified via incoming predicate attribute in defaultAddMissingIndividualForm.jsp"); - String propDomainPublic = (prop.getDomainPublic() == null) ? "affiliation" : prop.getDomainPublic(); - - VitroRequest vreq = new VitroRequest(request); - //String contextPath = vreq.getContextPath(); - WebappDaoFactory wdf = vreq.getWebappDaoFactory(); - if( prop.getRangeVClassURI() == null )throw new Error("Property has null for its range class URI"); - - VClass rangeClass = wdf.getVClassDao().getVClassByURI(prop.getRangeVClassURI()); - if( rangeClass == null ) throw new Error ("Cannot find class for range for property. Looking for " + prop.getRangeVClassURI() ); - //vreq.setAttribute("rangeClassLocalName",rangeClass.getLocalName()); - //vreq.setAttribute("rangeClassNamespace",rangeClass.getNamespace()); - vreq.setAttribute("rangeClassUri",prop.getRangeVClassURI()); - vreq.setAttribute("curatorReviewUri","http://vivo.library.cornell.edu/ns/0.1#CuratorReview"); - -%> - - - PREFIX owl: - SELECT ?inverse_property - WHERE { ?inverse_property owl:inverseOf ?predicate } - - -<%-- Enter here the class names to be used for constructing MONIKERS_VIA_VCLASS pick lists - These are then referenced in the field's ObjectClassUri but not elsewhere. - Note that you can't reference a jsonset variable inside another jsonset expression - or you get double escaping problems --%> -${rangeClassUri} - -<%-- Then enter a SPARQL query for each field, by convention concatenating the field id with "Existing" - to convey that the expression is used to retrieve any existing value for the field in an existing individual. - Each of these must then be referenced in the sparqlForExistingLiterals section of the JSON block below - and in the literalsOnForm --%> - - PREFIX rdfs: - SELECT ?existingName - WHERE { ?newIndividual rdfs:label ?existingName } - -<%-- Pair the "existing" query with the skeleton of what will be asserted for a new statement involving this field. - the actual assertion inserted in the model will be created via string substitution into the ? variables. - NOTE the pattern of punctuation (a period after the prefix URI and after the ?field) --%> - - @prefix vivo: . - ?newIndividual rdfs:label ?name . - - - - PREFIX rdfs: - SELECT ?existingMoniker - WHERE { ?newIndividual vitro:moniker ?existingMoniker } - - - @prefix vivo: . - ?newIndividual vitro:moniker ?moniker . - - - - PREFIX vitro: - SELECT ?existingLinkUrl - WHERE { ?newIndividual vitro:primaryLink ?newLink ; - ?newLink vitro:linkURL ?existingLinkUrl . - } - - - @prefix vitro: . - ?newLink vitro:linkURL ?linkUrl . - - - - @prefix rdf: . - @prefix rdfs: . - @prefix vivo: . - @prefix vitro: . - - ?newIndividual rdf:type <${curatorReviewUri}> . - ?newIndividual rdf:type <${rangeClassUri}> . - ?subject ?predicate ?newIndividual . - - ?newIndividual rdfs:label ?name . - - - - ?newIndividual ?inverseProp ?subject . - - -<%-- make sure you have all the @prefix entries to cover the statements in each block --%> - - @prefix vitro: . - ?newIndividual vitro:moniker ?moniker . - - -<%-- note that it's safer to have multiple distinct optional blocks so that a failure in one - will not prevent correct sections from being inserted --%> - - @prefix rdf: . - @prefix vitro: . - ?newLink - rdf:type vitro:Link ; - vitro:linkURL ?linkUrl ; - vitro:linkAnchor ?name ; - vitro:linkDisplayRank "1" . - - ?newIndividual vitro:primaryLink ?newLink . - - - - - { - "formUrl" : "${formUrl}", - "editKey" : "${editKey}", - "urlPatternToReturnTo" : "/entity", - - "subject" : [ "subject", "${subjectUriJson}" ], - "predicate" : [ "predicate", "${predicateUriJson}" ], - "object" : [ "newIndividual", "${objectUriJson}", "URI" ], - - "n3required" : [ "${n3ForEdit}" ], - "n3optional" : [ "${n3optional}", "${n3Inverse}", "${n3link}" ], - "newResources" : { - "newIndividual" : "http://vivo.library.cornell.edu/ns/0.1#individual", - "newLink" : "http://vitro.mannlib.cornell.edu/ns/vitro/0.7#Link" - }, - "urisInScope" : { }, - "literalsInScope" : { }, - "urisOnForm" : [ ], - "literalsOnForm" : [ "name","moniker","linkUrl" ], - "filesOnForm" : [ ], - "sparqlForLiterals" : { }, - "sparqlForUris" : { "inverseProp" : "${queryForInverse}" }, - "sparqlForExistingLiterals" : { - "name" : "${nameExisting}", - "moniker" : "${monikerExisting}", - "linkUrl" : "${linkUrlExisting}" - }, - "sparqlForExistingUris" : { }, - "fields" : { - "name" : { - "newResource" : "false", - "validators" : [ "nonempty" ], - "optionsType" : "UNDEFINED", - "literalOptions" : [ ], - "predicateUri" : "", - "objectClassUri" : "", - "rangeDatatypeUri" : "", - "rangeLang" : "", - "assertions" : [ "${nameAssertion}" ] - }, - "moniker" : { - "newResource" : "false", - "validators" : [ ], - "optionsType" : "MONIKERS_VIA_VCLASS", - "literalOptions" : [ ], - "predicateUri" : "", - "objectClassUri" : "${newIndividualVClassUri}", - "rangeDatatypeUri" : "", - "rangeLang" : "", - "assertions" : [ "${monikerAssertion}" ] - }, - "linkUrl" : { - "newResource" : "false", - "validators" : [], - "optionsType" : "UNDEFINED", - "literalOptions" : [], - "predicateUri" : "", - "objectClassUri" : "", - "rangeDatatypeUri" : "", - "rangeLang" : "", - "assertions" : [ "${linkUrlAssertion}" ] - } - } - } - -<% - EditConfiguration editConfig = EditConfiguration.getConfigFromSession(session,request); - if( editConfig == null ){ - editConfig = new EditConfiguration((String)request.getAttribute("editjson")); - EditConfiguration.putConfigInSession(editConfig, session); - } - - Model model = (Model)application.getAttribute("jenaOntModel"); - String objectUri = (String)request.getAttribute("objectUri"); - if( objectUri != null ){ - editConfig.prepareForObjPropUpdate(model); - }else{ - editConfig.prepareForNonUpdate(model); - } - - String submitButtonLabel=""; // don't put local variables into the request - /* title is used by pre and post form fragments */ - //set title to Edit to maintain functionality from 1.1.1 and avoid updates to Selenium tests - request.setAttribute("title", "Edit"); - if (objectUri != null) { - request.setAttribute("formTitle", "Edit \""+propDomainPublic+"\" entry for " + subject.getName()); - submitButtonLabel = "Save changes"; - } else { - request.setAttribute("formTitle","Create \""+propDomainPublic+"\" entry for " + subject.getName()); - submitButtonLabel = "Create \""+propDomainPublic+"\" entry"; - } - -%> - - - - - - - - -

${formTitle}

-
" > - -
- start typing to see existing choices, or add a new label - - - - -