diff --git a/src/main/java/com/epimorphics/registry/commands/CommandRead.java b/src/main/java/com/epimorphics/registry/commands/CommandRead.java index 547d1366..c3f2977c 100644 --- a/src/main/java/com/epimorphics/registry/commands/CommandRead.java +++ b/src/main/java/com/epimorphics/registry/commands/CommandRead.java @@ -203,6 +203,20 @@ public Response doExecute() { } else if (ri.getEntity() != null) { m.add( ri.getEntity().getModel() ); } + + // Full solution here would also apply this to the case where entityWithMetadata is set + // that's why the check is inject at this point. + // That full solution currently disabled due to test case issues. +// if (graphEntity || entityWithMetadata) { + if (graphEntity ) { + // Validate that the graph contains a matching entity definition with a type property. + // For both plain and graph registered entities this is enforced at registration time. + // If this is an external entity then the graph will not contain a matching root resource + // and we prefer to return a 404 in that case. + if ( ! m.getResource(target).hasProperty(RDF.type) ) { + throw new NotFoundException(); + } + } } List members = (paged) ? new ArrayList(length) : new ArrayList() ; diff --git a/src/test/java/com/epimorphics/registry/webapi/TestAPI.java b/src/test/java/com/epimorphics/registry/webapi/TestAPI.java index fa162a21..65acc1b5 100644 --- a/src/test/java/com/epimorphics/registry/webapi/TestAPI.java +++ b/src/test/java/com/epimorphics/registry/webapi/TestAPI.java @@ -39,9 +39,6 @@ import javax.ws.rs.core.Response; import org.apache.jena.riot.RDFDataMgr; -import org.apache.shiro.SecurityUtils; -import org.apache.shiro.mgt.DefaultSecurityManager; -import org.junit.Before; import org.junit.Test; import com.epimorphics.rdfutil.QueryUtil; @@ -104,6 +101,8 @@ public void testAll() throws IOException { // Puts red in reg1/red doItemRegistrationTests(); + // Reference red from another register + testCrossRegisterReference(); // Adds external resource reg1/black doExternalRegistrationTests(); @@ -265,6 +264,19 @@ private void doRegisterRegistrationTests() { assertEquals("Register the same again", 403, postFileStatus("test/reg1.ttl", BASE_URL)); } + private void testCrossRegisterReference() { + Response response = postFile("test/reg4.ttl", BASE_URL, "text/turtle"); + assertEquals("Register a register", 201, response.getStatus()); + assertEquals(201, postFileStatus("test/reference.ttl", BASE_URL + "reg4")); + + assertEquals(404, getResponse(BASE_URL + "reg4/reference").getStatus()); + + Model m = getModelResponse(BASE_URL + "reg4/_reference"); + checkModelResponse(m, ROOT_REGISTER + "reg1/red", "test/expected/reference_red.ttl"); + + assertEquals(303, post(BASE_URL + "reg4?real_delete").getStatus()); + } + // Assumes reg1 has been created // Adds an item (reg1/red) and checks it all looks OK // Leaves reg1/red in plce diff --git a/test/expected/reference_red.ttl b/test/expected/reference_red.ttl new file mode 100644 index 00000000..38e8bc07 --- /dev/null +++ b/test/expected/reference_red.ttl @@ -0,0 +1,19 @@ +@prefix rdf: . +@prefix rdfs: . +@prefix owl: . +@prefix xsd: . +@prefix dct: . +@prefix skos: . + +@prefix reg: . + +<_reference> a reg:RegisterItem; + reg:definition [ + reg:entity ; + ] +. + + a skos:Concept; + rdfs:label "red" + . + diff --git a/test/reference.ttl b/test/reference.ttl new file mode 100644 index 00000000..71515c86 --- /dev/null +++ b/test/reference.ttl @@ -0,0 +1,19 @@ +@prefix rdf: . +@prefix rdfs: . +@prefix owl: . +@prefix xsd: . +@prefix dct: . +@prefix skos: . + +@prefix reg: . + +<_reference> a reg:RegisterItem; + reg:definition [ + reg:entity ; + ] +. + + a skos:Concept; + rdfs:label "red" +. + diff --git a/test/reg4.ttl b/test/reg4.ttl new file mode 100644 index 00000000..25d67ff2 --- /dev/null +++ b/test/reg4.ttl @@ -0,0 +1,25 @@ +@prefix rdf: . +@prefix rdfs: . +@prefix owl: . +@prefix xsd: . +@prefix dct: . +@prefix dc: . +@prefix foaf: . +@prefix skos: . +@prefix version: . +@prefix ldp: . +@prefix ssd: . +@prefix vs: . +@prefix void: . +@prefix prov: . + +@prefix reg: . + + a reg:Register, skos:Collection ; + ldp:membershipPredicate skos:member; + rdfs:label "register 4"@en; + dct:description "Example register 4"@en; + reg:owner ; + reg:manager +. +