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.URIImpl; import org.openrdf.model.impl.ValueFactoryImpl; import org.openrdf.model.vocabulary.OWL; import org.openrdf.repository.object.base.ObjectRepositoryTestCase; public class AlternativeRoleTest extends ObjectRepositoryTestCase { public static Test suite() throws Exception { return ObjectRepositoryTestCase.suite(AlternativeRoleTest.class); } public enum Friendly { FRIENDLY, NOT_FRIENDLY } public enum Ridable { RIDABLE, NOT_RIDABLE } public enum Behaves { BEHAVES, DOES_NOT_BEHAVE } @Iri(NS + "Animal") public static interface Animal { String disturb(); Friendly isFriendly(); Ridable isRidable(); Behaves isBehaved(); } @Iri(NS + "Pet") public static interface Pet { } @complementOf(Pet.class) public static interface Wild { } @Iri(NS + "Trained") public static interface Trained { } @Iri(NS + "Dog") public static interface Dog extends Animal { } @Iri(NS + "Cat") public static interface Cat extends Animal { } @Iri(NS + "Horse") public static interface Horse extends Animal { } public static class PetSupport implements Pet { public Friendly isFriendly() { return Friendly.FRIENDLY; } } @Retention(RetentionPolicy.RUNTIME) @Target( { ElementType.TYPE }) public @interface oneOf { @Iri(OWL.NAMESPACE + "oneOf") String[] value(); } @oneOf( { NS + "cujo" }) public static interface CUJO extends Pet { } public static class CujoSupport extends PetSupport implements CUJO { @Override public Friendly isFriendly() { return Friendly.NOT_FRIENDLY; } } public static class WildSupport implements Wild { public Friendly isFriendly() { return Friendly.NOT_FRIENDLY; } } public static class TrainedSupport implements Trained { public Behaves isBehaved() { return Behaves.BEHAVES; } } @complementOf(Trained.class) public interface NotTrained { } public static class NotTrainedSupport implements NotTrained { public Behaves isBehaved() { return Behaves.DOES_NOT_BEHAVE; } } public static class DogSupport { public String disturb() { return "Bark!"; } } @Retention(RetentionPolicy.RUNTIME) @Target( { ElementType.TYPE }) public @interface intersectionOf { @Iri(OWL.NAMESPACE + "intersectionOf") Class<?>[] value(); } @intersectionOf( { Cat.class, Pet.class }) public interface PetCat { } public static class PetCatSupport implements PetCat { public String disturb() { return "Meow"; } } @intersectionOf( { Cat.class, Wild.class }) public interface WildCat { } public static class WildCatSupport implements WildCat { public String disturb() { return "Hiss"; } } public static class HorseSupport { public String disturb() { return "Neigh"; } } @intersectionOf( { Horse.class, Trained.class }) public static interface TrainedHorse extends Horse, Trained { } public static abstract class TrainedHorseSupport implements TrainedHorse { public Ridable isRidable() { return Ridable.RIDABLE; } } @Retention(RetentionPolicy.RUNTIME) @Target( { ElementType.TYPE }) public @interface complementOf { @Iri(OWL.NAMESPACE + "complementOf") Class<?> value(); } @complementOf(TrainedHorse.class) public interface NotRidable { } public static class NotRidableSupport implements NotRidable { public Ridable isRidable() { return Ridable.NOT_RIDABLE; } } private static final String NS = "http://www.example.com/rdf/2007/"; private static final ValueFactory vf = ValueFactoryImpl.getInstance(); private static final URI TOBY = vf.createURI(NS, "toby"); private static final URI LYCAON = vf.createURI(NS, "lycaon"); private static final URI CUJO = vf.createURI(NS, "cujo"); private static final URI SANDY = vf.createURI(NS, "sandy"); private static final URI LINGRA = vf.createURI(NS, "lingra"); private static final URI TRIGGER = vf.createURI(NS, "trigger"); private static final URI MUSTANG = vf.createURI(NS, "mustang"); @Override protected void setUp() throws Exception { config.addAnnotation(complementOf.class); config.addAnnotation(intersectionOf.class); config.addAnnotation(oneOf.class); config.addConcept(Animal.class); config.addConcept(Pet.class); config.addConcept(Trained.class); config.addConcept(Dog.class); config.addConcept(Cat.class); config.addConcept(Horse.class); config.addBehaviour(PetSupport.class); config.addBehaviour(WildSupport.class); config.addBehaviour(CujoSupport.class); config.addBehaviour(TrainedSupport.class); config.addBehaviour(NotTrainedSupport.class); config.addBehaviour(DogSupport.class, new URIImpl((NS + "Dog"))); config.addBehaviour(PetCatSupport.class); config.addBehaviour(WildCatSupport.class); config.addBehaviour(HorseSupport.class, new URIImpl((NS + "Horse"))); config.addBehaviour(TrainedHorseSupport.class); config.addBehaviour(NotRidableSupport.class); super.setUp(); } public void testAnimals() throws Exception { con.addDesignation(con.getObject(TOBY), Pet.class); con.addDesignation(con.getObject(SANDY), Pet.class); con.addDesignation(con.getObject(CUJO), Pet.class); con.addDesignation(con.getObject(TOBY), Trained.class); con.addDesignation(con.getObject(TRIGGER), Trained.class); con.addDesignation(con.getObject(TOBY), Dog.class); con.addDesignation(con.getObject(LYCAON), Dog.class); con.addDesignation(con.getObject(CUJO), Dog.class); con.addDesignation(con.getObject(SANDY), Cat.class); con.addDesignation(con.getObject(LINGRA), Cat.class); con.addDesignation(con.getObject(TRIGGER), Horse.class); con.addDesignation(con.getObject(MUSTANG), Horse.class); Animal toby = (Animal) con.getObject(TOBY); Animal lycaon = (Animal) con.getObject(LYCAON); Animal cujo = (Animal) con.getObject(CUJO); Animal sandy = (Animal) con.getObject(SANDY); Animal lingra = (Animal) con.getObject(LINGRA); Animal trigger = (Animal) con.getObject(TRIGGER); Animal mustang = (Animal) con.getObject(MUSTANG); assertEquals(Friendly.FRIENDLY, toby.isFriendly()); assertEquals(Friendly.NOT_FRIENDLY, lycaon.isFriendly()); assertEquals(Friendly.NOT_FRIENDLY, cujo.isFriendly()); assertEquals(Friendly.FRIENDLY, sandy.isFriendly()); assertEquals(Friendly.NOT_FRIENDLY, lingra.isFriendly()); assertEquals(Friendly.NOT_FRIENDLY, trigger.isFriendly()); assertEquals(Friendly.NOT_FRIENDLY, mustang.isFriendly()); assertEquals("Bark!", toby.disturb()); assertEquals("Bark!", lycaon.disturb()); assertEquals("Bark!", cujo.disturb()); assertEquals("Meow", sandy.disturb()); assertEquals("Hiss", lingra.disturb()); assertEquals("Neigh", trigger.disturb()); assertEquals("Neigh", mustang.disturb()); assertEquals(Behaves.BEHAVES, toby.isBehaved()); assertEquals(Behaves.DOES_NOT_BEHAVE, lycaon.isBehaved()); assertEquals(Behaves.DOES_NOT_BEHAVE, cujo.isBehaved()); assertEquals(Behaves.DOES_NOT_BEHAVE, sandy.isBehaved()); assertEquals(Behaves.DOES_NOT_BEHAVE, lingra.isBehaved()); assertEquals(Behaves.BEHAVES, trigger.isBehaved()); assertEquals(Behaves.DOES_NOT_BEHAVE, mustang.isBehaved()); assertEquals(Ridable.NOT_RIDABLE, toby.isRidable()); assertEquals(Ridable.NOT_RIDABLE, lycaon.isRidable()); assertEquals(Ridable.NOT_RIDABLE, cujo.isRidable()); assertEquals(Ridable.NOT_RIDABLE, sandy.isRidable()); assertEquals(Ridable.NOT_RIDABLE, lingra.isRidable()); assertEquals(Ridable.RIDABLE, trigger.isRidable()); assertEquals(Ridable.NOT_RIDABLE, mustang.isRidable()); } }