package org.openrdf.repository.object; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.reflect.Method; import java.util.Collections; import java.util.Set; import junit.framework.TestCase; import org.openrdf.annotations.Iri; import org.openrdf.model.URI; import org.openrdf.model.ValueFactory; import org.openrdf.model.impl.ValueFactoryImpl; import org.openrdf.repository.object.advice.Advice; import org.openrdf.repository.object.advice.AdviceFactory; import org.openrdf.repository.object.advice.AdviceProvider; import org.openrdf.repository.object.composition.ClassResolver; import org.openrdf.repository.object.traits.ObjectMessage; public class SubMethodTest extends TestCase { private ClassResolver resolver; @Retention(RetentionPolicy.RUNTIME) public @interface SubClassOf { @Iri("http://www.w3.org/2000/01/rdf-schema#subClassOf") String[] value(); } @Iri("urn:test:Viewable") public interface Viewable { @Iri("urn:test:viewTrue") @SubClassOf("urn:test:thingTrue") boolean isTrue(); } @Iri("urn:test:File") public interface File extends Viewable { @Iri("urn:test:fileTrue") @SubClassOf("urn:test:viewTrue") boolean isTrue(); } @Iri("urn:test:Font") public interface Font extends File { @Iri("urn:test:fontTrue") @SubClassOf("urn:test:fileTrue") boolean isTrue(Object arg1); } @Iri("urn:test:Vector") public interface Vector extends File { @Iri("urn:test:vectorTrue") @SubClassOf("urn:test:viewTrue") boolean isTrue(Object arg1); } public static class BooleanAdvice implements AdviceProvider, AdviceFactory { public static String override; @Override public AdviceFactory getAdviserFactory(Class<?> annotationType) { if (SubClassOf.class.equals(annotationType)) return this; else return null; } @Override public Advice createAdvice(final Method method) { return new Advice() { @Override public Object intercept(ObjectMessage message) throws Exception { String iri = method.getAnnotation(Iri.class).value(); if (iri.equals(override)) return true; return message.proceed(); } }; } } private static final ValueFactory vf = ValueFactoryImpl.getInstance(); public SubMethodTest(String name) { super(name); } public void setUp() throws Exception { super.setUp(); BooleanAdvice.override = null; resolver = new ClassResolver(); resolver.getRoleMapper().addConcept(Viewable.class); resolver.getRoleMapper().addConcept(File.class); resolver.getRoleMapper().addConcept(Font.class); resolver.getRoleMapper().addConcept(Vector.class); } public void tearDown() throws Exception { super.tearDown(); } public void testDefaultValueFont() throws Exception { URI entity = vf.createURI("urn:test:entity"); Set<URI> type = Collections.singleton(vf.createURI("urn:test:Font")); Class<? extends Font> classFile = (Class<? extends Font>) resolver.resolveEntity(entity, type); Font font = classFile.newInstance(); assertFalse(font.isTrue(null)); } public void testViewableSupportFont() throws Exception { BooleanAdvice.override = "urn:test:viewTrue"; URI entity = vf.createURI("urn:test:entity"); Set<URI> type = Collections.singleton(vf.createURI("urn:test:Font")); Class<? extends Font> classFile = (Class<? extends Font>) resolver.resolveEntity(entity, type); Font font = classFile.newInstance(); assertTrue(font.isTrue(null)); } public void testFileSupportFont() throws Exception { BooleanAdvice.override = "urn:test:fileTrue"; URI entity = vf.createURI("urn:test:entity"); Set<URI> type = Collections.singleton(vf.createURI("urn:test:Font")); Class<? extends Font> classFile = (Class<? extends Font>) resolver.resolveEntity(entity, type); Font font = classFile.newInstance(); assertTrue(font.isTrue(null)); } public void testFontSupportFont() throws Exception { BooleanAdvice.override = "urn:test:fontTrue"; URI entity = vf.createURI("urn:test:entity"); Set<URI> type = Collections.singleton(vf.createURI("urn:test:Font")); Class<? extends Font> classFile = (Class<? extends Font>) resolver.resolveEntity(entity, type); Font font = classFile.newInstance(); assertTrue(font.isTrue(null)); } public void testVectorSupportFont() throws Exception { BooleanAdvice.override = "urn:test:vectorTrue"; URI entity = vf.createURI("urn:test:entity"); Set<URI> type = Collections.singleton(vf.createURI("urn:test:Font")); Class<? extends Font> classFile = (Class<? extends Font>) resolver.resolveEntity(entity, type); Font font = classFile.newInstance(); assertFalse(font.isTrue(null)); } public void testDefaultValueVector() throws Exception { URI entity = vf.createURI("urn:test:entity"); Set<URI> type = Collections.singleton(vf.createURI("urn:test:Vector")); Class<? extends Vector> classFile = (Class<? extends Vector>) resolver.resolveEntity(entity, type); Vector vector = classFile.newInstance(); assertFalse(vector.isTrue(null)); } public void testViewableSupportVector() throws Exception { BooleanAdvice.override = "urn:test:viewTrue"; URI entity = vf.createURI("urn:test:entity"); Set<URI> type = Collections.singleton(vf.createURI("urn:test:Vector")); Class<? extends Vector> classFile = (Class<? extends Vector>) resolver.resolveEntity(entity, type); Vector vector = classFile.newInstance(); assertTrue(vector.isTrue(null)); } public void testFontSupportVector() throws Exception { BooleanAdvice.override = "urn:test:fontTrue"; URI entity = vf.createURI("urn:test:entity"); Set<URI> type = Collections.singleton(vf.createURI("urn:test:Vector")); Class<? extends Vector> classFile = (Class<? extends Vector>) resolver.resolveEntity(entity, type); Vector vector = classFile.newInstance(); assertFalse(vector.isTrue(null)); } public void testVectorSupportVector() throws Exception { BooleanAdvice.override = "urn:test:vectorTrue"; URI entity = vf.createURI("urn:test:entity"); Set<URI> type = Collections.singleton(vf.createURI("urn:test:Vector")); Class<? extends Vector> classFile = (Class<? extends Vector>) resolver.resolveEntity(entity, type); Vector vector = classFile.newInstance(); assertTrue(vector.isTrue(null)); } }