diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/PropertyInstanceDaoJena.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/PropertyInstanceDaoJena.java index b704cb363..c2831bef4 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/PropertyInstanceDaoJena.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/PropertyInstanceDaoJena.java @@ -21,6 +21,7 @@ import com.hp.hpl.jena.ontology.OntProperty; import com.hp.hpl.jena.ontology.Restriction; import com.hp.hpl.jena.rdf.model.Property; 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.OWL; @@ -60,13 +61,14 @@ public class PropertyInstanceDaoJena extends JenaBaseDao implements getOntModel().getBaseModel().notifyEvent(new IndividualUpdateEvent(getWebappDaoFactory().getUserURI(),true,subjectURI)); try { ontModel.remove(subjRes,pred,objRes); + updatePropertyDateTimeValue(subjRes,MODTIME,Calendar.getInstance().getTime(),getOntModel()); } finally { getOntModel().getBaseModel().notifyEvent(new IndividualUpdateEvent(getWebappDaoFactory().getUserURI(),false,subjectURI)); } try{ - getOntModel().getBaseModel().notifyEvent(new IndividualDeletionEvent(getWebappDaoFactory().getUserURI(),true,objectURI)); - List depResStmts = DependentResourceDeleteJena.getDependentResourceDeleteList(objRes,ontModel); + getOntModel().getBaseModel().notifyEvent(new IndividualDeletionEvent(getWebappDaoFactory().getUserURI(),true,objectURI)); + List depResStmts = DependentResourceDeleteJena.getDependentResourceDeleteList(ResourceFactory.createStatement(subjRes, pred, objRes),ontModel); getOntModel().remove(depResStmts); } finally { getOntModel().getBaseModel().notifyEvent(new IndividualDeletionEvent(getWebappDaoFactory().getUserURI(),false,objectURI)); diff --git a/webapp/test/edu/cornell/mannlib/vitro/webapp/dao/jena/PropertyInstanceDaoJenaTest.java b/webapp/test/edu/cornell/mannlib/vitro/webapp/dao/jena/PropertyInstanceDaoJenaTest.java new file mode 100644 index 000000000..79155171c --- /dev/null +++ b/webapp/test/edu/cornell/mannlib/vitro/webapp/dao/jena/PropertyInstanceDaoJenaTest.java @@ -0,0 +1,138 @@ +package edu.cornell.mannlib.vitro.webapp.dao.jena; + +import java.io.StringReader; +import java.util.List; + +import junit.framework.Assert; + +import com.hp.hpl.jena.ontology.OntModel; +import com.hp.hpl.jena.rdf.model.Model; +import com.hp.hpl.jena.rdf.model.ModelFactory; +import com.hp.hpl.jena.rdf.model.Statement; +import com.hp.hpl.jena.vocabulary.XSD; + +import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary; +import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; + + +public class PropertyInstanceDaoJenaTest { + String isDependentRelation = + " <"+VitroVocabulary.PROPERTY_STUBOBJECTPROPERTYANNOT+"> \"true\"^^xsd:boolean .\n" ; + + String nosePropIsDependentRel = + "<"+VitroVocabulary.PROPERTY_STUBOBJECTPROPERTYANNOT+"> rdf:type owl:AnnotationProperty .\n" + + " ex:hasNose " + isDependentRelation; + + String prefixesN3 = + "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + + "@prefix xsd: <" + XSD.getURI() + "> . \n " + + "@prefix ex: . \n" + + "@prefix rdf: . \n"+ + "@prefix rdfs: . \n"+ + "@prefix owl: . \n"; + + + void printModels(Model expected, Model result){ + System.out.println("Expected:"); + expected.write(System.out); + System.out.println("Result:"); + result.write(System.out); + } + + + @org.junit.Test + public void testStmtNonForceDelete() { + String n3 = + prefixesN3 + + " ex:bob ex:hasNose ex:nose1 . \n" + + " ex:nose1 ex:hasHair ex:hair23. \n" + + " ex:hair23 ex:hasHairCount \"23\". " ; + + String expected = + prefixesN3 + + " ex:nose1 ex:hasHair ex:hair23. \n" + + " ex:hair23 ex:hasHairCount \"23\". " ; + + Model model = (ModelFactory.createDefaultModel()).read(new StringReader(n3), "", "N3"); + OntModel ontModel = ModelFactory.createOntologyModel(); + ontModel.add(model.listStatements()); + WebappDaoFactory wdf = new WebappDaoFactoryJena(ontModel); + wdf.getPropertyInstanceDao().deleteObjectPropertyStatement("http://example.com/bob", "http://example.com/hasNose", "http://example.com/nose1"); + + Model expectedModel = (ModelFactory.createDefaultModel()).read(new StringReader(expected), "", "N3"); + wipeOutModTime(ontModel); + //Model resultModel = ModelFactory.createDefaultModel().add(ontModel.listStatements()); + + boolean same = expectedModel.isIsomorphicWith( ontModel.getBaseModel() ); + if( ! same ) printModels( expectedModel, ontModel.getBaseModel()); + Assert.assertTrue( same ); + } + + + @org.junit.Test + public void testStmtSimpleForceDelete() { + String n3= + prefixesN3 + + nosePropIsDependentRel + + "ex:hasHair " + isDependentRelation + + " ex:bob ex:hasNose ex:nose1 . \n" + + " ex:nose1 ex:hasHair ex:hair23. \n" + + " ex:hair23 ex:hasHairCount \"23\". " ; + String expected = + prefixesN3 + + nosePropIsDependentRel + + "ex:hasHair " + isDependentRelation ; + + Model model = (ModelFactory.createDefaultModel()).read(new StringReader(n3), "", "N3"); + OntModel ontModel = ModelFactory.createOntologyModel(); + ontModel.add(model.listStatements()); + WebappDaoFactory wdf = new WebappDaoFactoryJena(ontModel); + wdf.getPropertyInstanceDao().deleteObjectPropertyStatement("http://example.com/bob", "http://example.com/hasNose", "http://example.com/nose1"); + + Model expectedModel = (ModelFactory.createDefaultModel()).read(new StringReader(expected), "", "N3"); + wipeOutModTime(ontModel); + //Model resultModel = ModelFactory.createDefaultModel().add(ontModel.listStatements()); + + boolean same = expectedModel.isIsomorphicWith( ontModel.getBaseModel() ); + if( ! same ) printModels( expectedModel, ontModel.getBaseModel()); + Assert.assertTrue( same ); + } + + @org.junit.Test + public void testStmtForceDeleteWithLiterals() { + String n3 = + prefixesN3 + + nosePropIsDependentRel + + "ex:hasHair " + isDependentRelation + + " ex:bob ex:a \"Bob\". \n" + + " ex:bob ex:hasNose ex:nose1 . \n" + + " ex:nose1 ex:a \"this is a literal\". \n" + + " ex:nose1 ex:b \"2343\" . \n" + + " ex:nose1 ex:hasHair ex:hair23. \n" + + " ex:hair23 ex:hasHairCount \"23\". " ; + + String expected = + prefixesN3 + + nosePropIsDependentRel + + "ex:hasHair " + isDependentRelation + + " ex:bob ex:a \"Bob\". \n" ; + + Model model = (ModelFactory.createDefaultModel()).read(new StringReader(n3), "", "N3"); + OntModel ontModel = ModelFactory.createOntologyModel(); + ontModel.add(model.listStatements()); + WebappDaoFactory wdf = new WebappDaoFactoryJena(ontModel); + wdf.getPropertyInstanceDao().deleteObjectPropertyStatement("http://example.com/bob", "http://example.com/hasNose", "http://example.com/nose1"); + + Model expectedModel = (ModelFactory.createDefaultModel()).read(new StringReader(expected), "", "N3"); + wipeOutModTime(ontModel); + //Model resultModel = ModelFactory.createDefaultModel().add(ontModel.listStatements()); + + boolean same = expectedModel.isIsomorphicWith( ontModel.getBaseModel() ); + if( ! same ) printModels( expectedModel, ontModel.getBaseModel()); + Assert.assertTrue( same ); + } + + void wipeOutModTime(Model model){ + model.removeAll(null, model.createProperty(VitroVocabulary.MODTIME), null); + } +}