@Override public boolean contains(final BlankNodeOrIRI subject, final IRI predicate, final RDFTerm object) { return dataset.contains(unionOrNamedGraph(), subject, predicate, object); }
/** * Stream out the removed quads * @return the removed quads */ public Stream<Quad> getRemoved() { return existing.stream().filter(q -> !dataset.contains(q)) // exclude the server-managed modified triple .filter(q -> !q.getGraphName().equals(of(PreferServerManaged)) || !modified.equals(q.getPredicate())) .map(q -> (Quad) q); }
private Consumer<Resource> emitToParent(final IRI identifier, final Dataset dataset, final List<Future<RecordMetadata>> results) { final Boolean isCreate = dataset.contains(of(PreferAudit), null, type, Create); final Boolean isDelete = dataset.contains(of(PreferAudit), null, type, Delete); final String containmentTopic = isDelete ? TOPIC_LDP_CONTAINMENT_DELETE : TOPIC_LDP_CONTAINMENT_ADD; final String membershipTopic = isDelete ? TOPIC_LDP_MEMBERSHIP_DELETE : TOPIC_LDP_MEMBERSHIP_ADD; return container -> { if (isDelete || isCreate) { try { LOGGER.info("Sending to parent: {}", container.getIdentifier()); results.add(producer.send(buildContainmentMessage(containmentTopic, identifier, container, dataset))); buildMembershipMessage(membershipTopic, identifier, container, dataset).ifPresent(msg -> { LOGGER.info("Sending to member resource: {}", container.getMembershipResource()); results.add(producer.send(msg)); }); } catch (final Exception ex) { LOGGER.error("Error processing dataset: {}", ex.getMessage()); } } }; }
@Override public boolean contains(final Triple triple) { return dataset.contains(unionOrNamedGraph(), triple.getSubject(), triple.getPredicate(), triple.getObject()); }
private Stream<Executable> checkEventProperties(final Dataset dataset) { return Stream.of( () -> assertTrue(dataset.contains(null, null, type, PROV.Activity), "missing prov:Activity triple!"), () -> assertTrue(dataset.contains(null, subject, PROV.wasGeneratedBy, null), "missing prov:wasGeneratedBy triple!"), () -> assertTrue(dataset.contains(null, null, PROV.wasAssociatedWith, Trellis.AnonymousAgent), "missing prov:wasAssociatedWith triple!"), () -> assertTrue(dataset.contains(null, null, PROV.actedOnBehalfOf, Trellis.AdministratorAgent), "missing prov:actedOnBehalfOf triple!"), () -> assertTrue(dataset.contains(null, null, PROV.atTime, rdf.createLiteral(created.toString(), XSD.dateTime)), "missing prov:atTime triple!"), () -> assertEquals(6L, dataset.size(), "Incorrect dataset size!")); } }
@Test public void contains() throws Exception { assertFalse(dataset.contains(null, bob, knows, alice)); // or so he claims.. assertTrue(dataset.contains(Optional.of(graph1), alice, knows, bob)); try (Stream<? extends Quad> stream = dataset.stream()) { final Optional<? extends Quad> first = stream.skip(4).findFirst(); Assume.assumeTrue(first.isPresent()); final Quad existingQuad = first.get(); assertTrue(dataset.contains(existingQuad)); } final Quad nonExistingQuad = factory.createQuad(graph2, bob, knows, alice); assertFalse(dataset.contains(nonExistingQuad)); // An existing quad final Quad quad = factory.createQuad(graph1, alice, knows, bob); // FIXME: Should not this always be true? assertTrue(dataset.contains(quad)); }
/** * Ensure {@link Dataset#getGraphNames()} contains our two graphs. * * @throws Exception * If test fails */ @Test public void getGraphNames() throws Exception { final Set<BlankNodeOrIRI> names = dataset.getGraphNames().collect(Collectors.toSet()); assertTrue("Can't find graph name " + graph1, names.contains(graph1)); assertTrue("Found no quads in graph1", dataset.contains(Optional.of(graph1), null, null, null)); final Optional<BlankNodeOrIRI> graphName2 = dataset.getGraphNames().filter(BlankNode.class::isInstance).findAny(); assertTrue("Could not find graph2-like BlankNode", graphName2.isPresent()); assertTrue("Found no quads in graph2", dataset.contains(graphName2, null, null, null)); // Some implementations like Virtuoso might have additional internal graphs, // so we can't assume this: //assertEquals(2, names.size()); }
/** * Test creating a resource. * @throws Exception if the operation failed */ @Test @DisplayName("Test creating resource") default void testCreateResource() throws Exception { final RDF rdf = getInstance(); final IRI identifier = rdf.createIRI(TRELLIS_DATA_PREFIX + getResourceService().generateIdentifier()); final Dataset dataset = buildDataset(identifier, "Creation Test", SUBJECT1); assertEquals(MISSING_RESOURCE, getResourceService().get(identifier).toCompletableFuture().join(), "Check for no pre-existing LDP-RS"); assertDoesNotThrow(() -> getResourceService().create(Metadata.builder(identifier) .interactionModel(LDP.RDFSource).container(ROOT_CONTAINER).build(), dataset) .toCompletableFuture().join(), "Check that the resource was successfully created"); final Resource res = getResourceService().get(identifier).toCompletableFuture().join(); assertAll("Check resource stream", res.stream(Trellis.PreferUserManaged).map(toQuad(Trellis.PreferUserManaged)) .map(q -> () -> assertTrue(dataset.contains(q), "Verify that the quad is from the dataset: " + q))); }
/** * Test creating a resource. * @throws Exception if the operation failed */ @Test @DisplayName("Test creating resource") default void testCreateResource() throws Exception { final RDF rdf = getInstance(); final IRI identifier = rdf.createIRI(TRELLIS_DATA_PREFIX + getResourceService().generateIdentifier()); final Dataset dataset = buildDataset(identifier, "Creation Test", SUBJECT1); assertEquals(MISSING_RESOURCE, getResourceService().get(identifier).toCompletableFuture().join(), "Check for no pre-existing LDP-RS"); assertDoesNotThrow(() -> getResourceService().create(Metadata.builder(identifier) .interactionModel(LDP.RDFSource).container(ROOT_CONTAINER).build(), dataset) .toCompletableFuture().join(), "Check that the resource was successfully created"); final Resource res = getResourceService().get(identifier).toCompletableFuture().join(); assertAll("Check resource stream", res.stream(Trellis.PreferUserManaged).map(toQuad(Trellis.PreferUserManaged)) .map(q -> () -> assertTrue(dataset.contains(q), "Verify that the quad is from the dataset: " + q))); }
@Test public void contains() throws Exception { assertTrue(dataset.contains(new DummyQuad())); }
@Test public void containsLanguageTagsCaseInsensitive() { // COMMONSRDF-51: Ensure we can add/contains/remove with any casing // of literal language tag final Literal lower = factory.createLiteral("Hello there", "en-gb"); final Literal upper = factory.createLiteral("Hello there", "EN-GB"); final Literal mixed = factory.createLiteral("Hello there", "en-GB"); final IRI example1 = factory.createIRI("http://example.com/s1"); final IRI greeting = factory.createIRI("http://example.com/greeting"); dataset.add(null, example1, greeting, upper); // any kind of Triple should match assertTrue(dataset.contains(factory.createQuad(null, example1, greeting, upper))); assertTrue(dataset.contains(factory.createQuad(null, example1, greeting, lower))); assertTrue(dataset.contains(factory.createQuad(null, example1, greeting, mixed))); // or as patterns assertTrue(dataset.contains(null, null, null, upper)); assertTrue(dataset.contains(null, null, null, lower)); assertTrue(dataset.contains(null, null, null, mixed)); }
@Test public void getQuads() throws Exception { long quadCount; try (Stream<? extends Quad> stream = dataset.stream()) { quadCount = stream.count(); } assertTrue(quadCount > 0); try (Stream<? extends Quad> stream = dataset.stream()) { assertTrue(stream.allMatch(t -> dataset.contains(t))); } // Check exact count Assume.assumeNotNull(bnode1, bnode2, aliceName, bobName, secretClubName, companyName, bobNameQuad); assertEquals(10, quadCount); }
@Test public void testAuditDeletion() { final Dataset dataset = rdf.createDataset(); final AuditService svc = new DefaultAuditService() {}; svc.deletion(subject, mockSession).forEach(dataset::add); assertTrue(dataset.getGraph(Trellis.PreferAudit).filter(graph -> graph.size() == dataset.size()).isPresent(), "Graph and dataset sizes don't match for deletion event!"); assertTrue(dataset.contains(null, null, type, AS.Delete), "as:Delete type not in delete dataset!"); assertAll("Event property check", checkEventProperties(dataset)); }
@Test public void testAuditUpdate() { final Dataset dataset = rdf.createDataset(); final AuditService svc = new DefaultAuditService() {}; svc.update(subject, mockSession).forEach(dataset::add); assertTrue(dataset.getGraph(Trellis.PreferAudit).filter(graph -> graph.size() == dataset.size()).isPresent()); assertTrue(dataset.contains(null, null, type, AS.Update)); assertAll("Event property check", checkEventProperties(dataset)); }
@Test public void testAuditCreation() { final Dataset dataset = rdf.createDataset(); final AuditService svc = new DefaultAuditService() {}; svc.creation(subject, mockSession).forEach(dataset::add); assertTrue(dataset.getGraph(Trellis.PreferAudit).filter(graph -> graph.size() == dataset.size()).isPresent(), "Graph and dataset sizes don't match for creation event!"); assertTrue(dataset.contains(null, null, type, AS.Create), "as:Create type not in create dataset!"); assertAll("Event property check", checkEventProperties(dataset)); }
@Test public void testAppendSemantics() { final Quad testFirstQuad = createQuad(testResourceId3, testResourceId2, testResourceId1, badId); final Quad testSecondQuad = createQuad(testResourceId3, testResourceId2, testResourceId1, badId); // store some data in mutable and immutable sides under the same resource ID final Resource testFirstResource = new TestResource(testResourceId3, testFirstQuad); assertNull(testable.add(testResourceId3, testFirstResource.dataset()).toCompletableFuture().join(), "Couldn't create an immutable resource!"); final Resource testSecondResource = new TestResource(testResourceId3, testSecondQuad); assertNull(testable.add(testResourceId3, testSecondResource.dataset()).toCompletableFuture().join(), "Couldn't add to an immutable resource!"); final Resource retrieved = testable.get(testResourceId3).toCompletableFuture().join(); assertEquals(testResourceId3, retrieved.getIdentifier(), "Resource was retrieved with wrong ID!"); final Dataset quads = retrieved.dataset(); assertTrue(quads.contains(testFirstQuad), "Resource was retrieved without its immutable data!"); assertTrue(quads.contains(testSecondQuad), "Resource was retrieved without its mutable data!"); quads.remove(testFirstQuad); quads.remove(testSecondQuad); assertEquals(0, quads.size(), "Resource was retrieved with too much data!"); }
@Test public void testMergingBehavior() { final Quad testMutableQuad = createQuad(testResourceId2, testResourceId2, testResourceId1, badId); final Quad testImmutableQuad = createQuad(testResourceId2, testResourceId2, testResourceId1, badId); // store some data in mutable and immutable sides under the same resource ID final Resource testMutableResource = new TestResource(testResourceId2, testMutableQuad); assertNull(testable.create(Metadata.builder(testMutableResource).build(), testMutableResource.dataset()) .toCompletableFuture().join(), "Couldn't create a resource!"); final Resource testImmutableResource = new TestResource(testResourceId2, testImmutableQuad); assertNull(testable.add(testResourceId2, testImmutableResource.dataset()).toCompletableFuture().join(), "Couldn't create an immutable resource!"); final Resource retrieved = testable.get(testResourceId2).toCompletableFuture().join(); assertEquals(testMutableResource.getIdentifier(), retrieved.getIdentifier(), "Resource was retrieved with wrong ID!"); final Dataset quads = retrieved.dataset(); assertTrue(quads.contains(testImmutableQuad), "Resource was retrieved without its immutable data!"); assertTrue(quads.contains(testMutableQuad), "Resource was retrieved without its mutable data!"); quads.remove(testImmutableQuad); quads.remove(testMutableQuad); assertEquals(0, quads.size(), "Resource was retrieved with too much data!"); }
@Test public void removeLanguageTagsCaseInsensitive() { // COMMONSRDF-51: Ensure we can remove with any casing // of literal language tag final Literal lower = factory.createLiteral("Howdy", "en-us"); final Literal upper = factory.createLiteral("Howdy", "EN-US"); final Literal mixed = factory.createLiteral("Howdy", "en-US"); final IRI example1 = factory.createIRI("http://example.com/s1"); final IRI greeting = factory.createIRI("http://example.com/greeting"); dataset.add(null, example1, greeting, upper); // Remove should also honour any case dataset.remove(null, example1, null, mixed); assertFalse(dataset.contains(null, null, greeting, null)); dataset.add(null, example1, greeting, lower); dataset.remove(null, example1, null, upper); // Check with Triple dataset.add(factory.createQuad(null, example1, greeting, mixed)); dataset.remove(factory.createQuad(null, example1, greeting, upper)); assertFalse(dataset.contains(null, null, greeting, null)); }