package org.openrdf.repository.object; import junit.framework.TestCase; import org.openrdf.annotations.Bind; import org.openrdf.annotations.Iri; import org.openrdf.annotations.ParameterTypes; import org.openrdf.annotations.Sparql; import org.openrdf.model.URI; import org.openrdf.model.ValueFactory; import org.openrdf.repository.object.config.ObjectRepositoryConfig; import org.openrdf.repository.object.config.ObjectRepositoryFactory; import org.openrdf.repository.object.traits.ObjectMessage; import org.openrdf.repository.sail.SailRepository; import org.openrdf.result.Result; import org.openrdf.sail.memory.MemoryStore; public class SmokeTest extends TestCase { private static final String FOAF = "urn:test:foaf:"; private static final String PREFIX = "PREFIX foaf:<" + FOAF + ">\n"; private static final String DEFAULT_IMAGE_URI = "about:blank"; @Iri(Document.NS + "Document") public static class Document { public static final String NS = "http://meta.leighnet.ca/rdf/2009/gs#"; @Iri(NS + "title") String title; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } // retrieve a Document by title using a named query @Sparql("PREFIX gs:<http://meta.leighnet.ca/rdf/2009/gs#>\n" + "SELECT ?doc WHERE {?doc gs:title $title}") public Document findDocumentByTitle(@Bind("title") String title) { return null; } } @Iri(FOAF + "Person") public interface Person { @Iri(FOAF + "depiction") Image getDepiction(); @Iri(FOAF + "depiction") void setDepiction(Image depiction); } @Iri(FOAF + "Image") public interface Image { @Sparql(PREFIX + "SELECT ?person { ?person foaf:depiction $this }") Person getDepicts(); @Sparql(PREFIX + "DELETE { ?p foaf:depiction $this } WHERE { ?p foaf:depiction $this } ;\n" + "INSERT { $person foaf:depiction $this } WHERE {} ") void setDepicts(@Bind("person") Person person); } public abstract static class PersonSupport implements Person, RDFObject { @ParameterTypes({}) public Image getDepiction(ObjectMessage msg) throws Exception { Image depiction = (Image) msg.proceed(); if (depiction == null) { return (Image) getObjectConnection().getObject( DEFAULT_IMAGE_URI); } return depiction; } } private ObjectRepository repository; private ObjectConnection con; public void setUp() throws Exception { ObjectRepositoryFactory orf = new ObjectRepositoryFactory(); ObjectRepositoryConfig config = orf.getConfig(); config.addConcept(Document.class); config.addConcept(Person.class); config.addConcept(Image.class); config.addBehaviour(PersonSupport.class); MemoryStore store = new MemoryStore(); SailRepository delegate = new SailRepository(store); delegate.initialize(); repository = orf.createRepository(config, delegate); con = repository.getConnection(); } public void tearDown() throws Exception { con.close(); repository.shutDown(); } public void testCreateDocument() throws Exception { // create a Document Document doc = new Document(); doc.setTitle("Getting Started"); // add a Document to the repository ValueFactory vf = con.getValueFactory(); URI id = vf .createURI("http://meta.leighnet.ca/data/2009/getting-started"); con.addObject(id, doc); // retrieve a Document by id doc = con.getObject(Document.class, id); assertEquals("Getting Started", doc.getTitle()); } public void testRemoveDocument() throws Exception { // create a Document Document doc = new Document(); doc.setTitle("Getting Started"); // add a Document to the repository ValueFactory vf = con.getValueFactory(); URI id = vf .createURI("http://meta.leighnet.ca/data/2009/getting-started"); con.addObject(id, doc); // retrieve a Document by id doc = con.getObject(Document.class, id); assertEquals("Getting Started", doc.getTitle()); // remove a Document from the repository doc = con.getObject(Document.class, id); doc.setTitle(null); con.removeDesignation(doc, Document.class); } public void testAllDocuments() throws Exception { // create a Document Document doc = new Document(); doc.setTitle("Getting Started"); // add a Document to the repository ValueFactory vf = con.getValueFactory(); URI id = vf .createURI("http://meta.leighnet.ca/data/2009/getting-started"); con.addObject(id, doc); // retrieve a Document by id doc = con.getObject(Document.class, id); assertEquals("Getting Started", doc.getTitle()); // retrieve all Documents Result<Document> result = con.getObjects(Document.class); assertTrue(result.hasNext()); while (result.hasNext()) { assertEquals("Getting Started", result.next().getTitle()); } } public void testDynamicQuery() throws Exception { // create a Document Document doc = new Document(); doc.setTitle("Getting Started"); // add a Document to the repository ValueFactory vf = con.getValueFactory(); URI id = vf .createURI("http://meta.leighnet.ca/data/2009/getting-started"); con.addObject(id, doc); // retrieve a Document by id doc = con.getObject(Document.class, id); assertEquals("Getting Started", doc.getTitle()); // retrieve a Document by title using a dynamic query ObjectQuery query = con .prepareObjectQuery("PREFIX gs:<http://meta.leighnet.ca/rdf/2009/gs#>\n" + "SELECT ?doc WHERE {?doc gs:title ?title}"); query.setObject("title", "Getting Started"); doc = query.evaluate(Document.class).singleResult(); assertEquals("Getting Started", doc.getTitle()); } public void testMethodQuery() throws Exception { // create a Document Document doc = new Document(); doc.setTitle("Getting Started"); // add a Document to the repository ValueFactory vf = con.getValueFactory(); URI id = vf .createURI("http://meta.leighnet.ca/data/2009/getting-started"); con.addObject(id, doc); // retrieve a Document by id doc = con.getObject(Document.class, id); assertEquals("Getting Started", doc.getTitle()); doc = doc.findDocumentByTitle("Getting Started"); assertEquals("Getting Started", doc.getTitle()); } public void testProperty() throws Exception { Image nil = con.addDesignation(con.getObject(DEFAULT_IMAGE_URI), Image.class); Person me = con.addDesignation(con.getObject("urn:test:me"), Person.class); Person myself = con.addDesignation(con.getObject("urn:test:myself"), Person.class); Image image = con.addDesignation(con.getObject("urn:test:image"), Image.class); me.setDepiction(image); me = con.getObject(Person.class, "urn:test:me"); myself = con.getObject(Person.class, "urn:test:myself"); image = con.getObject(Image.class, "urn:test:image"); assertEquals(image, me.getDepiction()); assertEquals(nil, myself.getDepiction()); assertEquals(me, image.getDepicts()); me.setDepiction(null); myself.setDepiction(image); me = con.getObject(Person.class, "urn:test:me"); myself = con.getObject(Person.class, "urn:test:myself"); image = con.getObject(Image.class, "urn:test:image"); assertEquals(image, myself.getDepiction()); assertEquals(nil, me.getDepiction()); assertEquals(myself, image.getDepicts()); } public void testInverse() throws Exception { Image nil = con.addDesignation(con.getObject(DEFAULT_IMAGE_URI), Image.class); Person me = con.addDesignation(con.getObject("urn:test:me"), Person.class); Person myself = con.addDesignation(con.getObject("urn:test:myself"), Person.class); Image image = con.addDesignation(con.getObject("urn:test:image"), Image.class); image.setDepicts(me); me = con.getObject(Person.class, "urn:test:me"); myself = con.getObject(Person.class, "urn:test:myself"); image = con.getObject(Image.class, "urn:test:image"); assertEquals(image, me.getDepiction()); assertEquals(nil, myself.getDepiction()); assertEquals(me, image.getDepicts()); image.setDepicts(myself); me = con.refresh(me); myself = con.refresh(myself); image = con.refresh(image); assertEquals(image, myself.getDepiction()); assertEquals(nil, me.getDepiction()); assertEquals(myself, image.getDepicts()); } }