diff --git a/webapp/src/edu/cornell/mannlib/vedit/controller/OperationController.java b/webapp/src/edu/cornell/mannlib/vedit/controller/OperationController.java index c0688d954..f1537bc11 100644 --- a/webapp/src/edu/cornell/mannlib/vedit/controller/OperationController.java +++ b/webapp/src/edu/cornell/mannlib/vedit/controller/OperationController.java @@ -116,6 +116,7 @@ public class OperationController extends BaseEditController { boolean status = performEdit(epo, newObj, action); if (status == FAILURE) { retry(request,response); + return; } /* put request parameters and attributes into epo where the listeners can see */ @@ -165,6 +166,7 @@ public class OperationController extends BaseEditController { try { retry(request, response); + return; } catch (IOException ioe) { log.error(this.getClass().getName() + " IOError on redirect: ", ioe); } 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 a64bdde55..e09f690fe 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 @@ -189,6 +189,23 @@ public class VClassDaoJena extends JenaBaseDao implements VClassDao { try { OntClass cls = getOntClass(ontModel,URI); if (cls != null) { + //Remove restriction class. + Iterator restIt = ontModel.listSubjectsWithProperty(OWL.allValuesFrom, cls); + while(restIt.hasNext()) { + Resource restRes = restIt.next(); + if (restRes.canAs(OntResource.class)) { + OntResource restOntRes = (OntResource) restRes.as(OntResource.class); + smartRemove(restOntRes, ontModel); + } + } + restIt = ontModel.listSubjectsWithProperty(OWL.someValuesFrom, cls); + while(restIt.hasNext()) { + Resource restRes = restIt.next(); + if (restRes.canAs(OntResource.class)) { + OntResource restOntRes = (OntResource) restRes.as(OntResource.class); + smartRemove(restOntRes, ontModel); + } + } removeRulesMentioningResource(cls, ontModel); smartRemove(cls, ontModel); } diff --git a/webapp/test/edu/cornell/mannlib/vitro/webapp/dao/jena/JenaBaseDaoTest.java b/webapp/test/edu/cornell/mannlib/vitro/webapp/dao/jena/JenaBaseDaoTest.java index 6d1a7610f..562098684 100644 --- a/webapp/test/edu/cornell/mannlib/vitro/webapp/dao/jena/JenaBaseDaoTest.java +++ b/webapp/test/edu/cornell/mannlib/vitro/webapp/dao/jena/JenaBaseDaoTest.java @@ -8,8 +8,11 @@ import junit.framework.Assert; import org.junit.Test; +import com.hp.hpl.jena.ontology.OntClass; import com.hp.hpl.jena.ontology.OntModel; import com.hp.hpl.jena.ontology.OntModelSpec; +import com.hp.hpl.jena.ontology.OntProperty; +import com.hp.hpl.jena.ontology.Restriction; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; import com.hp.hpl.jena.rdf.model.StmtIterator; @@ -436,4 +439,44 @@ public class JenaBaseDaoTest { Assert.assertTrue(preModel.size() == postModel.size()); } + + @Test + /** + * Test that removing classes or properties used in restrictions + * does not leave behind broken, syntactically-invalid restrictions. + * The restrictions should be deleted. + */ + public void testPreventInvalidRestrictionsOnDeletion() { + OntModel m = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); + WebappDaoFactoryJena wadf = new WebappDaoFactoryJena(m); + + String ns = "http://example.org/ontology/"; + String class1URI = ns + "Class1"; + String class2URI = ns + "Class2"; + String propURI = ns + "property"; + + OntClass class1 = m.createClass(class1URI); + OntClass class2 = m.createClass(class2URI); + OntProperty prop = m.createObjectProperty(propURI); + Restriction rest = m.createAllValuesFromRestriction(null, prop, class2); + class1.addSuperClass(rest); + + ObjectProperty op = wadf.getObjectPropertyDao().getObjectPropertyByURI(propURI); + wadf.getObjectPropertyDao().deleteObjectProperty(op); + + Assert.assertEquals(class1.listSuperClasses().toSet().size(), 0); + Assert.assertEquals(m.size(), 2); // just rdf:type owl:Class for Class1 and Class2 + + prop = m.createObjectProperty(propURI); + rest = m.createAllValuesFromRestriction(null, prop, class2); + class1.addSuperClass(rest); + + VClass vclass = wadf.getVClassDao().getVClassByURI(class2URI); + wadf.getVClassDao().deleteVClass(vclass); + + Assert.assertEquals(class1.listSuperClasses().toSet().size(), 0); + Assert.assertEquals(m.size(), 2); // just rdf:type for Class1 and Prop + + } + }