package org.openrdf.repository.object;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import junit.framework.Test;
import org.openrdf.annotations.Iri;
import org.openrdf.annotations.ParameterTypes;
import org.openrdf.model.Literal;
import org.openrdf.model.Resource;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import org.openrdf.model.vocabulary.XMLSchema;
import org.openrdf.repository.object.base.ObjectRepositoryTestCase;
import org.openrdf.repository.object.traits.ObjectMessage;
import org.openrdf.repository.object.traits.VoidMessage;
public class InterceptTest extends ObjectRepositoryTestCase {
public static Test suite() throws Exception {
return ObjectRepositoryTestCase.suite(InterceptTest.class);
}
@Iri("urn:test:IConcept")
public interface IConcept extends RDFObject {
@Iri("urn:test:date")
public XMLGregorianCalendar getDate();
public void setDate(XMLGregorianCalendar date);
@Iri("urn:test:time")
public XMLGregorianCalendar getTime();
public void setTime(XMLGregorianCalendar time);
}
public abstract static class CatchBehaviour implements IConcept {
@ParameterTypes({})
public XMLGregorianCalendar getTime(ObjectMessage msg) throws Exception {
try {
msg.proceed();
} catch (IllegalArgumentException e) {
try {
return DatatypeFactory.newInstance().newXMLGregorianCalendar();
} catch (DatatypeConfigurationException e1) {
return null;
}
}
return (XMLGregorianCalendar) msg.proceed();
}
}
public static class CConcept {
public static int count;
public void increment1() {
count++;
}
public void increment2() {
count++;
}
}
public static class Behaviour {
public static int count;
@ParameterTypes( {})
public void increment1(VoidMessage msg) throws Exception {
count++;
msg.proceed();
}
@ParameterTypes( {})
public void increment2(VoidMessage msg) {
count++;
}
}
public void setUp() throws Exception {
config.addConcept(CConcept.class, "urn:test:Concept");
config.addBehaviour(Behaviour.class, "urn:test:Concept");
config.addConcept(IConcept.class);
config.addBehaviour(CatchBehaviour.class);
super.setUp();
}
public void testInterceptBaseMethod() throws Exception {
CConcept.count = 0;
Behaviour.count = 0;
CConcept concept = con.addDesignation(
con.getObject("urn:test:concept"), CConcept.class);
concept.increment1();
assertEquals(1, CConcept.count);
assertEquals(1, Behaviour.count);
}
public void testOverrideBaseMethod() throws Exception {
CConcept.count = 0;
Behaviour.count = 0;
CConcept concept = con.addDesignation(
con.getObject("urn:test:concept"), CConcept.class);
concept.increment2();
assertEquals(1, Behaviour.count);
assertEquals(0, CConcept.count);
}
public void testIllegalArgument() throws Exception {
IConcept concept = con.addDesignation(
con.getObject("urn:test:concept"), IConcept.class);
ValueFactory vf = con.getValueFactory();
Resource subj = concept.getResource();
URI pred = vf.createURI("urn:test:date");
Literal lit = vf.createLiteral("noon", XMLSchema.DATETIME);
con.add(subj, pred, lit);
try {
concept.getDate();
fail();
} catch (IllegalArgumentException e) {
assertTrue(e.getMessage().contains("noon"));
}
}
public void testCatchIllegalArgument() throws Exception {
IConcept concept = con.addDesignation(
con.getObject("urn:test:concept"), IConcept.class);
ValueFactory vf = con.getValueFactory();
Resource subj = concept.getResource();
URI pred = vf.createURI("urn:test:time");
Literal lit = vf.createLiteral("noon", XMLSchema.DATETIME);
con.add(subj, pred, lit);
XMLGregorianCalendar zero = DatatypeFactory.newInstance().newXMLGregorianCalendar();
assertEquals(zero, concept.getTime());
}
}