diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/VitroVocabulary.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/VitroVocabulary.java index 506a3b773..0d5dd6578 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/VitroVocabulary.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/VitroVocabulary.java @@ -88,7 +88,6 @@ public class VitroVocabulary { public static final String IMAGEFILE = vitroURI+"imageFile"; public static final String IMAGETHUMB = vitroURI+"imageThumb"; - public static final String DEPENDENT_RESOURCE = vitroURI + "DependentResource"; // ================== property related ================================= public static final String PROPERTY_ENTITYSORTDIRECTION = vitroURI+"individualSortDirectionAnnot"; @@ -106,9 +105,10 @@ public class VitroVocabulary { public static final String PROPERTY_OFFERCREATENEWOPTIONANNOT = vitroURI+"offerCreateNewOptionAnnot"; public static final String PROPERTY_INPROPERTYGROUPANNOT = vitroURI+"inPropertyGroupAnnot"; public static final String PROPERTYGROUP = vitroURI + "PropertyGroup"; - public static final String MASKS_PROPERTY = VitroVocabulary.vitroURI + "masksProperty"; - public static final String SKIP_EDIT_FORM = VitroVocabulary.vitroURI + "skipEditForm"; - + public static final String MASKS_PROPERTY = vitroURI + "masksProperty"; + public static final String SKIP_EDIT_FORM = vitroURI + "skipEditForm"; + public static final String PROPERTY_DEPENDENCYPROPERTYANNOT = vitroURI + "dependencyPropertyAnnot"; + // ================== keyword related ================================== public static final String KEYWORD = vitroURI+"Keyword"; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/DependentResourceDeleteJena.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/DependentResourceDeleteJena.java index 7e5c31dd5..e839fb382 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/DependentResourceDeleteJena.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/DependentResourceDeleteJena.java @@ -9,26 +9,49 @@ import java.util.List; import java.util.ListIterator; import java.util.Set; +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.Property; import com.hp.hpl.jena.rdf.model.RDFNode; import com.hp.hpl.jena.rdf.model.Resource; import com.hp.hpl.jena.rdf.model.Statement; import com.hp.hpl.jena.rdf.model.StmtIterator; -import com.hp.hpl.jena.vocabulary.RDF; import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary; +/** + * This class handles deletion of resources based on the annotation vitro:dependentResourceAnnot. + * + * The vitro:dependentResourceAnnot + * + * For example, take a graph like: + * + * ex:bob ex:hasPositionHistory ex:positionHistory23 . + * ex:positionHistory23 ex:hasTitle "position 23 was great" . + * ex:hasPositionHistory vitro.dependentResourceAnnot "true"^^xsd:boolean . + * + * When the object property statement ex:bob ex:hasPositionHistory ex:positioinHisroty23 is + * deleted, then everything about ex:positionHistory23 should be deleted because + * ex:hasPositionHistory is a dependent resource property. + * + * @author bdc34 + * + */ public class DependentResourceDeleteJena { public static List getDependentResourceDeleteList ( Statement stmt, Model model){ if( model == null ) throw new IllegalArgumentException("model must not be null."); - return getDependentResourceDeleteList(stmt, model, new HashSet()); + return getDependentResourceDeleteList(stmt, model, new HashSet(), false); } - public static List getDependentResourceDeleteList (RDFNode node, Model model){ - if( model == null ) throw new IllegalArgumentException("model must not be null."); - return getDependentResourceDeleteList(node, model, new HashSet()); + public static List getDependentResourceDeleteList(Resource deleteMe, Model sourceModel) { + List deletes = new LinkedList(); + for( Statement stmt : getAllStatements(deleteMe, sourceModel)){ + deletes.add(stmt); + deletes.addAll(getDependentResourceDeleteList(stmt, sourceModel, new HashSet(), false)); + } + return deletes; } public static Model getDependentResourceDeleteForChange( Model assertions, Model retractions, Model sourceModel){ @@ -103,53 +126,27 @@ public class DependentResourceDeleteJena { return toRemove; } - private static List getDependentResourceDeleteList ( Statement stmt, Model model, Set visitedUris){ + private static List getDependentResourceDeleteList ( Statement stmt, Model model, Set visitedUris, boolean perviousWasDependentResource ){ if( stmt == null ) return Collections.emptyList(); List toDelete = new LinkedList(); + toDelete.add(stmt); RDFNode obj = stmt.getObject(); - if( obj.isLiteral() ){ - toDelete.add(stmt); - }else if( obj.isResource() ){ - Resource res = (Resource)obj.as(Resource.class); - String id = res.isAnon()?res.getId().toString():res.getURI(); - toDelete.add(stmt); - if(!visitedUris.contains(id) && isStubResource(res, model) ){ - visitedUris.add(id); - for( Statement stubStmt : getAllStatements(res, model)){ - toDelete.addAll( getDependentResourceDeleteList(stubStmt, model,visitedUris)); - } - } - } - return toDelete; - } - private static List getDependentResourceDeleteList (RDFNode node, Model model, Set visitedUris){ - if( node == null ) - return Collections.emptyList(); - - List toDelete = new LinkedList(); - - if( node.isLiteral() ){ - //Literals are ignored - }else if( node.isResource() ){ - Resource res = (Resource)node.as(Resource.class); - String id = res.isAnon()?res.getId().toString():res.getURI(); - if(!visitedUris.contains(id) && isStubResource(res, model) ){ - visitedUris.add(id); - for( Statement stubStmt : getAllStatements(res, model)){ - toDelete.addAll( getDependentResourceDeleteList(stubStmt, model,visitedUris) ); - } - } - } - return toDelete; - } - - private static boolean isStubResource(Resource res, Model model){ - //boolean q = res.hasProperty(RDF.type, model.createProperty(VitroVocabulary.DEPENDENT_RESOURCE)); - boolean q = model.contains(res, RDF.type,model.createProperty(VitroVocabulary.DEPENDENT_RESOURCE)); - return q; + if( ( obj.canAs(Resource.class) && isPredicateDependencyRelation(stmt.getPredicate(), model) ) + || ( obj.isAnon() && perviousWasDependentResource ) ){ + Resource res = (Resource)obj.as(Resource.class); + String id = res.isAnon()?res.getId().toString():res.getURI(); + + if( !visitedUris.contains(id) ){ + visitedUris.add(id); + for( Statement stubStmt : getAllStatements(res, model)){ + toDelete.addAll( getDependentResourceDeleteList(stubStmt, model,visitedUris,true)); + } + } + } + return toDelete; } private static List getAllStatements(Resource res, Model model){ @@ -172,5 +169,13 @@ public class DependentResourceDeleteJena { return deleteUs; } + private static boolean isPredicateDependencyRelation( Property predicate , Model model){ + return model.containsLiteral( + model.getResource(predicate.getURI()), + model.createProperty(VitroVocabulary.PROPERTY_DEPENDENCYPROPERTYANNOT), + true); + } + + } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/IndividualJena.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/IndividualJena.java index 729c78821..5e9e6ce83 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/IndividualJena.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/IndividualJena.java @@ -878,5 +878,7 @@ public class IndividualJena extends IndividualImpl implements Individual { } catch (Exception e) { log.error(e); } - } + } + + } diff --git a/webapp/test/edu/cornell/mannlib/vitro/webapp/dao/jena/DependentResourceDeleteJenaTest.java b/webapp/test/edu/cornell/mannlib/vitro/webapp/dao/jena/DependentResourceDeleteJenaTest.java index 549c2a0cd..79b191064 100644 --- a/webapp/test/edu/cornell/mannlib/vitro/webapp/dao/jena/DependentResourceDeleteJenaTest.java +++ b/webapp/test/edu/cornell/mannlib/vitro/webapp/dao/jena/DependentResourceDeleteJenaTest.java @@ -12,12 +12,27 @@ import com.hp.hpl.jena.rdf.model.ModelFactory; import com.hp.hpl.jena.rdf.model.RDFNode; import com.hp.hpl.jena.rdf.model.Statement; import com.hp.hpl.jena.rdf.model.StmtIterator; +import com.hp.hpl.jena.vocabulary.XSD; import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary; public class DependentResourceDeleteJenaTest { - String depRes = "<" + VitroVocabulary.DEPENDENT_RESOURCE + ">"; + String isDependentRelation = + " <"+VitroVocabulary.PROPERTY_DEPENDENCYPROPERTYANNOT+"> \"true\"^^xsd:boolean .\n" ; + + String nosePropIsDependentRel = + "<"+VitroVocabulary.PROPERTY_DEPENDENCYPROPERTYANNOT+"> 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); @@ -28,11 +43,7 @@ public class DependentResourceDeleteJenaTest { @org.junit.Test public void testStmtNormalDelete() { String n3 = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ + prefixesN3 + " ex:bob ex:hasNose ex:nose1 . " ; Model model = (ModelFactory.createDefaultModel()).read(new StringReader(n3), "", "N3"); @@ -53,19 +64,21 @@ public class DependentResourceDeleteJenaTest { @org.junit.Test public void testStmtSimpleForceDelete() { - String n3 = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ + 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 + " ex:bob ex:hasNose ex:nose1 . \n" + - " ex:nose1 rdf:type " + depRes + " . \n" + " ex:nose1 ex:hasHair ex:hair23. \n" + - " ex:hair23 rdf:type " + depRes + " . \n" + " ex:hair23 ex:hasHairCount \"23\". " ; Model model = (ModelFactory.createDefaultModel()).read(new StringReader(n3), "", "N3"); + Model expectedModel = (ModelFactory.createDefaultModel()).read(new StringReader(expected), "", "N3"); List deletes = DependentResourceDeleteJena.getDependentResourceDeleteList( model.createStatement( @@ -77,33 +90,22 @@ public class DependentResourceDeleteJenaTest { Model resultModel = ModelFactory.createDefaultModel(); resultModel.add(deletes); - //all statements should be deleted - boolean same = resultModel.isIsomorphicWith( model ); - Assert.assertTrue( same); + //all statements should be deleted + Assert.assertTrue( resultModel.isIsomorphicWith( expectedModel ) ) ; } @org.junit.Test public void testStmtNonForceDelete() { String n3 = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ + prefixesN3 + " ex:bob ex:hasNose ex:nose1 . \n" + " ex:nose1 ex:hasHair ex:hair23. \n" + - " ex:hair23 rdf:type " + depRes + " . \n" + " ex:hair23 ex:hasHairCount \"23\". " ; String expected = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ + prefixesN3 + " ex:nose1 ex:hasHair ex:hair23. \n" + - " ex:hair23 rdf:type " + depRes + " . \n" + " ex:hair23 ex:hasHairCount \"23\". " ; Model model = (ModelFactory.createDefaultModel()).read(new StringReader(n3), "", "N3"); @@ -127,26 +129,20 @@ public class DependentResourceDeleteJenaTest { @org.junit.Test public void testStmtForceDeleteWithLiterals() { String n3 = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ + prefixesN3 + + nosePropIsDependentRel + + "ex:hasHair " + isDependentRelation + " ex:bob ex:a \"Bob\". \n" + " ex:bob ex:hasNose ex:nose1 . \n" + - " ex:nose1 rdf:type " + depRes + " . \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 rdf:type " + depRes + " . \n" + " ex:hair23 ex:hasHairCount \"23\". " ; String expected = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ + prefixesN3 + + nosePropIsDependentRel + + "ex:hasHair " + isDependentRelation + " ex:bob ex:a \"Bob\". \n" ; Model model = (ModelFactory.createDefaultModel()).read(new StringReader(n3), "", "N3"); @@ -167,30 +163,57 @@ public class DependentResourceDeleteJenaTest { } @org.junit.Test - public void testStmtForceDeleteWithCycles() { + public void testStmtForceDeleteWithSimpleCycles() { String n3 = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ + prefixesN3 + + nosePropIsDependentRel + + "ex:hasHair " + isDependentRelation + + " ex:bob ex:a \"Bob\". \n" + + " ex:bob ex:hasNose ex:nose1 . \n" + + " ex:nose1 ex:c ex:bob ." ; + + String expected = + prefixesN3 + + nosePropIsDependentRel + + "ex:hasHair " + isDependentRelation + + " ex:bob ex:a \"Bob\"." ; + + Model model = (ModelFactory.createDefaultModel()).read(new StringReader(n3), "", "N3"); + + List deletes = DependentResourceDeleteJena.getDependentResourceDeleteList( + model.createStatement( + model.createResource("http://example.com/bob"), + model.createProperty("http://example.com/hasNose"), + model.createResource("http://example.com/nose1")), + model); + + model.remove(deletes); + + Model expectedModel = (ModelFactory.createDefaultModel()).read(new StringReader(expected), "", "N3"); + boolean same = expectedModel.isIsomorphicWith( model ); + if( ! same ) printModels( expectedModel, model); + Assert.assertTrue( same ); + } + + @org.junit.Test + public void testStmtForceDeleteWithCycles() { + String n3 = + prefixesN3 + + nosePropIsDependentRel + + "ex:hasHair " + isDependentRelation + " ex:bob ex:a \"Bob\". \n" + " ex:bob ex:hasNose ex:nose1 . \n" + - " ex:nose1 rdf:type " + depRes + " . \n" + " ex:nose1 ex:a \"this is a literal\". \n" + " ex:nose1 ex:b \"2343\" . \n" + " ex:nose1 ex:c ex:bob . \n" + " ex:nose1 ex:hasHair ex:hair23. \n" + - " ex:hair23 rdf:type " + depRes + " . \n" + " ex:hair23 ex:c ex:bob . \n" + " ex:hair23 ex:hasHairCount \"23\". " ; String expected = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ + prefixesN3 + + nosePropIsDependentRel + + "ex:hasHair " + isDependentRelation + " ex:bob ex:a \"Bob\". \n" ; Model model = (ModelFactory.createDefaultModel()).read(new StringReader(n3), "", "N3"); @@ -213,25 +236,18 @@ public class DependentResourceDeleteJenaTest { @org.junit.Test public void testStmtForceDeleteWithCycles2() { String n3 = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ + prefixesN3 + + nosePropIsDependentRel + " ex:bob ex:a \"Bob\". \n" + " ex:bob ex:hasNose ex:nose1 . \n" + - " ex:nose1 rdf:type " + depRes + " . \n" + " ex:nose1 ex:a \"this is a literal\". \n" + " ex:nose1 ex:b \"2343\" . \n" + " ex:nose1 ex:c ex:nose1 . \n" + " ex:nose1 ex:c ex:bob . \n" ; String expected = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ + prefixesN3 + + nosePropIsDependentRel + " ex:bob ex:a \"Bob\". \n" ; Model model = (ModelFactory.createDefaultModel()).read(new StringReader(n3), "", "N3"); @@ -254,24 +270,17 @@ public class DependentResourceDeleteJenaTest { @org.junit.Test public void testStmtForceDeleteWithLinks() { String n3 = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ + prefixesN3 + + nosePropIsDependentRel + " ex:bob ex:a \"Bob\". \n" + " ex:bob ex:hasNose ex:nose1 . \n" + - " ex:nose1 rdf:type " + depRes + " . \n" + " ex:nose1 ex:c ex:glasses65 . \n" + " ex:glasses65 ex:c ex:nose1 . \n" + " ex:glasses65 ex:a \"glasses 65\" ." ; String expected = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ + prefixesN3 + + nosePropIsDependentRel + " ex:bob ex:a \"Bob\". \n" + " ex:glasses65 ex:a \"glasses 65\" ." ; @@ -295,24 +304,17 @@ public class DependentResourceDeleteJenaTest { @org.junit.Test public void testStmtForceDeleteWithBNodes() { String n3 = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ + prefixesN3 + + nosePropIsDependentRel + " ex:bob ex:a \"Bob\". \n" + " ex:bob ex:hasNose [ \n" + - " rdf:type " + depRes + " ; \n" + " ex:a \"this is a bnode\"; \n" + " ex:c ex:glasses65 ] . \n" + " ex:glasses65 ex:a \"glasses 65\" ." ; String expected = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ + prefixesN3 + + nosePropIsDependentRel + " ex:bob ex:a \"Bob\". \n" + " ex:glasses65 ex:a \"glasses 65\" ." ; @@ -336,27 +338,20 @@ public class DependentResourceDeleteJenaTest { @org.junit.Test public void testStmtForceDeleteWithNestedBNodes() { String n3 = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ + prefixesN3 + + nosePropIsDependentRel + " ex:bob ex:a \"Bob\". \n" + " ex:bob ex:hasNose [ \n" + - " rdf:type " + depRes + " ; \n" + " ex:a \"this is a bnode\"; \n" + " ex:c ex:glasses65 ; \n" + - " ex:c [ rdf:type " + depRes + " ;" + + " ex:c [ " + " ex:a \"this is a nested bnode\" ] " + "] . \n" + " ex:glasses65 ex:a \"glasses 65\" ." ; String expected = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ + prefixesN3 + + nosePropIsDependentRel + " ex:bob ex:a \"Bob\". \n" + " ex:glasses65 ex:a \"glasses 65\" ." ; @@ -377,47 +372,51 @@ public class DependentResourceDeleteJenaTest { Assert.assertTrue( same ); } - - - - @org.junit.Test public void testResNormalDelete() { String n3 = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ - " ex:bob ex:hasNose ex:nose1 . " ; - Model model = (ModelFactory.createDefaultModel()).read(new StringReader(n3), "", "N3"); + prefixesN3 + + nosePropIsDependentRel + + " ex:bob ex:hasNose ex:nose1 . " ; + String expected = + prefixesN3 + + nosePropIsDependentRel ; + + Model model = (ModelFactory.createDefaultModel()).read(new StringReader(n3), "", "N3"); + Model expectedModel = (ModelFactory.createDefaultModel()).read(new StringReader(expected), "", "N3"); + List deletes = DependentResourceDeleteJena.getDependentResourceDeleteList( - model.createResource("http://example.com/nose1"),model); - Assert.assertTrue( deletes != null && deletes.size() ==0 ); + model.createResource("http://example.com/nose1"),model); + Model resultModel = model.remove(deletes); + + //all statements should be deleted + boolean same = resultModel.isIsomorphicWith( expectedModel ); + if( ! same ) printModels( expectedModel, model); + Assert.assertTrue( same); } @org.junit.Test public void testResSimpleForceDelete() { String n3 = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ + prefixesN3 + + nosePropIsDependentRel + " ex:bob ex:hasNose ex:nose1 . \n" + - " ex:nose1 rdf:type " + depRes + " . \n" + " ex:nose1 ex:hasHair ex:hair23. \n" + - " ex:hair23 rdf:type " + depRes + " . \n" + + " ex:hair23 ex:hasHairCount \"23\". " ; + String expected = + prefixesN3 + + nosePropIsDependentRel + " ex:hair23 ex:hasHairCount \"23\". " ; Model model = (ModelFactory.createDefaultModel()).read(new StringReader(n3), "", "N3"); + Model expectedModel = (ModelFactory.createDefaultModel()).read(new StringReader(expected), "", "N3"); List deletes = DependentResourceDeleteJena.getDependentResourceDeleteList( model.createResource("http://example.com/nose1"),model); - Model resultModel = ModelFactory.createDefaultModel(); - resultModel.add(deletes); + Model resultModel = model.remove(deletes); //all statements should be deleted - boolean same = resultModel.isIsomorphicWith( model ); + boolean same = resultModel.isIsomorphicWith( expectedModel ); + if( ! same ) printModels( expectedModel, model); Assert.assertTrue( same); } @@ -425,45 +424,68 @@ public class DependentResourceDeleteJenaTest { @org.junit.Test public void testResNonForceDelete() { String n3 = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ + prefixesN3 + " ex:bob ex:hasNose ex:nose1 . \n" + " ex:nose1 ex:hasHair ex:hair23. \n" + - " ex:hair23 rdf:type " + depRes + " . \n" + " ex:hair23 ex:hasHairCount \"23\". " ; - Model model = (ModelFactory.createDefaultModel()).read(new StringReader(n3), "", "N3"); - List deletes = DependentResourceDeleteJena.getDependentResourceDeleteList( - model.createResource("http://example.com/nose1"),model); - Assert.assertTrue( deletes != null && deletes.size() == 0); + String expected = + prefixesN3 + + " ex:hair23 ex:hasHairCount \"23\". " ; + Model model = (ModelFactory.createDefaultModel()).read(new StringReader(n3), "", "N3"); + Model expectedModel = (ModelFactory.createDefaultModel()).read(new StringReader(expected), "", "N3"); + + List deletes = DependentResourceDeleteJena.getDependentResourceDeleteList( + model.createResource("http://example.com/nose1"),model); + Model resultModel = model.remove(deletes); + + //all statements should be deleted + boolean same = resultModel.isIsomorphicWith( expectedModel ); + if( ! same ) printModels( expectedModel, model); + Assert.assertTrue( same); } + @org.junit.Test + public void testResNonForceDelete2() { + String n3 = + prefixesN3 + + nosePropIsDependentRel + + " ex:bob ex:hasNose ex:nose1 . \n" + + " ex:nose1 ex:hasHair ex:hair23. \n" + + " ex:hair23 ex:hasHairCount \"23\". " ; + String expected = + prefixesN3 + + nosePropIsDependentRel + + " ex:hair23 ex:hasHairCount \"23\". " ; + Model model = (ModelFactory.createDefaultModel()).read(new StringReader(n3), "", "N3"); + Model expectedModel = (ModelFactory.createDefaultModel()).read(new StringReader(expected), "", "N3"); + + List deletes = DependentResourceDeleteJena.getDependentResourceDeleteList( + model.createResource("http://example.com/nose1"),model); + Model resultModel = model.remove(deletes); + + //all statements should be deleted + boolean same = resultModel.isIsomorphicWith( expectedModel ); + if( ! same ) printModels( expectedModel, model); + Assert.assertTrue( same); + } @org.junit.Test public void testResForceDeleteWithLiterals() { String n3 = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ + prefixesN3 + + nosePropIsDependentRel + + " ex:hasHair " + isDependentRelation + " ex:bob ex:a \"Bob\". \n" + " ex:bob ex:hasNose ex:nose1 . \n" + - " ex:nose1 rdf:type " + depRes + " . \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 rdf:type " + depRes + " . \n" + " ex:hair23 ex:hasHairCount \"23\". " ; String expected = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ + prefixesN3 + + nosePropIsDependentRel + + " ex:hasHair " + isDependentRelation + " ex:bob ex:a \"Bob\". \n" ; Model model = (ModelFactory.createDefaultModel()).read(new StringReader(n3), "", "N3"); @@ -477,32 +499,26 @@ public class DependentResourceDeleteJenaTest { if( ! same ) printModels( expectedModel, model); Assert.assertTrue( same ); } - + @org.junit.Test public void testResForceDeleteWithCycles() { String n3 = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ + prefixesN3 + + nosePropIsDependentRel + + "ex:hasHair " + isDependentRelation + " ex:bob ex:a \"Bob\". \n" + " ex:bob ex:hasNose ex:nose1 . \n" + - " ex:nose1 rdf:type " + depRes + " . \n" + " ex:nose1 ex:a \"this is a literal\". \n" + " ex:nose1 ex:b \"2343\" . \n" + " ex:nose1 ex:c ex:bob . \n" + " ex:nose1 ex:hasHair ex:hair23. \n" + - " ex:hair23 rdf:type " + depRes + " . \n" + " ex:hair23 ex:c ex:bob . \n" + " ex:hair23 ex:hasHairCount \"23\". " ; String expected = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ + prefixesN3 + + nosePropIsDependentRel + + "ex:hasHair " + isDependentRelation + " ex:bob ex:a \"Bob\". \n" ; Model model = (ModelFactory.createDefaultModel()).read(new StringReader(n3), "", "N3"); @@ -520,30 +536,22 @@ public class DependentResourceDeleteJenaTest { @org.junit.Test public void testResForceDeleteWithCycles2() { String n3 = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ + prefixesN3 + + nosePropIsDependentRel + " ex:bob ex:a \"Bob\". \n" + " ex:bob ex:hasNose ex:nose1 . \n" + - " ex:nose1 rdf:type " + depRes + " . \n" + " ex:nose1 ex:a \"this is a literal\". \n" + " ex:nose1 ex:b \"2343\" . \n" + " ex:nose1 ex:c ex:nose1 . \n" + " ex:nose1 ex:c ex:bob . \n" ; String expected = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ - " ex:bob ex:a \"Bob\". \n" ; + prefixesN3 + + nosePropIsDependentRel ; Model model = (ModelFactory.createDefaultModel()).read(new StringReader(n3), "", "N3"); List deletes = DependentResourceDeleteJena.getDependentResourceDeleteList( - model.createResource("http://example.com/nose1"),model); + model.createResource("http://example.com/bob"),model); model.remove(deletes); Model expectedModel = (ModelFactory.createDefaultModel()).read(new StringReader(expected), "", "N3"); @@ -555,24 +563,17 @@ public class DependentResourceDeleteJenaTest { @org.junit.Test public void testResForceDeleteWithLinks() { String n3 = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ + prefixesN3 + + nosePropIsDependentRel + " ex:bob ex:a \"Bob\". \n" + " ex:bob ex:hasNose ex:nose1 . \n" + - " ex:nose1 rdf:type " + depRes + " . \n" + " ex:nose1 ex:c ex:glasses65 . \n" + " ex:glasses65 ex:c ex:nose1 . \n" + " ex:glasses65 ex:a \"glasses 65\" ." ; String expected = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ + prefixesN3 + + nosePropIsDependentRel + " ex:bob ex:a \"Bob\". \n" + " ex:glasses65 ex:a \"glasses 65\" ." ; Model model = (ModelFactory.createDefaultModel()).read(new StringReader(n3), "", "N3"); @@ -587,117 +588,97 @@ public class DependentResourceDeleteJenaTest { Assert.assertTrue( same ); } - @org.junit.Test - public void testResForceDeleteWithBNodes() { - String n3 = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ - " ex:bob ex:a \"Bob\". \n" + - " ex:bob ex:hasNose [ \n" + - " rdf:type " + depRes + " ; \n" + - " ex:a \"this is a bnode\"; \n" + - " ex:c ex:glasses65 ] . \n" + - " ex:glasses65 ex:a \"glasses 65\" ." ; - - String expected = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ - " ex:bob ex:a \"Bob\". \n" + - " ex:glasses65 ex:a \"glasses 65\" ." ; - Model model = (ModelFactory.createDefaultModel()).read(new StringReader(n3), "", "N3"); - - StmtIterator stmtIt = model.listStatements( - model.createResource("http://example.com/bob"), - model.createProperty("http://example.com/hasNose"), - (RDFNode)null); - - RDFNode bnode = stmtIt.nextStatement().getObject(); - - List deletes = - DependentResourceDeleteJena.getDependentResourceDeleteList(bnode,model); - model.remove(deletes); - - Model expectedModel = (ModelFactory.createDefaultModel()).read(new StringReader(expected), "", "N3"); - boolean same = expectedModel.isIsomorphicWith( model ); - if( ! same ) printModels( expectedModel, model); - Assert.assertTrue( same ); - } +// @org.junit.Test +// public void testResForceDeleteWithBNodes() { +// String n3 = +// prefixesN3 + +// nosePropIsDependentRel + +// " ex:bob ex:a \"Bob\". \n" + +// " ex:bob ex:hasNose [ \n" + +// " ex:a \"this is a bnode\"; \n" + +// " ex:c ex:glasses65 ] . \n" + +// " ex:glasses65 ex:a \"glasses 65\" ." ; +// +// String expected = +// prefixesN3 + +// nosePropIsDependentRel + +// " ex:bob ex:a \"Bob\". \n" + +// " ex:glasses65 ex:a \"glasses 65\" ." ; +// Model model = (ModelFactory.createDefaultModel()).read(new StringReader(n3), "", "N3"); +// +// StmtIterator stmtIt = model.listStatements( +// model.createResource("http://example.com/bob"), +// model.createProperty("http://example.com/hasNose"), +// (RDFNode)null); +// +// RDFNode bnode = stmtIt.nextStatement().getObject(); +// +// List deletes = +// DependentResourceDeleteJena.getDependentResourceDeleteList(bnode,model); +// model.remove(deletes); +// +// Model expectedModel = (ModelFactory.createDefaultModel()).read(new StringReader(expected), "", "N3"); +// boolean same = expectedModel.isIsomorphicWith( model ); +// if( ! same ) printModels( expectedModel, model); +// Assert.assertTrue( same ); +// } - @org.junit.Test - public void testResForceDeleteWithNestedBNodes() { - String n3 = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ - " ex:bob ex:a \"Bob\". \n" + - " ex:bob ex:hasNose [ \n" + - " rdf:type " + depRes + " ; \n" + - " ex:a \"this is a bnode\"; \n" + - " ex:c ex:glasses65 ; \n" + - " ex:c [ rdf:type " + depRes + " ;" + - " ex:a \"this is a nested bnode\" ] " + - "] . \n" + - " ex:glasses65 ex:a \"glasses 65\" ." ; - - String expected = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ - " ex:bob ex:a \"Bob\". \n" + - " ex:glasses65 ex:a \"glasses 65\" ." ; - - Model model = (ModelFactory.createDefaultModel()).read(new StringReader(n3), "", "N3"); - - StmtIterator stmtIt = model.listStatements( - model.createResource("http://example.com/bob"), - model.createProperty("http://example.com/hasNose"), - (RDFNode)null); - RDFNode bnode = stmtIt.nextStatement().getObject(); - - List deletes = - DependentResourceDeleteJena.getDependentResourceDeleteList(bnode,model); - model.remove(deletes); - - Model expectedModel = (ModelFactory.createDefaultModel()).read(new StringReader(expected), "", "N3"); - boolean same = expectedModel.isIsomorphicWith( model ); - if( ! same ) printModels( expectedModel, model); - Assert.assertTrue( same ); - } +// @org.junit.Test +// public void testResForceDeleteWithNestedBNodes() { +// String n3 = +// prefixesN3 + +// nosePropIsDependentRel + +// " ex:bob ex:a \"Bob\". \n" + +// " ex:bob ex:hasNose [ \n" + +// " ex:a \"this is a bnode\"; \n" + +// " ex:c ex:glasses65 ; \n" + +// " ex:c [ " + +// " ex:a \"this is a nested bnode\" ] " + +// "] . \n" + +// " ex:glasses65 ex:a \"glasses 65\" ." ; +// +// String expected = +// prefixesN3 + +// nosePropIsDependentRel + +// " ex:bob ex:a \"Bob\". \n" + +// " ex:glasses65 ex:a \"glasses 65\" ." ; +// +// Model model = (ModelFactory.createDefaultModel()).read(new StringReader(n3), "", "N3"); +// +// StmtIterator stmtIt = model.listStatements( +// model.createResource("http://example.com/bob"), +// model.createProperty("http://example.com/hasNose"), +// (RDFNode)null); +// RDFNode bnode = stmtIt.nextStatement().getObject(); +// +// List deletes = +// DependentResourceDeleteJena.getDependentResourceDeleteList(bnode,model); +// model.remove(deletes); +// +// Model expectedModel = (ModelFactory.createDefaultModel()).read(new StringReader(expected), "", "N3"); +// boolean same = expectedModel.isIsomorphicWith( model ); +// if( ! same ) printModels( expectedModel, model); +// Assert.assertTrue( same ); +// } @org.junit.Test public void testDeleteForChange() { String source = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ + prefixesN3 + + nosePropIsDependentRel + + "ex:hasHair " + isDependentRelation + " ex:bob ex:a \"Bob\". \n" + " ex:bob ex:hasNose ex:nose1 . \n" + - " ex:nose1 rdf:type " + depRes + " . \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 rdf:type " + depRes + " . \n" + " ex:hair23 ex:hasHairCount \"23\". " ; String expected = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ + prefixesN3 + + nosePropIsDependentRel + + "ex:hasHair " + isDependentRelation + " ex:bob ex:a \"Bob\". \n" ; String retractions = @@ -722,35 +703,25 @@ public class DependentResourceDeleteJenaTest { @org.junit.Test public void testDeleteForChangeWithReplace() { String source = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ + prefixesN3 + + nosePropIsDependentRel + " ex:bob ex:a \"Bob\". \n" + " ex:jim ex:a \"Jim\". \n" + " ex:bob ex:hasNose ex:nose1 . \n" + - " ex:nose1 rdf:type " + depRes + " . \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 rdf:type " + depRes + " . \n" + " ex:hair23 ex:hasHairCount \"23\". " ; String expected = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ + prefixesN3 + + nosePropIsDependentRel + " ex:jim ex:a \"Jim\". \n" + " ex:bob ex:a \"Bob\". \n" + " ex:jim ex:hasNose ex:nose1 . \n" + - " ex:nose1 rdf:type " + depRes + " . \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 rdf:type " + depRes + " . \n" + " ex:hair23 ex:hasHairCount \"23\". " ; String additions = @@ -777,48 +748,51 @@ public class DependentResourceDeleteJenaTest { Assert.assertTrue( same ); } - @org.junit.Ignore @org.junit.Test + + @org.junit.Test public void testDeleteWithNonZeroInDegree() { /* - This tests deleteing a position context node from the orginization side. - Currently the required behaivor is that the position context node not be - deleted when the object property statement is deleted from the org side. + This tests deleting a position context node from the organization side. + Currently the required behavior is that the position context node not be + deleted when the object property statement is deleted from the organization side. */ String source = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ + prefixesN3 + + " ex:personHasPosition " + isDependentRelation + " ex:bob ex:a \"Bob\". \n" + " ex:orgP ex:a \"orgP\". \n" + - " ex:bob ex:hasPosition ex:position1 . \n" + - " ex:orgP ex:hasPosition ex:position1 . \n" + - " ex:position1 rdf:type " + depRes + " . \n" + + " ex:bob ex:personHasPosition ex:position1 . \n" + + " ex:orgP ex:positionInOrganization ex:position1 . \n" + " ex:position1 ex:a \"This is Position1\". \n" + " ex:position1 ex:b \"2343\" . "; String expected = - "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + - "@prefix ex: . \n" + - "@prefix rdf: . \n"+ - "@prefix rdfs: . \n"+ - "@prefix owl: . \n"+ + prefixesN3 + + " ex:personHasPosition " + isDependentRelation + " ex:bob ex:a \"Bob\". \n" + " ex:orgP ex:a \"orgP\". \n" + - " ex:bob ex:hasPosition ex:position1 . \n" + - " ex:position1 rdf:type " + depRes + " . \n" + + " ex:bob ex:personHasPosition ex:position1 . \n" + " ex:position1 ex:a \"This is Position1\". \n" + " ex:position1 ex:hasOrgName \"org xyz\" . \n" + " ex:position1 ex:b \"2343\" . "; + +// prefixesN3 + +// " ex:bob ex:a \"Bob\". \n" + +// " ex:orgP ex:a \"orgP\". \n" + +// " ex:bob ex:hasPosition ex:position1 . \n" + +// " ex:position1 ex:a \"This is Position1\". \n" + +// " ex:position1 ex:hasOrgName \"org xyz\" . \n" + +// " ex:position1 ex:b \"2343\" . "; String additions = - "@prefix ex: . \n" + + "@prefix ex: . \n" + + "@prefix xsd: <" + XSD.getURI() + "> . \n " + " ex:position1 ex:hasOrgName \"org xyz\" . "; String retractions = - "@prefix ex: . \n" + - " ex:orgP ex:hasPosition ex:position1 . "; + "@prefix ex: . \n" + + "@prefix xsd: <" + XSD.getURI() + "> . \n " + + " ex:orgP ex:positionInOrganization ex:position1 . "; Model sourceModel = (ModelFactory.createDefaultModel()).read(new StringReader(source), "", "N3"); Model additionsModel = (ModelFactory.createDefaultModel()).read(new StringReader(additions), "", "N3"); @@ -836,4 +810,50 @@ public class DependentResourceDeleteJenaTest { Assert.assertTrue( same ); } + @org.junit.Test + public void testDeleteWithNonZeroInDegree2() { + /* + This tests deleting a position context node from the organization side. + Currently the required behavior is that the position context node not be + deleted when the object property statement is deleted from the organization side. + */ + String source = + prefixesN3 + + " ex:personHasPosition " + isDependentRelation + + " ex:bob ex:a \"Bob\". \n" + + " ex:orgP ex:a \"orgP\". \n" + + " ex:bob ex:personHasPosition ex:position1 . \n" + + " ex:orgP ex:positionInOrganization ex:position1 . \n" + + " ex:position1 ex:a \"This is Position1\". \n" + + " ex:position1 ex:b \"2343\" . "; + + String expected = + prefixesN3 + + " ex:personHasPosition " + isDependentRelation + + " ex:bob ex:a \"Bob\". \n" + + " ex:orgP ex:a \"orgP\". \n" + + " ex:bob ex:personHasPosition ex:position1 . \n" + + " ex:position1 ex:a \"This is Position1\". \n" + + " ex:position1 ex:b \"2343\" . "; + + String retractions = + "@prefix ex: . \n" + + "@prefix xsd: <" + XSD.getURI() + "> . \n " + + " ex:orgP ex:positionInOrganization ex:position1 . "; + + Model sourceModel = (ModelFactory.createDefaultModel()).read(new StringReader(source), "", "N3"); + Model additionsModel = ModelFactory.createDefaultModel(); //no additions + Model retractionsModel = (ModelFactory.createDefaultModel()).read(new StringReader(retractions), "", "N3"); + + Model depDeletes = + DependentResourceDeleteJena.getDependentResourceDeleteForChange(additionsModel, retractionsModel, sourceModel); + sourceModel.remove(depDeletes); + sourceModel.remove(retractionsModel); + sourceModel.add(additionsModel); + + Model expectedModel = (ModelFactory.createDefaultModel()).read(new StringReader(expected), "", "N3"); + boolean same = expectedModel.isIsomorphicWith( sourceModel ); + if( ! same ) printModels( expectedModel, sourceModel); + Assert.assertTrue( same ); + } } 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 9835696b8..5cb968cca 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 @@ -13,7 +13,10 @@ import com.hp.hpl.jena.ontology.OntModelSpec; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; import com.hp.hpl.jena.rdf.model.StmtIterator; +import com.hp.hpl.jena.vocabulary.OWL; import com.hp.hpl.jena.vocabulary.RDF; +import com.hp.hpl.jena.vocabulary.RDFS; +import com.hp.hpl.jena.vocabulary.XSD; import edu.cornell.mannlib.vitro.webapp.beans.DataProperty; import edu.cornell.mannlib.vitro.webapp.beans.DataPropertyStatement; @@ -29,141 +32,104 @@ import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary; public class JenaBaseDaoTest { + String isDependentRelation = + " <"+VitroVocabulary.PROPERTY_DEPENDENCYPROPERTYANNOT+"> \"true\"^^xsd:boolean .\n" ; + String nosePropIsDependentRel = + "<"+VitroVocabulary.PROPERTY_DEPENDENCYPROPERTYANNOT+"> rdf:type owl:AnnotationProperty .\n" + + " ex:hasNose " + isDependentRelation; + + String prefixesN3 = + "@prefix vitro: <" + VitroVocabulary.vitroURI + "> . \n" + + "@prefix xsd: <" + XSD.getURI() + "> . \n " + + "@prefix rdf: <" + RDF.getURI() + "> . \n"+ + "@prefix rdfs: <" + RDFS.getURI() + "> . \n"+ + "@prefix owl: <" + OWL.getURI() + "> . \n" + + "@prefix ex: . \n" ; + @Test public void smartRemoveTestForIndivdiualDelete(){ - OntModel model = ModelFactory.createOntologyModel(); - WebappDaoFactoryJena wdfj = new WebappDaoFactoryJena( model ); - - /* Need to have the DEPENDENT_RESOURCE class in the model */ - VClass cls = new VClass(); - cls.setURI(VitroVocabulary.DEPENDENT_RESOURCE); - try { - wdfj.getVClassDao().insertNewVClass(cls); - } catch (InsertException e1) { - Assert.fail("could not create class for dependentResourc"); - } + String n3 = prefixesN3 + + "ex:prop1 rdf:type owl:ObjectProperty ." + + "ex:prop1 rdfs:label \"Prop 1 Dependent Relation\" ." + + "ex:prop1 " + isDependentRelation; + + Model readInModel = (ModelFactory.createDefaultModel()).read(new StringReader(n3), "", "N3"); + OntModel ontModel = ModelFactory.createOntologyModel(); + ontModel.add(readInModel); + WebappDaoFactoryJena wdfj = new WebappDaoFactoryJena( ontModel); - /* Need to have an Object Property */ - ObjectProperty op = new ObjectProperty(); - op.setURI("http://example.com/prop1"); - try { - wdfj.getObjectPropertyDao().insertObjectProperty(op); - } catch (InsertException e1) { - Assert.fail("Could not create object property."); - } - - Individual ind = new IndividualImpl(); - ind.setURI("http://example.com/bob"); - ind.setName("Smith, Bob"); - try { - wdfj.getIndividualDao().insertNewIndividual(ind); - } catch (InsertException e) { - Assert.fail("Could not create new Individual Smith, Bob"); - } - - Individual indxyz = new IndividualImpl(); - indxyz.setURI("http://example.com/depResXYZ"); - indxyz.setName("depResXYZ"); - indxyz.setVClassURI(VitroVocabulary.DEPENDENT_RESOURCE); try { + ObjectProperty prop1 = wdfj.getObjectPropertyDao().getObjectPropertyByURI("http://example.com/prop1"); + Assert.assertNotNull(prop1); + + Individual ind = new IndividualImpl(); + ind.setURI("http://example.com/bob"); + ind.setName("Smith, Bob"); + + wdfj.getIndividualDao().insertNewIndividual(ind); + + Individual indxyz = new IndividualImpl(); + indxyz.setURI("http://example.com/depResXYZ"); + indxyz.setName("depResXYZ"); wdfj.getIndividualDao().insertNewIndividual(indxyz); - } catch (InsertException e) { - Assert.fail("Could not create new Individual depResXYZ"); - } - StmtIterator it = model.listStatements(model.createResource("http://example.com/depResXYZ"), - RDF.type, model.createResource(VitroVocabulary.DEPENDENT_RESOURCE)); - Assert.assertTrue("depResXYZ did not get rdf:type vitro:dependentResource" , - it != null && it.nextStatement() != null); + + Individual indAbc = new IndividualImpl(); + indAbc.setURI("http://example.com/depResNested"); + indAbc.setName("depResNested"); + wdfj.getIndividualDao().insertNewIndividual(indAbc); - Individual indAbc = new IndividualImpl(); - indAbc.setURI("http://example.com/depResNested"); - indAbc.setName("depResNested"); - indAbc.setVClassURI(VitroVocabulary.DEPENDENT_RESOURCE); - try { - wdfj.getIndividualDao().insertNewIndividual(indAbc); - } catch (InsertException e) { - Assert.fail("Could not create new Individual depResNested"); - } - it = model.listStatements(model.createResource("http://example.com/depResNested"), - RDF.type, model.createResource(VitroVocabulary.DEPENDENT_RESOURCE)); - Assert.assertTrue("depResNested did not get rdf:type vitro:dependentResource" , - it != null && it.nextStatement() != null); + ObjectPropertyStatement ops = new ObjectPropertyStatementImpl(); + ops.setSubjectURI("http://example.com/bob"); + ops.setPropertyURI("http://example.com/prop1"); + ops.setObjectURI("http://example.com/depResXYZ"); + wdfj.getObjectPropertyStatementDao().insertNewObjectPropertyStatement(ops); - - ObjectPropertyStatement ops = new ObjectPropertyStatementImpl(); - ops.setSubjectURI("http://example.com/bob"); - ops.setPropertyURI("http://example.com/prop1"); - ops.setObjectURI("http://example.com/depResXYZ"); - wdfj.getObjectPropertyStatementDao().insertNewObjectPropertyStatement(ops); - - ops = new ObjectPropertyStatementImpl(); - ops.setSubjectURI("http://example.com/depResXYZ"); - ops.setPropertyURI("http://example.com/prop1"); - ops.setObjectURI("http://example.com/depResNested"); - wdfj.getObjectPropertyStatementDao().insertNewObjectPropertyStatement(ops); - - String expected = " \n"+ - " \n"+ - " 2010-01-25T15:27:54\n"+ - " Smith, Bob\n"+ - " \n"+ - " \n"+ - " \n"+ - " -1\n"+ - " -1\n"+ - " \n"+ - " \n"+ - " \n"+ - " true\n"+ - " 5\n"+ - " \n"+ - " \n"+ - ""; - - wdfj.getIndividualDao().deleteIndividual("http://example.com/depResXYZ"); - - - Model expectedModel = (ModelFactory.createOntologyModel()).read(new StringReader(expected), "", "RDF/XML"); - - //modtime times make it difficult to compare graphs - wipeOutModTime(expectedModel); - wipeOutModTime(model); - - Assert.assertTrue( model.isIsomorphicWith(expectedModel)); + ops = new ObjectPropertyStatementImpl(); + ops.setSubjectURI("http://example.com/depResXYZ"); + ops.setPropertyURI("http://example.com/prop1"); + ops.setObjectURI("http://example.com/depResNested"); + wdfj.getObjectPropertyStatementDao().insertNewObjectPropertyStatement(ops); + + wdfj.getIndividualDao().deleteIndividual("http://example.com/depResXYZ"); + + String expected = + "@prefix xsd: . "+ + "@prefix rdfs: ."+ + "@prefix rdf: ."+ + "@prefix owl: . "+ + " a owl:Thing ; " + + " rdfs:label \"Smith, Bob\"@en-US . "+ + " " + + " a owl:ObjectProperty ; " + + " rdfs:label \"Prop 1 Dependent Relation\" ; " + + " \"true\"^^xsd:boolean ." ; + + Model expectedModel = (ModelFactory.createOntologyModel()).read(new StringReader(expected), "", "N3"); + + //modtime times make it difficult to compare graphs + wipeOutModTime(expectedModel); + wipeOutModTime(ontModel); + + Assert.assertTrue( ontModel.isIsomorphicWith(expectedModel) ); + } catch (InsertException e) { + Assert.fail(e.getMessage()); + } } @Test public void smartRemoveTestForObjPropStmtDelete(){ - + String n3 = prefixesN3 + + "ex:prop1 rdf:type owl:ObjectProperty ." + + "ex:prop1 rdfs:label \"Prop 1 Dependent Relation\" ." + + "ex:prop1 " + isDependentRelation; + + Model readInModel = (ModelFactory.createDefaultModel()).read(new StringReader(n3), "", "N3"); OntModel model = ModelFactory.createOntologyModel(); - WebappDaoFactoryJena wdfj = new WebappDaoFactoryJena( model ); - - /* Need to have the DEPENDENT_RESOURCE class in the model */ - VClass cls = new VClass(); - cls.setURI(VitroVocabulary.DEPENDENT_RESOURCE); - try { - wdfj.getVClassDao().insertNewVClass(cls); - } catch (InsertException e1) { - Assert.fail("could not create class for dependentResourc"); - } - - /* Need to have an Object Property */ - ObjectProperty op = new ObjectProperty(); - op.setURI("http://example.com/prop1"); - try { - wdfj.getObjectPropertyDao().insertObjectProperty(op); - } catch (InsertException e1) { - Assert.fail("Could not create object property."); - } - + model.add(readInModel); + WebappDaoFactoryJena wdfj = new WebappDaoFactoryJena( model); + Individual ind = new IndividualImpl(); ind.setURI("http://example.com/bob"); ind.setName("Smith, Bob"); @@ -176,31 +142,20 @@ public class JenaBaseDaoTest { Individual indxyz = new IndividualImpl(); indxyz.setURI("http://example.com/depResXYZ"); indxyz.setName("depResXYZ"); - indxyz.setVClassURI(VitroVocabulary.DEPENDENT_RESOURCE); try { wdfj.getIndividualDao().insertNewIndividual(indxyz); } catch (InsertException e) { Assert.fail("Could not create new Individual depResXYZ"); } - StmtIterator it = model.listStatements(model.createResource("http://example.com/depResXYZ"), - RDF.type, model.createResource(VitroVocabulary.DEPENDENT_RESOURCE)); - Assert.assertTrue("depResXYZ did not get rdf:type vitro:dependentResource" , - it != null && it.nextStatement() != null); Individual indAbc = new IndividualImpl(); indAbc.setURI("http://example.com/depResNested"); indAbc.setName("depResNested"); - indAbc.setVClassURI(VitroVocabulary.DEPENDENT_RESOURCE); try { wdfj.getIndividualDao().insertNewIndividual(indAbc); } catch (InsertException e) { Assert.fail("Could not create new Individual depResNested"); - } - it = model.listStatements(model.createResource("http://example.com/depResNested"), - RDF.type, model.createResource(VitroVocabulary.DEPENDENT_RESOURCE)); - Assert.assertTrue("depResNested did not get rdf:type vitro:dependentResource" , - it != null && it.nextStatement() != null); - + } ObjectPropertyStatement ops = new ObjectPropertyStatementImpl(); ops.setSubjectURI("http://example.com/bob"); @@ -214,147 +169,201 @@ public class JenaBaseDaoTest { ops.setObjectURI("http://example.com/depResNested"); wdfj.getObjectPropertyStatementDao().insertNewObjectPropertyStatement(ops); - String expected = " \n"+ - " \n"+ - " 2010-01-25T15:27:54\n"+ - " Smith, Bob\n"+ - " \n"+ - " \n"+ - " \n"+ - " -1\n"+ - " -1\n"+ - " \n"+ - " \n"+ - " \n"+ - " true\n"+ - " 5\n"+ - " \n"+ - " \n"+ - ""; - - ops = new ObjectPropertyStatementImpl(); ops.setSubjectURI("http://example.com/bob"); ops.setPropertyURI("http://example.com/prop1"); ops.setObjectURI("http://example.com/depResXYZ"); wdfj.getObjectPropertyStatementDao().deleteObjectPropertyStatement(ops); - Model expectedModel = (ModelFactory.createOntologyModel()).read(new StringReader(expected), "", "RDF/XML"); - + String expected = + "@prefix xsd: . "+ + "@prefix rdfs: ."+ + "@prefix rdf: ."+ + "@prefix owl: . "+ + " a owl:Thing ; " + + " rdfs:label \"Smith, Bob\"@en-US . "+ + " " + + " a owl:ObjectProperty ; " + + " rdfs:label \"Prop 1 Dependent Relation\" ; " + + " \"true\"^^xsd:boolean ." ; + + Model expectedModel = (ModelFactory.createOntologyModel()).read(new StringReader(expected), "", "N3"); + //modtime times make it difficult to compare graphs wipeOutModTime(expectedModel); wipeOutModTime(model); - + Assert.assertTrue( model.isIsomorphicWith(expectedModel)); } + @Test - public void smartRemoveTestForObjPropDelete(){ + public void smartRemoveTestForObjPropDelete(){ + String n3 = prefixesN3 + + "ex:prop1 rdf:type owl:ObjectProperty ." + + "ex:prop1 rdfs:label \"Prop 1 Dependent Relation\" ." + + "ex:prop1 " + isDependentRelation; + + Model readInModel = (ModelFactory.createDefaultModel()).read(new StringReader(n3), "", "N3"); + OntModel ontModel = ModelFactory.createOntologyModel(); + ontModel.add(readInModel); + WebappDaoFactoryJena wdfj = new WebappDaoFactoryJena( ontModel); - OntModel model = ModelFactory.createOntologyModel(); - WebappDaoFactoryJena wdfj = new WebappDaoFactoryJena( model ); - - /* Need to have the DEPENDENT_RESOURCE class in the model */ - VClass cls = new VClass(); - cls.setURI(VitroVocabulary.DEPENDENT_RESOURCE); - try { - wdfj.getVClassDao().insertNewVClass(cls); - } catch (InsertException e1) { - Assert.fail("could not create class for dependentResourc"); - } - - /* Need to have an Object Property */ - ObjectProperty op = new ObjectProperty(); - op.setURI("http://example.com/prop1"); - try { - wdfj.getObjectPropertyDao().insertObjectProperty(op); - } catch (InsertException e1) { - Assert.fail("Could not create object property."); - } - - Individual ind = new IndividualImpl(); - ind.setURI("http://example.com/bob"); - ind.setName("Smith, Bob"); - try { - wdfj.getIndividualDao().insertNewIndividual(ind); - } catch (InsertException e) { - Assert.fail("Could not create new Individual Smith, Bob"); - } - - Individual indxyz = new IndividualImpl(); - indxyz.setURI("http://example.com/depResXYZ"); - indxyz.setName("depResXYZ"); - indxyz.setVClassURI(VitroVocabulary.DEPENDENT_RESOURCE); try { + ObjectProperty prop1 = wdfj.getObjectPropertyDao().getObjectPropertyByURI("http://example.com/prop1"); + Assert.assertNotNull(prop1); + + Individual ind = new IndividualImpl(); + ind.setURI("http://example.com/bob"); + ind.setName("Smith, Bob"); + + wdfj.getIndividualDao().insertNewIndividual(ind); + + Individual indxyz = new IndividualImpl(); + indxyz.setURI("http://example.com/depResXYZ"); + indxyz.setName("depResXYZ"); wdfj.getIndividualDao().insertNewIndividual(indxyz); - } catch (InsertException e) { - Assert.fail("Could not create new Individual depResXYZ"); - } - StmtIterator it = model.listStatements(model.createResource("http://example.com/depResXYZ"), - RDF.type, model.createResource(VitroVocabulary.DEPENDENT_RESOURCE)); - Assert.assertTrue("depResXYZ did not get rdf:type vitro:dependentResource" , - it != null && it.nextStatement() != null); + + Individual indAbc = new IndividualImpl(); + indAbc.setURI("http://example.com/depResNested"); + indAbc.setName("depResNested"); + wdfj.getIndividualDao().insertNewIndividual(indAbc); - Individual indAbc = new IndividualImpl(); - indAbc.setURI("http://example.com/depResNested"); - indAbc.setName("depResNested"); - indAbc.setVClassURI(VitroVocabulary.DEPENDENT_RESOURCE); - try { - wdfj.getIndividualDao().insertNewIndividual(indAbc); - } catch (InsertException e) { - Assert.fail("Could not create new Individual depResNested"); - } - it = model.listStatements(model.createResource("http://example.com/depResNested"), - RDF.type, model.createResource(VitroVocabulary.DEPENDENT_RESOURCE)); - Assert.assertTrue("depResNested did not get rdf:type vitro:dependentResource" , - it != null && it.nextStatement() != null); + ObjectPropertyStatement ops = new ObjectPropertyStatementImpl(); + ops.setSubjectURI("http://example.com/bob"); + ops.setPropertyURI("http://example.com/prop1"); + ops.setObjectURI("http://example.com/depResXYZ"); + wdfj.getObjectPropertyStatementDao().insertNewObjectPropertyStatement(ops); - - ObjectPropertyStatement ops = new ObjectPropertyStatementImpl(); - ops.setSubjectURI("http://example.com/bob"); - ops.setPropertyURI("http://example.com/prop1"); - ops.setObjectURI("http://example.com/depResXYZ"); - wdfj.getObjectPropertyStatementDao().insertNewObjectPropertyStatement(ops); - - ops = new ObjectPropertyStatementImpl(); - ops.setSubjectURI("http://example.com/depResXYZ"); - ops.setPropertyURI("http://example.com/prop1"); - ops.setObjectURI("http://example.com/depResNested"); - wdfj.getObjectPropertyStatementDao().insertNewObjectPropertyStatement(ops); - - String expected = " \n"+ - " \n"+ - " Smith, Bob\n"+ - " \n"+ - " \n"+ - " \n"+ - " -1\n"+ - " -1\n"+ - " \n"+ - " \n"+ - ""; - - wdfj.getObjectPropertyDao().deleteObjectProperty(op); - - Model expectedModel = (ModelFactory.createOntologyModel()).read(new StringReader(expected), "", "RDF/XML"); - - //modtime times make it difficult to compare graphs - wipeOutModTime(expectedModel); - wipeOutModTime(model); - Assert.assertTrue( model.isIsomorphicWith(expectedModel)); + ops = new ObjectPropertyStatementImpl(); + ops.setSubjectURI("http://example.com/depResXYZ"); + ops.setPropertyURI("http://example.com/prop1"); + ops.setObjectURI("http://example.com/depResNested"); + wdfj.getObjectPropertyStatementDao().insertNewObjectPropertyStatement(ops); + + wdfj.getObjectPropertyDao().deleteObjectProperty(prop1); + + String expected = + "@prefix xsd: . "+ + "@prefix rdfs: ."+ + "@prefix rdf: ."+ + "@prefix owl: . "+ + " a owl:Thing ; " + + " rdfs:label \"Smith, Bob\"@en-US . " ; + + Model expectedModel = (ModelFactory.createOntologyModel()).read(new StringReader(expected), "", "N3"); + + //modtime times make it difficult to compare graphs + wipeOutModTime(expectedModel); + wipeOutModTime(ontModel); + + Assert.assertTrue( ontModel.isIsomorphicWith(expectedModel) ); + } catch (InsertException e) { + Assert.fail(e.getMessage()); + } } + +// @Test +// public void smartRemoveTestForObjPropDelete(){ +// +// OntModel model = ModelFactory.createOntologyModel(); +// WebappDaoFactoryJena wdfj = new WebappDaoFactoryJena( model ); +// +// /* Need to have the DEPENDENT_RESOURCE class in the model */ +// VClass cls = new VClass(); +// //cls.setURI(VitroVocabulary.DEPENDENT_RESOURCE); +// try { +// wdfj.getVClassDao().insertNewVClass(cls); +// } catch (InsertException e1) { +// Assert.fail("could not create class for dependentResourc"); +// } +// +// /* Need to have an Object Property */ +// ObjectProperty op = new ObjectProperty(); +// op.setURI("http://example.com/prop1"); +// try { +// wdfj.getObjectPropertyDao().insertObjectProperty(op); +// } catch (InsertException e1) { +// Assert.fail("Could not create object property."); +// } +// +// Individual ind = new IndividualImpl(); +// ind.setURI("http://example.com/bob"); +// ind.setName("Smith, Bob"); +// try { +// wdfj.getIndividualDao().insertNewIndividual(ind); +// } catch (InsertException e) { +// Assert.fail("Could not create new Individual Smith, Bob"); +// } +// +// Individual indxyz = new IndividualImpl(); +// indxyz.setURI("http://example.com/depResXYZ"); +// indxyz.setName("depResXYZ"); +// //indxyz.setVClassURI(VitroVocabulary.DEPENDENT_RESOURCE); +// try { +// wdfj.getIndividualDao().insertNewIndividual(indxyz); +// } catch (InsertException e) { +// Assert.fail("Could not create new Individual depResXYZ"); +// } +//// StmtIterator it = model.listStatements(model.createResource("http://example.com/depResXYZ"), +//// RDF.type, model.createResource(VitroVocabulary.DEPENDENT_RESOURCE)); +//// Assert.assertTrue("depResXYZ did not get rdf:type vitro:dependentResource" , +//// it != null && it.nextStatement() != null); +// +// Individual indAbc = new IndividualImpl(); +// indAbc.setURI("http://example.com/depResNested"); +// indAbc.setName("depResNested"); +//// indAbc.setVClassURI(VitroVocabulary.DEPENDENT_RESOURCE); +// try { +// wdfj.getIndividualDao().insertNewIndividual(indAbc); +// } catch (InsertException e) { +// Assert.fail("Could not create new Individual depResNested"); +// } +//// it = model.listStatements(model.createResource("http://example.com/depResNested"), +//// RDF.type, model.createResource(VitroVocabulary.DEPENDENT_RESOURCE)); +//// Assert.assertTrue("depResNested did not get rdf:type vitro:dependentResource" , +//// it != null && it.nextStatement() != null); +// +// +// ObjectPropertyStatement ops = new ObjectPropertyStatementImpl(); +// ops.setSubjectURI("http://example.com/bob"); +// ops.setPropertyURI("http://example.com/prop1"); +// ops.setObjectURI("http://example.com/depResXYZ"); +// wdfj.getObjectPropertyStatementDao().insertNewObjectPropertyStatement(ops); +// +// ops = new ObjectPropertyStatementImpl(); +// ops.setSubjectURI("http://example.com/depResXYZ"); +// ops.setPropertyURI("http://example.com/prop1"); +// ops.setObjectURI("http://example.com/depResNested"); +// wdfj.getObjectPropertyStatementDao().insertNewObjectPropertyStatement(ops); +// +// String expected = " \n"+ +// " \n"+ +// " Smith, Bob\n"+ +// " \n"+ +// " \n"+ +// " \n"+ +// " -1\n"+ +// " -1\n"+ +// " \n"+ +// " \n"+ +// ""; +// +// wdfj.getObjectPropertyDao().deleteObjectProperty(op); +// +// Model expectedModel = (ModelFactory.createOntologyModel()).read(new StringReader(expected), "", "RDF/XML"); +// +// //modtime times make it difficult to compare graphs +// wipeOutModTime(expectedModel); +// wipeOutModTime(model); +// Assert.assertTrue( model.isIsomorphicWith(expectedModel)); +// } void printModels(Model expected, Model result){ System.out.println("Expected:"); expected.write(System.out);