package net.fortytwo.sesametools;
import info.aduna.iteration.CloseableIteration;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openrdf.model.IRI;
import org.openrdf.model.Resource;
import org.openrdf.model.Statement;
import org.openrdf.model.Value;
import org.openrdf.model.ValueFactory;
import org.openrdf.model.impl.SimpleValueFactory;
import org.openrdf.sail.Sail;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.sail.memory.MemoryStore;
import static junit.framework.Assert.assertEquals;
/**
* @author Joshua Shinavier (http://fortytwo.net)
*/
public class SingleContextSailTest {
private static final ValueFactory valueFactory = SimpleValueFactory.getInstance();
private static final IRI
SPECIAL_CONTEXT = valueFactory.createIRI("http://example.org/ns/special-context"),
OTHER_CONTEXT = valueFactory.createIRI("http://example.org/ns/other-context"),
THING1 = valueFactory.createIRI("http://example.org/ns/thing1"),
THING2 = valueFactory.createIRI("http://example.org/ns/thing2"),
RELATION1 = valueFactory.createIRI("http://example.org/ns/relation1");
private Sail baseSail;
private Sail sail;
@Before
public void setup() throws Exception {
baseSail = new MemoryStore();
sail = new SingleContextSail(baseSail, SPECIAL_CONTEXT);
sail.initialize();
}
@After
public void tearDown() throws Exception {
sail.shutDown();
}
@Test
public void testStatementsInSpecialContextAreVisible() throws Exception {
SailConnection bc = baseSail.getConnection();
try {
bc.begin();
bc.addStatement(THING1, RELATION1, THING2, SPECIAL_CONTEXT);
bc.addStatement(THING2, RELATION1, THING2, SPECIAL_CONTEXT);
bc.commit();
} finally {
bc.close();
}
assertEquals(2, countStatements(null, null, null, SPECIAL_CONTEXT));
assertEquals(2, countStatements(null, null, null));
assertEquals(1, countStatements(THING1, null, null, SPECIAL_CONTEXT));
assertEquals(1, countStatements(THING1, null, null));
assertEquals(0, countStatements(null, null, null, OTHER_CONTEXT));
assertEquals(0, countStatements(null, null, null, (Resource) null));
}
@Test
public void testStatementsInOtherContextsAreInvisible() throws Exception {
SailConnection bc = baseSail.getConnection();
try {
bc.begin();
bc.addStatement(THING1, RELATION1, THING2, SPECIAL_CONTEXT);
bc.addStatement(THING2, RELATION1, THING1, OTHER_CONTEXT);
bc.addStatement(THING2, RELATION1, THING2, (Resource) null);
bc.commit();
} finally {
bc.close();
}
assertEquals(1, countStatements(null, null, null, SPECIAL_CONTEXT));
assertEquals(1, countStatements(null, null, null));
assertEquals(1, countStatements(THING1, null, null, SPECIAL_CONTEXT));
assertEquals(1, countStatements(THING1, null, null));
assertEquals(0, countStatements(THING2, null, null, SPECIAL_CONTEXT));
assertEquals(0, countStatements(THING2, null, null));
assertEquals(0, countStatements(null, null, null, OTHER_CONTEXT));
assertEquals(0, countStatements(null, null, null, (Resource) null));
}
@Test
public void canWriteIntoOnlySpecialContext() throws Exception {
SailConnection c = sail.getConnection();
try {
c.begin();
c.addStatement(THING1, RELATION1, THING2, SPECIAL_CONTEXT);
c.addStatement(THING2, RELATION1, THING1, OTHER_CONTEXT);
c.addStatement(THING2, RELATION1, THING2, (Resource) null);
c.commit();
} finally {
c.close();
}
assertEquals(1, countStatements(null, null, null));
}
private long countStatements(final Resource subject,
final IRI predicate,
final Value object,
final Resource... contexts) {
long count = 0;
SailConnection c = sail.getConnection();
try {
try (CloseableIteration<? extends Statement, SailException> iter
= c.getStatements(subject, predicate, object, false, contexts)) {
while (iter.hasNext()) {
count++;
iter.next();
}
}
c.rollback();
} finally {
c.close();
}
return count;
}
}