package org.mitre.provenance.workflows;
import java.util.Date;
import org.mitre.provenance.PLUSException;
import org.mitre.provenance.client.LocalProvenanceClient;
import org.mitre.provenance.plusobject.PLUSInvocation;
import org.mitre.provenance.plusobject.PLUSObject;
import org.mitre.provenance.plusobject.PLUSWorkflow;
import org.mitre.provenance.plusobject.ProvenanceCollection;
import org.mitre.provenance.plusobject.builder.ProvBuilder;
import org.mitre.provenance.user.User;
/**
* A teaching example of a provenance workflow, as part of the default catalog.
* This workflow converts the fahrenheit temperature of 100 degrees to Celsius.
* The formula for converting Fahrenheit to Celsius is subtract 32, multiply by 5, then divide by 9.
* This simple example shows the difference between operations and the values they take as arguments, and
* how the result of multiple operations becomes a provenance graph.
* @author moxious
*
*/
public class TemperatureConversion {
public static ProvenanceCollection create() throws PLUSException {
PLUSWorkflow wf = new PLUSWorkflow();
wf.setName("Temperature Conversion: 100F to Celsius");
wf.setWhenStart(new Date().toString());
wf.setWhenEnd(new Date().toString());
ProvBuilder b = new ProvBuilder(wf, User.PUBLIC);
b = b.link(b.merge(b.newDataNamed("100 degrees Fahrenheit"),
b.newDataNamed(" 32 ")),
b.newInvocationNamed("Subtract"));
b = b.merge(b.link(b.nodeNamed("Subtract"), b.newDataNamed("68")));
b = b.merge(b.link(new ProvBuilder(b.nodeNamed("68"), b.newDataNamed("5")),
b.newInvocationNamed("Multiply")));
b = b.merge(b.link(b.nodeNamed("Multiply"), b.newDataNamed("340")));
b = b.merge(b.link(new ProvBuilder(b.nodeNamed("340"), b.newDataNamed("9")),
b.newInvocationNamed("Divide")));
b = b.merge(b.link(b.nodeNamed("Divide"), b.newDataNamed("37.77")));
System.out.println(b);
return b;
}
public static void main(String [] args) throws Exception {
new LocalProvenanceClient().report(TemperatureConversion.create());
}
}