|
@@ -10,6 +10,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Repository;
|
|
|
|
|
|
import ua.be.wee.model.nodes.Activity;
|
|
|
+import ua.be.wee.model.nodes.Artifact;
|
|
|
import ua.be.wee.model.nodes.ports.ControlInputPort;
|
|
|
import ua.be.wee.model.nodes.ports.ControlOutputPort;
|
|
|
import ua.be.wee.model.pm.PM;
|
|
@@ -18,14 +19,21 @@ import ua.be.wee.model.pt.EndTraceEvent;
|
|
|
import ua.be.wee.model.pt.Event;
|
|
|
import ua.be.wee.model.pt.PT;
|
|
|
import ua.be.wee.model.pt.StartActivityEvent;
|
|
|
+import ua.be.wee.model.pt.StartTraceEvent;
|
|
|
import ua.be.wee.model.pt.TraceArtifact;
|
|
|
import ua.be.wee.model.util.DateTimeConverter;
|
|
|
+import ua.be.wee.model.util.Pair;
|
|
|
|
|
|
@Repository
|
|
|
public class PTRepository {
|
|
|
|
|
|
@Autowired
|
|
|
private PMRepository pmRepo;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private NodeRespository nodeRepo;
|
|
|
+
|
|
|
+
|
|
|
|
|
|
public PT createTrace(PM pm) throws Exception {
|
|
|
int index = getNextIndex(pm);
|
|
@@ -49,7 +57,8 @@ public class PTRepository {
|
|
|
PT pt = new PT();
|
|
|
pt.setPmEnacted(pm);
|
|
|
pt.setIri(traceiri);
|
|
|
- pt.setEvents(new ArrayList<Event>());
|
|
|
+
|
|
|
+
|
|
|
|
|
|
query = "PREFIX tr: <http://ua.be/sdo2l/vocabulary/formalisms/processtraces#>\n"
|
|
|
+ "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
|
|
@@ -62,7 +71,14 @@ public class PTRepository {
|
|
|
if (results.hasNext()) {
|
|
|
QuerySolution next = results.next();
|
|
|
RDFNode rdfNode = next.get("?ts");
|
|
|
- pt.setTimestamp(DateTimeConverter.convertSPARQLDateTimeToTimestamp(rdfNode.toString()));
|
|
|
+
|
|
|
+ StartTraceEvent ev = new StartTraceEvent();
|
|
|
+ ev.setIri(traceiri);
|
|
|
+ ev.setPmEnacted(pm);
|
|
|
+ ev.setTimestamp(DateTimeConverter.convertSPARQLDateTimeToTimestamp(rdfNode.toString()));
|
|
|
+ List<Event> list = new ArrayList<Event>();
|
|
|
+ list.add(ev);
|
|
|
+ pt.setEvents(list);
|
|
|
}
|
|
|
return pt;
|
|
|
} else {
|
|
@@ -87,7 +103,7 @@ public class PTRepository {
|
|
|
}
|
|
|
|
|
|
public void createStartEvent(PT pt, ControlInputPort port, Activity act, List<TraceArtifact> arts) throws Exception {
|
|
|
- int index = pt.getLastEvent() == null ? 0 : (Integer.parseInt(""+pt.getLastEvent().getIri().charAt(pt.getLastEvent().getIri().length()-1))+1);
|
|
|
+ int index = pt.getEvents().size() == 1 ? 0 : (Integer.parseInt(""+pt.getLastEvent().getIri().charAt(pt.getLastEvent().getIri().length()-1))+1);
|
|
|
|
|
|
String iri = pt.getIri().replace('#', '/') + "#" + "start_activity" + index;
|
|
|
String endiri = pt.getIri().replace('#', '/') + "#" + "end_activity" + index;
|
|
@@ -101,7 +117,6 @@ public class PTRepository {
|
|
|
+ "INSERT {\n"
|
|
|
+ " <" + iri + "> rdf:type <http://ua.be/sdo2l/vocabulary/formalisms/processtraces#StartActivityEvent> , <http://ua.be/sdo2l/vocabulary/formalisms/processtraces#element> , <http://ua.be/sdo2l/vocabulary/formalisms/processtraces#Event> , owl:Thing , <http://ua.be/sdo2l/vocabulary/base/acyclic#element> ;\n"
|
|
|
+ " base:acyclicForward <" + endiri + "> ;\n"
|
|
|
- + " tr:isFollowedBy <" + endiri + "> ;\n"
|
|
|
+ " tr:hasTimestamp ?now ; \n"
|
|
|
+ " tr:isPrecededBy <" + preiri + "> ;\n"
|
|
|
+ " tr:relatesTo <" + portiri + "> ;\n";
|
|
@@ -111,6 +126,7 @@ public class PTRepository {
|
|
|
}
|
|
|
}
|
|
|
query += " owl:sameAs <" + iri + "> .\n"
|
|
|
+ + " <"+ preiri + "> tr:isFollowedBy <" + iri + "> .\n"
|
|
|
+ "} WHERE {"
|
|
|
+ " SELECT ?now\n"
|
|
|
+ " WHERE\n"
|
|
@@ -163,7 +179,11 @@ public class PTRepository {
|
|
|
public void updatePT(PT pt) throws Exception {
|
|
|
String transitive = "";
|
|
|
for (Event ev : pt.getEvents()) {
|
|
|
- transitive += "<" + ev.getIri()+">,";
|
|
|
+ if (ev instanceof StartTraceEvent) {
|
|
|
+ continue;
|
|
|
+ } else {
|
|
|
+ transitive += "<" + ev.getIri()+">,";
|
|
|
+ }
|
|
|
}
|
|
|
transitive = transitive.substring(0, transitive.length()-1);
|
|
|
|
|
@@ -179,10 +199,10 @@ public class PTRepository {
|
|
|
+ "};\n"
|
|
|
+ "INSERT DATA {\n"
|
|
|
+ " <" + pt.getIri() + "> rdf:type <http://ua.be/sdo2l/vocabulary/formalisms/processtraces#Event> , <http://ua.be/sdo2l/vocabulary/formalisms/processtraces#StartTraceEvent> , owl:Thing , <http://ua.be/sdo2l/vocabulary/base/acyclic#element> , <http://ua.be/sdo2l/vocabulary/formalisms/processtraces#element> ;\n"
|
|
|
- + " base:acyclicForward <" + pt.getEvents().get(0).getIri() + "> ;\n"
|
|
|
+ + " base:acyclicForward <" + pt.getEvents().get(1).getIri() + "> ;\n"
|
|
|
+ " base:transitiveForward "+ transitive + " ;\n"
|
|
|
- + " tr:isFollowedBy <" + pt.getEvents().get(0).getIri() + "> ;\n"
|
|
|
- + " tr:hasTimestamp " + DateTimeConverter.convertTimestampToSPARQLdateTime(pt.getTimestamp()) + " ; \n "
|
|
|
+ + " tr:isFollowedBy <" + pt.getEvents().get(1).getIri() + "> ;\n"
|
|
|
+ + " tr:hasTimestamp " + DateTimeConverter.convertTimestampToSPARQLdateTime(pt.getEvents().get(0).getTimestamp()) + " ; \n "
|
|
|
+ " tr:relatesTo <" + pt.getPmEnacted().getIri() + "> ;\n"
|
|
|
+ " owl:sameAs <"+ pt.getIri() + "> .\n"
|
|
|
+ "};";
|
|
@@ -205,9 +225,10 @@ public class PTRepository {
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
+ String preiri = pt.getLastEvent() != null ? pt.getLastEvent().getIri() : pt.getIri();
|
|
|
int index = (Integer.parseInt(""+source.getIri().charAt(source.getIri().length()-1)));
|
|
|
|
|
|
- String startiri = pt.getIri().replace('#', '/') + "#" + "start_activity" + index;
|
|
|
+ //String startiri = pt.getIri().replace('#', '/') + "#" + "start_activity" + index;
|
|
|
String endiri = pt.getIri().replace('#', '/') + "#" + "end_activity" + index;
|
|
|
|
|
|
List<String> artifactsIRI = new ArrayList<String>();
|
|
@@ -215,7 +236,7 @@ public class PTRepository {
|
|
|
String artifactIRI = pt.getIri().replace('#', '/') + "#" + art.getGUID();
|
|
|
art.setIri(artifactIRI);
|
|
|
artifactsIRI.add(artifactIRI);
|
|
|
- createTraceArtifact(endiri,startiri, art, pt);
|
|
|
+ createTraceArtifact(endiri,preiri, art, pt);
|
|
|
}
|
|
|
|
|
|
|
|
@@ -224,8 +245,8 @@ public class PTRepository {
|
|
|
+ "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
|
|
|
+ "PREFIX base: <http://ua.be/sdo2l/vocabulary/base/acyclic#>\n"
|
|
|
+ "INSERT {\n"
|
|
|
- + " <" + endiri + "> rdf:type <http://ua.be/sdo2l/vocabulary/formalisms/processtraces#StartActivityEvent> , <http://ua.be/sdo2l/vocabulary/formalisms/processtraces#element> , <http://ua.be/sdo2l/vocabulary/formalisms/processtraces#Event> , owl:Thing , <http://ua.be/sdo2l/vocabulary/base/acyclic#element> ;\n"
|
|
|
- + " tr:isPrecededBy <" + startiri + "> ;\n"
|
|
|
+ + " <" + endiri + "> rdf:type <http://ua.be/sdo2l/vocabulary/formalisms/processtraces#EndActivityEvent> , <http://ua.be/sdo2l/vocabulary/formalisms/processtraces#element> , <http://ua.be/sdo2l/vocabulary/formalisms/processtraces#Event> , owl:Thing , <http://ua.be/sdo2l/vocabulary/base/acyclic#element> ;\n"
|
|
|
+ + " tr:isPrecededBy <" + preiri + "> ;\n"
|
|
|
+ " tr:relatesTo <" + p.getIri() + "> ;\n"
|
|
|
+ " tr:hasTimestamp ?now ; \n";
|
|
|
|
|
@@ -233,7 +254,7 @@ public class PTRepository {
|
|
|
query += " tr:produces <" + iri + "> ;\n" ;
|
|
|
}
|
|
|
query += " owl:sameAs <" + endiri + "> .\n"
|
|
|
- + " <"+ startiri + "> tr:isFollowedBy <" + endiri + "> .\n"
|
|
|
+ + " <"+ preiri + "> tr:isFollowedBy <" + endiri + "> .\n"
|
|
|
+ "} WHERE {"
|
|
|
+ " SELECT ?now\n"
|
|
|
+ " WHERE\n"
|
|
@@ -395,6 +416,7 @@ public class PTRepository {
|
|
|
|
|
|
public Event createEndTraceEvent(String ptIRI, String previous, String pmIRI) throws Exception {
|
|
|
String traceiri = ptIRI + "_end";
|
|
|
+
|
|
|
String query = "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
|
|
|
+ "PREFIX tr: <http://ua.be/sdo2l/vocabulary/formalisms/processtraces#>\n"
|
|
|
+ "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
|
|
@@ -440,8 +462,8 @@ public class PTRepository {
|
|
|
}
|
|
|
|
|
|
|
|
|
- public List<PT> getStartTraceEvents() {
|
|
|
- List<PT> list = new ArrayList<PT>();
|
|
|
+ public List<StartTraceEvent> getStartTraceEvents() {
|
|
|
+ List<StartTraceEvent> list = new ArrayList<StartTraceEvent>();
|
|
|
String query = "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
|
|
|
+ "PREFIX tr: <http://ua.be/sdo2l/vocabulary/formalisms/processtraces#>\n"
|
|
|
+ "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
|
|
@@ -456,7 +478,7 @@ public class PTRepository {
|
|
|
RDFNode trace = next.get("?trace");
|
|
|
RDFNode pm = next.get("?pm");
|
|
|
RDFNode ts = next.get("?ts");
|
|
|
- PT pt = new PT();
|
|
|
+ StartTraceEvent pt = new StartTraceEvent();
|
|
|
pt.setIri(trace.toString());
|
|
|
pt.setTimestamp(DateTimeConverter.convertSPARQLDateTimeToTimestamp(ts.toString()));
|
|
|
pt.setPmEnacted(pmRepo.getPM(pm.toString()));
|
|
@@ -465,4 +487,297 @@ public class PTRepository {
|
|
|
return list;
|
|
|
}
|
|
|
|
|
|
+ public List<Event> getEvents(String startEventIRI) throws Exception {
|
|
|
+ List<Event> list = new ArrayList<Event>();
|
|
|
+ String query = "PREFIX tr: <http://ua.be/sdo2l/vocabulary/formalisms/processtraces#>\n"
|
|
|
+ + "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
|
|
|
+ + "SELECT ?trace ?pm ?ts ?next ?nexttype WHERE {\n"
|
|
|
+ + " ?trace owl:sameAs <" + startEventIRI + "> ;\n"
|
|
|
+ + " tr:relatesTo ?pm ;\n"
|
|
|
+ + " tr:hasTimestamp ?ts .\n"
|
|
|
+ + " OPTIONAL {\n"
|
|
|
+ + " ?trace tr:isFollowedBy ?next .\n"
|
|
|
+ + " ?next a ?nexttype .\n"
|
|
|
+ + " FILTER (?nexttype IN (tr:StartActivityEvent, tr:EndActivityEvent, tr:EndTraceEvent)) .\n"
|
|
|
+ + " }\n"
|
|
|
+ + "}";
|
|
|
+ ResultSet rs = FusekiWrapper.getInstance().execQuery(query);
|
|
|
+ if (rs.hasNext()) {
|
|
|
+ QuerySolution sol = rs.next();
|
|
|
+ RDFNode trace = sol.get("?trace");
|
|
|
+ RDFNode pm = sol.get("?pm");
|
|
|
+ RDFNode ts = sol.get("?ts");
|
|
|
+ RDFNode nextQ = sol.get("?next");
|
|
|
+ RDFNode nexttypeQ = sol.get("?nexttype");
|
|
|
+
|
|
|
+ StartTraceEvent stev = new StartTraceEvent();
|
|
|
+ stev.setIri(trace.toString());
|
|
|
+ PM pm2 = pmRepo.getPM(pm.toString());
|
|
|
+ pm2.setNodes(nodeRepo.getNodes(pm2.getIri()));
|
|
|
+ stev.setPmEnacted(pm2);
|
|
|
+ stev.setTimestamp(DateTimeConverter.convertSPARQLDateTimeToTimestamp(ts.toString()));
|
|
|
+ list.add(stev);
|
|
|
+
|
|
|
+ String next = nextQ != null ? nextQ.toString() : null;
|
|
|
+ String nexttype = nexttypeQ != null ? nexttypeQ.toString() : null;
|
|
|
+
|
|
|
+ while (next!= null && !next.toString().equals("")) {
|
|
|
+ if (nexttype.toString().equals(Event.START_ACTIVITY_IRI)) {
|
|
|
+ Pair<String,String> p = getStartActivityEvent(next.toString(), pm2, list);
|
|
|
+ next = p != null ? p.getFst() : null;
|
|
|
+ nexttype = p != null ? p.getSnd() : null;
|
|
|
+ } else if (nexttype.toString().equals(Event.END_ACTIVITY_IRI)) {
|
|
|
+ Pair<String,String> p = getEndActivityEvent(next.toString(), pm2, list);
|
|
|
+ next = p != null ? p.getFst() : null;
|
|
|
+ nexttype = p != null ? p.getSnd() : null;
|
|
|
+ } else if (nexttype.toString().equals(Event.END_TRACE_IRI)) {
|
|
|
+ getEndTraceEvent(next.toString(), pm2, list);
|
|
|
+ next = null;
|
|
|
+ } else {
|
|
|
+ throw new Exception("Unexpected type of event");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void getEndTraceEvent(String iri, PM pmo, List<Event> list) throws Exception {
|
|
|
+ String query = "PREFIX tr: <http://ua.be/sdo2l/vocabulary/formalisms/processtraces#>\n"
|
|
|
+ + "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
|
|
|
+ + "SELECT ?trace ?pm ?ts WHERE {\n"
|
|
|
+ + " ?trace owl:sameAs <" + iri + "> ;\n"
|
|
|
+ + " tr:relatesTo ?pm ;\n"
|
|
|
+ + " tr:hasTimestamp ?ts ;\n"
|
|
|
+ + "}";
|
|
|
+ ResultSet rs = FusekiWrapper.getInstance().execQuery(query);
|
|
|
+ if (rs.hasNext()) {
|
|
|
+ QuerySolution sol = rs.next();
|
|
|
+ RDFNode trace = sol.get("?trace");
|
|
|
+ RDFNode ts = sol.get("?ts");
|
|
|
+
|
|
|
+ EndTraceEvent ev = new EndTraceEvent();
|
|
|
+ ev.setIri(trace.toString());
|
|
|
+ ev.setPmEnacted(pmo);
|
|
|
+ ev.setTimestamp(DateTimeConverter.convertSPARQLDateTimeToTimestamp(ts.toString()));
|
|
|
+ list.add(ev);
|
|
|
+ } else {
|
|
|
+ throw new Exception("No data returned by query: \n" + query );
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private Pair<String, String> getStartActivityEvent(String iri, PM pm, List<Event> list) throws Exception {
|
|
|
+ String query = "PREFIX tr: <http://ua.be/sdo2l/vocabulary/formalisms/processtraces#>\n"
|
|
|
+ + "PREFIX pm: <http://ua.be/sdo2l/vocabulary/formalisms/pm#>\n"
|
|
|
+ + "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
|
|
|
+ + "SELECT ?trace ?port ?act ?ts ?next ?nexttype WHERE {\n"
|
|
|
+ + " ?trace owl:sameAs <" + iri + "> ;\n"
|
|
|
+ + " tr:relatesTo ?port ;\n"
|
|
|
+ + " tr:hasTimestamp ?ts .\n"
|
|
|
+ + " ?act pm:hasPort ?port .\n"
|
|
|
+ + " OPTIONAL {\n"
|
|
|
+ + " ?trace tr:isFollowedBy ?next .\n"
|
|
|
+ + " ?next a ?nexttype .\n"
|
|
|
+ + " FILTER (?nexttype IN (tr:StartActivityEvent, tr:EndActivityEvent, tr:EndTraceEvent)) . \n"
|
|
|
+ + " }\n"
|
|
|
+ + "}";
|
|
|
+ ResultSet rs = FusekiWrapper.getInstance().execQuery(query);
|
|
|
+ if (rs.hasNext()) {
|
|
|
+ QuerySolution sol = rs.next();
|
|
|
+ RDFNode trace = sol.get("?trace");
|
|
|
+ RDFNode port = sol.get("?port");
|
|
|
+ RDFNode act = sol.get("?act");
|
|
|
+
|
|
|
+ Activity activity = (Activity)pm.getNode(act.toString());
|
|
|
+ List<ControlInputPort> ctrlInPorts = activity.getCtrlInPorts();
|
|
|
+ ControlInputPort ctrlPort = null;
|
|
|
+ for (ControlInputPort ctrl : ctrlInPorts) {
|
|
|
+ if (ctrl.getIri().equals(port.toString())) {
|
|
|
+ ctrlPort = ctrl;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ RDFNode ts = sol.get("?ts");
|
|
|
+
|
|
|
+ StartActivityEvent stev = new StartActivityEvent();
|
|
|
+ stev.setIri(trace.toString());
|
|
|
+ stev.setTimestamp(DateTimeConverter.convertSPARQLDateTimeToTimestamp(ts.toString()));
|
|
|
+ stev.setRelatesTo(ctrlPort);
|
|
|
+
|
|
|
+ stev.setConsumedArtifacts(getArtifacts(stev,pm));
|
|
|
+
|
|
|
+
|
|
|
+ list.add(stev);
|
|
|
+
|
|
|
+ RDFNode next = sol.get("?next");
|
|
|
+ if (next == null) {
|
|
|
+ return null;
|
|
|
+ } else {
|
|
|
+ return new Pair<String, String>(next.toString(),sol.get("?nexttype").toString());
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ throw new Exception("No data returned by query: \n" + query );
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<TraceArtifact> getArtifacts(Event ev, PM pm) {
|
|
|
+ List<TraceArtifact> arts = new ArrayList<TraceArtifact>();
|
|
|
+ String query = "PREFIX tr: <http://ua.be/sdo2l/vocabulary/formalisms/processtraces#>\n"
|
|
|
+ + "PREFIX base: <http://ua.be/sdo2l/vocabulary/base/base#>\n"
|
|
|
+ + "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
|
|
|
+ + "SELECT ?art ?ts ?guid ?location ?tag ?pmArt WHERE {\n"
|
|
|
+ + " ?art a tr:Artifact .\n"
|
|
|
+ + (ev instanceof StartActivityEvent ?
|
|
|
+ " <" + ev.getIri() + "> tr:consumes ?art .\n" :
|
|
|
+ " <" + ev.getIri() + "> tr:produces ?art .\n")
|
|
|
+ + " ?art tr:addedAt ?ts .\n"
|
|
|
+ + " ?art base:hasGUID ?guid .\n"
|
|
|
+ + " ?art tr:hasLocation ?location .\n"
|
|
|
+ + " ?art base:hasTag ?tag .\n"
|
|
|
+ + " ?art tr:relatesTo ?pmArt .\n"
|
|
|
+ + "}";
|
|
|
+ ResultSet rs = FusekiWrapper.getInstance().execQuery(query);
|
|
|
+ while (rs.hasNext()) {
|
|
|
+ QuerySolution next = rs.next();
|
|
|
+ RDFNode art = next.get("?art");
|
|
|
+ RDFNode guid = next.get("?guid");
|
|
|
+ RDFNode ts = next.get("?ts");
|
|
|
+ RDFNode location = next.get("?location");
|
|
|
+ RDFNode tag = next.get("?tag");
|
|
|
+ RDFNode pmArt = next.get("?pmArt");
|
|
|
+ TraceArtifact tArt = new TraceArtifact();
|
|
|
+ tArt.setIri(art.toString());
|
|
|
+ tArt.setTimestamp(DateTimeConverter.convertSPARQLDateTimeToTimestamp(ts.toString()));
|
|
|
+ tArt.setRelatesTo((Artifact)pm.getNode(pmArt.toString()));
|
|
|
+ tArt.setGUID(guid.toString());
|
|
|
+ tArt.setLocation(location.toString());
|
|
|
+ tArt.setTag(tag.toString());
|
|
|
+
|
|
|
+ arts.add(tArt);
|
|
|
+ }
|
|
|
+ return arts;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Pair<String, String> getEndActivityEvent(String iri, PM pm, List<Event> list) throws Exception {
|
|
|
+ String query = "PREFIX tr: <http://ua.be/sdo2l/vocabulary/formalisms/processtraces#>\n"
|
|
|
+ + "PREFIX pm: <http://ua.be/sdo2l/vocabulary/formalisms/pm#>\n"
|
|
|
+ + "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
|
|
|
+ + "SELECT ?trace ?port ?act ?ts ?next ?nexttype WHERE {\n"
|
|
|
+ + " ?trace owl:sameAs <" + iri + "> ;\n"
|
|
|
+ + " tr:relatesTo ?port ;\n"
|
|
|
+ + " tr:hasTimestamp ?ts .\n"
|
|
|
+ + " ?act pm:hasPort ?port .\n"
|
|
|
+ + " OPTIONAL {\n"
|
|
|
+ + " ?trace tr:isFollowedBy ?next .\n"
|
|
|
+ + " ?next a ?nexttype .\n"
|
|
|
+ + " FILTER (?nexttype IN (tr:StartActivityEvent, tr:EndActivityEvent, tr:EndTraceEvent)) . \n"
|
|
|
+ + " }\n"
|
|
|
+ + "}";
|
|
|
+ ResultSet rs = FusekiWrapper.getInstance().execQuery(query);
|
|
|
+ if (rs.hasNext()) {
|
|
|
+ QuerySolution sol = rs.next();
|
|
|
+ RDFNode trace = sol.get("?trace");
|
|
|
+ RDFNode port = sol.get("?port");
|
|
|
+ RDFNode act = sol.get("?act");
|
|
|
+
|
|
|
+ Activity activity = (Activity)pm.getNode(act.toString());
|
|
|
+ List<ControlOutputPort> ctrlOutPorts = activity.getCtrlOutPorts();
|
|
|
+ ControlOutputPort ctrlPort = null;
|
|
|
+ for (ControlOutputPort ctrl : ctrlOutPorts) {
|
|
|
+ if (ctrl.getIri().equals(port.toString())) {
|
|
|
+ ctrlPort = ctrl;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ RDFNode ts = sol.get("?ts");
|
|
|
+
|
|
|
+ EndActivityEvent ev = new EndActivityEvent();
|
|
|
+ ev.setIri(trace.toString());
|
|
|
+ ev.setTimestamp(DateTimeConverter.convertSPARQLDateTimeToTimestamp(ts.toString()));
|
|
|
+ ev.setRelatesTo(ctrlPort);
|
|
|
+
|
|
|
+ ev.setProducedArtifacts(getArtifacts(ev,pm));
|
|
|
+
|
|
|
+ list.add(ev);
|
|
|
+
|
|
|
+ RDFNode next = sol.get("?next");
|
|
|
+ if (next == null) {
|
|
|
+ return null;
|
|
|
+ } else {
|
|
|
+ return new Pair<String, String>(next.toString(),sol.get("?nexttype").toString());
|
|
|
+ }
|
|
|
+
|
|
|
+ } else {
|
|
|
+ throw new Exception("No data returned by query: \n" + query );
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public List<StartTraceEvent> getActiveTraces(String pm) {
|
|
|
+ List<StartTraceEvent> list = new ArrayList<StartTraceEvent>();
|
|
|
+ String query = "PREFIX tr: <http://ua.be/sdo2l/vocabulary/formalisms/processtraces#>\n"
|
|
|
+ + "SELECT ?trace ?ts ?next WHERE {\n"
|
|
|
+ + " ?trace tr:hasTimestamp ?ts .\n"
|
|
|
+ + " ?trace tr:relatesTo <" + pm + "> .\n"
|
|
|
+ + " { \n"
|
|
|
+ + " ?trace a tr:StartTraceEvent .\n"
|
|
|
+ + " ?trace tr:isFollowedBy+ ?next .\n"
|
|
|
+ + " ?next a ?nexttype .\n"
|
|
|
+ + " FILTER (?trace != ?next)\n"
|
|
|
+ + " FILTER NOT EXISTS {?next tr:isFollowedBy ?other } .\n"
|
|
|
+ + " FILTER (?nexttype IN (tr:StartActivityEvent, tr:EndActivityEvent)) .\n"
|
|
|
+ + " }\n"
|
|
|
+ + " UNION \n"
|
|
|
+ + " {\n"
|
|
|
+ + " ?trace a tr:StartTraceEvent .\n"
|
|
|
+ + " FILTER NOT EXISTS {?trace tr:isFollowedBy ?next} .\n"
|
|
|
+ + " }\n"
|
|
|
+ + "}";
|
|
|
+ ResultSet rs = FusekiWrapper.getInstance().execQuery(query);
|
|
|
+ while (rs.hasNext()) {
|
|
|
+ QuerySolution next = rs.next();
|
|
|
+ RDFNode trace = next.get("?trace");
|
|
|
+ RDFNode ts = next.get("?ts");
|
|
|
+ StartTraceEvent ev = new StartTraceEvent();
|
|
|
+ ev.setIri(trace.toString());
|
|
|
+ ev.setTimestamp(DateTimeConverter.convertSPARQLDateTimeToTimestamp(ts.toString()));
|
|
|
+ PM pmo = new PM();
|
|
|
+ pmo.setIri(pm);
|
|
|
+ ev.setPmEnacted(pmo);
|
|
|
+ list.add(ev);
|
|
|
+ }
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+
|
|
|
+ public List<StartTraceEvent> getConcludedTraces(String pmiri) {
|
|
|
+ List<StartTraceEvent> list = new ArrayList<StartTraceEvent>();
|
|
|
+ String query = "PREFIX tr: <http://ua.be/sdo2l/vocabulary/formalisms/processtraces#>\n"
|
|
|
+ + "SELECT ?trace ?ts ?next WHERE {\n"
|
|
|
+ + " ?trace a tr:StartTraceEvent .\n"
|
|
|
+ + " ?trace tr:hasTimestamp ?ts .\n"
|
|
|
+ + " ?trace tr:relatesTo <" + pmiri + "> .\n"
|
|
|
+ + " ?trace tr:isFollowedBy+ ?next .\n"
|
|
|
+ + " ?next a ?nexttype .\n"
|
|
|
+ + " FILTER (?trace != ?next)\n"
|
|
|
+ + " FILTER NOT EXISTS {?next tr:isFollowedBy ?other } .\n"
|
|
|
+ + " FILTER (?nexttype IN (tr:EndTraceEvent)) .\n"
|
|
|
+ + "}";
|
|
|
+ ResultSet rs = FusekiWrapper.getInstance().execQuery(query);
|
|
|
+ while (rs.hasNext()) {
|
|
|
+ QuerySolution next = rs.next();
|
|
|
+ RDFNode trace = next.get("?trace");
|
|
|
+ RDFNode ts = next.get("?ts");
|
|
|
+ StartTraceEvent ev = new StartTraceEvent();
|
|
|
+ ev.setIri(trace.toString());
|
|
|
+ ev.setTimestamp(DateTimeConverter.convertSPARQLDateTimeToTimestamp(ts.toString()));
|
|
|
+ PM pmo = new PM();
|
|
|
+ pmo.setIri(pmiri);
|
|
|
+ ev.setPmEnacted(pmo);
|
|
|
+ list.add(ev);
|
|
|
+ }
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
}
|