From 68d1129114f0eec6be3112f3749ae59144c6fe6b Mon Sep 17 00:00:00 2001 From: tworrall Date: Fri, 8 Nov 2013 17:13:07 -0500 Subject: [PATCH 01/40] VIVO-514 --- .../freemarker/edit/forms/autoCompleteObjectPropForm.ftl | 4 ++-- .../freemarker/edit/forms/defaultDeletePropertyForm.ftl | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/webapp/web/templates/freemarker/edit/forms/autoCompleteObjectPropForm.ftl b/webapp/web/templates/freemarker/edit/forms/autoCompleteObjectPropForm.ftl index bb2253cae..a9a74c0a1 100644 --- a/webapp/web/templates/freemarker/edit/forms/autoCompleteObjectPropForm.ftl +++ b/webapp/web/templates/freemarker/edit/forms/autoCompleteObjectPropForm.ftl @@ -9,7 +9,7 @@ --> <#assign rangeOptionsExist = true /> - +<#assign rangeVClassURI = editConfiguration.objectPredicateProperty.rangeVClassURI!"" /> <#assign objectTypes = editConfiguration.pageData.objectTypes /> <#assign objectTypesSize = objectTypes?length /> <#assign objectTypesExist = false /> @@ -40,7 +40,7 @@ <#assign formTitle = editConfiguration.formTitle /> <#if editConfiguration.formTitle?contains("collaborator") > <#assign formTitle = "${i18n().select_existing_collaborator(editConfiguration.subjectName)}" /> -<#elseif editConfiguration.objectPredicateProperty.rangeVClassURI?contains("IAO_0000030")> +<#elseif rangeVClassURI?contains("IAO_0000030")> <#assign formTitle = "${i18n().select_an_existing_document}" + " ${i18n().for} " + editConfiguration.subjectName/> <#--In order to fill out the subject--> diff --git a/webapp/web/templates/freemarker/edit/forms/defaultDeletePropertyForm.ftl b/webapp/web/templates/freemarker/edit/forms/defaultDeletePropertyForm.ftl index 489e07a8e..85c4a96c5 100644 --- a/webapp/web/templates/freemarker/edit/forms/defaultDeletePropertyForm.ftl +++ b/webapp/web/templates/freemarker/edit/forms/defaultDeletePropertyForm.ftl @@ -7,8 +7,8 @@ - - + + <#if editConfiguration.dataProperty = true> From 5af822f7ab2caca28a8405ac1eb348a85179b96b Mon Sep 17 00:00:00 2001 From: j2blake Date: Wed, 6 Nov 2013 15:57:21 -0500 Subject: [PATCH 02/40] VIVO-469 print progress messages while looking for URIs to re-index. --- .../webapp/search/indexing/IndexBuilder.java | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/IndexBuilder.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/IndexBuilder.java index 0d7fea706..69e2ba3ee 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/IndexBuilder.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/IndexBuilder.java @@ -281,11 +281,24 @@ public class IndexBuilder extends VitroBackgroundThread { //keep uris unique by using a HashSet Collection urisToUpdate = new HashSet(); - for( Statement stmt : getAndClearChangedStmts() ){ - for( StatementToURIsToUpdate stu : stmtToURIsToIndexFunctions ){ - urisToUpdate.addAll( stu.findAdditionalURIsToIndex(stmt) ); - } - } + Statement[] changedStatements = getAndClearChangedStmts(); + int howManyChanges = changedStatements.length; + + if (howManyChanges > 100) { + log.info("Finding URIs that are affected by " + howManyChanges + + " changed statements."); + } + + for (int i = 0; i < howManyChanges; i++) { + Statement stmt = changedStatements[i]; + for (StatementToURIsToUpdate stu : stmtToURIsToIndexFunctions) { + urisToUpdate.addAll(stu.findAdditionalURIsToIndex(stmt)); + } + if ((i > 0) && (i % 1000 == 0)) { + log.info("Processed " + i + " changed statements; found " + + urisToUpdate.size() + " affected URIs."); + } + } //inform StatementToURIsToUpdate that they are done for( StatementToURIsToUpdate stu : stmtToURIsToIndexFunctions ) { From 5d19e746e111ecb5e19758ff7b5b204c54635fba Mon Sep 17 00:00:00 2001 From: j2blake Date: Thu, 7 Nov 2013 12:36:05 -0500 Subject: [PATCH 03/40] VIVO-469 run the URL Finders from an RDFService, not an OntModel --- .../vitro/webapp/dao/jena/QueryUtils.java | 41 ++++++++++- .../AdditionalURIsForObjectProperties.java | 69 ++++++++----------- .../search/indexing/AdditionalUriFinders.java | 7 +- .../vitro/webapp/search/solr/SolrSetup.java | 4 +- .../vitro/webapp/dao/jena/QueryUtilsTest.java | 65 +++++++++++++++++ ...AdditionalURIsForObjectPropertiesTest.java | 16 +++-- 6 files changed, 149 insertions(+), 53 deletions(-) create mode 100644 webapp/test/edu/cornell/mannlib/vitro/webapp/dao/jena/QueryUtilsTest.java 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 f2c686657..c056a28ec 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 @@ -6,6 +6,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.Map; +import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -116,7 +117,11 @@ public class QueryUtils { return getQueryResults(queryStr, vreq.getRDFService()); } - public static ResultSet getLanguageNeutralQueryResults(String queryStr, VitroRequest vreq) { + public static ResultSet getQueryResults(String queryStr, QuerySolution initialBindings, RDFService rdfService) { + return getQueryResults(bindVariables(queryStr, initialBindings), rdfService); + } + + public static ResultSet getLanguageNeutralQueryResults(String queryStr, VitroRequest vreq) { return getQueryResults(queryStr, vreq.getUnfilteredRDFService()); } @@ -130,4 +135,38 @@ public class QueryUtils { } } + /** + * The RDFService interface doesn't support initial bindings, so do text + * substitutions instead. + */ + public static String bindVariables(String queryStr, + QuerySolution initialBindings) { + String bound = queryStr; + for (Iterator it = initialBindings.varNames(); it.hasNext();) { + String name = it.next(); + RDFNode node = initialBindings.get(name); + if (node.isLiteral()) { + bound = bound.replace('?' + name, literalToString(node.asLiteral())); + } else if (node.isURIResource()) { + bound = bound.replace('?' + name, '<'+node.asResource().getURI()+ '>'); + }else { + log.warn("Failed to bind anonymous resource variable '" + name + + "' to query '" + bound + "'"); + } + } + return bound; + } + + private static String literalToString(Literal l) { + StringBuilder buffer = new StringBuilder(); + buffer.append('"').append(l.getLexicalForm()).append('"'); + if (l.getDatatypeURI() != null) { + buffer.append("^^<").append(l.getDatatypeURI()).append(">"); + } else if (StringUtils.isNotEmpty(l.getLanguage())) { + buffer.append("@").append(l.getLanguage()); + } + return buffer.toString(); + } + + } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalURIsForObjectProperties.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalURIsForObjectProperties.java index ba6d6d1e8..38fdf1ea7 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalURIsForObjectProperties.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalURIsForObjectProperties.java @@ -10,22 +10,17 @@ import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -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.QueryFactory; 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.query.Syntax; -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.rdf.model.Statement; -import com.hp.hpl.jena.shared.Lock; import com.hp.hpl.jena.vocabulary.RDFS; +import edu.cornell.mannlib.vitro.webapp.dao.jena.QueryUtils; +import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService; import edu.cornell.mannlib.vitro.webapp.search.beans.StatementToURIsToUpdate; /** @@ -38,13 +33,13 @@ import edu.cornell.mannlib.vitro.webapp.search.beans.StatementToURIsToUpdate; public class AdditionalURIsForObjectProperties implements StatementToURIsToUpdate { protected static final Log log = LogFactory.getLog(AdditionalURIsForObjectProperties.class); - protected Model model; + protected final RDFService rdfService; - public AdditionalURIsForObjectProperties( Model model){ - this.model = model; - } - - @Override + public AdditionalURIsForObjectProperties(RDFService rdfService) { + this.rdfService = rdfService; + } + + @Override public List findAdditionalURIsToIndex(Statement stmt) { if( stmt == null ) return Collections.emptyList(); @@ -102,37 +97,27 @@ public class AdditionalURIsForObjectProperties implements StatementToURIsToUpdat Resource uriResource = ResourceFactory.createResource(uri); initialBinding.add("uri", uriResource); - Query sparqlQuery = QueryFactory.create( QUERY_FOR_RELATED ); - model.getLock().enterCriticalSection(Lock.READ); - try{ - QueryExecution qExec = QueryExecutionFactory.create(sparqlQuery, model, initialBinding); - try{ - ResultSet results = qExec.execSelect(); - while(results.hasNext()){ - QuerySolution soln = results.nextSolution(); - Iterator iter = soln.varNames() ; - while( iter.hasNext()){ - String name = iter.next(); - RDFNode node = soln.get( name ); - if( node != null ){ - if( node.isURIResource() ){ - additionalUris.add( node.as( Resource.class ).getURI() ); - }else{ - log.warn( "value from query for var " + name + " was not a URIResource, it was " + node); - } - }else{ - log.warn("value for query for var " + name + " was null"); - } + ResultSet results = QueryUtils.getQueryResults(QUERY_FOR_RELATED, + initialBinding, rdfService); + + while(results.hasNext()){ + QuerySolution soln = results.nextSolution(); + Iterator iter = soln.varNames() ; + while( iter.hasNext()){ + String name = iter.next(); + RDFNode node = soln.get( name ); + if( node != null ){ + if( node.isURIResource() ){ + additionalUris.add( node.as( Resource.class ).getURI() ); + }else{ + log.warn( "value from query for var " + name + " was not a URIResource, it was " + node); } - } - }catch(Throwable t){ - log.error(t,t); - } finally{ - qExec.close(); - } - }finally{ - model.getLock().leaveCriticalSection(); + }else{ + log.warn("value for query for var " + name + " was null"); + } + } } + return additionalUris; } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalUriFinders.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalUriFinders.java index 498d74334..4758de021 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalUriFinders.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalUriFinders.java @@ -5,9 +5,8 @@ package edu.cornell.mannlib.vitro.webapp.search.indexing; import java.util.ArrayList; import java.util.List; -import com.hp.hpl.jena.ontology.OntModel; - import edu.cornell.mannlib.vitro.webapp.dao.IndividualDao; +import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService; import edu.cornell.mannlib.vitro.webapp.search.beans.StatementToURIsToUpdate; /** @@ -16,12 +15,12 @@ import edu.cornell.mannlib.vitro.webapp.search.beans.StatementToURIsToUpdate; */ public class AdditionalUriFinders { - public static List getList(OntModel jenaOntModel, + public static List getList(RDFService rdfService, IndividualDao indDao) { // TODO How many of these are only relevant to VIVO? List uriFinders = new ArrayList<>(); uriFinders.add(new AdditionalURIsForDataProperties()); - uriFinders.add(new AdditionalURIsForObjectProperties(jenaOntModel)); + uriFinders.add(new AdditionalURIsForObjectProperties(rdfService)); uriFinders.add(new AdditionalURIsForTypeStatements()); uriFinders.add(new URIsForClassGroupChange(indDao)); return uriFinders; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/solr/SolrSetup.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/solr/SolrSetup.java index 04ae6971d..883418cee 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/solr/SolrSetup.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/solr/SolrSetup.java @@ -23,6 +23,7 @@ import edu.cornell.mannlib.vitro.webapp.dao.filtering.WebappDaoFactoryFiltering; import edu.cornell.mannlib.vitro.webapp.dao.filtering.filters.VitroFilterUtils; import edu.cornell.mannlib.vitro.webapp.dao.filtering.filters.VitroFilters; import edu.cornell.mannlib.vitro.webapp.dao.jena.ModelContext; +import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService; import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceFactory; import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils; import edu.cornell.mannlib.vitro.webapp.search.beans.StatementToURIsToUpdate; @@ -133,7 +134,8 @@ public class SolrSetup implements javax.servlet.ServletContextListener{ wadf = new WebappDaoFactoryFiltering(wadf, vf); // make objects that will find additional URIs for context nodes etc - List uriFinders = AdditionalUriFinders.getList(jenaOntModel,wadf.getIndividualDao()); + RDFService rdfService = RDFServiceUtils.getRDFServiceFactory(context).getRDFService(); + List uriFinders = AdditionalUriFinders.getList(rdfService,wadf.getIndividualDao()); // Make the IndexBuilder IndexBuilder builder = new IndexBuilder( solrIndexer, wadf, uriFinders ); diff --git a/webapp/test/edu/cornell/mannlib/vitro/webapp/dao/jena/QueryUtilsTest.java b/webapp/test/edu/cornell/mannlib/vitro/webapp/dao/jena/QueryUtilsTest.java new file mode 100644 index 000000000..837c5cf50 --- /dev/null +++ b/webapp/test/edu/cornell/mannlib/vitro/webapp/dao/jena/QueryUtilsTest.java @@ -0,0 +1,65 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.dao.jena; + +import static org.junit.Assert.*; + +import org.junit.Ignore; +import org.junit.Test; + +import com.hp.hpl.jena.query.QuerySolutionMap; +import com.hp.hpl.jena.rdf.model.Literal; +import com.hp.hpl.jena.rdf.model.ModelFactory; +import com.hp.hpl.jena.rdf.model.ResourceFactory; + +import edu.cornell.mannlib.vitro.testing.AbstractTestClass; + +/** + * TODO + */ +public class QueryUtilsTest extends AbstractTestClass { + private QuerySolutionMap bindings = new QuerySolutionMap(); + + @Test + public void bindResource() { + bindings.add("uri", ResourceFactory.createResource("http://my.uri")); + assertBoundQueryEquals("a resource ?uri", "a resource "); + } + + @Test + public void bindPlainLiteral() { + bindings.add("plain", ResourceFactory.createPlainLiteral("too easy")); + assertBoundQueryEquals("This is ?plain ?plain", + "This is \"too easy\" \"too easy\""); + } + + @Test + public void bindTypedLiteral() { + bindings.add("typed", ResourceFactory.createTypedLiteral(100L)); + assertBoundQueryEquals("take this ?typed number", + "take this \"100\"^^ number"); + } + + @Test + public void bindLanguageLiteral() { + Literal l = ModelFactory.createDefaultModel().createLiteral("Spanish", + "es-ES"); + bindings.add("lang", l); + assertBoundQueryEquals("speak my ?lang?", "speak my \"Spanish\"@es-ES?"); + } + + @Ignore + @Test + public void bindAnon() { + fail("bindAnon not implemented"); + } + + // ---------------------------------------------------------------------- + // Helper methods + // ---------------------------------------------------------------------- + + private void assertBoundQueryEquals(String template, String expected) { + String actual = QueryUtils.bindVariables(template, bindings); + assertEquals("bounding results", expected, actual); + } +} diff --git a/webapp/test/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalURIsForObjectPropertiesTest.java b/webapp/test/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalURIsForObjectPropertiesTest.java index eeacf0e6f..5b91a3816 100644 --- a/webapp/test/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalURIsForObjectPropertiesTest.java +++ b/webapp/test/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalURIsForObjectPropertiesTest.java @@ -15,9 +15,13 @@ import com.hp.hpl.jena.rdf.model.ResourceFactory; import com.hp.hpl.jena.vocabulary.OWL; import com.hp.hpl.jena.vocabulary.RDFS; +import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService; +import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.jena.model.RDFServiceModel; + public class AdditionalURIsForObjectPropertiesTest { Model model; + RDFService rdfService; String testNS = "http://example.com/test#"; String n3 = "" + @@ -39,11 +43,12 @@ public class AdditionalURIsForObjectPropertiesTest { public void setUp() throws Exception { model = ModelFactory.createDefaultModel(); model.read(new StringReader(n3 ), null , "N3"); + rdfService = new RDFServiceModel(model); } @Test public void testChangeOfRdfsLabel() { - AdditionalURIsForObjectProperties aufop = new AdditionalURIsForObjectProperties(model); + AdditionalURIsForObjectProperties aufop = new AdditionalURIsForObjectProperties(rdfService); List uris = aufop.findAdditionalURIsToIndex( ResourceFactory.createStatement( ResourceFactory.createResource(testNS + "bob"), @@ -66,7 +71,7 @@ public class AdditionalURIsForObjectPropertiesTest { @Test public void testChangeOfObjPropStmt() { - AdditionalURIsForObjectProperties aufop = new AdditionalURIsForObjectProperties(model); + AdditionalURIsForObjectProperties aufop = new AdditionalURIsForObjectProperties(rdfService); List uris = aufop.findAdditionalURIsToIndex( ResourceFactory.createStatement( ResourceFactory.createResource(testNS + "bob"), @@ -88,7 +93,7 @@ public class AdditionalURIsForObjectPropertiesTest { @Test public void testOfDataPropChange() { - AdditionalURIsForObjectProperties aufop = new AdditionalURIsForObjectProperties(model); + AdditionalURIsForObjectProperties aufop = new AdditionalURIsForObjectProperties(rdfService); List uris = aufop.findAdditionalURIsToIndex( ResourceFactory.createStatement( ResourceFactory.createResource(testNS + "bob"), @@ -107,8 +112,9 @@ public class AdditionalURIsForObjectPropertiesTest { Model model = ModelFactory.createDefaultModel(); model.read(new StringReader( n3ForNIHVIVO_2902 ), null , "N3"); - - AdditionalURIsForObjectProperties aufop = new AdditionalURIsForObjectProperties(model); + RDFService rdfService = new RDFServiceModel(model); + + AdditionalURIsForObjectProperties aufop = new AdditionalURIsForObjectProperties(rdfService); List uris = aufop.findAdditionalURIsToIndex( ResourceFactory.createStatement( ResourceFactory.createResource("http://caruso-laptop.mannlib.cornell.edu:8090/vivo/individual/n2241"), From bf8e2b477813d2302525e06fdf1eca4dabecf5f4 Mon Sep 17 00:00:00 2001 From: tworrall Date: Mon, 11 Nov 2013 15:28:35 -0500 Subject: [PATCH 04/40] editLink macro was referencing displayNames rather than rangeURIs --- .../templates/freemarker/lib/lib-properties.ftl | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/webapp/web/templates/freemarker/lib/lib-properties.ftl b/webapp/web/templates/freemarker/lib/lib-properties.ftl index d5b5ec9c2..efb98f2a8 100644 --- a/webapp/web/templates/freemarker/lib/lib-properties.ftl +++ b/webapp/web/templates/freemarker/lib/lib-properties.ftl @@ -171,22 +171,22 @@ name will be used as the label. --> <#macro editingLinks propertyLocalName propertyName statement editable rangeUri=""> <#if editable > <#if (!rangeUri?contains("Authorship") && !rangeUri?contains("URL") && !rangeUri?contains("Editorship") && propertyLocalName != "hasResearchArea")> - <@editLink propertyLocalName propertyName statement /> + <@editLink propertyLocalName propertyName statement rangeUri/> <@deleteLink propertyLocalName propertyName statement /> -<#macro editLink propertyLocalName propertyName statement> +<#macro editLink propertyLocalName propertyName statement rangeUri=""> <#if propertyLocalName?contains("ARG_2000028")> - <#if propertyName?contains("mailing address")> + <#if rangeUri?contains("Address")> <#local url = statement.editUrl + "&addressUri=" + "${statement.address!}"> - <#elseif propertyName?contains("phone") || propertyName?contains("fax")> + <#elseif rangeUri?contains("Telephone") || rangeUri?contains("Fax")> <#local url = statement.editUrl + "&phoneUri=" + "${statement.phone!}"> - <#elseif propertyName?contains("primary email") || propertyName?contains("additional emails")> + <#elseif rangeUri?contains("Work") || rangeUri?contains("Email")> <#local url = statement.editUrl + "&emailUri=" + "${statement.email!}"> - <#elseif propertyName?contains("full name")> + <#elseif rangeUri?contains("Name")> <#local url = statement.editUrl + "&fullNameUri=" + "${statement.fullName!}"> - <#elseif propertyName?contains("preferred title")> + <#elseif rangeUri?contains("Title")> <#local url = statement.editUrl + "&titleUri=" + "${statement.title!}"> <#else> From fc90df70f3ad8709e87cc8b479a4de1e23b9c5ab Mon Sep 17 00:00:00 2001 From: brianjlowe Date: Mon, 11 Nov 2013 16:03:46 -0500 Subject: [PATCH 05/40] VIVO-511 allowing only 1 complete migration --- .../vitro/webapp/ontology/update/KnowledgeBaseUpdater.java | 4 +++- .../vitro/webapp/servlet/setup/UpdateKnowledgeBase.java | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/KnowledgeBaseUpdater.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/KnowledgeBaseUpdater.java index 3e685ed1e..a64025294 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/KnowledgeBaseUpdater.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/KnowledgeBaseUpdater.java @@ -346,7 +346,9 @@ public class KnowledgeBaseUpdater { } public static boolean isUpdatableABoxGraph(String graphName) { - return (!graphName.contains("tbox") && !graphName.contains("filegraph")); + return (graphName != null && !graphName.contains("tbox") + && !graphName.contains("filegraph") + && !graphName.contains("x-arq:UnionGraph")); } /** diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/UpdateKnowledgeBase.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/UpdateKnowledgeBase.java index 0f739dd5d..8c8f53533 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/UpdateKnowledgeBase.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/UpdateKnowledgeBase.java @@ -141,7 +141,7 @@ public class UpdateKnowledgeBase implements ServletContextListener { KnowledgeBaseUpdater ontologyUpdater = new KnowledgeBaseUpdater(settings); boolean requiredUpdate = ontologyUpdater.updateRequired(ctx); - if(!JenaDataSourceSetupBase.isFirstStartup()) { + if(requiredUpdate && !JenaDataSourceSetupBase.isFirstStartup()) { try { ctx.setAttribute(KBM_REQURIED_AT_STARTUP, Boolean.TRUE); migrationChangesMade = ontologyUpdater.update(ctx); From 769b53e919bc50806661019ac04b11bbe777d615 Mon Sep 17 00:00:00 2001 From: hudajkhan Date: Mon, 11 Nov 2013 18:28:11 -0500 Subject: [PATCH 06/40] Updates to enable deletion of object individuals for vcard editing --- .../freemarker/DeletePropertyController.java | 32 +++++++++++++------ .../edit/EditConfigurationTemplateModel.java | 4 +++ .../edit/forms/confirmDeletePropertyForm.ftl | 2 +- .../freemarker/lib/lib-properties.ftl | 14 ++++++++ 4 files changed, 42 insertions(+), 10 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/DeletePropertyController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/DeletePropertyController.java index 4f1bbd1c4..5586b8cb3 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/DeletePropertyController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/DeletePropertyController.java @@ -167,21 +167,21 @@ public class DeletePropertyController extends FreemarkerHttpServlet { } - - - - //process object property private void processObjectProperty(VitroRequest vreq) { ObjectProperty prop = EditConfigurationUtils.getObjectProperty(vreq); //if this property is true, it means the object needs to be deleted along with statement - if(prop.getStubObjectRelation()) + //while the second test is to see if a different object uri (i.e. not the direct objet of the predicate) + //needs to be deleted + if(prop.getStubObjectRelation() || hasDeleteObjectUri(vreq)) { deleteObjectIndividual(vreq); } - deleteObjectPropertyStatement(vreq); + if(!hasDeleteObjectUri(vreq)) { + deleteObjectPropertyStatement(vreq); + } } @@ -194,7 +194,7 @@ public class DeletePropertyController extends FreemarkerHttpServlet { wdf.getPropertyInstanceDao().deleteObjectPropertyStatement(subjectUri, predicateUri, objectUri); } - private Individual getObjectIndividualForStubRelation(VitroRequest vreq, String objectUri) { + private Individual getObjectIndividualForDeletion(VitroRequest vreq, String objectUri) { Individual object = EditConfigurationUtils.getIndividual(vreq, objectUri); if(object == null) { @@ -208,9 +208,13 @@ public class DeletePropertyController extends FreemarkerHttpServlet { private void deleteObjectIndividual(VitroRequest vreq) { String objectUri = EditConfigurationUtils.getObjectUri(vreq); - Individual object = getObjectIndividualForStubRelation(vreq, objectUri); + if(hasDeleteObjectUri(vreq)) { + //if a different individual needs to be deleted, get that uri instead + objectUri = getDeleteObjectUri(vreq); + } + Individual object = getObjectIndividualForDeletion(vreq, objectUri); if(object != null) { - log.warn("Deleting individual " + object.getName() + "since property has been set to force range object deletion"); + log.warn("Deleting individual " + object.getName() + "since property has been set to force range object deletion or has been set to delete a specific object"); WebappDaoFactory wdf = vreq.getWebappDaoFactory(); wdf.getIndividualDao().deleteIndividual(object); } else { @@ -218,6 +222,16 @@ public class DeletePropertyController extends FreemarkerHttpServlet { log.error("could not find object as request attribute or in model " + objectUri); } } + + //This checks if the object uri is not the individual to be deleted but another individual connected + private String getDeleteObjectUri(VitroRequest vreq) { + return (String) vreq.getParameter("deleteObjectUri"); + } + + private boolean hasDeleteObjectUri(VitroRequest vreq) { + String deleteObjectUri = getDeleteObjectUri(vreq); + return (deleteObjectUri != null && !deleteObjectUri.isEmpty()); + } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/edit/EditConfigurationTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/edit/EditConfigurationTemplateModel.java index cac4c484e..5df5485e1 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/edit/EditConfigurationTemplateModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/edit/EditConfigurationTemplateModel.java @@ -491,6 +491,10 @@ public class EditConfigurationTemplateModel extends BaseTemplateModel { return getDataLiteralValuesFromParameter(); } + //Get a custom object uri for deletion if one exists, i.e. not the object uri for the property + public String getCustomDeleteObjectUri() { + return (String) vreq.getParameter("deleteObjectUri"); + } //Used for deletion in case there's a specific template to be employed public String getDeleteTemplate() { String templateName = vreq.getParameter("templateName"); diff --git a/webapp/web/templates/freemarker/edit/forms/confirmDeletePropertyForm.ftl b/webapp/web/templates/freemarker/edit/forms/confirmDeletePropertyForm.ftl index 7e2f13cac..60c74c4e3 100644 --- a/webapp/web/templates/freemarker/edit/forms/confirmDeletePropertyForm.ftl +++ b/webapp/web/templates/freemarker/edit/forms/confirmDeletePropertyForm.ftl @@ -32,7 +32,7 @@ - + <#if editConfiguration.dataProperty = true> diff --git a/webapp/web/templates/freemarker/lib/lib-properties.ftl b/webapp/web/templates/freemarker/lib/lib-properties.ftl index d5b5ec9c2..815fd9e20 100644 --- a/webapp/web/templates/freemarker/lib/lib-properties.ftl +++ b/webapp/web/templates/freemarker/lib/lib-properties.ftl @@ -205,6 +205,20 @@ name will be used as the label. --> <#macro deleteLink propertyLocalName propertyName statement> <#local url = statement.deleteUrl> <#if url?has_content> + <#--We need to specify the actual object to be deleted as it is different from the object uri--> + <#if propertyLocalName?contains("ARG_2000028")> + <#if propertyName?contains("mailing address")> + <#local url = url + "&deleteObjectUri=" + "${statement.address!}"> + <#elseif propertyName?contains("phone") || propertyName?contains("fax")> + <#local url = url + "&deleteObjectUri=" + "${statement.phone!}"> + <#elseif propertyName?contains("primary email") || propertyName?contains("additional emails")> + <#local url = url + "&deleteObjectUri=" + "${statement.email!}"> + <#elseif propertyName?contains("full name")> + <#local url = url + "&deleteObjectUri=" + "${statement.fullName!}"> + <#elseif propertyName?contains("preferred title")> + <#local url = url + "&deleteObjectUri=" + "${statement.title!}"> + + <@showDeleteLink propertyLocalName url /> From 89354b45209a1da484abc1cbbeaf5c47ad86892d Mon Sep 17 00:00:00 2001 From: hudajkhan Date: Tue, 12 Nov 2013 08:56:15 -0500 Subject: [PATCH 07/40] in case domain uri, range uri, and customDeleteObjectUri do not exist, the template should not throw an error --- .../freemarker/edit/forms/confirmDeletePropertyForm.ftl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/webapp/web/templates/freemarker/edit/forms/confirmDeletePropertyForm.ftl b/webapp/web/templates/freemarker/edit/forms/confirmDeletePropertyForm.ftl index 60c74c4e3..5fb7e245c 100644 --- a/webapp/web/templates/freemarker/edit/forms/confirmDeletePropertyForm.ftl +++ b/webapp/web/templates/freemarker/edit/forms/confirmDeletePropertyForm.ftl @@ -30,9 +30,9 @@ - - - + + + <#if editConfiguration.dataProperty = true> From 41664dbce0388a39f6272a596305c56652b9322e Mon Sep 17 00:00:00 2001 From: tworrall Date: Wed, 13 Nov 2013 12:26:25 -0500 Subject: [PATCH 08/40] convert display name checks to a rangeUri check --- .../templates/freemarker/lib/lib-properties.ftl | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/webapp/web/templates/freemarker/lib/lib-properties.ftl b/webapp/web/templates/freemarker/lib/lib-properties.ftl index 16d950dad..b9352790c 100644 --- a/webapp/web/templates/freemarker/lib/lib-properties.ftl +++ b/webapp/web/templates/freemarker/lib/lib-properties.ftl @@ -172,7 +172,7 @@ name will be used as the label. --> <#if editable > <#if (!rangeUri?contains("Authorship") && !rangeUri?contains("URL") && !rangeUri?contains("Editorship") && propertyLocalName != "hasResearchArea")> <@editLink propertyLocalName propertyName statement rangeUri/> - <@deleteLink propertyLocalName propertyName statement /> + <@deleteLink propertyLocalName propertyName statement rangeUri/> @@ -202,20 +202,20 @@ name will be used as the label. --> ${i18n().edit_entry} -<#macro deleteLink propertyLocalName propertyName statement> +<#macro deleteLink propertyLocalName propertyName statement rangeUri=""> <#local url = statement.deleteUrl> <#if url?has_content> <#--We need to specify the actual object to be deleted as it is different from the object uri--> <#if propertyLocalName?contains("ARG_2000028")> - <#if propertyName?contains("mailing address")> + <#if rangeUri?contains("Address")> <#local url = url + "&deleteObjectUri=" + "${statement.address!}"> - <#elseif propertyName?contains("phone") || propertyName?contains("fax")> + <#elseif rangeUri?contains("Telephone") || rangeUri?contains("Fax")> <#local url = url + "&deleteObjectUri=" + "${statement.phone!}"> - <#elseif propertyName?contains("primary email") || propertyName?contains("additional emails")> + <#elseif rangeUri?contains("Work") || rangeUri?contains("Email")> <#local url = url + "&deleteObjectUri=" + "${statement.email!}"> - <#elseif propertyName?contains("full name")> + <#elseif rangeUri?contains("Name")> <#local url = url + "&deleteObjectUri=" + "${statement.fullName!}"> - <#elseif propertyName?contains("preferred title")> + <#elseif rangeUri?contains("Title")> <#local url = url + "&deleteObjectUri=" + "${statement.title!}"> From d3f6af6981320850b91f77871df11b94b07b4bf7 Mon Sep 17 00:00:00 2001 From: j2blake Date: Thu, 14 Nov 2013 17:05:04 -0500 Subject: [PATCH 09/40] VIVO-523 Change the way the example language files are presented. --- .../i18n/all_es.properties => es_GO/i18n/all_es_GO.properties} | 0 .../templates/freemarker/search-help_es_GO.ftl} | 0 .../templates/freemarker/termsOfUse_es_GO.ftl} | 0 .../freemarker/userAccounts-acctCreatedEmail_es_GO.ftl} | 0 .../userAccounts-acctCreatedExternalOnlyEmail_es_GO.ftl} | 0 .../userAccounts-confirmEmailChangedEmail_es_GO.ftl} | 0 .../freemarker/userAccounts-firstTimeExternalEmail_es_GO.ftl} | 0 .../freemarker/userAccounts-passwordCreatedEmail_es_GO.ftl} | 0 .../userAccounts-passwordResetCompleteEmail_es_GO.ftl} | 0 .../userAccounts-passwordResetPendingEmail_es_GO.ftl} | 0 .../vitro/webapp/i18n/selection/LocaleSelectionSetup.java | 3 ++- 11 files changed, 2 insertions(+), 1 deletion(-) rename webapp/languages/{example/i18n/all_es.properties => es_GO/i18n/all_es_GO.properties} (100%) rename webapp/languages/{example/templates/freemarker/search-help_es.ftl => es_GO/templates/freemarker/search-help_es_GO.ftl} (100%) rename webapp/languages/{example/templates/freemarker/termsOfUse_es.ftl => es_GO/templates/freemarker/termsOfUse_es_GO.ftl} (100%) rename webapp/languages/{example/templates/freemarker/userAccounts-acctCreatedEmail.ftl => es_GO/templates/freemarker/userAccounts-acctCreatedEmail_es_GO.ftl} (100%) rename webapp/languages/{example/templates/freemarker/userAccounts-acctCreatedExternalOnlyEmail.ftl => es_GO/templates/freemarker/userAccounts-acctCreatedExternalOnlyEmail_es_GO.ftl} (100%) rename webapp/languages/{example/templates/freemarker/userAccounts-confirmEmailChangedEmail.ftl => es_GO/templates/freemarker/userAccounts-confirmEmailChangedEmail_es_GO.ftl} (100%) rename webapp/languages/{example/templates/freemarker/userAccounts-firstTimeExternalEmail.ftl => es_GO/templates/freemarker/userAccounts-firstTimeExternalEmail_es_GO.ftl} (100%) rename webapp/languages/{example/templates/freemarker/userAccounts-passwordCreatedEmail.ftl => es_GO/templates/freemarker/userAccounts-passwordCreatedEmail_es_GO.ftl} (100%) rename webapp/languages/{example/templates/freemarker/userAccounts-passwordResetCompleteEmail.ftl => es_GO/templates/freemarker/userAccounts-passwordResetCompleteEmail_es_GO.ftl} (100%) rename webapp/languages/{example/templates/freemarker/userAccounts-passwordResetPendingEmail.ftl => es_GO/templates/freemarker/userAccounts-passwordResetPendingEmail_es_GO.ftl} (100%) diff --git a/webapp/languages/example/i18n/all_es.properties b/webapp/languages/es_GO/i18n/all_es_GO.properties similarity index 100% rename from webapp/languages/example/i18n/all_es.properties rename to webapp/languages/es_GO/i18n/all_es_GO.properties diff --git a/webapp/languages/example/templates/freemarker/search-help_es.ftl b/webapp/languages/es_GO/templates/freemarker/search-help_es_GO.ftl similarity index 100% rename from webapp/languages/example/templates/freemarker/search-help_es.ftl rename to webapp/languages/es_GO/templates/freemarker/search-help_es_GO.ftl diff --git a/webapp/languages/example/templates/freemarker/termsOfUse_es.ftl b/webapp/languages/es_GO/templates/freemarker/termsOfUse_es_GO.ftl similarity index 100% rename from webapp/languages/example/templates/freemarker/termsOfUse_es.ftl rename to webapp/languages/es_GO/templates/freemarker/termsOfUse_es_GO.ftl diff --git a/webapp/languages/example/templates/freemarker/userAccounts-acctCreatedEmail.ftl b/webapp/languages/es_GO/templates/freemarker/userAccounts-acctCreatedEmail_es_GO.ftl similarity index 100% rename from webapp/languages/example/templates/freemarker/userAccounts-acctCreatedEmail.ftl rename to webapp/languages/es_GO/templates/freemarker/userAccounts-acctCreatedEmail_es_GO.ftl diff --git a/webapp/languages/example/templates/freemarker/userAccounts-acctCreatedExternalOnlyEmail.ftl b/webapp/languages/es_GO/templates/freemarker/userAccounts-acctCreatedExternalOnlyEmail_es_GO.ftl similarity index 100% rename from webapp/languages/example/templates/freemarker/userAccounts-acctCreatedExternalOnlyEmail.ftl rename to webapp/languages/es_GO/templates/freemarker/userAccounts-acctCreatedExternalOnlyEmail_es_GO.ftl diff --git a/webapp/languages/example/templates/freemarker/userAccounts-confirmEmailChangedEmail.ftl b/webapp/languages/es_GO/templates/freemarker/userAccounts-confirmEmailChangedEmail_es_GO.ftl similarity index 100% rename from webapp/languages/example/templates/freemarker/userAccounts-confirmEmailChangedEmail.ftl rename to webapp/languages/es_GO/templates/freemarker/userAccounts-confirmEmailChangedEmail_es_GO.ftl diff --git a/webapp/languages/example/templates/freemarker/userAccounts-firstTimeExternalEmail.ftl b/webapp/languages/es_GO/templates/freemarker/userAccounts-firstTimeExternalEmail_es_GO.ftl similarity index 100% rename from webapp/languages/example/templates/freemarker/userAccounts-firstTimeExternalEmail.ftl rename to webapp/languages/es_GO/templates/freemarker/userAccounts-firstTimeExternalEmail_es_GO.ftl diff --git a/webapp/languages/example/templates/freemarker/userAccounts-passwordCreatedEmail.ftl b/webapp/languages/es_GO/templates/freemarker/userAccounts-passwordCreatedEmail_es_GO.ftl similarity index 100% rename from webapp/languages/example/templates/freemarker/userAccounts-passwordCreatedEmail.ftl rename to webapp/languages/es_GO/templates/freemarker/userAccounts-passwordCreatedEmail_es_GO.ftl diff --git a/webapp/languages/example/templates/freemarker/userAccounts-passwordResetCompleteEmail.ftl b/webapp/languages/es_GO/templates/freemarker/userAccounts-passwordResetCompleteEmail_es_GO.ftl similarity index 100% rename from webapp/languages/example/templates/freemarker/userAccounts-passwordResetCompleteEmail.ftl rename to webapp/languages/es_GO/templates/freemarker/userAccounts-passwordResetCompleteEmail_es_GO.ftl diff --git a/webapp/languages/example/templates/freemarker/userAccounts-passwordResetPendingEmail.ftl b/webapp/languages/es_GO/templates/freemarker/userAccounts-passwordResetPendingEmail_es_GO.ftl similarity index 100% rename from webapp/languages/example/templates/freemarker/userAccounts-passwordResetPendingEmail.ftl rename to webapp/languages/es_GO/templates/freemarker/userAccounts-passwordResetPendingEmail_es_GO.ftl diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/i18n/selection/LocaleSelectionSetup.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/i18n/selection/LocaleSelectionSetup.java index c89819421..081019a04 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/i18n/selection/LocaleSelectionSetup.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/i18n/selection/LocaleSelectionSetup.java @@ -134,7 +134,8 @@ public class LocaleSelectionSetup implements ServletContextListener { throws IllegalArgumentException { Locale locale = LocaleUtils.toLocale(localeString); - if (!LocaleUtils.isAvailableLocale(locale)) { + if (!"es_GO".equals(localeString) && // No complaint about bogus locale + !LocaleUtils.isAvailableLocale(locale)) { ssWarning("'" + locale + "' is not a recognized locale."); } return locale; From 35251e89f43a6992fd1ec3f5af6528f3ea56f8ba Mon Sep 17 00:00:00 2001 From: hudajkhan Date: Fri, 15 Nov 2013 12:33:47 -0500 Subject: [PATCH 10/40] enable check for creating new individual to get faux property information correctly --- .../generators/DefaultAddMissingIndividualFormGenerator.java | 5 ++++- .../edit/forms/defaultOfferCreateNewOptionForm.ftl | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/DefaultAddMissingIndividualFormGenerator.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/DefaultAddMissingIndividualFormGenerator.java index 2f53d3619..0a8a866a3 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/DefaultAddMissingIndividualFormGenerator.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/DefaultAddMissingIndividualFormGenerator.java @@ -56,7 +56,10 @@ public class DefaultAddMissingIndividualFormGenerator implements EditConfigurati public static boolean isCreateNewIndividual(VitroRequest vreq, HttpSession session) { String command = vreq.getParameter("cmd"); String predicateUri = EditConfigurationUtils.getPredicateUri(vreq); - ObjectProperty objProp = vreq.getWebappDaoFactory().getObjectPropertyDao().getObjectPropertyByURI(predicateUri); + //This method also looks at domain and range uris and so is different than just getting the + //object property based on predicate uri alone + ObjectProperty objProp = EditConfigurationUtils.getObjectPropertyForPredicate(vreq, + predicateUri); if(objProp != null) { return(objProp.getOfferCreateNewOption() && ( diff --git a/webapp/web/templates/freemarker/edit/forms/defaultOfferCreateNewOptionForm.ftl b/webapp/web/templates/freemarker/edit/forms/defaultOfferCreateNewOptionForm.ftl index 578f017c6..1f6279ba5 100644 --- a/webapp/web/templates/freemarker/edit/forms/defaultOfferCreateNewOptionForm.ftl +++ b/webapp/web/templates/freemarker/edit/forms/defaultOfferCreateNewOptionForm.ftl @@ -17,6 +17,8 @@ + + checked> + + +<#macro showTextbox key> + + + + + + +<#if !settings["developer.enabled"]> +<#elseif !settings["mayControl"]> +
+

${siteName} is running in developer mode.

+
+<#else> +
+

${siteName} is running in developer mode. + (click for Options) +

+
+
+ + +
+ Freemarker templates + + +
+ +
+ SPARQL Queries + + + +
+ +
+ Language support + + +
+ + +
+
+
+ \ No newline at end of file diff --git a/webapp/web/templates/freemarker/page/partials/menu.ftl b/webapp/web/templates/freemarker/page/partials/menu.ftl index e0543117e..e193960fd 100644 --- a/webapp/web/templates/freemarker/page/partials/menu.ftl +++ b/webapp/web/templates/freemarker/page/partials/menu.ftl @@ -1,5 +1,7 @@ <#-- $This file is distributed under the terms of the license in /doc/license.txt$ --> +<#include "developer.ftl"> +