package org.openrdf.repository.object; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import junit.framework.Test; import org.openrdf.annotations.Iri; import org.openrdf.model.URI; import org.openrdf.model.Value; import org.openrdf.model.ValueFactory; import org.openrdf.query.TupleQuery; import org.openrdf.query.TupleQueryResult; import org.openrdf.repository.object.base.ObjectRepositoryTestCase; public class FieldPredicateTest extends ObjectRepositoryTestCase { public static Test suite() throws Exception { return ObjectRepositoryTestCase.suite(FieldPredicateTest.class); } @Iri("urn:test:Party") public static abstract class Party { @Iri("urn:test:label") private String label; @Iri("urn:test:number") private int surname; public String getLabel() { return label; } public void setLabel(String label) { this.label = label; } public int getNumber() { return surname; } public void setNumber(int count) { this.surname = count; } public abstract String getType(); @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((label == null) ? 0 : label.hashCode()); result = prime * result + surname; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Party other = (Party) obj; if (label == null) { if (other.label != null) return false; } else if (!label.equals(other.label)) return false; if (surname != other.surname) return false; return true; } } // urn:test:Person public static class Person extends Party { // urn:test:surname private String surname; // urn:test:givenNames protected Set<String> givenNames = new HashSet<String>(); public Person spouse; public String getSurname() { return surname; } public void setSurname(String surname) { this.surname = surname; super.setLabel(toString()); } public Set<String> getGivenNames() { return givenNames; } public void setGivenNames(Set<String> givenNames) { this.givenNames = givenNames; super.setLabel(toString()); } // urn:test:spouse public Person getSpouse() { return spouse; } public void setSpouse(Person spouse) { this.spouse = spouse; } public String toString() { return givenNames + " " + surname; } public String getType() { return "Person"; } @Override public int hashCode() { final int prime = 31; int result = super.hashCode(); result = prime * result + ((givenNames == null) ? 0 : givenNames.hashCode()); result = prime * result + ((spouse == null) ? 0 : spouse.hashCode()); result = prime * result + ((surname == null) ? 0 : surname.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (!super.equals(obj)) return false; if (getClass() != obj.getClass()) return false; Person other = (Person) obj; if (givenNames == null) { if (other.givenNames != null) return false; } else if (!givenNames.equals(other.givenNames)) return false; if (spouse == null) { if (other.spouse != null) return false; } else if (!spouse.equals(other.spouse)) return false; if (surname == null) { if (other.surname != null) return false; } else if (!surname.equals(other.surname)) return false; return true; } } @Iri("urn:test:Company") public static class Company extends Party { @Iri("urn:test:name") private String name; @Iri("urn:test:employees") Set<Person> employees = new HashSet<Person>(); @Iri("urn:test:count") protected int count; public String getName() { return name; } public void setName(String name) { this.name = name; super.setLabel(name); } public boolean isNamePresent() { return name != null; } public Set<Person> getEmployees() { return Collections.unmodifiableSet(employees); } public void addEmployee(Person employee) { employees.add(employee); count++; } public boolean isEmployed(Person employee) { return employees.contains(employee); } public int getNumberOfEmployees() { return count; } public Person findByGivenName(String given) { Person found = null; for (Person person : employees) { if (person.getGivenNames().contains(given)) { found = person; } } return found; } public Person findByGivenName(String given, String alternative) { Person found = null; for (Person person : employees) { Set<String> names = person.getGivenNames(); if (names.contains(given) || names.contains(alternative)) { found = person; } } return found; } public String getType() { return "Company"; } } public void testReadField() throws Exception { Company c = new Company(); c = (Company) con.getObject(con.addObject(c)); c.setName("My Company"); c = con.getObjects(Company.class).singleResult(); assertEquals("My Company", c.getName()); } public void testWriteField() throws Exception { Company c = new Company(); Person p = new Person(); Person w = new Person(); c.setName("My Company"); p.getGivenNames().add("me"); w.getGivenNames().add("my"); w.setSurname("wife"); p.setSpouse(w); c.addEmployee(p); c = (Company) con.getObject(con.addObject(c)); p = c.findByGivenName("me"); w = p.getSpouse(); assertEquals(Collections.singleton("me"), p.getGivenNames()); assertEquals("wife", w.getSurname()); assertTrue(c.isEmployed(p)); assertTrue(c.isNamePresent()); assertEquals("my wife", w.toString()); } public void testWriteFieldAlt() throws Exception { Company c = new Company(); Person p = new Person(); Person w = new Person(); c.setName("My Company"); p.getGivenNames().add("me"); w.getGivenNames().add("my"); w.setSurname("wife"); p.setSpouse(w); c.addEmployee(p); c = (Company) con.getObject(con.addObject(c)); p = c.findByGivenName("nobody", "me"); w = p.getSpouse(); assertEquals(Collections.singleton("me"), p.getGivenNames()); assertEquals("wife", w.getSurname()); assertTrue(c.isEmployed(p)); assertTrue(c.isNamePresent()); assertEquals("my wife", w.toString()); } public void testPrimitive() throws Exception { Company c = new Company(); Person p = new Person(); c.setName("My Company"); p.getGivenNames().add("me"); c.addEmployee(p); c = (Company) con.getObject(con.addObject(c)); assertEquals(1, c.getNumberOfEmployees()); } public void testSuper() throws Exception { Company c = (Company) con.getObject(con.addObject(new Company())); c.setName("My Company"); c = con.getObjects(Company.class).singleResult(); assertEquals("My Company", c.getLabel()); } public void testModifyCall() throws Exception { Person p = (Person) con.getObject(con.addObject(new Person())); p.setSurname("Smith"); assertEquals("Smith", p.getSurname()); } public void testSameFieldName() throws Exception { Person p = new Person(); p.setNumber(4); p = (Person) con.getObject(con.addObject(p)); p.setSurname("Smith"); assertEquals("Smith", p.getSurname()); assertEquals(4, p.getNumber()); } public void testAbstractConcept() throws Exception { assertEquals("Person", ((Person) con.getObject(con.addObject(new Person()))).getType()); List<Person> list = con.getObjects(Person.class).asList(); assertFalse(list.isEmpty()); } public void testEquals() throws Exception { Person p1 = new Person(); p1.setSurname("Smith"); Person p2 = new Person(); p2.setSurname("Smith"); assertTrue(p1.equals(p2)); p1 = (Person) con.getObject(con.addObject(new Person())); p1.setSurname("Smith"); p2 = (Person) con.getObject(con.addObject(new Person())); p2.setSurname("Smith"); assertFalse(p1.equals(p2)); } public void testReadAccess() throws Exception { ValueFactory vf = con.getValueFactory(); URI graph = vf.createURI("urn:test:graph"); con.setAddContexts(graph); Company c = new Company(); c = (Company) con.getObject(con.addObject(c)); c.setName("My Company"); assertEquals("My Company", c.getName()); TupleQuery query = con.prepareTupleQuery("SELECT ?g WHERE {GRAPH ?g {?o <urn:test:name> ?name}}"); query.setBinding("name", vf.createLiteral("My Company")); TupleQueryResult results = query.evaluate(); Value g = results.next().getValue("g"); results.close(); assertEquals(graph, g); con.setAddContexts(); assertEquals("My Company", c.getName()); query = con.prepareTupleQuery("SELECT ?g WHERE {GRAPH ?g {?o <urn:test:name> ?name}}"); query.setBinding("name", vf.createLiteral("My Company")); results = query.evaluate(); g = results.next().getValue("g"); results.close(); assertEquals(graph, g); } @Override protected void setUp() throws Exception { // Person = urn:test:Person config.addConcept(Party.class); config.addConcept(Company.class); super.setUp(); } }