package org.openprovenance.prov.xml; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.List; import java.net.URI; import javax.xml.bind.JAXBException; import org.openprovenance.prov.model.Entity; import org.openprovenance.prov.model.Activity; import org.openprovenance.prov.model.Agent; import org.openprovenance.prov.model.HasOther; import org.openprovenance.prov.model.Name; import org.openprovenance.prov.model.Namespace; import org.openprovenance.prov.model.Used; import org.openprovenance.prov.model.WasDerivedFrom; import org.openprovenance.prov.model.WasGeneratedBy; import org.openprovenance.prov.model.WasAssociatedWith; import org.openprovenance.prov.model.Statement; import org.openprovenance.prov.model.Document; import org.openprovenance.prov.model.Type; import org.openprovenance.prov.model.QualifiedName; import org.xml.sax.SAXException; import junit.framework.TestCase; /** * Unit test for simple Provenance Challenge 1 like workflow. */ public class PC1FullTest extends TestCase { public static final String PC1_NS = "http://www.ipaw.info/pc1/"; public static final String PC1_PREFIX = "pc1"; public static final String PRIM_NS = "http://openprovenance.org/primitives#"; public static final String PRIM_PREFIX = "prim"; static final ProvUtilities util=new ProvUtilities(); public static ProvFactory pFactory=new ProvFactory(); public static Name name=pFactory.getName(); public QualifiedName q(String n) { //return new org.openprovenance.prov.xml.QualifiedName(PC1_NS, n, PC1_PREFIX); return pFactory.newQualifiedName(PC1_NS, n, PC1_PREFIX); } /** * Create the test case * * @param testName * name of the test case */ public PC1FullTest(String testName) { super(testName); } public boolean urlFlag = true; /** * @return the suite of tests being tested */ public static Document graph1; public static Document graph2; public void testPC1() throws JAXBException, FileNotFoundException, IOException, SAXException { subtestPC1Full(); subtestCopyPC1Full(); subtestSchemaValidateXML(); //now failing, since no curie version //subtestSchemaFailValidateXML(); } public void subtestPC1Full() throws JAXBException { Document graph = makePC1FullGraph(pFactory); ProvSerialiser serial = ProvSerialiser.getThreadProvSerialiser(); Namespace.withThreadNamespace(graph.getNamespace()); serial.serialiseDocument(new File("target/pc1-full.xml"), graph, true); graph1 = graph; //System.out.println("PC1Full Test asserting True"); assertTrue(true); } static String PATH_PROPERTY = "http://openprovenance.org/primitives#path"; static String URL_PROPERTY = "http://openprovenance.org/primitives#url"; static String PRIMITIVE_PROPERTY = "http://openprovenance.org/primitives#primitive"; static String FILE_LOCATION = "/shomewhere/pc1/"; static String URL_LOCATION = "http://www.ipaw.info/challenge/"; private static QualifiedName PRIMITIVE_ALIGN_WARP = pFactory.newQualifiedName(PRIM_NS, "align_warp", PRIM_PREFIX); static URI PRIMITIVE_RESLICE = URI .create("http://openprovenance.org/primitives#reslice"); static URI PRIMITIVE_SOFTMEAN = URI .create("http://openprovenance.org/primitives#softmean"); static URI PRIMITIVE_CONVERT = URI .create("http://openprovenance.org/primitives#convert"); static URI PRIMITIVE_SLICER = URI .create("http://openprovenance.org/primitives#slicer"); public Entity newFile(ProvFactory pFactory, String id, String label, String file, String location) { Entity a = pFactory.newEntity(q(id), label); pFactory.addType(a, URI .create("http://openprovenance.org/primitives#File")); addUrl(a, location + file); return a; } public Entity newParameter(ProvFactory pFactory, String id, String label, String value) { Entity a = pFactory.newEntity(q(id), label); pFactory.addType(a, URI.create("http://openprovenance.org/primitives#String")); addValue(a, value); return a; } public Document makePC1FullGraph(ProvFactory pFactory) { if (urlFlag) { return makePC1FullGraph(pFactory, URL_LOCATION, URL_LOCATION); } else { return makePC1FullGraph(pFactory, FILE_LOCATION, "./"); } } public void addValue(HasOther p1, String val) { p1.getOther().add(pFactory.newOther(PC1_NS, "value", PC1_PREFIX, val, name.XSD_STRING)); } public void addUrl(HasOther p1, String val) { p1.getOther().add(pFactory.newOther(PC1_NS, "url", PC1_PREFIX, val, name.XSD_STRING)); } public Used newUsed(Activity activity, String role, Entity entity){ return newUsed(activity.getId(),role,entity.getId()); } public Used newUsed(org.openprovenance.prov.model.QualifiedName activity, String role, org.openprovenance.prov.model.QualifiedName entity){ Used u1 = pFactory.newUsed(activity, entity); u1.getRole().add(pFactory.newRole(role,name.XSD_STRING)); return u1; } public WasDerivedFrom newWasDerivedFrom(Entity entity2, Entity entity1){ WasDerivedFrom wdf=pFactory.newWasDerivedFrom(null, entity2.getId(), entity1.getId()); return wdf; } public Document makePC1FullGraph(ProvFactory pFactory, String inputLocation, String outputLocation) { //Activity p0 = pFactory.newActivity("a0", "PC1Full Workflow"); Activity p1 = pFactory.newActivity(q("00000p1"), "align_warp 1"); List<Type> o = p1.getType(); o.add(pFactory.newType(PRIMITIVE_ALIGN_WARP,name.PROV_QUALIFIED_NAME)); pFactory.addType(p1, PRIMITIVE_ALIGN_WARP, name.PROV_QUALIFIED_NAME); pFactory.addType(p1, 10, name.XSD_INT); pFactory.addType(p1, -10, name.XSD_INT); pFactory.addType(p1, -10.55, name.XSD_FLOAT); pFactory.addType(p1, "abc", name.XSD_STRING); pFactory.addType(p1, true, name.XSD_BOOLEAN); pFactory.addType(p1, URI.create("http://www.example.com/hi")); p1.getLabel().add(pFactory.newInternationalizedString("bonjour", "fr")); p1.getLabel().add(pFactory.newInternationalizedString("hello", "en")); Activity p2 = pFactory.newActivity(q("a2"), "align_warp 2"); pFactory.addType(p2, PRIMITIVE_ALIGN_WARP, name.PROV_QUALIFIED_NAME); Activity p3 = pFactory.newActivity(q("a3"), "align_warp 3"); pFactory.addType(p3, PRIMITIVE_ALIGN_WARP, name.PROV_QUALIFIED_NAME); Activity p4 = pFactory.newActivity(q("a4"), "align_warp 4"); pFactory.addType(p4, PRIMITIVE_ALIGN_WARP, name.XSD_ANY_URI); Activity p5 = pFactory.newActivity(q("a5"), "Reslice 1"); pFactory.addType(p5, PRIMITIVE_RESLICE, name.XSD_ANY_URI); Activity p6 = pFactory.newActivity(q("a6"), "Reslice 2"); pFactory.addType(p6, PRIMITIVE_RESLICE, name.XSD_ANY_URI); Activity p7 = pFactory.newActivity(q("a7"), "Reslice 3"); pFactory.addType(p7, PRIMITIVE_RESLICE, name.XSD_ANY_URI); Activity p8 = pFactory.newActivity(q("a8"), "Reslice 4"); pFactory.addType(p8, PRIMITIVE_RESLICE, name.XSD_ANY_URI); Activity p9 = pFactory.newActivity(q("a9"), "Softmean"); pFactory.addType(p9, PRIMITIVE_SOFTMEAN, name.XSD_ANY_URI); Activity p10 = pFactory.newActivity(q("a10"), "Slicer 1"); pFactory.addType(p10, PRIMITIVE_SLICER, name.XSD_ANY_URI); Activity p11 = pFactory.newActivity(q("a11"), "Slicer 2"); pFactory.addType(p11, PRIMITIVE_SLICER, name.XSD_ANY_URI); Activity p12 = pFactory.newActivity(q("a12"), "Slicer 3"); pFactory.addType(p12, PRIMITIVE_SLICER, name.XSD_ANY_URI); Activity p13 = pFactory.newActivity(q("a13"), "Convert 1"); pFactory.addType(p13, PRIMITIVE_CONVERT, name.XSD_ANY_URI); Activity p14 = pFactory.newActivity(q("a14"), "Convert 2"); pFactory.addType(p14, PRIMITIVE_CONVERT, name.XSD_ANY_URI); Activity p15 = pFactory.newActivity(q("a15"), "Convert 3"); pFactory.addType(p15, PRIMITIVE_CONVERT, name.XSD_ANY_URI); Agent ag1 = pFactory.newAgent(q("ag1"), "John Doe"); Entity a1 = newFile(pFactory, "e1", "Reference Image", "reference.img", inputLocation); Entity a2 = newFile(pFactory, "e2", "Reference Header", "reference.hdr", inputLocation); Entity a3 = newFile(pFactory, "e3", "Anatomy I1", "anatomy1.img", inputLocation); Entity a4 = newFile(pFactory, "e4", "Anatomy H1", "anatomy1.hdr", inputLocation); Entity a5 = newFile(pFactory, "e5", "Anatomy I2", "anatomy2.img", inputLocation); Entity a6 = newFile(pFactory, "e6", "Anatomy H2", "anatomy2.hdr", inputLocation); Entity a7 = newFile(pFactory, "e7", "Anatomy I3", "anatomy3.img", inputLocation); Entity a8 = newFile(pFactory, "e8", "Anatomy H3", "anatomy3.hdr", inputLocation); Entity a9 = newFile(pFactory, "e9", "Anatomy I4", "anatomy4.img", inputLocation); Entity a10 = newFile(pFactory, "e10", "Anatomy H4", "anatomy4.hdr", inputLocation); Entity a11 = newFile(pFactory, "e11", "Warp Params1", "warp1.warp", outputLocation); Entity a12 = newFile(pFactory, "e12", "Warp Params2", "warp2.warp", outputLocation); Entity a13 = newFile(pFactory, "e13", "Warp Params3", "warp3.warp", outputLocation); Entity a14 = newFile(pFactory, "e14", "Warp Params4", "warp4.warp", outputLocation); Entity a15 = newFile(pFactory, "e15", "Resliced I1", "resliced1.img", outputLocation); Entity a16 = newFile(pFactory, "e16", "Resliced H1", "resliced1.hdr", outputLocation); Entity a17 = newFile(pFactory, "e17", "Resliced I2", "resliced2.img", outputLocation); Entity a18 = newFile(pFactory, "e18", "Resliced H2", "resliced2.hdr", outputLocation); Entity a19 = newFile(pFactory, "e19", "Resliced I3", "resliced3.img", outputLocation); Entity a20 = newFile(pFactory, "e20", "Resliced H3", "resliced3.hdr", outputLocation); Entity a21 = newFile(pFactory, "e21", "Resliced I4", "resliced4.img", outputLocation); Entity a22 = newFile(pFactory, "e22", "Resliced H4", "resliced4.hdr", outputLocation); Entity a23 = newFile(pFactory, "e23", "Atlas Image", "atlas.img", outputLocation); Entity a24 = newFile(pFactory, "e24", "Atlas Header", "atlas.hdr", outputLocation); Entity a25 = newFile(pFactory, "e25", "Atlas X Slice", "atlas-x.pgm", outputLocation); Entity a25p = newParameter(pFactory, "e25p", "slicer param 1", "-x .5"); Entity a26 = newFile(pFactory, "e26", "Atlas Y Slice", "atlas-y.pgm", outputLocation); Entity a26p = newParameter(pFactory, "e26p", "slicer param 2", "-y .5"); Entity a27 = newFile(pFactory, "e27", "Atlas Z Slice", "atlas-z.pgm", outputLocation); Entity a27p = newParameter(pFactory, "e27p", "slicer param 3", "-z .5"); Entity a28 = newFile(pFactory, "e28", "Atlas X Graphic", "atlas-x.gif", outputLocation); Entity a29 = newFile(pFactory, "e29", "Atlas Y Graphic", "atlas-y.gif", outputLocation); Entity a30 = newFile(pFactory, "e30", "Atlas Z Graphic", "atlas-z.gif", outputLocation); Used u1 = newUsed(p1, "img", a3); Used u2 = newUsed(p1, "hdr", a4); Used u3 = newUsed(p1, "imgRef", a1);u3.setId(q("u3")); Used u4 = newUsed(p1, "hdrRef", a2); Used u5 = newUsed(p2, "img", a5); Used u6 = newUsed(p2, "hdr", a6); Used u7 = newUsed(p2, "imgRef", a1); Used u8 = newUsed(p2, "hdrRef", a2); Used u9 = newUsed(p3, "img", a7); Used u10 = newUsed(p3, "hdr", a8); Used u11 = newUsed(p3, "imgRef", a1); Used u12 = newUsed(p3, "hdrRef", a2); Used u13 = newUsed(p4, "img", a9); Used u14 = newUsed(p4, "hdr", a10); Used u15 = newUsed(p4, "imgRef", a1); Used u16 = newUsed(p4, "hdrRef", a2); Used u17 = newUsed(p5, "in", a11); Used u18 = newUsed(p6, "in", a12); Used u19 = newUsed(p7, "in", a13); Used u20 = newUsed(p8, "in", a14); Used u21 = newUsed(p9, "i1", a15); Used u22 = newUsed(p9, "h1", a16); Used u23 = newUsed(p9, "i2", a17); Used u24 = newUsed(p9, "h2", a18); Used u25 = newUsed(p9, "i3", a19); Used u26 = newUsed(p9, "h3", a20); Used u27 = newUsed(p9, "i4", a21); Used u28 = newUsed(p9, "h4", a22); Used u29 = newUsed(p10, "img", a23); Used u30 = newUsed(p10, "hdr", a24); Used u30p = newUsed(p10, "param", a25p); Used u31 = newUsed(p11, "img", a23); Used u32 = newUsed(p11, "hdr", a24); Used u32p = newUsed(p11, "param", a26p); Used u33 = newUsed(p12, "img", a23); Used u34 = newUsed(p12, "hdr", a24); Used u34p = newUsed(p12, "param", a27p); Used u35 = newUsed(p13, "in", a25); Used u36 = newUsed(p14, "in", a26); Used u37 = newUsed(p15, "in", a27); WasGeneratedBy wg1 = pFactory.newWasGeneratedBy(q("wgb1"), a11, "out", p1); WasGeneratedBy wg2 = pFactory.newWasGeneratedBy(a12, "out", p2); WasGeneratedBy wg3 = pFactory.newWasGeneratedBy(a13, "out", p3); WasGeneratedBy wg4 = pFactory.newWasGeneratedBy(a14, "out", p4); WasGeneratedBy wg5 = pFactory.newWasGeneratedBy(a15, "img", p5); WasGeneratedBy wg6 = pFactory.newWasGeneratedBy(a16, "hdr", p5); WasGeneratedBy wg7 = pFactory.newWasGeneratedBy(a17, "img", p6); WasGeneratedBy wg8 = pFactory.newWasGeneratedBy(a18, "hdr", p6); WasGeneratedBy wg9 = pFactory.newWasGeneratedBy(a19, "img", p7); WasGeneratedBy wg10 = pFactory.newWasGeneratedBy(a20, "hdr", p7); WasGeneratedBy wg11 = pFactory.newWasGeneratedBy(a21, "img", p8); WasGeneratedBy wg12 = pFactory.newWasGeneratedBy(a22, "hdr", p8); WasGeneratedBy wg13 = pFactory.newWasGeneratedBy(a23, "img", p9); WasGeneratedBy wg14 = pFactory.newWasGeneratedBy(a24, "hdr", p9); WasGeneratedBy wg15 = pFactory.newWasGeneratedBy(a25, "out", p10); WasGeneratedBy wg16 = pFactory.newWasGeneratedBy(a26, "out", p11); WasGeneratedBy wg17 = pFactory.newWasGeneratedBy(a27, "out", p12); WasGeneratedBy wg18 = pFactory.newWasGeneratedBy(a28, "out", p13); WasGeneratedBy wg19 = pFactory.newWasGeneratedBy(a29, "out", p14); WasGeneratedBy wg20 = pFactory.newWasGeneratedBy(a30, "out", p15); wg18.setTime(pFactory.newTimeNow()); wg19.setTime(pFactory.newTimeNow()); wg20.setTime(pFactory.newTimeNow()); //WasDerivedFrom wd1 = pFactory.newWasDerivedFrom(a11, a1, p1, wg1, u3); WasDerivedFrom wd1 = newWasDerivedFrom(a11,a1); wd1.setActivity(p1.getId()); wd1.setGeneration(wg1.getId()); wd1.setUsage(u3.getId()); WasDerivedFrom wd2 = newWasDerivedFrom(a11, a2); WasDerivedFrom wd3 = newWasDerivedFrom(a11, a3); WasDerivedFrom wd4 = newWasDerivedFrom(a11, a4); WasDerivedFrom wd5 = newWasDerivedFrom(a12, a1); WasDerivedFrom wd6 = newWasDerivedFrom(a12, a2); WasDerivedFrom wd7 = newWasDerivedFrom(a12, a5); WasDerivedFrom wd8 = newWasDerivedFrom(a12, a6); WasDerivedFrom wd9 = newWasDerivedFrom(a13, a1); WasDerivedFrom wd10 = newWasDerivedFrom(a13, a2); WasDerivedFrom wd11 = newWasDerivedFrom(a13, a7); WasDerivedFrom wd12 = newWasDerivedFrom(a13, a8); WasDerivedFrom wd13 = newWasDerivedFrom(a14, a1); WasDerivedFrom wd14 = newWasDerivedFrom(a14, a2); WasDerivedFrom wd15 = newWasDerivedFrom(a14, a9); WasDerivedFrom wd16 = newWasDerivedFrom(a14, a10); WasDerivedFrom wd17 = newWasDerivedFrom(a15, a11); WasDerivedFrom wd18 = newWasDerivedFrom(a16, a11); WasDerivedFrom wd19 = newWasDerivedFrom(a17, a12); WasDerivedFrom wd20 = newWasDerivedFrom(a18, a12); WasDerivedFrom wd21 = newWasDerivedFrom(a19, a13); WasDerivedFrom wd22 = newWasDerivedFrom(a20, a13); WasDerivedFrom wd23 = newWasDerivedFrom(a21, a14); WasDerivedFrom wd24 = newWasDerivedFrom(a22, a14); WasDerivedFrom wd25 = newWasDerivedFrom(a23, a15); WasDerivedFrom wd26 = newWasDerivedFrom(a23, a16); WasDerivedFrom wd27 = newWasDerivedFrom(a23, a17); WasDerivedFrom wd28 = newWasDerivedFrom(a23, a18); WasDerivedFrom wd29 = newWasDerivedFrom(a23, a19); WasDerivedFrom wd30 = newWasDerivedFrom(a23, a20); WasDerivedFrom wd31 = newWasDerivedFrom(a23, a21); WasDerivedFrom wd32 = newWasDerivedFrom(a23, a22); WasDerivedFrom wd33 = newWasDerivedFrom(a24, a15); WasDerivedFrom wd34 = newWasDerivedFrom(a24, a16); WasDerivedFrom wd35 = newWasDerivedFrom(a24, a17); WasDerivedFrom wd36 = newWasDerivedFrom(a24, a18); WasDerivedFrom wd37 = newWasDerivedFrom(a24, a19); WasDerivedFrom wd38 = newWasDerivedFrom(a24, a20); WasDerivedFrom wd39 = newWasDerivedFrom(a24, a21); WasDerivedFrom wd40 = newWasDerivedFrom(a24, a22); WasDerivedFrom wd41 = newWasDerivedFrom(a25, a23); WasDerivedFrom wd42 = newWasDerivedFrom(a25, a24); WasDerivedFrom wd43 = newWasDerivedFrom(a26, a23); WasDerivedFrom wd44 = newWasDerivedFrom(a26, a24); WasDerivedFrom wd45 = newWasDerivedFrom(a27, a23); WasDerivedFrom wd46 = newWasDerivedFrom(a27, a24); WasDerivedFrom wd47 = newWasDerivedFrom(a28, a25); WasDerivedFrom wd48 = newWasDerivedFrom(a29, a26); WasDerivedFrom wd49 = newWasDerivedFrom(a30, a27); WasAssociatedWith waw1 = pFactory.newWasAssociatedWith(q("waw1"), p1.getId(), ag1.getId()); Document graph = pFactory .newDocument(new Activity[] { p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15 }, new Entity[] { a1, a2, a5, a6, a3, a4, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a25p, a26, a26p, a27, a27p, a28, a29, a30 }, new Agent[] { ag1 }, new Statement[] { u1, u2, u3, u4, u5, u6, u7, u8, u9, u10, u11, u12, u13, u14, u15, u16, u17, u18, u19, u20, u21, u22, u23, u24, u25, u26, u27, u28, u29, u30, u31, u32, u33, u34, u30p, u32p, u34p, u35, u36, u37, wg1, wg2, wg3, wg4, wg5, wg6, wg7, wg8, wg9, wg10, wg11, wg12, wg13, wg14, wg15, wg16, wg17, wg18, wg19, wg20, wd1, wd2, wd3, wd4, wd5, wd6, wd7, wd8, wd9, wd10, wd11, wd12, wd13, wd14, wd15, wd16, wd17, wd18, wd19, wd20, wd21, wd22, wd23, wd24, wd25, wd26, wd27, wd28, wd29, wd30, wd31, wd32, wd33, wd34, wd35, wd36, wd37, wd38, wd39, wd40, wd41, wd42, wd43, wd44, wd45, wd46, wd47, wd48, wd49, waw1 }); graph.setNamespace(Namespace.gatherNamespaces(graph)); return graph; } public void subtestCopyPC1Full() throws java.io.FileNotFoundException, java.io.IOException { ProvFactory pFactory = new ProvFactory(); Document c = pFactory.newDocument(graph1); assertTrue("self graph1 differ", graph1.equals(graph1)); assertTrue("self c differ", c.equals(c)); assertTrue("graph1 c differ", graph1.equals(c)); } public void subtestReadXMLGraph() throws javax.xml.bind.JAXBException { ProvDeserialiser deserial = ProvDeserialiser .getThreadProvDeserialiser(); Document c = deserial.deserialiseDocument(new File("target/pc1-full.xml")); graph2 = c; graph2.setNamespace(graph1.getNamespace()); ProvSerialiser serial = ProvSerialiser.getThreadProvSerialiser(); Namespace.withThreadNamespace(graph2.getNamespace()); serial.serialiseDocument(new File("target/pc1-full2.xml"), graph2, true); // System.out.println("a0" + graph1.getRecords().getActivity().get(0)); // System.out.println("a0" + graph2.getRecords().getActivity().get(0)); assertTrue("graph1 a* and graph2 a* differ", util.getActivity(graph1).equals(util.getActivity(graph2))); // failing because of comparison of Elements <pc1:url>...</pc1:url> assertFalse("graph1 e* and graph2 e* differ", util.getEntity(graph1).equals(util.getEntity(graph2))); assertFalse("graph1 and graph2 differ", graph1.equals(graph2)); Document c2 = deserial.deserialiseDocument(new File("target/pc1-full.xml")); c2.setNamespace(graph1.getNamespace()); assertFalse("c e* and c2 e* differ", util.getEntity(c) .equals(util.getEntity(c2))); assertFalse("c and c2 differ", c.equals(c2)); } public void subtestSchemaValidateXML() throws javax.xml.bind.JAXBException, org.xml.sax.SAXException, java.io.IOException { ProvDeserialiser deserial = ProvDeserialiser .getThreadProvDeserialiser(); String[] schemaFiles = new String[2]; schemaFiles[0] = "src/test/resources/pc1.xsd"; schemaFiles[1] = "src/test/resources/prim.xsd"; deserial.validateDocument(schemaFiles, new File("target/pc1-full.xml")); } public void subtestSchemaFailValidateXML() { ProvDeserialiser deserial = ProvDeserialiser .getThreadProvDeserialiser(); String[] schemaFiles = new String[1]; schemaFiles[0] = "src/test/resources/pc1.xsd"; try { deserial.validateDocument(schemaFiles, new File("target/pc1-full.xml")); } catch (Exception e) { e.printStackTrace(); assertTrue(e instanceof javax.xml.bind.UnmarshalException); return; } assertTrue(false); } }