import com.clarkparsia.empire.Empire;
import com.clarkparsia.empire.EmpireOptions;
import com.clarkparsia.empire.config.ConfigKeys;
import com.clarkparsia.empire.sesame.OpenRdfEmpireModule;
import com.clarkparsia.empire.sesame.RepositoryDataSourceFactory;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.impl.ClassPathResource;
import org.drools.owl.conyard.Equipment;
import org.drools.owl.conyard.EquipmentImpl;
import org.drools.owl.conyard.Guest;
import org.drools.owl.conyard.GuestImpl;
import org.drools.owl.conyard.IronInstallation;
import org.drools.owl.conyard.IronInstallationImpl;
import org.drools.owl.conyard.Labourer;
import org.drools.owl.conyard.LabourerImpl;
import org.drools.owl.conyard.ObjectFactory;
import org.drools.owl.conyard.Paint;
import org.drools.owl.conyard.PaintImpl;
import org.drools.owl.conyard.Painting;
import org.drools.owl.conyard.PaintingImpl;
import org.drools.owl.conyard.Person;
import org.drools.owl.conyard.PersonImpl;
import org.drools.owl.conyard.Site;
import org.drools.owl.conyard.SiteImpl;
import org.drools.owl.conyard.Smith;
import org.drools.owl.conyard.SmithImpl;
import org.drools.owl.conyard.Stair;
import org.drools.owl.conyard.StairImpl;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.semantics.XMLSerializationHelper;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.spi.PersistenceProvider;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
public class FactTest {
private static ObjectFactory factory = new ObjectFactory();
private static Painting painting;
private static Person pers;
private static Site site;
@BeforeClass
public static void init() {
String path = Thread.currentThread().getContextClassLoader().getResource( "empire.configuration.file" ).getPath();
System.setProperty( "empire.configuration.file", path );
}
@Before
public void initTestData() {
painting = new PaintingImpl();
painting.setStartsOn(new Date());
painting.setEndsOn(new Date());
painting.setHasComment("Some comment on this object");
Stair stair = new StairImpl();
stair.setStairLength(10);
stair.setOid( "stairId" );
painting.setRequiresStair( stair );
painting.setOid("oidX");
painting.addRequiresAlso( stair );
Person px = new PersonImpl();
px.setOid( "aGuy" );
painting.addInvolves( px );
Labourer lab = new LabourerImpl();
lab.setOid( "123456x" );
painting.addInvolves( lab );
lab.addParticipatesIn( painting );
Paint paint = new PaintImpl();
paint.setOid( "R0_G0_B0" );
site = new SiteImpl();
site.setOid( "siteId" );
site.setCenterX(10.0f);
site.setCenterY(20.0f);
site.setRadius(100.0f);
paint.setStoredInSite( site );
painting.addRequires( paint );
stair.setStoredInSite( site );
Equipment equip = new EquipmentImpl();
equip.setOid( "ekwip1" );
painting.addRequires( equip );
pers = new LabourerImpl();
pers.setOid( "pers2" );
pers.addParticipatesIn( painting );
painting.addInvolves( pers );
}
public void checkPainting( Painting painting ) {
assertNotNull( painting );
assertEquals( 3, painting.getRequires().size() );
assertEquals( 1, painting.getRequiresAlso().size() );
assertTrue( painting.getRequiresAlso().get( 0 ) instanceof StairImpl );
assertEquals( 10, (int) ((Stair) painting.getRequiresAlso().get( 0 )).getStairLength() );
assertEquals( 3, painting.getInvolves().size() );
List<Labourer> labs = painting.getInvolvesLabourers();
boolean found = false;
for ( Labourer lab : labs) {
if ( lab.getParticipatesIn().size() > 0 ) {
found = true;
assertSame( painting, lab.getParticipatesIn().get( 0 ) );
}
}
assertTrue( found );
}
@Test
public void testFact() {
checkPainting( painting );
assertEquals( 3, pers.getMakesUseOf().size() );
}
@Test
public void testJaxb() throws Exception {
Painting p2 = (Painting) refreshOnJaxb( painting );
assertEquals( painting, p2 );
assertEquals( p2, painting );
checkPainting( p2 );
}
@Test
public void testSemanticAccessors() {
Painting pain = new PaintingImpl();
Date d = new Date();
pain.setStartsOn(d);
assertEquals( d, pain.getStartsOn() );
Labourer lab = new LabourerImpl();
lab.setOid("xyz");
assertEquals("xyz", lab.getOid());
lab.setOid("abc");
assertEquals("abc", lab.getOid());
}
@Test
public void testEqualityAndHashCodeWithKey() {
Painting px = new PaintingImpl();
px.setOid( "oidX" );
px.setHasComment("Some comment on this object");
// equal since key attributes are equal
assertEquals( px, painting );
assertTrue( px.hashCode() == painting.hashCode() );
// change key - no longer equal
px.setHasComment("Change value");
assertFalse( px.equals( painting ) );
assertFalse( px.hashCode() == painting.hashCode() );
// id has no effect in presence of keys
((PaintingImpl) painting).setDyEntryId( "aid" );
((PaintingImpl) px).setDyEntryId( "aid" );
assertFalse( painting.equals( px ) );
assertFalse( px.hashCode() == painting.hashCode() );
painting.setHasComment( "Change value" );
// key is matchgin again
assertEquals( painting, px );
assertTrue( px.hashCode() == painting.hashCode() );
// no effect from id
((PaintingImpl) painting).setDyEntryId( "aid2" );
assertTrue( px.equals( painting ) );
assertTrue( px.hashCode() == painting.hashCode() );
}
@Test
public void testEqualsHashcodeNoKey() {
PaintingImpl p1 = new PaintingImpl();
PaintingImpl p2 = new PaintingImpl();
PaintingImpl p3 = new PaintingImpl();
assertFalse( p1.hashCode() == p2.hashCode() );
assertFalse( p1.equals( p2 ) );
p3.setDyReference( p1.getDyEntryId() );
assertTrue( p1.hashCode() == p3.hashCode() );
assertTrue( p1.equals( p3 ) );
p1.setOid( "abx" );
p2.setOid( "abx" );
p1.setHasComment( "x" );
p2.setHasComment( "x" );
assertEquals( p1, p2 );
}
private Marshaller createMarshaller() {
return XMLSerializationHelper.createMarshaller( factory.getClass().getPackage().getName() );
}
private Unmarshaller createUnMarshaller() {
return XMLSerializationHelper.createUnmarshaller( factory.getClass().getPackage().getName() );
}
private Object refreshOnJaxb( Object o ) throws JAXBException, ParserConfigurationException, TransformerException {
StringWriter writer;
// Document dox = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
writer = new StringWriter();
createMarshaller().marshal( o, writer );
// createMarshaller().marshal( o, dox );
// Transformer transformer = TransformerFactory.newInstance().newTransformer();
// transformer.setParameter( OutputKeys.INDENT, "true" );
// transformer.transform( new DOMSource( dox ), new StreamResult( writer ) );
String initial = writer.toString();
System.err.println( initial );
System.err.println( "------------------------------------------" );
final Unmarshaller unmarsh = createUnMarshaller();
Object ret = unmarsh.unmarshal( new StringReader( writer.toString() ) );
writer = new StringWriter();
createMarshaller().marshal( ret, writer );
String fineal = writer.toString();
System.err.println( fineal );
assertEquals( initial, fineal );
return ret;
}
private void persist( Object o, EntityManager em ) {
em.getTransaction().begin();
em.persist( o );
em.getTransaction().commit();
em.clear();
}
private Object refreshOnJPA( Object o, Object key, EntityManager em ) {
Object ans = null;
em.getTransaction().begin();
ans = em.find( o.getClass(), key );
em.getTransaction().commit();
return ans;
}
@Test
public void testEmpireInheritance() {
Empire.init(new OpenRdfEmpireModule());
EmpireOptions.STRICT_MODE = false;
PersistenceProvider aProvider = Empire.get().persistenceProvider();
EntityManagerFactory emf = aProvider.createEntityManagerFactory( ObjectFactory.class.getPackage().getName()
, getTestEMConfigMap() );
EntityManager em = emf.createEntityManager();
IronInstallation ironi = new IronInstallationImpl();
Smith smith = new SmithImpl();
Labourer labrr = new LabourerImpl();
Guest guest = new GuestImpl();
ironi.getInvolves().add( smith );
ironi.getInvolves().add( labrr );
ironi.getInvolves().add( guest );
persist( ironi, em );
System.out.println( "IronI has id " + ironi.getRdfId() );
System.out.println( "Smith has id " + smith.getRdfId() );
System.out.println( "Labrr has id " + labrr.getRdfId() );
System.out.println( "Guest has id " + guest.getRdfId() );
IronInstallation ironBuild = (IronInstallation) refreshOnJPA( ironi, ironi.getRdfId(), em );
assertEquals( 3, ironBuild.getInvolves().size() );
boolean x1 = false;
boolean x2 = false;
boolean x3 = false;
boolean x4 = false;
GuestImpl newGuest = null;
for( Person p : ironBuild.getInvolves() ) {
if ( p instanceof Smith ) x1 = true;
if ( p instanceof Labourer ) x2 = true;
if ( p instanceof Guest ) x3 = true;
if ( p instanceof GuestImpl ) {
x4 = true;
newGuest = (GuestImpl) p;
}
}
assertTrue( x1 && x2 && x3 && x4 );
assertNotNull( newGuest );
newGuest.withOid("abc");
assertTrue( newGuest.getOid().contains( "abc" ) );
}
private static Map<String, String> getTestEMConfigMap() {
Map<String, String> aMap = new HashMap<String, String>();
aMap.put(ConfigKeys.FACTORY, RepositoryDataSourceFactory.class.getName());
aMap.put(RepositoryDataSourceFactory.REPO, "test-repo");
aMap.put(RepositoryDataSourceFactory.FILES, "");
aMap.put(RepositoryDataSourceFactory.QUERY_LANG, RepositoryDataSourceFactory.LANG_SERQL);
return aMap;
}
@Test
public void testEmpire() {
Empire.init( new OpenRdfEmpireModule() );
EmpireOptions.STRICT_MODE = false;
PersistenceProvider aProvider = Empire.get().persistenceProvider();
EntityManagerFactory emf = aProvider.createEntityManagerFactory( ObjectFactory.class.getPackage().getName()
, getTestEMConfigMap() );
EntityManager em = emf.createEntityManager();
persist( painting, em );
Painting p2 = (Painting) refreshOnJPA( painting, painting.getRdfId(), em );
assertTrue( p2 instanceof Painting );
assertTrue( p2 instanceof PaintingImpl );
assertEquals( new Integer(10), p2.getRequiresStair().getStairLength() );
assertEquals( painting, p2 );
assertEquals( p2, painting );
p2.getRequiresStair().setStairLength(6);
assertTrue( painting.equals( p2 ) );
assertNotSame( painting, p2 );
PaintingImpl p3 = new PaintingImpl();
p3.mergeFrom( p3, p2 );
checkPainting( p2 );
em.close();
}
@Test
public void testRuleWithEmpire() {
Empire.init(new OpenRdfEmpireModule());
EmpireOptions.STRICT_MODE = false;
PersistenceProvider aProvider = Empire.get().persistenceProvider();
EntityManagerFactory emf = aProvider.createEntityManagerFactory( ObjectFactory.class.getPackage().getName()
, getTestEMConfigMap() );
EntityManager em = emf.createEntityManager();
persist( painting, em );
Painting paintingFact = (Painting) refreshOnJPA( painting, painting.getRdfId(), em );
KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder();
builder.add( new ClassPathResource( "test/testFacts.drl" ), ResourceType.DRL );
if ( builder.hasErrors() ) {
fail( builder.getErrors().toString() );
}
KnowledgeBase kBase = KnowledgeBaseFactory.newKnowledgeBase();
kBase.addKnowledgePackages( builder.getKnowledgePackages() );
ArrayList ans = new ArrayList();
StatefulKnowledgeSession kSession = kBase.newStatefulKnowledgeSession();
kSession.setGlobal( "ans", ans );
kSession.insert(paintingFact);
kSession.fireAllRules();
assertEquals( 2, ans.size() );
System.out.println( ans );
}
@Test
public void testJPA() throws ClassNotFoundException {
EntityManagerFactory emf = Persistence.createEntityManagerFactory(
"conyard"
);
EntityManager em = emf.createEntityManager();
persist( painting, em );
Painting p2 = (Painting) refreshOnJPA( painting, ((PaintingImpl) painting).getDyEntryId(), em );
checkPainting( p2 );
em.close();
}
@Test
@Ignore
public void validateXMLWithSchema() throws SAXException {
StringWriter writer = new StringWriter();
String inXSD = "org.drools.owl.conyard.xsd";
String global = "owlThing.xsd";
SchemaFactory factory =
SchemaFactory.newInstance( "http://www.w3.org/2001/XMLSchema" );
Source schemaFile = null;
Source globalFile = null;
try {
globalFile = new StreamSource( new ClassPathResource( global ).getInputStream() );
schemaFile = new StreamSource( new ClassPathResource( inXSD ).getInputStream() );
} catch ( IOException e ) {
fail( e.getMessage() );
}
Schema schema = factory.newSchema( new Source[] { globalFile, schemaFile } );
try {
Marshaller marsh = XMLSerializationHelper.createMarshaller( painting.getClass().getPackage().getName(), schema );
marsh.marshal( painting, writer );
} catch (JAXBException e) {
e.printStackTrace();
fail( e.getMessage() );
}
System.out.println( writer.toString() );
Validator validator = schema.newValidator();
Source source = new StreamSource( new ByteArrayInputStream( writer.toString().getBytes() ) );
try {
validator.validate(source);
}
catch ( SAXException ex ) {
fail( ex.getMessage() );
} catch ( IOException ex ) {
fail( ex.getMessage() );
}
}
@Test
public void testBasicProperties() {
Empire.init(new OpenRdfEmpireModule());
EmpireOptions.STRICT_MODE = false;
PersistenceProvider aProvider = Empire.get().persistenceProvider();
EntityManagerFactory emf = aProvider.createEntityManagerFactory( ObjectFactory.class.getPackage().getName()
, getTestEMConfigMap() );
EntityManager em = emf.createEntityManager();
Stair st = new StairImpl();
st.setStairLength( 10 );
persist( st, em );
Stair s2 = (Stair) refreshOnJPA( st, st.getRdfId(), em );
assertEquals( new Integer(10), s2.getStairLength() );
em.close();
}
@Test
public void testCascadedBasicProperties() {
Empire.init( new OpenRdfEmpireModule() );
EmpireOptions.STRICT_MODE = false;
PersistenceProvider aProvider = Empire.get().persistenceProvider();
EntityManagerFactory emf = aProvider.createEntityManagerFactory( ObjectFactory.class.getPackage().getName()
, getTestEMConfigMap() );
EntityManager em = emf.createEntityManager();
Painting p = new PaintingImpl();
Stair st = new StairImpl();
st.setStairLength( 10 );
p.addRequires( st );
persist( p, em );
Painting p2 = (Painting) refreshOnJPA( p, p.getRdfId(), em );
assertEquals( new Integer(10), p.getRequiresStair().getStairLength() );
em.close();
}
@Test
public void testXMLNamespaces() {
StringWriter writer;
writer = new StringWriter();
try {
createMarshaller().marshal( painting, writer );
} catch (JAXBException e) {
fail( e.getMessage() );
}
try {
System.out.println( writer.toString() );
Document dox = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse( new ByteArrayInputStream( writer.toString().getBytes() ) );
XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xPath = xPathFactory.newXPath();
XPathExpression xPathExpression = xPath.compile("//namespace::*" );
NodeList nodeList = (NodeList) xPathExpression.evaluate( dox, XPathConstants.NODESET );
for ( int j = 0; j < nodeList.getLength(); j++ ) {
Node n = nodeList.item( j );
if ( n.getNodeName().equals( "xmlns" ) ) {
assertEquals( "http://owl.drools.org/conyard", n.getNodeValue() );
} else if ( n.getNodeName().equals( "xmlns:xml" ) ) {
assertEquals( "http://www.w3.org/XML/1998/namespace", n.getNodeValue() );
} else if ( n.getNodeName().equals( "xmlns:xsi" ) ) {
assertEquals( "http://www.w3.org/2001/XMLSchema-instance", n.getNodeValue() );
} else if ( n.getNodeName().equals( "xmlns:xs" ) ) {
assertEquals( "http://www.w3.org/2001/XMLSchema", n.getNodeValue() );
} else {
fail( "Unexpected namespace " + n.getNodeName() + " :: " + n.getNodeValue() );
}
}
} catch ( Exception e ) {
e.printStackTrace();
fail(e.getMessage());
}
}
@Test
public void testJaxbFromStringEmptyContext() {
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
"<tns:Painting id=\"idfad886c3-3a4b-48d0-9f39-2bcbcfaa9916\" xmlns:tns=\"http://owl.drools.org/conyard\" xmlns:owl=\"http://www.w3.org/2002/07/owl\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n" +
" <tns:oid>oidX</tns:oid>\n" +
" <tns:endsOn>2013-02-03T02:23:38Z</tns:endsOn>\n" +
" <tns:requires xsi:type=\"tns:Stair\" id=\"id691c7b81-de8f-4348-8bfb-9d4d812fa5c2\">\n" +
" <tns:oid>stairId</tns:oid>\n" +
" <tns:storedIn id=\"id6b2e7e09-e988-4bb5-b1fb-ca53e836194f\">\n" +
" <tns:oid>siteId</tns:oid>\n" +
" <tns:radius>100.0</tns:radius>\n" +
" <tns:centerY>20.0</tns:centerY>\n" +
" <tns:centerX>10.0</tns:centerX>\n" +
" </tns:storedIn>\n" +
" <tns:stairLength>10</tns:stairLength>\n" +
" </tns:requires>\n" +
" <tns:requires xsi:type=\"tns:Paint\" id=\"ida9c46ad4-6ce0-4c93-b770-3a9358623989\">\n" +
" <tns:oid>R0_G0_B0</tns:oid>\n" +
" <tns:storedIn idref=\"id6b2e7e09-e988-4bb5-b1fb-ca53e836194f\"/>\n" +
" </tns:requires>\n" +
" <tns:requires id=\"id18cb4e92-30b3-47a1-836a-c6760eaf7268\">\n" +
" <tns:oid>ekwip1</tns:oid>\n" +
" </tns:requires>\n" +
" <tns:involves id=\"ida4d7bf06-fe5b-43b4-9f5b-357898f283b1\">\n" +
" <tns:oid>aGuy</tns:oid>\n" +
" </tns:involves>\n" +
" <tns:involves xsi:type=\"tns:Labourer\" id=\"id250ed42d-32a9-4cd1-a624-0be7d5e24589\">\n" +
" <tns:oid>123456x</tns:oid>\n" +
" <tns:participatesIn xsi:type=\"tns:Painting\" idref=\"idfad886c3-3a4b-48d0-9f39-2bcbcfaa9916\"/>\n" +
" </tns:involves>\n" +
" <tns:involves xsi:type=\"tns:Labourer\" id=\"idc4fb4fc5-208a-4e55-bd2f-724c8688f636\">\n" +
" <tns:oid>pers2</tns:oid>\n" +
" <tns:participatesIn xsi:type=\"tns:Painting\" idref=\"idfad886c3-3a4b-48d0-9f39-2bcbcfaa9916\"/>\n" +
" </tns:involves>\n" +
" <tns:requiresAlso xsi:type=\"tns:Stair\" idref=\"id691c7b81-de8f-4348-8bfb-9d4d812fa5c2\"/>\n" +
" <tns:startsOn>2013-02-03T02:23:38Z</tns:startsOn>\n" +
" <tns:hasComment>Some comment on this object</tns:hasComment>\n" +
"</tns:Painting>";
try {
Object paint2 = createUnMarshaller().unmarshal( new StringReader( xml ) );
checkPainting( (Painting) paint2 );
} catch ( JAXBException jxe ) {
jxe.printStackTrace();
fail(jxe.getMessage());
}
}
}