package org.ilrt.mca.rdf;
import com.hp.hpl.jena.datatypes.xsd.XSDDatatype;
import com.hp.hpl.jena.query.Dataset;
import com.hp.hpl.jena.query.QuerySolutionMap;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.rdf.model.ResourceFactory;
import com.hp.hpl.jena.rdf.model.Statement;
import com.hp.hpl.jena.sdb.SDBFactory;
import com.hp.hpl.jena.sdb.util.StoreUtils;
import com.hp.hpl.jena.vocabulary.DC;
import org.ilrt.mca.Common;
import org.junit.Before;
import org.junit.Test;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
/**
* @author Mike Jones (mike.a.jones@bristol.ac.uk)
*/
public class SdbRepositoryImplTest {
@Before
public void setUp() throws Exception {
setUpStore();
StoreWrapper storeWrapper = getStoreWrapper();
assertTrue("The store is not formatted", StoreUtils.isFormatted(storeWrapper.getStore()));
storeWrapper.close();
}
@Test
public void addModel() throws Exception {
// test that the database is empty
StoreWrapper storeWrapper = getStoreWrapper();
Model beforeModel = SDBFactory.connectDefaultModel(storeWrapper.getStore());
assertEquals("The model should be empty", 0, beforeModel.size());
storeWrapper.close();
// add some data
UpdateManager repository = getRepository();
repository.add(getTestData());
// test that the database is not empty
storeWrapper = getStoreWrapper();
Model afterModel = SDBFactory.connectDefaultModel(storeWrapper.getStore());
assertEquals("The model should not be empty", 1, afterModel.size());
storeWrapper.close();
}
@Test
public void addModelToGraph() throws Exception {
// test that the graph isn't stored
StoreWrapper storeWrapper = getStoreWrapper();
Dataset dataset = SDBFactory.connectDataset(storeWrapper.getStore());
Model beforeModel = dataset.getNamedModel(graphUri);
assertEquals("The model should be empty", 0, beforeModel.size());
storeWrapper.close();
// add some data to the graph
UpdateManager repository = getRepository();
repository.add(graphUri, getTestData());
// test that the graph is stored
storeWrapper = getStoreWrapper();
Dataset afterDataset = SDBFactory.connectDataset(storeWrapper.getStore());
Model afterModel = afterDataset.getNamedModel(graphUri);
assertEquals("The model should not be empty", 1, afterModel.size());
storeWrapper.close();
}
@Test
public void deleteModelFromGraph() throws Exception {
// test that the graph is stored
StoreWrapper storeWrapper = getStoreWrapper();
Dataset dataset = SDBFactory.connectDataset(storeWrapper.getStore());
dataset.getNamedModel(graphUri).add(getTestData());
Model beforeModel = dataset.getNamedModel(graphUri);
assertEquals("The model should not be empty", 1, beforeModel.size());
storeWrapper.close();
// remove data from the graph
UpdateManager repository = getRepository();
repository.delete(graphUri, getTestData());
// test that the graph isn't stored
storeWrapper = getStoreWrapper();
Dataset afterDataset = SDBFactory.connectDataset(getStoreWrapper().getStore());
Model afterModel = afterDataset.getNamedModel(graphUri);
assertEquals("The model should be empty", 0, afterModel.size());
storeWrapper.close();
}
@Test
public void deleteModel() throws Exception {
// test that the database is empty
StoreWrapper storeWrapper = getStoreWrapper();
Model beforeModel = SDBFactory.connectDefaultModel(storeWrapper.getStore());
assertEquals("The model should be empty", 0, beforeModel.size());
storeWrapper.close();
// add some data
UpdateManager repository = getRepository();
repository.add(getTestData());
// test that the database is not empty
storeWrapper = getStoreWrapper();
Model afterModel = SDBFactory.connectDefaultModel(storeWrapper.getStore());
assertEquals("The model should not be empty", 1, afterModel.size());
storeWrapper.close();
// try deleting
repository.delete(getTestData());
// test that the database is now empty
storeWrapper = getStoreWrapper();
Model afterDeleteModel = SDBFactory.connectDefaultModel(storeWrapper.getStore());
assertEquals("The model should be empty", 0, afterDeleteModel.size());
storeWrapper.close();
}
@Test
public void findWithBindings() throws Exception {
// add some data
DataManager repository = getRepository();
repository.add(getTestData());
// test that the database is not empty
StoreWrapper storeWrapper = getStoreWrapper();
Model afterModel = SDBFactory.connectDefaultModel(storeWrapper.getStore());
assertEquals("The model should not be empty", 1, afterModel.size());
QuerySolutionMap bindings = new QuerySolutionMap();
bindings.add("id", ResourceFactory.createResource(uri));
Model results = repository.find(bindings, query);
assertEquals("The results should not be empty", 1, results.size());
storeWrapper.close();
}
@Test
public void findWithJustSparql() throws Exception {
// add some data
DataManager repository = getRepository();
repository.add(getTestData());
// test that the database is not empty
StoreWrapper storeWrapper = getStoreWrapper();
Model afterModel = SDBFactory.connectDefaultModel(storeWrapper.getStore());
assertEquals("The model should not be empty", 1, afterModel.size());
Model results = repository.find(query);
assertEquals("The results should not be empty", 1, results.size());
storeWrapper.close();
}
@Test
public void findWithBindingId() throws Exception {
// add some data
DataManager dataManager = getRepository();
dataManager.add(getTestData());
// test that the database is not empty
StoreWrapper storeWrapper = getStoreWrapper();
Model afterModel = SDBFactory.connectDefaultModel(storeWrapper.getStore());
assertEquals("The model should not be empty", 1, afterModel.size());
Model results = dataManager.find("id", uri, query);
assertEquals("The results should not be empty", 1, results.size());
storeWrapper.close();
}
@Test
public void updatePropertyValueInGraph() {
// test data
String uri = "mca://registry/news/events/";
String graph = "mca://audit/";
Calendar calendar = new GregorianCalendar(2009, Calendar.SEPTEMBER, 30, 11, 38);
String date = Common.parseXsdDate(calendar.getTime());
// add some data
StoreWrapper storeWrapper = getStoreWrapper();
Model beforeModel = SDBFactory.connectDataset(storeWrapper.getStore())
.getNamedModel(graph);
Resource resource = beforeModel.getResource(uri);
beforeModel.add(beforeModel.createStatement(resource, DC.date,
beforeModel.createTypedLiteral(date, XSDDatatype.XSDdateTime)));
// check we have expected data
assertTrue("The model should have a dc:date", beforeModel.getResource(uri)
.hasProperty(DC.date));
assertEquals("Unexpected date value", date, beforeModel.getResource(uri)
.getProperty(DC.date).getLiteral().getLexicalForm());
// clean up
beforeModel.close();
storeWrapper.close();
UpdateManager repository = getRepository();
String newdate = Common.parseXsdDate(new Date());
repository.updatePropertyInGraph(graph, uri, DC.date,
ModelFactory.createDefaultModel().createTypedLiteral(newdate,
XSDDatatype.XSDdateTime));
storeWrapper = getStoreWrapper();
Model afterModel = SDBFactory.connectDataset(storeWrapper.getStore())
.getNamedModel(graph);
String changedDate = afterModel.getResource(uri).getProperty(DC.date).getLiteral()
.getLexicalForm();
assertFalse("The dates should be different", changedDate.equals(date));
storeWrapper.close();
}
@Test
public void testDeleteDataInGraph() throws Exception {
setUpStore();
String graph = "http://example.org/graph";
StoreWrapper storeWrapper = getStoreWrapper();
Model model = SDBFactory.connectNamedModel(storeWrapper.getStore(), graph);
assertTrue("The graph should be empty", model.isEmpty());
model.add(getTestData());
assertFalse("The model should not be empty", model.isEmpty());
model.close();
UpdateManager repository = getRepository();
repository.deleteAllInGraph(graph);
storeWrapper = getStoreWrapper();
model = SDBFactory.connectNamedModel(storeWrapper.getStore(), graph);
assertTrue("The graph should be empty", model.isEmpty());
}
@Test
public void testDeleteDataInDefaultGraph() throws Exception {
setUpStore();
StoreWrapper storeWrapper = getStoreWrapper();
Model model = SDBFactory.connectDefaultModel(storeWrapper.getStore());
assertTrue("The graph should be empty", model.isEmpty());
model.add(getTestData());
assertFalse("The model should not be empty", model.isEmpty());
model.close();
UpdateManager repository = getRepository();
repository.deleteAllInGraph(null);
storeWrapper = getStoreWrapper();
model = SDBFactory.connectDefaultModel(storeWrapper.getStore());
assertTrue("The graph should be empty", model.isEmpty());
}
// -- Utility methods
void setUpStore() throws Exception {
StoreWrapper storeWrapper = getStoreWrapper();
if (StoreUtils.isFormatted(storeWrapper.getStore())) {
storeWrapper.getStore().getTableFormatter().truncate();
} else {
storeWrapper.getStore().getTableFormatter().format();
}
assertTrue("The store is not formatted", StoreUtils.isFormatted(storeWrapper.getStore()));
storeWrapper.close();
}
StoreWrapper getStoreWrapper() {
return getStoreWrapperManager().getStoreWrapper();
}
DataManager getRepository() {
return new SdbManagerImpl(getStoreWrapperManager());
}
StoreWrapperManager getStoreWrapperManager() {
return new StoreWrapperManagerImpl(TEST_CONFIG);
}
Model getTestData() {
Model model = ModelFactory.createDefaultModel();
Resource resource = model.getResource(uri);
Statement stmt = model.createStatement(resource, DC.title,
model.createLiteral("Test Data"));
model.add(stmt);
return model;
}
final String TEST_CONFIG = "/test-sdb.ttl";
String uri = "http://example.org";
String graphUri = "http://example.org/graph1";
String query = "PREFIX dc: <http://purl.org/dc/elements/1.1/> " +
"CONSTRUCT { ?id dc:title ?title } WHERE { ?id dc:title ?title }";
}