package org.openrdf.repository.object; import junit.framework.Test; import org.openrdf.annotations.Iri; import org.openrdf.annotations.ParameterTypes; import org.openrdf.model.URI; import org.openrdf.model.impl.URIImpl; import org.openrdf.model.impl.ValueFactoryImpl; import org.openrdf.query.QueryLanguage; import org.openrdf.repository.event.base.NotifyingRepositoryWrapper; import org.openrdf.repository.object.base.RepositoryTestCase; import org.openrdf.repository.object.concepts.Seq; import org.openrdf.repository.object.config.ObjectRepositoryConfig; import org.openrdf.repository.object.config.ObjectRepositoryFactory; import org.openrdf.repository.object.traits.VoidMessage; import org.openrdf.result.Result; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.HashSet; import java.util.Set; public class UserGuideTest extends RepositoryTestCase { private static final String NS = "http://www.example.com/rdf/2007/"; public static Test suite() throws Exception { return RepositoryTestCase.suite(UserGuideTest.class); } public interface EmailUser extends User { public boolean readEmail(EmailMessage message); } public static class EmailValidator { private void validate(String email) throws Exception { if (!email.endsWith("@example.com")) { throw new IllegalArgumentException("Only internal emails"); } } @ParameterTypes(String.class) public void setFromEmailAddress(VoidMessage msg) throws Exception { validate((String) msg.getParameters()[0]); msg.proceed(); } @ParameterTypes(String.class) public void setToEmailAddress(VoidMessage msg) throws Exception { validate((String) msg.getParameters()[0]); msg.proceed(); } } @Iri("http://www.example.com/rdf/2007/Employee") public interface Employee { public double calculateExpectedBonus(double d); @Iri("http://www.example.com/rdf/2007/address") public String getAddress(); @Iri("http://www.example.com/rdf/2007/emailAddress") public String getEmailAddress(); @Iri("http://www.example.com/rdf/2007/name") public String getName(); @Iri("http://www.example.com/rdf/2007/phoneNumber") public String getPhoneNumber(); @Iri("http://www.example.com/rdf/2007/salary") public double getSalary(); public void setAddress(String address); public void setEmailAddress(String email); public void setName(String string); public void setPhoneNumber(String phone); public void setSalary(double salary); } @Iri("http://www.example.com/rdf/2007/Engineer") public interface Engineer extends Employee { @Iri("http://www.example.com/rdf/2007/bonusTargetMet") public boolean isBonusTargetMet(); public void setBonusTargetMet(boolean met); } public static abstract class EngineerBonusBehaviour implements Engineer { public double calculateExpectedBonus(double percent) { boolean target = isBonusTargetMet(); if (target) { return percent * getSalary(); } return 0; } } public static class ITSupportAgent { public boolean readEmail(EmailMessage message) { if (message.getToEmailAddress().equals("help@support.exmple.com")) { // process email here return true; } return false; } } @Iri("http://www.example.com/rdf/2007/EmailMessage") public interface EmailMessage { @Iri("http://www.example.com/rdf/2007/fromEmailAddress") public String getFromEmailAddress(); @Iri("http://www.example.com/rdf/2007/toEmailAddress") public String getToEmailAddress(); public void setFromEmailAddress(String string); public void setToEmailAddress(String string); } @Iri("http://www.example.com/rdf/2007/Node") public interface Node1 { @Iri("http://www.example.com/rdf/2007/children") public java.util.List<Node1> getChildren(); public void setChildren(java.util.List<Node1> children); } @Iri("http://www.example.com/rdf/2007/Node") public interface Node2 { @Iri("http://www.example.com/rdf/2007/children") public java.util.List<Node2> getChildren(); public void setChildren(java.util.List<Node2> children); } @Iri("http://www.example.com/rdf/2007/Node") public interface Node3 { @Iri("http://www.example.com/rdf/2007/child") public Set<Node3> getChildren(); public void setChildren(Set<Node3> children); } @Iri("http://www.example.com/rdf/2007/Node4") public interface Node4 { @Iri("http://www.example.com/rdf/2007/child") public Set<Node4> getChildren(); public void setChildren(Set<Node4> children); } @Iri("http://www.example.com/rdf/2007/Node") public interface Node2SetConcept { @Iri("http://www.example.com/rdf/2007/child") public abstract Set<Node2> getChildSet(); public abstract void setChildSet(Set<Node2> children); } public static abstract class NodeWithoutOrderedChildrenSupport implements Node2SetConcept { public java.util.List<Node2> getChildren() { return new ArrayList<Node2>(getChildSet()); } public void setChildren(java.util.List<Node2> children) { setChildSet(new HashSet<Node2>(children)); } } public static abstract class PersonalBehaviour implements EmailUser { public boolean readEmail(EmailMessage message) { String un = getUserName(); if (message.getToEmailAddress().equals(un + "@example.com")) { // process email here return true; } return false; } } public static final class PropertyChangeListenerImpl implements PropertyChangeListener { private boolean updated; public boolean isUpdated() { return updated; } public void propertyChange(PropertyChangeEvent evt) { updated = true; } } @Iri("http://www.example.com/rdf/2007/Salesman") public interface Salesman extends Employee { @Iri("http://www.example.com/rdf/2007/targetUnits") public int getTargetUnits(); @Iri("http://www.example.com/rdf/2007/unitsSold") public int getUnitsSold(); public void setTargetUnits(int target); public void setUnitsSold(int units); } public static abstract class SalesmanBonusBehaviour implements Salesman { public double calculateExpectedBonus(double percent) { int units = getUnitsSold(); int target = getTargetUnits(); if (units > target) { return percent * getSalary() * units / target; } return 0; } } public interface SupportAgent { // Concept identifier } @Iri("http://www.example.com/rdf/2007/User") public interface User { @Iri("http://www.example.com/rdf/2007/userName") public String getUserName(); public void setUserName(String name); } private ObjectRepository factory; private ObjectConnection manager; public void testBehaviour1() throws Exception { ObjectRepositoryConfig module = new ObjectRepositoryConfig(); module.addConcept(Node1.class); factory = new ObjectRepositoryFactory().createRepository(module, repository); manager = factory.getConnection(); Node1 node = manager.addDesignation(manager.getObjectFactory().createObject(), Node1.class); // All setter calls use a bean created by the manager. java.util.List<Node1> children = manager.addDesignation(manager.getObjectFactory().createObject(), Seq.class); Node1 childNode = manager.addDesignation(manager.getObjectFactory().createObject(), Node1.class); children.add(childNode); node.setChildren(children); assertEquals(1, node.getChildren().size()); } // public void testBehaviour2() throws Exception { // ObjectRepositoryConfig module = new ObjectRepositoryConfig(); // module.addConcept(Node2SetConcept.class); // module.addBehaviour(NodeWithoutOrderedChildrenSupport.class); // module.addConcept(Node2.class); // factory = new ObjectRepositoryFactory().createRepository(module, repository); // manager = factory.getConnection(); // // Node2 node = manager.addDesignation(manager.getObjectFactory().createObject(), Node2.class); // // java.util.List<Node2> children = new ArrayList<Node2>(); // // Node2 childNode = manager.addDesignation(manager.getObjectFactory().createObject(), Node2.class); // children.add(childNode); // // node.setChildren(children); // // assertEquals(1, node.getChildren().size()); // } public void testInterceptor2() throws Exception { // The RDfBean Seq can also be created within the behaviour. ObjectRepositoryConfig module = new ObjectRepositoryConfig(); module.addConcept(Node2.class); factory = new ObjectRepositoryFactory().createRepository(module, repository); manager = factory.getConnection(); Node2 node = manager.addDesignation(manager.getObjectFactory().createObject(), Node2.class); java.util.List<Node2> children = new ArrayList<Node2>(); Node2 childNode = manager.addDesignation(manager.getObjectFactory().createObject(), Node2.class); children.add(childNode); node.setChildren(children); assertEquals(1, node.getChildren().size()); } public void testChainOfResponsibility() throws Exception { String agentType = NS + "SupportAgent"; String userType = NS + "User"; ObjectRepositoryConfig module = new ObjectRepositoryConfig(); module.addBehaviour(ITSupportAgent.class, new URIImpl(agentType)); module.addConcept(SupportAgent.class, new URIImpl(agentType)); module.addBehaviour(PersonalBehaviour.class); module.addConcept(EmailUser.class, new URIImpl(userType)); module.addConcept(User.class, new URIImpl(userType)); module.addConcept(EmailMessage.class); factory = new ObjectRepositoryFactory().createRepository(module, repository); manager = factory.getConnection(); URI id = ValueFactoryImpl.getInstance().createURI(NS, "E340076"); manager.addDesignation(manager.getObject(id), SupportAgent.class); manager.addDesignation(manager.getObject(id), User.class); EmailUser user = (EmailUser) manager.getObject(id); user.setUserName("john"); EmailMessage message = manager.addDesignation(manager.getObjectFactory().createObject(), EmailMessage.class); message.setToEmailAddress("john@example.com"); if (!user.readEmail(message)) { fail(); } } public void testConcept1() throws Exception { ObjectRepositoryConfig module = new ObjectRepositoryConfig(); module.addConcept(Node4.class); factory = new ObjectRepositoryFactory().createRepository(module, repository); manager = factory.getConnection(); Node4 node = manager.addDesignation(manager.getObjectFactory().createObject(), Node4.class); Set<Node4> children = new HashSet<>(); Node4 childNode = manager.addDesignation(manager.getObjectFactory().createObject(), Node4.class); children.add(childNode); node.setChildren(children); assertEquals(1, node.getChildren().size()); } public void testConcept2() throws Exception { ObjectRepositoryConfig module = new ObjectRepositoryConfig(); module.addConcept(Engineer.class, new URIImpl(("http://www.example.org/rdf/2007/" + "Engineer"))); // uri type of Salesman is retrieved from the @rdf annotation module.addConcept(Salesman.class); factory = new ObjectRepositoryFactory().createRepository(module, repository); manager = factory.getConnection(); Engineer eng = manager.addDesignation(manager.getObjectFactory().createObject(), Engineer.class); assertNotNull(eng); Salesman sales = manager.addDesignation(manager.getObjectFactory().createObject(), Salesman.class); assertNotNull(sales); } public void testContextSpecificData() throws Exception { URI c = new URIImpl(NS + "Period#common"); URI p1 = new URIImpl(NS + "Period#1"); URI p2 = new URIImpl(NS + "Period#2"); ObjectRepositoryConfig module = new ObjectRepositoryConfig(); module.addConcept(Employee.class); module.addConcept(Salesman.class); module.addConcept(Engineer.class); module.addBehaviour(SalesmanBonusBehaviour.class); module.addBehaviour(EngineerBonusBehaviour.class); module.setAddContexts(c); module.setRemoveContexts(c); module.setReadContexts(c); ObjectRepositoryConfig m1 = module.clone(); m1.setAddContexts(p1); m1.setRemoveContexts(c, p1); m1.setReadContexts(c, p1); ObjectRepositoryConfig m2 = module.clone(); m2.setAddContexts(p2); m2.setRemoveContexts(c, p2); m2.setReadContexts(c, p2); factory = new ObjectRepositoryFactory().createRepository(module, repository); ObjectRepository f1 = new ObjectRepositoryFactory().createRepository(m1, repository); ObjectRepository f2 = new ObjectRepositoryFactory().createRepository(m2, repository); ObjectConnection common = factory.getConnection(); ObjectConnection period1 = f1.getConnection(); ObjectConnection period2 = f2.getConnection(); String qry = "SELECT ?s WHERE { ?j <http://www.example.com/rdf/2007/salary> ?s}"; try { Employee emp; Object obj; URI id = ValueFactoryImpl.getInstance().createURI(NS, "E340076"); emp = common.addDesignation(common.getObject(id), Employee.class); emp.setName("John"); Salesman slm = period1.addDesignation(period1.getObject(id), Salesman.class); slm.setTargetUnits(10); slm.setUnitsSold(15); slm.setSalary(90); Engineer eng = period2.addDesignation(period2.getObject(id), Engineer.class); eng.setBonusTargetMet(true); eng.setSalary(100); obj = common.getObject(id); assertTrue(obj instanceof Employee); assertFalse(obj instanceof Salesman); assertFalse(obj instanceof Engineer); emp = (Employee) obj; assertEquals("John", emp.getName()); assertEquals(0.0, emp.getSalary(), 0); assertTrue(common.prepareObjectQuery(qry).evaluate().asList().isEmpty()); obj = period1.getObject(id); assertTrue(obj instanceof Employee); assertTrue(obj instanceof Salesman); assertFalse(obj instanceof Engineer); emp = (Employee) obj; assertEquals("John", emp.getName()); assertEquals(90.0, emp.getSalary(), 0); assertEquals(6.75, emp.calculateExpectedBonus(0.05), 0); assertEquals(90.0, period1.prepareObjectQuery(qry).evaluate().singleResult()); obj = period2.getObject(id); assertTrue(obj instanceof Employee); assertFalse(obj instanceof Salesman); assertTrue(obj instanceof Engineer); emp = (Employee) obj; assertEquals("John", emp.getName()); assertEquals(100.0, emp.getSalary(), 0); assertEquals(5, emp.calculateExpectedBonus(0.05), 0); assertEquals(100.0, period2.prepareObjectQuery(qry).evaluate().singleResult()); } finally { common.close(); period1.close(); period2.close(); f1.shutDown(); f2.shutDown(); } } @Iri("http://www.w3.org/2000/01/rdf-schema#Resource") public interface MyResource { /** A name given to the resource. */ @Iri("urn:test:title") public abstract String getDcTitle(); /** A name given to the resource. */ public abstract void setDcTitle(String value); } public void testElmoManager1() throws Exception { assert Salesman.class.isInterface(); assert Engineer.class.isInterface(); ObjectRepositoryConfig module = new ObjectRepositoryConfig(); module.addConcept(Engineer.class); module.addConcept(Salesman.class); factory = new ObjectRepositoryFactory().createRepository(module, repository); manager = factory.getConnection(); URI id = ValueFactoryImpl.getInstance().createURI(NS, "E340076"); manager.addDesignation(manager.getObject(id), Salesman.class); Object john = manager.addDesignation(manager.getObject(id), Engineer.class); assertTrue(john instanceof Engineer); assertTrue(john instanceof Salesman); } public void testElmoManager2() throws Exception { factory = new ObjectRepositoryFactory().createRepository(new ObjectRepositoryConfig(), repository); manager = factory.getConnection(); String ns = NS; URI id = ValueFactoryImpl.getInstance().createURI(ns, "E340076"); Object john = manager.getObject(id); assertNotNull(john); assertEquals(id, manager.addObject(john)); // the subject john has the uri of // "http://www.example.com/rdf/2007/E340076" } public void testElmoManager3() throws Exception { ObjectRepositoryConfig module = new ObjectRepositoryConfig(); module.addConcept(Employee.class); factory = new ObjectRepositoryFactory().createRepository(module, repository); manager = factory.getConnection(); URI id = ValueFactoryImpl.getInstance().createURI(NS, "E340076"); Employee john = manager.addDesignation(manager.getObject(id), Employee.class); Employee jonny = (Employee) manager.getObject(id); assert john.equals(jonny); john.setName("John"); assert jonny.getName().equals("John"); } public void testElmoQuery() throws Exception { ObjectRepositoryConfig module = new ObjectRepositoryConfig(); module.addConcept(Employee.class); factory = new ObjectRepositoryFactory().createRepository(module, repository); factory.setQueryLanguage(QueryLanguage.SERQL); manager = factory.getConnection(); Employee john = manager.addDesignation(manager.getObjectFactory().createObject(), Employee.class); john.setName("John"); String queryStr = "SELECT emp FROM {emp} <http://www.example.com/rdf/2007/name> {name}"; ObjectQuery query = manager.prepareObjectQuery(queryStr); query.setObject("name", "John"); int count = 0; for (Object obj : query.evaluate().asList()) { Employee emp = (Employee) obj; count++; assert emp.getName().equals("John"); } assertEquals(1, count); } public void testInterceptor1() throws Exception { ObjectRepositoryConfig module = new ObjectRepositoryConfig(); module.addBehaviour(EmailValidator.class, new URIImpl("http://www.example.com/rdf/2007/EmailMessage")); module.addConcept(EmailMessage.class); factory = new ObjectRepositoryFactory().createRepository(module, repository); manager = factory.getConnection(); EmailMessage message = manager.addDesignation(manager.getObjectFactory().createObject(), EmailMessage.class); message.setFromEmailAddress("john@example.com"); // okay try { message.setToEmailAddress("jonny@invalid-example.com"); fail(); } catch (IllegalArgumentException e) { // invalid email } } public void testLocking() throws Exception { repository = new NotifyingRepositoryWrapper(repository, true); ObjectRepositoryConfig module = new ObjectRepositoryConfig(); module.addConcept(Employee.class); factory = new ObjectRepositoryFactory().createRepository(module, repository); manager = factory.getConnection(); for (int i = 0; i < 20; i++) { Employee emp = manager.addDesignation(manager.getObjectFactory().createObject(), Employee.class); emp.setName("Emp" + i); emp.setAddress(i + " street"); emp.setPhoneNumber("555-" + i + i); emp.setEmailAddress("emp" + i + "@example.com"); } Result<Employee> beans = manager.getObjects(Employee.class); Employee first = beans.next(); beans.close(); first.setName(first.getName().replaceAll("Emp", "Employee Number ")); for (Employee emp : manager.getObjects(Employee.class).asList()) { emp.setName(emp.getName().replaceAll("Emp", "Employee Number ")); } } public void testStrategy() throws Exception { ObjectRepositoryConfig module = new ObjectRepositoryConfig(); module.addBehaviour(SalesmanBonusBehaviour.class); module.addBehaviour(EngineerBonusBehaviour.class); module.addConcept(Engineer.class); factory = new ObjectRepositoryFactory().createRepository(module, repository); manager = factory.getConnection(); URI id = ValueFactoryImpl.getInstance().createURI(NS, "E340076"); Engineer eng = manager.addDesignation(manager.getObject(id), Engineer.class); eng.setBonusTargetMet(true); eng.setSalary(100); Employee employee = (Employee) manager.getObject(id); double bonus = employee.calculateExpectedBonus(0.05); assertEquals("bonus", 5.0, bonus, 0); } @Override protected void tearDown() throws Exception { if (manager != null) manager.close(); if (factory != null) { factory.shutDown(); } super.tearDown(); } }