package org.openrdf.repository.object;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import junit.framework.Test;
import org.openrdf.annotations.Iri;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import org.openrdf.model.impl.ValueFactoryImpl;
import org.openrdf.model.vocabulary.OWL;
import org.openrdf.repository.object.base.ObjectRepositoryTestCase;
import org.openrdf.repository.object.base.RepositoryTestCase;
import org.openrdf.repository.object.config.ObjectRepositoryFactory;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.sail.memory.MemoryStore;
public class MergeTest extends ObjectRepositoryTestCase {
public static Test suite() throws Exception {
return RepositoryTestCase.suite(MergeTest.class);
}
@Retention(RetentionPolicy.RUNTIME)
@Target( { ElementType.TYPE })
public @interface complementOf {
@Iri(OWL.NAMESPACE + "complementOf")
Class<?> value();
}
@Retention(RetentionPolicy.RUNTIME)
@Target( { ElementType.TYPE })
public @interface intersectionOf {
@Iri(OWL.NAMESPACE+"intersectionOf")
Class<?>[] value();
}
@Iri("urn:test:Company")
public interface Company {}
@Iri("urn:test:BigCompany")
public interface BigCompany extends Company {}
@complementOf(BigCompany.class)
public interface NotBigCompany {}
@intersectionOf({Company.class, NotBigCompany.class})
public interface SmallCompany extends Company, NotBigCompany {}
public class SmallCompanyImpl implements SmallCompany {
private URI name;
public SmallCompanyImpl(URI name) {
this.name = name;
}
public URI getURI() {
return name;
}
}
@Iri("urn:test:Node")
public interface Node {
@Iri("urn:test:sibling")
Node getSibling();
@Iri("urn:test:sibling")
void setSibling(Node sibling);
}
public void testComplexMerge() throws Exception {
URI name = ValueFactoryImpl.getInstance().createURI("urn:test:", "comp");
con.addDesignation(con.getObject(name), BigCompany.class);
con.addObject(name, new SmallCompanyImpl(name));
Company company = (Company) con.getObject(name);
assertTrue(company instanceof BigCompany);
}
public void testMergeOtherRepository() throws Exception {
SailRepository repo = new SailRepository(new MemoryStore());
repo.initialize();
ObjectRepositoryFactory orf = new ObjectRepositoryFactory();
ObjectRepository or = orf.createRepository(config, repo);
ObjectConnection oc = or.getConnection();
Node n1 = oc.addDesignation(oc.getObject("urn:test:n1"), Node.class);
Node n2 = oc.addDesignation(oc.getObject("urn:test:n2"), Node.class);
n1.setSibling(n2);
n2.setSibling(n1);
Node m1 = (Node) con.getObject(con.addObject(n1));
assertNotNull(m1.getSibling());
}
public void testMergeBlankNodeFromOtherRepository() throws Exception {
SailRepository repo = new SailRepository(new MemoryStore());
repo.initialize();
ObjectRepositoryFactory orf = new ObjectRepositoryFactory();
ObjectRepository or = orf.createRepository(config, repo);
ObjectConnection oc = or.getConnection();
ValueFactory vf = oc.getValueFactory();
Node n1 = oc.addDesignation(oc.getObject(vf.createBNode()), Node.class);
Node n2 = oc.addDesignation(oc.getObject(vf.createBNode()), Node.class);
n1.setSibling(n2);
n2.setSibling(n1);
Node m1 = (Node) con.getObject(con.addObject(n1));
assertNotNull(m1.getSibling());
}
public void setUp() throws Exception {
config.addAnnotation(complementOf.class);
config.addAnnotation(intersectionOf.class);
config.addConcept(Company.class);
config.addConcept(BigCompany.class);
config.addConcept(Node.class);
super.setUp();
}
}