NIHVIVO-3874 reimplemented change namespace function to work around strange lack of deletion with ResourceUtils.renameResource()

This commit is contained in:
brianjlowe 2012-07-05 20:02:43 +00:00
parent c052a20271
commit 74662f29d0

View file

@ -60,7 +60,6 @@ import com.hp.hpl.jena.sdb.sql.JDBC;
import com.hp.hpl.jena.sdb.store.DatabaseType; import com.hp.hpl.jena.sdb.store.DatabaseType;
import com.hp.hpl.jena.sdb.store.LayoutType; import com.hp.hpl.jena.sdb.store.LayoutType;
import com.hp.hpl.jena.shared.Lock; import com.hp.hpl.jena.shared.Lock;
import com.hp.hpl.jena.util.ResourceUtils;
import com.hp.hpl.jena.util.iterator.ClosableIterator; import com.hp.hpl.jena.util.iterator.ClosableIterator;
import edu.cornell.mannlib.vedit.controller.BaseEditController; import edu.cornell.mannlib.vedit.controller.BaseEditController;
@ -69,13 +68,18 @@ import edu.cornell.mannlib.vitro.webapp.beans.Ontology;
import edu.cornell.mannlib.vitro.webapp.controller.Controllers; import edu.cornell.mannlib.vitro.webapp.controller.Controllers;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.dao.OntologyDao; import edu.cornell.mannlib.vitro.webapp.dao.OntologyDao;
import edu.cornell.mannlib.vitro.webapp.dao.jena.JenaBaseDao;
import edu.cornell.mannlib.vitro.webapp.dao.jena.ModelContext; import edu.cornell.mannlib.vitro.webapp.dao.jena.ModelContext;
import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceGraph;
import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceModelMaker; import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceModelMaker;
import edu.cornell.mannlib.vitro.webapp.dao.jena.VitroJenaModelMaker; import edu.cornell.mannlib.vitro.webapp.dao.jena.VitroJenaModelMaker;
import edu.cornell.mannlib.vitro.webapp.dao.jena.VitroJenaSDBModelMaker; import edu.cornell.mannlib.vitro.webapp.dao.jena.VitroJenaSDBModelMaker;
import edu.cornell.mannlib.vitro.webapp.dao.jena.VitroJenaSpecialModelMaker; import edu.cornell.mannlib.vitro.webapp.dao.jena.VitroJenaSpecialModelMaker;
import edu.cornell.mannlib.vitro.webapp.dao.jena.event.EditEvent; import edu.cornell.mannlib.vitro.webapp.dao.jena.event.EditEvent;
import edu.cornell.mannlib.vitro.webapp.rdfservice.ChangeSet;
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceException;
import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils;
import edu.cornell.mannlib.vitro.webapp.servlet.setup.JenaDataSourceSetupBase;
import edu.cornell.mannlib.vitro.webapp.servlet.setup.WebappDaoSetup; import edu.cornell.mannlib.vitro.webapp.servlet.setup.WebappDaoSetup;
import edu.cornell.mannlib.vitro.webapp.utils.SparqlQueryUtils; import edu.cornell.mannlib.vitro.webapp.utils.SparqlQueryUtils;
import edu.cornell.mannlib.vitro.webapp.utils.jena.JenaIngestUtils; import edu.cornell.mannlib.vitro.webapp.utils.jena.JenaIngestUtils;
@ -1163,42 +1167,39 @@ public class JenaIngestController extends BaseEditController {
String result = null; String result = null;
Integer counter = 0; Integer counter = 0;
Boolean namespacePresent = false; Boolean namespacePresent = false;
OntModel baseOntModel = (OntModel) RDFService rdfService = RDFServiceUtils.getRDFServiceFactory(
getServletContext().getAttribute("baseOntModel"); getServletContext()).getRDFService();
OntModel ontModel = (OntModel)
getServletContext().getAttribute("jenaOntModel");
OntModel infOntModel = (OntModel)
getServletContext().getAttribute(JenaBaseDao.INFERENCE_ONT_MODEL_ATTRIBUTE_NAME);
List<String> urisToChange = new LinkedList<String>();
ontModel.enterCriticalSection(Lock.READ);
try { try {
Iterator<Individual> indIter = ontModel.listIndividuals(); Model baseOntModel = RDFServiceGraph.createRDFServiceModel
while( indIter.hasNext()){ (new RDFServiceGraph(
Individual ind = indIter.next(); rdfService, JenaDataSourceSetupBase.JENA_DB_MODEL));
String namespace = ind.getNameSpace(); OntModel ontModel = (OntModel)
if( namespace != null ){ getServletContext().getAttribute("jenaOntModel");
if( oldNamespace.equals(namespace) ){ List<String> urisToChange = new LinkedList<String>();
uri = ind.getURI(); ontModel.enterCriticalSection(Lock.READ);
urisToChange.add(uri); try {
namespacePresent = true; Iterator<Individual> indIter = ontModel.listIndividuals();
while( indIter.hasNext()){
Individual ind = indIter.next();
String namespace = ind.getNameSpace();
if( namespace != null ){
if( oldNamespace.equals(namespace) ){
uri = ind.getURI();
urisToChange.add(uri);
namespacePresent = true;
}
} }
} }
} finally {
ontModel.leaveCriticalSection();
} }
} finally { if(!namespacePresent){
ontModel.leaveCriticalSection(); result = "no resources renamed";
} return result;
if(!namespacePresent){ }
result = "no resources renamed"; for( String oldURIStr : urisToChange){
return result;
}
for( String oldURIStr : urisToChange){
baseOntModel.enterCriticalSection(Lock.WRITE);
ontModel.enterCriticalSection(Lock.WRITE);
infOntModel.enterCriticalSection(Lock.WRITE);
try{
long time1 = System.currentTimeMillis(); long time1 = System.currentTimeMillis();
Resource res = baseOntModel.getResource(oldURIStr); Resource res = baseOntModel.getResource(oldURIStr);
Resource infRes = infOntModel.getResource(oldURIStr);
long time2 = System.currentTimeMillis(); long time2 = System.currentTimeMillis();
String newURIStr=null; String newURIStr=null;
Pattern p = Pattern.compile(oldNamespace); Pattern p = Pattern.compile(oldNamespace);
@ -1209,21 +1210,54 @@ public class JenaIngestController extends BaseEditController {
log.debug("time to get new uri: " + log.debug("time to get new uri: " +
Long.toString(time3 - time2)); Long.toString(time3 - time2));
log.debug("Renaming "+ oldURIStr + " to " + newURIStr); log.debug("Renaming "+ oldURIStr + " to " + newURIStr);
ResourceUtils.renameResource(res,newURIStr);
ResourceUtils.renameResource(infRes,newURIStr); String whereClause = "} WHERE { \n" +
" GRAPH <" + JenaDataSourceSetupBase.JENA_DB_MODEL + "> { \n" +
" { <" + oldURIStr + "> ?p <" + oldURIStr + "> } \n " +
" UNION \n" +
" { <" + oldURIStr + "> ?q ?o } \n " +
" UNION \n" +
" { ?s ?r <" + oldURIStr + "> } \n" +
" } \n" +
"}";
String removeQuery = "CONSTRUCT { \n" +
" <" + oldURIStr + "> ?p <" + oldURIStr + "> . \n " +
" <" + oldURIStr + "> ?q ?o . \n " +
" ?s ?r <" + oldURIStr + "> \n" + whereClause;
String addQuery = "CONSTRUCT { \n" +
" <" + newURIStr + "> ?p <" + newURIStr + "> . \n " +
" <" + newURIStr + "> ?q ?o . \n " +
" ?s ?r <" + newURIStr + "> \n" + whereClause;
try {
ChangeSet cs = rdfService.manufactureChangeSet();
cs.addAddition(rdfService.sparqlConstructQuery(
addQuery, RDFService.ModelSerializationFormat.N3),
RDFService.ModelSerializationFormat.N3,
JenaDataSourceSetupBase.JENA_DB_MODEL);
cs.addRemoval(rdfService.sparqlConstructQuery(
removeQuery, RDFService.ModelSerializationFormat.N3),
RDFService.ModelSerializationFormat.N3,
JenaDataSourceSetupBase.JENA_DB_MODEL);
rdfService.changeSetUpdate(cs);
} catch (RDFServiceException e) {
throw new RuntimeException(e);
}
long time4 = System.currentTimeMillis(); long time4 = System.currentTimeMillis();
log.debug(" time to rename : " + Long.toString( time4 - time3)); log.debug(" time to rename : " + Long.toString( time4 - time3));
log.debug(" time for one resource: " + log.debug(" time for one resource: " +
Long.toString( time4 -time1)); Long.toString( time4 -time1));
} finally { counter++;
infOntModel.leaveCriticalSection(); }
ontModel.leaveCriticalSection(); result = counter.toString() + " resources renamed";
baseOntModel.leaveCriticalSection(); return result;
} finally {
if (rdfService != null) {
rdfService.close();
} }
counter++; }
}
result = counter.toString() + " resources renamed";
return result;
} }
protected void showModelList(VitroRequest vreq, ModelMaker maker, String modelType) { protected void showModelList(VitroRequest vreq, ModelMaker maker, String modelType) {