소스 검색

Refactorings:
- adjusting the PM and the Nodes Rest Controllers
- Adding the @Repository annotation to the repository classes
- Moving the repository classes to the "repository" package
- Adding the proper annotations for the pt elements to allow their usage
in the rest controller
- Instead of using the timestamp of WEE server (Java code), consider the
timestamp of the FUSEKI server (collected from the queries).

Lucas Albertins 2 년 전
부모
커밋
401d2e4d43
25개의 변경된 파일701개의 추가작업 그리고 368개의 파일을 삭제
  1. 0 2
      src/main/java/ua/be/wee/controller/EnactmentControllerMVC.java
  2. 11 6
      src/main/java/ua/be/wee/controller/rest/NodeController.java
  3. 4 8
      src/main/java/ua/be/wee/controller/rest/PMController.java
  4. 4 5
      src/main/java/ua/be/wee/model/EnactmentController.java
  5. 8 8
      src/main/java/ua/be/wee/model/nodes/Activity.java
  6. 7 5
      src/main/java/ua/be/wee/model/nodes/FinalNode.java
  7. 2 2
      src/main/java/ua/be/wee/model/nodes/ForkNode.java
  8. 2 2
      src/main/java/ua/be/wee/model/nodes/JoinNode.java
  9. 0 272
      src/main/java/ua/be/wee/model/nodes/NodeRespository.java
  10. 2 2
      src/main/java/ua/be/wee/model/nodes/ports/ControlInputPort.java
  11. 2 2
      src/main/java/ua/be/wee/model/nodes/ports/ControlOutputPort.java
  12. 2 2
      src/main/java/ua/be/wee/model/nodes/ports/DataInputPort.java
  13. 2 2
      src/main/java/ua/be/wee/model/nodes/ports/DataOutputPort.java
  14. 1 7
      src/main/java/ua/be/wee/model/nodes/ports/Port.java
  15. 2 2
      src/main/java/ua/be/wee/model/pm/PM.java
  16. 7 0
      src/main/java/ua/be/wee/model/pt/EndActivityEvent.java
  17. 2 16
      src/main/java/ua/be/wee/model/pt/EndTraceEvent.java
  18. 35 1
      src/main/java/ua/be/wee/model/pt/Event.java
  19. 10 0
      src/main/java/ua/be/wee/model/pt/PT.java
  20. 7 0
      src/main/java/ua/be/wee/model/pt/StartActivityEvent.java
  21. 10 0
      src/main/java/ua/be/wee/model/pt/TraceArtifact.java
  22. 424 0
      src/main/java/ua/be/wee/model/repository/NodeRespository.java
  23. 4 4
      src/main/java/ua/be/wee/model/pm/PMRepository.java
  24. 129 20
      src/main/java/ua/be/wee/model/pt/PTRepository.java
  25. 24 0
      src/main/java/ua/be/wee/model/util/DateTimeConverter.java

+ 0 - 2
src/main/java/ua/be/wee/controller/EnactmentControllerMVC.java

@@ -20,14 +20,12 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 
 import ua.be.wee.model.EnactmentController;
-import ua.be.wee.model.NamedElement;
 import ua.be.wee.model.nodes.Activity;
 import ua.be.wee.model.nodes.Artifact;
 import ua.be.wee.model.nodes.FinalNode;
 import ua.be.wee.model.nodes.Node;
 import ua.be.wee.model.nodes.ports.ControlInputPort;
 import ua.be.wee.model.nodes.ports.ControlOutputPort;
-import ua.be.wee.model.nodes.ports.Port;
 import ua.be.wee.model.pm.PM;
 import ua.be.wee.model.pt.EndActivityEvent;
 import ua.be.wee.model.pt.Event;

+ 11 - 6
src/main/java/ua/be/wee/controller/rest/NodeController.java

@@ -8,8 +8,7 @@ import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RestController;
 
 import ua.be.wee.model.nodes.Node;
-import ua.be.wee.model.nodes.NodeRespository;
-import ua.be.wee.model.pm.PM;
+import ua.be.wee.model.repository.NodeRespository;
 
 @RestController
 public class NodeController {
@@ -22,9 +21,15 @@ public class NodeController {
 		return nodesRepo.getNodes(pmIRI);
 	}
 
-//	@GetMapping("/node/{pmIRI,nodeIRI}")
-//	Node getNode(@PathVariable String pmIRI, @PathVariable String nodeIRI) {
-//		return nodesRepo.getNode(pmIRI, nodeIRI);
-//	}
+	@GetMapping("/nodes/{pmIRI}/{nodeIRI}")
+	Node getNode(@PathVariable String pmIRI, @PathVariable String nodeIRI) {
+		List<Node> nodes = nodesRepo.getNodes(pmIRI);
+		for (Node node : nodes) {
+			if (node.getIri().equals(nodeIRI)) {
+				return node;
+			}
+		}
+		return null;
+	}
 	
 }

+ 4 - 8
src/main/java/ua/be/wee/controller/rest/PMController.java

@@ -1,23 +1,19 @@
 package ua.be.wee.controller.rest;
 
-import java.net.URLEncoder;
 import java.util.List;
 
-import javax.websocket.server.PathParam;
-
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
-import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
-import org.springframework.web.util.UrlPathHelper;
 
-import ua.be.wee.model.nodes.NodeRespository;
 import ua.be.wee.model.pm.PM;
-import ua.be.wee.model.pm.PMRepository;
 import ua.be.wee.model.repository.FusekiWrapper;
+import ua.be.wee.model.repository.NodeRespository;
+import ua.be.wee.model.repository.PMRepository;
 
 @RestController
 public class PMController {
@@ -45,7 +41,7 @@ public class PMController {
 		return pm;
 	}
 	
-	@PostMapping("/endpoint")
+	@PutMapping("/endpoint")
 	boolean setEndpoint(@RequestBody String url) {
 		FusekiWrapper.getInstance().setServiceURI(url);
 		return FusekiWrapper.getInstance().testEndpoint();

+ 4 - 5
src/main/java/ua/be/wee/model/EnactmentController.java

@@ -7,15 +7,15 @@ import org.springframework.stereotype.Component;
 
 import ua.be.wee.model.nodes.Activity;
 import ua.be.wee.model.nodes.Artifact;
-import ua.be.wee.model.nodes.NodeRespository;
 import ua.be.wee.model.nodes.ports.ControlInputPort;
 import ua.be.wee.model.nodes.ports.ControlOutputPort;
 import ua.be.wee.model.pm.PM;
-import ua.be.wee.model.pm.PMRepository;
 import ua.be.wee.model.pt.Event;
 import ua.be.wee.model.pt.PT;
-import ua.be.wee.model.pt.PTRepository;
 import ua.be.wee.model.pt.TraceArtifact;
+import ua.be.wee.model.repository.NodeRespository;
+import ua.be.wee.model.repository.PMRepository;
+import ua.be.wee.model.repository.PTRepository;
 import ua.be.wee.model.util.Pair;
 
 @Component
@@ -53,8 +53,7 @@ public class EnactmentController {
 	}
 
 	public void addEndEvent(PT pt, List<TraceArtifact> arts, ControlOutputPort p) throws Exception {
-		traceRepo.createEndEvent(pt,arts,p);
-		
+		traceRepo.createEndEvent(pt,arts,p);	
 	}
 
 	public Event addEndTraceEvent(String iri, String previous, String pmIRI) throws Exception {

+ 8 - 8
src/main/java/ua/be/wee/model/nodes/Activity.java

@@ -3,11 +3,11 @@ package ua.be.wee.model.nodes;
 import java.util.ArrayList;
 import java.util.List;
 
-import javax.persistence.ElementCollection;
 import javax.persistence.Entity;
+import javax.persistence.ManyToMany;
+import javax.persistence.OneToMany;
 
 import com.fasterxml.jackson.annotation.JsonBackReference;
-import com.fasterxml.jackson.annotation.JsonManagedReference;
 
 import ua.be.wee.model.nodes.ports.ControlInputPort;
 import ua.be.wee.model.nodes.ports.ControlOutputPort;
@@ -17,25 +17,25 @@ import ua.be.wee.model.nodes.ports.DataOutputPort;
 @Entity
 public class Activity extends Node {
 	
-	@ElementCollection
+	@ManyToMany
 	private List<Artifact> inputs;
 	
-	@ElementCollection
+	@ManyToMany
 	private List<Artifact> outputs;
 	
-	@ElementCollection
+	@OneToMany
 	@JsonBackReference
 	private List<ControlOutputPort> ctrlOutPorts;
 	
-	@ElementCollection
+	@OneToMany
 	@JsonBackReference
 	private List<ControlInputPort> ctrlInPorts;
 	
-	@ElementCollection
+	@OneToMany
 	@JsonBackReference
 	private List<DataOutputPort> dataOutPorts;
 	
-	@ElementCollection
+	@OneToMany
 	@JsonBackReference
 	private List<DataInputPort> datalInPorts;
 	

+ 7 - 5
src/main/java/ua/be/wee/model/nodes/FinalNode.java

@@ -1,20 +1,22 @@
 package ua.be.wee.model.nodes;
 
+import java.util.List;
+
 import javax.persistence.CascadeType;
 import javax.persistence.Entity;
-import javax.persistence.OneToOne;
+import javax.persistence.ManyToMany;
 
 @Entity
 public class FinalNode extends Node {
 	
-	@OneToOne(cascade = CascadeType.ALL)
-	private Node previous;
+	@ManyToMany(cascade = CascadeType.ALL)
+	private List<Node> previous;
 
-	public Node getPrevious() {
+	public List<Node> getPrevious() {
 		return previous;
 	}
 
-	public void setPrevious(Node previous) {
+	public void setPrevious(List<Node> previous) {
 		this.previous = previous;
 	}
 	

+ 2 - 2
src/main/java/ua/be/wee/model/nodes/ForkNode.java

@@ -3,8 +3,8 @@ package ua.be.wee.model.nodes;
 import java.util.List;
 
 import javax.persistence.CascadeType;
-import javax.persistence.ElementCollection;
 import javax.persistence.Entity;
+import javax.persistence.OneToMany;
 import javax.persistence.OneToOne;
 
 @Entity
@@ -13,7 +13,7 @@ public class ForkNode extends Node {
 	@OneToOne(cascade = CascadeType.ALL)
 	private Node previous;
 	
-	@ElementCollection
+	@OneToMany
 	private List<Node> nextNodes;
 
 	public Node getPrevious() {

+ 2 - 2
src/main/java/ua/be/wee/model/nodes/JoinNode.java

@@ -3,14 +3,14 @@ package ua.be.wee.model.nodes;
 import java.util.List;
 
 import javax.persistence.CascadeType;
-import javax.persistence.ElementCollection;
 import javax.persistence.Entity;
+import javax.persistence.OneToMany;
 import javax.persistence.OneToOne;
 
 @Entity
 public class JoinNode extends Node {
 	
-	@ElementCollection
+	@OneToMany
 	private List<Node> previousNodes;
 	
 	@OneToOne(cascade = CascadeType.ALL)

+ 0 - 272
src/main/java/ua/be/wee/model/nodes/NodeRespository.java

@@ -1,272 +0,0 @@
-package ua.be.wee.model.nodes;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.jena.query.QuerySolution;
-import org.apache.jena.query.ResultSet;
-import org.apache.jena.rdf.model.RDFNode;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import ua.be.wee.model.nodes.ports.ControlInputPort;
-import ua.be.wee.model.nodes.ports.ControlOutputPort;
-import ua.be.wee.model.nodes.ports.DataInputPort;
-import ua.be.wee.model.nodes.ports.DataOutputPort;
-import ua.be.wee.model.pm.PM;
-import ua.be.wee.model.pm.PMRepository;
-import ua.be.wee.model.repository.FusekiWrapper;
-
-@Component
-public class NodeRespository {
-	
-	@Autowired
-	private PMRepository pmRepo;
-	
-	public List<Node> getNodes(String pmIri) {
-		List<Node> nodes = new ArrayList<Node>();
-		
-		PM pm = pmRepo.getPM(pmIri);
-		
-		String query = "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
-				+ "PREFIX pm: <http://ua.be/sdo2l/vocabulary/formalisms/pm#>\n"
-				+ "PREFIX ob: <http://ua.be/sdo2l/vocabulary/formalisms/object_diagram#>\n"
-				+ "SELECT ?node ?nodetype WHERE {\n"
-				+ "  ?pm a pm:Model ;\n"
-				+ "  	ob:hasName ?pmName ;\n"
-				+ "  	owl:sameAs <" + pm.getIri() + "> ;\n"
-				+ "  	ob:hasObject ?node .\n"
-				+ "  ?node a ?nodetype .\n"
-				+ "  FILTER (?nodetype in (pm:Initial, pm:Activity, pm:Final, pm:Join, pm:Fork, pm:Artifact)) .      \n"
-				+ "}";
-		ResultSet results = FusekiWrapper.getInstance().execQuery(query);
-		while (results.hasNext()) {
-			QuerySolution soln = results.nextSolution();
-			
-			RDFNode iri = soln.get("?node");
-			RDFNode type = soln.get("?nodetype");
-			Node node = createNode(iri, type);
-			nodes.add(node);
-		}
-		pm.setNodes(nodes);
-		updateArtifactOfActivities(pm);
-		
-		return nodes;
-		
-	}
-
-	private void updateArtifactOfActivities(PM pm) {
-		for (Node node : pm.getNodes()) {
-			if (node instanceof Activity) {
-				Activity act = (Activity)node;
-				for (DataInputPort inport : act.getDatalInPorts()) {
-					String query = "PREFIX pm: <http://ua.be/sdo2l/vocabulary/formalisms/pm#>\n"
-							+ "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
-							+ "SELECT  ?inport ?art\n"
-							+ "WHERE { \n"
-							+ "  ?inport owl:sameAs <" +inport.getIri() + "> .\n"
-							+ "  ?inport pm:dataFrom ?art .\n"
-							+ "}";
-					ResultSet results = FusekiWrapper.getInstance().execQuery(query);
-					QuerySolution soln = results.nextSolution();
-						
-					RDFNode art = soln.get("?art");
-					if (art != null && !art.toString().isEmpty()) {
-						Artifact artifact = (Artifact)pm.getNode(art.toString());
-						act.addInputArtifact(artifact);
-					}					
-				}
-				
-				for (DataOutputPort outport : act.getDataOutPorts()) {
-					String query = "PREFIX pm: <http://ua.be/sdo2l/vocabulary/formalisms/pm#>\n"
-							+ "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
-							+ "SELECT  ?outport ?art\n"
-							+ "WHERE { \n"
-							+ "  ?outport owl:sameAs <"+ outport.getIri() + "> .\n"
-							+ "  ?outport pm:dataTo ?art .\n"
-							+ "}";
-					ResultSet results = FusekiWrapper.getInstance().execQuery(query);
-					QuerySolution soln = results.nextSolution();
-						
-					RDFNode art = soln.get("?art");
-					if (art != null && !art.toString().isEmpty()) {
-						Artifact artifact = (Artifact)pm.getNode(art.toString());
-						act.addOutputArtifact(artifact);
-					}					
-				}
-			}
-		}
-	}
-
-	private Node createNode(RDFNode iri, RDFNode type) {
-		Node node = null;
-		switch (type.toString()) {
-		case Node.ACTIVITY_IRI:
-			node = createActivity(iri.toString());
-			break;
-		case Node.INITIAL_IRI:
-			node = new InitialNode();
-			break;
-		case Node.FINAL_IRI:
-			node = new FinalNode();
-			break;
-		case Node.FORKJOIN_IRI:
-			//addlogic for fork join
-			node = new JoinNode();
-			break;
-		case Node.ARTIFACT_IRI:
-			//addlogic for fork join
-			node = createArtifact(iri.toString());
-			break;
-		}		
-		node.setIri(iri.toString());
-		return node;
-	}
-	
-	private Node createArtifact(String iri) {
-		Artifact art = new Artifact();
-		String query = "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
-				+ "PREFIX pm: <http://ua.be/sdo2l/vocabulary/formalisms/pm#>\n"
-				+ "PREFIX base: <http://ua.be/sdo2l/vocabulary/base/base#>\n"
-				+ "SELECT ?art ?name ?typename WHERE {\n"
-				+ "	?art owl:sameAs <" + iri + "> .\n"
-				+ " ?art	pm:hasName ?name .\n"
-				+ " ?art  	pm:hasType ?type .\n"
-				+ " ?type base:hasGUID ?typename .\n"
-				+ "}";
-		ResultSet results = FusekiWrapper.getInstance().execQuery(query);
-		QuerySolution soln = results.nextSolution();
-		RDFNode name = soln.get("?name");
-		RDFNode type = soln.get("?typename");
-		art.setIri(iri);
-		art.setName(name.toString());
-		art.setType(type.toString());
-		
-		return art;
-	}
-
-	private Node createActivity(String iri) {
-		Activity act = new Activity();
-		String query = "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
-				+ "PREFIX ftg: <http://ua.be/sdo2l/vocabulary/formalisms/ftg#>"
-				+ "PREFIX base: <http://ua.be/sdo2l/vocabulary/base/base#>"
-				+ "PREFIX pm: <http://ua.be/sdo2l/vocabulary/formalisms/pm#>\n"
-				+ "SELECT ?act ?name ?type WHERE {\n"
-				+ "	?act owl:sameAs <" + iri + ">;\n"
-				+ "   		pm:isTransformation ?t ;  \n"
-				+ "   		pm:hasName ?name .  \n"
-				+ " ?t base:hasGUID ?type .  \n"
-				+ "}";
-		ResultSet results = FusekiWrapper.getInstance().execQuery(query);
-		QuerySolution soln = results.nextSolution();
-		RDFNode name = soln.get("?name");
-		RDFNode type = soln.get("?type");
-		act.setIri(iri);
-		act.setName(name.toString());
-		act.setTransformationName(type.toString());
-		
-		act.setCtrlInPorts(getCtrlInPorts(act));
-		act.setCtrlOutPorts(getCtrlOutPorts(act));
-		act.setDatalInPorts(getDataInPorts(act));
-		act.setDataOutPorts(getDataOutPorts(act));
-		
-		return act;
-	}
-
-	private List<DataOutputPort> getDataOutPorts(Activity act) {
-		List<DataOutputPort> list = new ArrayList<DataOutputPort>();
-		String query = "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n" 
-			+ "PREFIX pm: <http://ua.be/sdo2l/vocabulary/formalisms/pm#>\n"
-			+ "SELECT ?port ?pname WHERE {\n"
-			+ "	?act owl:sameAs <" + act.getIri() + ">;\n"
-			+ "   		pm:hasPort ?port .\n"
-			+ "  	?port a pm:DataOutputPort .\n"
-			+ "  	?port pm:hasName ?pname .\n"
-			+ "}";
-		ResultSet results = FusekiWrapper.getInstance().execQuery(query);
-		while (results.hasNext()) {
-			QuerySolution soln = results.nextSolution();
-			RDFNode iri = soln.get("?port");
-			RDFNode name = soln.get("?pname");
-			DataOutputPort cout = new DataOutputPort();
-			cout.setIri(iri.toString());
-			cout.setName(name.toString());
-			cout.setActivity(act);
-			list.add(cout);
-		}
-		return list;
-	}
-
-	private List<DataInputPort> getDataInPorts(Activity act) {
-		List<DataInputPort> list = new ArrayList<DataInputPort>();
-		String query = "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
-			+ "PREFIX pm: <http://ua.be/sdo2l/vocabulary/formalisms/pm#>\n"
-			+ "SELECT ?port ?pname WHERE {\n"
-			+ "	?act owl:sameAs <" + act.getIri() + ">;\n"
-			+ "   		pm:hasPort ?port .\n"
-			+ "  	?port a pm:DataInputPort .\n"
-			+ "  	?port pm:hasName ?pname .\n"
-			+ "}";
-		ResultSet results = FusekiWrapper.getInstance().execQuery(query);
-		while (results.hasNext()) {
-			QuerySolution soln = results.nextSolution();
-			RDFNode iri = soln.get("?port");
-			RDFNode name = soln.get("?pname");
-			DataInputPort cout = new DataInputPort();
-			cout.setIri(iri.toString());
-			cout.setName(name.toString());
-			cout.setActivity(act);
-			list.add(cout);
-		}
-		return list;
-	}
-
-	private List<ControlOutputPort> getCtrlOutPorts(Activity act) {
-		List<ControlOutputPort> list = new ArrayList<ControlOutputPort>();
-		String query = "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
-			+ "PREFIX pm: <http://ua.be/sdo2l/vocabulary/formalisms/pm#>\n"
-			+ "SELECT ?port ?pname WHERE {\n"
-			+ "	?act owl:sameAs <" + act.getIri() + ">;\n"
-			+ "   		pm:hasPort ?port .\n"
-			+ "  	?port a pm:CtrlOutputPort .\n"
-			+ "  	?port pm:hasName ?pname .\n"
-			+ "}";
-		ResultSet results = FusekiWrapper.getInstance().execQuery(query);
-		while (results.hasNext()) {
-			QuerySolution soln = results.nextSolution();
-			RDFNode iri = soln.get("?port");
-			RDFNode name = soln.get("?pname");
-			ControlOutputPort cout = new ControlOutputPort();
-			cout.setIri(iri.toString());
-			cout.setName(name.toString());
-			cout.setActivity(act);
-			list.add(cout);
-		}
-		return list;
-	}
-
-	private List<ControlInputPort> getCtrlInPorts(Activity act) {
-		List<ControlInputPort> list = new ArrayList<ControlInputPort>();
-		String query = "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
-			+ "PREFIX pm: <http://ua.be/sdo2l/vocabulary/formalisms/pm#>\n"
-			+ "SELECT ?port ?pname WHERE {\n"
-			+ "	?act owl:sameAs <" + act.getIri() + ">;\n"
-			+ "   		pm:hasPort ?port .\n"
-			+ "  	?port a pm:CtrlInputPort .\n"
-			+ "  	?port pm:hasName ?pname .\n"
-			+ "}";
-		ResultSet results = FusekiWrapper.getInstance().execQuery(query);
-		while (results.hasNext()) {
-			QuerySolution soln = results.nextSolution();
-			RDFNode iri = soln.get("?port");
-			RDFNode name = soln.get("?pname");
-			ControlInputPort cout = new ControlInputPort();
-			cout.setIri(iri.toString());
-			cout.setName(name.toString());
-			cout.setAct(act);
-			list.add(cout);
-		}
-		return list;
-	}
-
-}

+ 2 - 2
src/main/java/ua/be/wee/model/nodes/ports/ControlInputPort.java

@@ -2,7 +2,7 @@ package ua.be.wee.model.nodes.ports;
 
 import javax.persistence.CascadeType;
 import javax.persistence.Entity;
-import javax.persistence.OneToOne;
+import javax.persistence.ManyToOne;
 
 import com.fasterxml.jackson.annotation.JsonManagedReference;
 
@@ -11,7 +11,7 @@ import ua.be.wee.model.nodes.Activity;
 @Entity
 public class ControlInputPort extends Port {
 
-	@OneToOne(cascade = CascadeType.ALL)
+	@ManyToOne(cascade = CascadeType.ALL)
 	@JsonManagedReference
 	private Activity activity;
 

+ 2 - 2
src/main/java/ua/be/wee/model/nodes/ports/ControlOutputPort.java

@@ -2,7 +2,7 @@ package ua.be.wee.model.nodes.ports;
 
 import javax.persistence.CascadeType;
 import javax.persistence.Entity;
-import javax.persistence.OneToOne;
+import javax.persistence.ManyToOne;
 
 import com.fasterxml.jackson.annotation.JsonManagedReference;
 
@@ -11,7 +11,7 @@ import ua.be.wee.model.nodes.Activity;
 @Entity
 public class ControlOutputPort extends Port {
 	
-	@OneToOne(cascade = CascadeType.ALL)
+	@ManyToOne(cascade = CascadeType.ALL)
 	@JsonManagedReference
 	private Activity activity;
 

+ 2 - 2
src/main/java/ua/be/wee/model/nodes/ports/DataInputPort.java

@@ -2,7 +2,7 @@ package ua.be.wee.model.nodes.ports;
 
 import javax.persistence.CascadeType;
 import javax.persistence.Entity;
-import javax.persistence.OneToOne;
+import javax.persistence.ManyToOne;
 
 import com.fasterxml.jackson.annotation.JsonManagedReference;
 
@@ -11,7 +11,7 @@ import ua.be.wee.model.nodes.Activity;
 @Entity
 public class DataInputPort extends Port {
 	
-	@OneToOne(cascade = CascadeType.ALL)
+	@ManyToOne(cascade = CascadeType.ALL)
 	@JsonManagedReference
 	private Activity act;
 

+ 2 - 2
src/main/java/ua/be/wee/model/nodes/ports/DataOutputPort.java

@@ -2,7 +2,7 @@ package ua.be.wee.model.nodes.ports;
 
 import javax.persistence.CascadeType;
 import javax.persistence.Entity;
-import javax.persistence.OneToOne;
+import javax.persistence.ManyToOne;
 
 import com.fasterxml.jackson.annotation.JsonManagedReference;
 
@@ -11,7 +11,7 @@ import ua.be.wee.model.nodes.Activity;
 @Entity
 public class DataOutputPort extends Port {
 	
-	@OneToOne(cascade = CascadeType.ALL)
+	@ManyToOne(cascade = CascadeType.ALL)
 	@JsonManagedReference
 	private Activity act;
 

+ 1 - 7
src/main/java/ua/be/wee/model/nodes/ports/Port.java

@@ -4,16 +4,10 @@ import javax.persistence.Entity;
 import javax.persistence.Id;
 
 import com.fasterxml.jackson.annotation.JsonSubTypes;
-import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
 
 import ua.be.wee.model.NamedElement;
-import ua.be.wee.model.nodes.Activity;
-import ua.be.wee.model.nodes.Artifact;
-import ua.be.wee.model.nodes.FinalNode;
-import ua.be.wee.model.nodes.ForkNode;
-import ua.be.wee.model.nodes.InitialNode;
-import ua.be.wee.model.nodes.JoinNode;
 
 @JsonTypeInfo(
 		  use = JsonTypeInfo.Id.NAME, 

+ 2 - 2
src/main/java/ua/be/wee/model/pm/PM.java

@@ -2,9 +2,9 @@ package ua.be.wee.model.pm;
 
 import java.util.List;
 
-import javax.persistence.ElementCollection;
 import javax.persistence.Entity;
 import javax.persistence.Id;
+import javax.persistence.OneToMany;
 
 import ua.be.wee.model.nodes.InitialNode;
 import ua.be.wee.model.nodes.Node;
@@ -17,7 +17,7 @@ public class PM {
 	
 	private String name;
 	
-	@ElementCollection
+	@OneToMany
 	private List<Node> nodes;
 
 	public String getName() {

+ 7 - 0
src/main/java/ua/be/wee/model/pt/EndActivityEvent.java

@@ -3,12 +3,19 @@ package ua.be.wee.model.pt;
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.persistence.Entity;
+import javax.persistence.OneToMany;
+import javax.persistence.OneToOne;
+
 import ua.be.wee.model.nodes.ports.ControlOutputPort;
 
+@Entity
 public class EndActivityEvent extends Event {
 
+	@OneToOne
 	private ControlOutputPort relatesTo;
 	
+	@OneToMany
 	private List<TraceArtifact> producedArtifacts;
 	
 	public EndActivityEvent() {

+ 2 - 16
src/main/java/ua/be/wee/model/pt/EndTraceEvent.java

@@ -1,22 +1,8 @@
 package ua.be.wee.model.pt;
 
-import java.sql.Timestamp;
-import java.text.SimpleDateFormat;
+import javax.persistence.Entity;
 
+@Entity
 public class EndTraceEvent extends Event {
 	
-	private Timestamp timestamp;
-	
-	public Timestamp getTimestamp() {
-		return timestamp;
-	}
-
-	public void setTimestamp(Timestamp timestamp) {
-		this.timestamp = timestamp;
-	}
-	
-	public String getTimestampF() {
-		return new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(timestamp);
-	}
-
 }

+ 35 - 1
src/main/java/ua/be/wee/model/pt/Event.java

@@ -1,11 +1,30 @@
 package ua.be.wee.model.pt;
 
+import java.sql.Timestamp;
+import java.text.SimpleDateFormat;
+
+import javax.persistence.Entity;
 import javax.persistence.Id;
 
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+@JsonTypeInfo(
+		  use = JsonTypeInfo.Id.NAME, 
+		  include = JsonTypeInfo.As.PROPERTY, 
+		  property = "type")
+@JsonSubTypes({ 
+		  @Type(value = EndActivityEvent.class), 
+		  @Type(value = StartActivityEvent.class),
+		  @Type(value = EndTraceEvent.class)
+		})
+@Entity
 public abstract class Event {
 	
 	@Id
-	private String iri; 
+	private String iri;
+	
+	private Timestamp timestamp;
 	
 	public String getIri() {
 		return iri;
@@ -14,6 +33,21 @@ public abstract class Event {
 	public void setIri(String iri) {
 		this.iri = iri;
 	}
+
+	public Timestamp getTimestamp() {
+		return timestamp;
+	}
+
+	public void setTimestamp(Timestamp timestamp) {
+		this.timestamp = timestamp;
+	}
+	
+	public String getTimestampF() {
+		return new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(timestamp);
+	}
+
+	
+	
 	
 	
 

+ 10 - 0
src/main/java/ua/be/wee/model/pt/PT.java

@@ -5,20 +5,30 @@ import java.sql.Timestamp;
 import java.text.SimpleDateFormat;
 import java.util.List;
 
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.OneToOne;
+
 import ua.be.wee.model.pm.PM;
 
+@Entity
 public class PT {
 	
+	@OneToOne
 	private PM pmEnacted;
 	
 	private Timestamp timestamp;
 	
+	@Id
 	private String iri;
 	
 	private String name;
 	
+	@OneToMany
 	private List<Event> events;
 	
+	@OneToMany
 	private List<TraceArtifact> inputs;
 
 	public PM getPmEnacted() {

+ 7 - 0
src/main/java/ua/be/wee/model/pt/StartActivityEvent.java

@@ -3,12 +3,19 @@ package ua.be.wee.model.pt;
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.persistence.Entity;
+import javax.persistence.OneToMany;
+import javax.persistence.OneToOne;
+
 import ua.be.wee.model.nodes.ports.ControlInputPort;
 
+@Entity
 public class StartActivityEvent extends Event {
 	
+	@OneToOne
 	private ControlInputPort relatesTo;
 	
+	@OneToMany
 	private List<TraceArtifact> consumedArtifacts;
 	
 	public StartActivityEvent() {

+ 10 - 0
src/main/java/ua/be/wee/model/pt/TraceArtifact.java

@@ -2,8 +2,13 @@ package ua.be.wee.model.pt;
 
 import java.sql.Timestamp;
 
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+
 import ua.be.wee.model.nodes.Artifact;
 
+@Entity
 public class TraceArtifact {
 	
 	private String location;
@@ -12,16 +17,21 @@ public class TraceArtifact {
 	
 	private String GUID;
 	
+	@Id
 	private String iri;
 	
+	@OneToOne
 	private StartActivityEvent consumedBy;
 	
+	@OneToOne
 	private EndActivityEvent producedBy;
 	
+	@OneToOne
 	private Artifact relatesTo;
 	
 	private Timestamp timestamp;
 	
+	@OneToOne
 	private TraceArtifact nextVersion;
 	
 	

+ 424 - 0
src/main/java/ua/be/wee/model/repository/NodeRespository.java

@@ -0,0 +1,424 @@
+package ua.be.wee.model.repository;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.jena.query.QuerySolution;
+import org.apache.jena.query.ResultSet;
+import org.apache.jena.rdf.model.RDFNode;
+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.FinalNode;
+import ua.be.wee.model.nodes.ForkNode;
+import ua.be.wee.model.nodes.InitialNode;
+import ua.be.wee.model.nodes.JoinNode;
+import ua.be.wee.model.nodes.Node;
+import ua.be.wee.model.nodes.ports.ControlInputPort;
+import ua.be.wee.model.nodes.ports.ControlOutputPort;
+import ua.be.wee.model.nodes.ports.DataInputPort;
+import ua.be.wee.model.nodes.ports.DataOutputPort;
+import ua.be.wee.model.pm.PM;
+
+@Repository
+public class NodeRespository {
+
+	@Autowired
+	private PMRepository pmRepo;
+
+	public List<Node> getNodes(String pmIri) {
+		List<Node> nodes = new ArrayList<Node>();
+
+		PM pm = pmRepo.getPM(pmIri);
+
+		String query = "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
+				+ "PREFIX pm: <http://ua.be/sdo2l/vocabulary/formalisms/pm#>\n"
+				+ "PREFIX ob: <http://ua.be/sdo2l/vocabulary/formalisms/object_diagram#>\n"
+				+ "SELECT ?node ?nodetype WHERE {\n" + "  ?pm a pm:Model ;\n" + "  	ob:hasName ?pmName ;\n"
+				+ "  	owl:sameAs <" + pm.getIri() + "> ;\n" + "  	ob:hasObject ?node .\n" + "  ?node a ?nodetype .\n"
+				+ "  FILTER (?nodetype in (pm:Initial, pm:Activity, pm:Final, pm:Join, pm:Fork, pm:Artifact)) .      \n"
+				+ "}";
+		ResultSet results = FusekiWrapper.getInstance().execQuery(query);
+		while (results.hasNext()) {
+			QuerySolution soln = results.nextSolution();
+
+			RDFNode iri = soln.get("?node");
+			RDFNode type = soln.get("?nodetype");
+			Node node = createNode(iri, type);
+			nodes.add(node);
+		}
+		pm.setNodes(nodes);
+		updateArtifactOfActivities(pm);
+		updateControlNodesReferences(nodes);
+
+		return nodes;
+
+	}
+
+	private void updateControlNodesReferences(List<Node> nodes) {
+
+		for (Node node : nodes) {
+			if (node instanceof InitialNode) {
+				updateInitialNode(nodes, (InitialNode) node);
+			} else if (node instanceof FinalNode) {
+				updateFinalNode(nodes, (FinalNode) node);
+			} else if (node instanceof ForkNode) {
+				updateForkNode(nodes, (ForkNode) node);
+			} else if (node instanceof JoinNode) {
+				updateJoinNode(nodes, (JoinNode) node);
+			}
+		}
+
+	}
+
+	private void updateJoinNode(List<Node> nodes, JoinNode node) {
+		String query = "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
+				+ "PREFIX pm: <http://ua.be/sdo2l/vocabulary/formalisms/pm#>\n" + "SELECT ?next ?nodetype ?act\n"
+				+ "WHERE { \n" + "  ?node owl:sameAs<" + node.getIri() + ">.\n" + "  ?node pm:ctrlTo ?next.\n"
+				+ "  ?next a ?nodetype ;\n"
+				+ "	FILTER (?nodetype in (pm:CtrlOutputPort, pm:Initial, pm:Final,pm:Fork, pm:Join)) \n"
+				+ "	OPTIONAL {\n" + "		?next pm:ofActivity ?act .\n" + "	}\n" + "}";
+		List<Node> list = new ArrayList<Node>();
+		ResultSet results = FusekiWrapper.getInstance().execQuery(query);
+		while (results.hasNext()) {
+			QuerySolution soln = results.nextSolution();
+			RDFNode type = soln.get("?nodetype");
+			String nextIri;
+			if (type.toString().equals(Node.CTRL_OUTPUT_PORT_IRI)) {
+				nextIri = soln.get("?act").toString();
+			} else {
+				nextIri = soln.get("?next").toString();
+			}
+			for (Node node2 : nodes) {
+				if (node2.getIri().equals(nextIri)) {
+					list.add(node2);
+				}
+			}
+		}
+		node.setPreviousNodes(list);
+		
+		
+		query = "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
+				+ "PREFIX pm: <http://ua.be/sdo2l/vocabulary/formalisms/pm#>\n" 
+				+ "SELECT ?next ?nodetype ?act\n"
+				+ "WHERE { \n" + "  ?node owl:sameAs<" + node.getIri() + ">.\n" 
+				+ "  ?node pm:ctrlFrom ?next.\n"
+				+ "  ?next a ?nodetype ;\n"
+				+ "	FILTER (?nodetype in (pm:CtrlOutputPort,pm:Fork, pm:Join, pm:Initial)) \n" 
+				+ "	OPTIONAL {\n"
+				+ "		?next pm:ofActivity ?act .\n" + "	}\n" + "}";
+		results = FusekiWrapper.getInstance().execQuery(query);
+		while (results.hasNext()) {
+			QuerySolution soln = results.nextSolution();
+			RDFNode type = soln.get("?nodetype");
+			String nextIri;
+			if (type.toString().equals(Node.CTRL_OUTPUT_PORT_IRI)) {
+				nextIri = soln.get("?act").toString();
+			} else {
+				nextIri = soln.get("?next").toString();
+			}
+			for (Node node2 : nodes) {
+				if (node2.getIri().equals(nextIri)) {
+					node.setNext(node2);
+					break;
+				}
+			}
+		}
+
+		
+	}
+
+	private void updateForkNode(List<Node> nodes, ForkNode node) {
+		String query = "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
+				+ "PREFIX pm: <http://ua.be/sdo2l/vocabulary/formalisms/pm#>\n" 
+				+ "SELECT ?next ?nodetype ?act\n"
+				+ "WHERE { \n" + "  ?node owl:sameAs<" + node.getIri() + ">.\n" 
+				+ "  ?node pm:ctrlFrom ?next.\n"
+				+ "  ?next a ?nodetype ;\n"
+				+ "	FILTER (?nodetype in (pm:CtrlOutputPort,pm:Fork, pm:Join, pm:Initial)) \n" 
+				+ "	OPTIONAL {\n"
+				+ "		?next pm:ofActivity ?act .\n" + "	}\n" + "}";
+		ResultSet results = FusekiWrapper.getInstance().execQuery(query);
+		while (results.hasNext()) {
+			QuerySolution soln = results.nextSolution();
+			RDFNode type = soln.get("?nodetype");
+			String nextIri;
+			if (type.toString().equals(Node.CTRL_OUTPUT_PORT_IRI)) {
+				nextIri = soln.get("?act").toString();
+			} else {
+				nextIri = soln.get("?next").toString();
+			}
+			for (Node node2 : nodes) {
+				if (node2.getIri().equals(nextIri)) {
+					node.setPrevious(node2);
+					break;
+				}
+			}
+		}
+
+		query = "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
+				+ "PREFIX pm: <http://ua.be/sdo2l/vocabulary/formalisms/pm#>\n" + "SELECT ?next ?nodetype ?act\n"
+				+ "WHERE { \n" + "  ?node owl:sameAs<" + node.getIri() + ">.\n" + "  ?node pm:ctrlTo ?next.\n"
+				+ "  ?next a ?nodetype ;\n"
+				+ "	FILTER (?nodetype in (pm:CtrlInputPort, pm:Initial, pm:Final,pm:Fork, pm:Join)) \n"
+				+ "	OPTIONAL {\n" + "		?next pm:ofActivity ?act .\n" + "	}\n" + "}";
+		List<Node> list = new ArrayList<Node>();
+		results = FusekiWrapper.getInstance().execQuery(query);
+		while (results.hasNext()) {
+			QuerySolution soln = results.nextSolution();
+			RDFNode type = soln.get("?nodetype");
+			String nextIri;
+			if (type.toString().equals(Node.CTRL_INPUT_PORT_IRI)) {
+				nextIri = soln.get("?act").toString();
+			} else {
+				nextIri = soln.get("?next").toString();
+			}
+			for (Node node2 : nodes) {
+				if (node2.getIri().equals(nextIri)) {
+					list.add(node2);
+				}
+			}
+		}
+		node.setNextNodes(list);
+
+	}
+
+	private void updateFinalNode(List<Node> nodes, FinalNode node) {
+		String query = "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
+				+ "PREFIX pm: <http://ua.be/sdo2l/vocabulary/formalisms/pm#>\n" + "SELECT ?next ?nodetype ?act\n"
+				+ "WHERE { \n" + "  ?node owl:sameAs<" + node.getIri() + ">.\n" + "  ?node pm:ctrlFrom ?next.\n"
+				+ "  ?next a ?nodetype ;\n"
+				+ "	FILTER (?nodetype in (pm:CtrlOutputPort, pm:Initial, pm:Final,pm:Fork, pm:Join)) \n"
+				+ "	OPTIONAL {\n" + "		?next pm:ofActivity ?act .\n" + "	}\n" + "}";
+		List<Node> list = new ArrayList<Node>();
+		ResultSet results = FusekiWrapper.getInstance().execQuery(query);
+		while (results.hasNext()) {
+			QuerySolution soln = results.nextSolution();
+			RDFNode type = soln.get("?nodetype");
+			String nextIri;
+			if (type.toString().equals(Node.CTRL_OUTPUT_PORT_IRI)) {
+				nextIri = soln.get("?act").toString();
+			} else {
+				nextIri = soln.get("?next").toString();
+			}
+			for (Node node2 : nodes) {
+				if (node2.getIri().equals(nextIri)) {
+					list.add(node2);
+				}
+			}
+		}
+		node.setPrevious(list);
+	}
+
+	private void updateInitialNode(List<Node> nodes, InitialNode node) {
+		String query = "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
+				+ "PREFIX pm: <http://ua.be/sdo2l/vocabulary/formalisms/pm#>\n" + "SELECT ?next ?nodetype ?act\n"
+				+ "WHERE { \n" + "  ?node owl:sameAs<" + node.getIri() + ">.\n" + "  ?node pm:ctrlTo ?next.\n"
+				+ "  ?next a ?nodetype ;\n" + "	FILTER (?nodetype in (pm:CtrlInputPort, pm:Final,pm:Fork, pm:Join)) \n"
+				+ "	OPTIONAL {\n" + "		?next pm:ofActivity ?act .\n" + "	}\n" + "}";
+		ResultSet results = FusekiWrapper.getInstance().execQuery(query);
+		while (results.hasNext()) {
+			QuerySolution soln = results.nextSolution();
+			RDFNode type = soln.get("?nodetype");
+			String nextIri;
+			if (type.toString().equals(Node.CTRL_INPUT_PORT_IRI)) {
+				nextIri = soln.get("?act").toString();
+			} else {
+				nextIri = soln.get("?next").toString();
+			}
+			for (Node node2 : nodes) {
+				if (node2.getIri().equals(nextIri)) {
+					node.setNext(node2);
+					break;
+				}
+			}
+		}
+	}
+
+	private void updateArtifactOfActivities(PM pm) {
+		for (Node node : pm.getNodes()) {
+			if (node instanceof Activity) {
+				Activity act = (Activity) node;
+				for (DataInputPort inport : act.getDatalInPorts()) {
+					String query = "PREFIX pm: <http://ua.be/sdo2l/vocabulary/formalisms/pm#>\n"
+							+ "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n" + "SELECT  ?inport ?art\n" + "WHERE { \n"
+							+ "  ?inport owl:sameAs <" + inport.getIri() + "> .\n" + "  ?inport pm:dataFrom ?art .\n"
+							+ "}";
+					ResultSet results = FusekiWrapper.getInstance().execQuery(query);
+					QuerySolution soln = results.nextSolution();
+
+					RDFNode art = soln.get("?art");
+					if (art != null && !art.toString().isEmpty()) {
+						Artifact artifact = (Artifact) pm.getNode(art.toString());
+						act.addInputArtifact(artifact);
+					}
+				}
+
+				for (DataOutputPort outport : act.getDataOutPorts()) {
+					String query = "PREFIX pm: <http://ua.be/sdo2l/vocabulary/formalisms/pm#>\n"
+							+ "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n" + "SELECT  ?outport ?art\n"
+							+ "WHERE { \n" + "  ?outport owl:sameAs <" + outport.getIri() + "> .\n"
+							+ "  ?outport pm:dataTo ?art .\n" + "}";
+					ResultSet results = FusekiWrapper.getInstance().execQuery(query);
+					QuerySolution soln = results.nextSolution();
+
+					RDFNode art = soln.get("?art");
+					if (art != null && !art.toString().isEmpty()) {
+						Artifact artifact = (Artifact) pm.getNode(art.toString());
+						act.addOutputArtifact(artifact);
+					}
+				}
+			}
+		}
+	}
+
+	private Node createNode(RDFNode iri, RDFNode type) {
+		Node node = null;
+		switch (type.toString()) {
+		case Node.ACTIVITY_IRI:
+			node = createActivity(iri.toString());
+			break;
+		case Node.INITIAL_IRI:
+			node = new InitialNode();
+			break;
+		case Node.FINAL_IRI:
+			node = new FinalNode();
+			break;
+		case Node.FORKJOIN_IRI:
+			// addlogic for fork join
+			node = new JoinNode();
+			break;
+		case Node.ARTIFACT_IRI:
+			// addlogic for fork join
+			node = createArtifact(iri.toString());
+			break;
+		}
+		node.setIri(iri.toString());
+		return node;
+	}
+
+	private Node createArtifact(String iri) {
+		Artifact art = new Artifact();
+		String query = "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
+				+ "PREFIX pm: <http://ua.be/sdo2l/vocabulary/formalisms/pm#>\n"
+				+ "PREFIX base: <http://ua.be/sdo2l/vocabulary/base/base#>\n" + "SELECT ?art ?name ?typename WHERE {\n"
+				+ "	?art owl:sameAs <" + iri + "> .\n" + " ?art	pm:hasName ?name .\n"
+				+ " ?art  	pm:hasType ?type .\n" + " ?type base:hasGUID ?typename .\n" + "}";
+		ResultSet results = FusekiWrapper.getInstance().execQuery(query);
+		QuerySolution soln = results.nextSolution();
+		RDFNode name = soln.get("?name");
+		RDFNode type = soln.get("?typename");
+		art.setIri(iri);
+		art.setName(name.toString());
+		art.setType(type.toString());
+
+		return art;
+	}
+
+	private Node createActivity(String iri) {
+		Activity act = new Activity();
+		String query = "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
+				+ "PREFIX ftg: <http://ua.be/sdo2l/vocabulary/formalisms/ftg#>"
+				+ "PREFIX base: <http://ua.be/sdo2l/vocabulary/base/base#>"
+				+ "PREFIX pm: <http://ua.be/sdo2l/vocabulary/formalisms/pm#>\n" + "SELECT ?act ?name ?type WHERE {\n"
+				+ "	?act owl:sameAs <" + iri + ">;\n" + "   		pm:isTransformation ?t ;  \n"
+				+ "   		pm:hasName ?name .  \n" + " ?t base:hasGUID ?type .  \n" + "}";
+		ResultSet results = FusekiWrapper.getInstance().execQuery(query);
+		QuerySolution soln = results.nextSolution();
+		RDFNode name = soln.get("?name");
+		RDFNode type = soln.get("?type");
+		act.setIri(iri);
+		act.setName(name.toString());
+		act.setTransformationName(type.toString());
+
+		act.setCtrlInPorts(getCtrlInPorts(act));
+		act.setCtrlOutPorts(getCtrlOutPorts(act));
+		act.setDatalInPorts(getDataInPorts(act));
+		act.setDataOutPorts(getDataOutPorts(act));
+
+		return act;
+	}
+
+	private List<DataOutputPort> getDataOutPorts(Activity act) {
+		List<DataOutputPort> list = new ArrayList<DataOutputPort>();
+		String query = "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
+				+ "PREFIX pm: <http://ua.be/sdo2l/vocabulary/formalisms/pm#>\n" + "SELECT ?port ?pname WHERE {\n"
+				+ "	?act owl:sameAs <" + act.getIri() + ">;\n" + "   		pm:hasPort ?port .\n"
+				+ "  	?port a pm:DataOutputPort .\n" + "  	?port pm:hasName ?pname .\n" + "}";
+		ResultSet results = FusekiWrapper.getInstance().execQuery(query);
+		while (results.hasNext()) {
+			QuerySolution soln = results.nextSolution();
+			RDFNode iri = soln.get("?port");
+			RDFNode name = soln.get("?pname");
+			DataOutputPort cout = new DataOutputPort();
+			cout.setIri(iri.toString());
+			cout.setName(name.toString());
+			cout.setActivity(act);
+			list.add(cout);
+		}
+		return list;
+	}
+
+	private List<DataInputPort> getDataInPorts(Activity act) {
+		List<DataInputPort> list = new ArrayList<DataInputPort>();
+		String query = "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
+				+ "PREFIX pm: <http://ua.be/sdo2l/vocabulary/formalisms/pm#>\n" + "SELECT ?port ?pname WHERE {\n"
+				+ "	?act owl:sameAs <" + act.getIri() + ">;\n" + "   		pm:hasPort ?port .\n"
+				+ "  	?port a pm:DataInputPort .\n" + "  	?port pm:hasName ?pname .\n" + "}";
+		ResultSet results = FusekiWrapper.getInstance().execQuery(query);
+		while (results.hasNext()) {
+			QuerySolution soln = results.nextSolution();
+			RDFNode iri = soln.get("?port");
+			RDFNode name = soln.get("?pname");
+			DataInputPort cout = new DataInputPort();
+			cout.setIri(iri.toString());
+			cout.setName(name.toString());
+			cout.setActivity(act);
+			list.add(cout);
+		}
+		return list;
+	}
+
+	private List<ControlOutputPort> getCtrlOutPorts(Activity act) {
+		List<ControlOutputPort> list = new ArrayList<ControlOutputPort>();
+		String query = "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
+				+ "PREFIX pm: <http://ua.be/sdo2l/vocabulary/formalisms/pm#>\n" + "SELECT ?port ?pname WHERE {\n"
+				+ "	?act owl:sameAs <" + act.getIri() + ">;\n" + "   		pm:hasPort ?port .\n"
+				+ "  	?port a pm:CtrlOutputPort .\n" + "  	?port pm:hasName ?pname .\n" + "}";
+		ResultSet results = FusekiWrapper.getInstance().execQuery(query);
+		while (results.hasNext()) {
+			QuerySolution soln = results.nextSolution();
+			RDFNode iri = soln.get("?port");
+			RDFNode name = soln.get("?pname");
+			ControlOutputPort cout = new ControlOutputPort();
+			cout.setIri(iri.toString());
+			cout.setName(name.toString());
+			cout.setActivity(act);
+			list.add(cout);
+		}
+		return list;
+	}
+
+	private List<ControlInputPort> getCtrlInPorts(Activity act) {
+		List<ControlInputPort> list = new ArrayList<ControlInputPort>();
+		String query = "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
+				+ "PREFIX pm: <http://ua.be/sdo2l/vocabulary/formalisms/pm#>\n" + "SELECT ?port ?pname WHERE {\n"
+				+ "	?act owl:sameAs <" + act.getIri() + ">;\n" + "   		pm:hasPort ?port .\n"
+				+ "  	?port a pm:CtrlInputPort .\n" + "  	?port pm:hasName ?pname .\n" + "}";
+		ResultSet results = FusekiWrapper.getInstance().execQuery(query);
+		while (results.hasNext()) {
+			QuerySolution soln = results.nextSolution();
+			RDFNode iri = soln.get("?port");
+			RDFNode name = soln.get("?pname");
+			ControlInputPort cout = new ControlInputPort();
+			cout.setIri(iri.toString());
+			cout.setName(name.toString());
+			cout.setAct(act);
+			list.add(cout);
+		}
+		return list;
+	}
+
+}

+ 4 - 4
src/main/java/ua/be/wee/model/pm/PMRepository.java

@@ -1,4 +1,4 @@
-package ua.be.wee.model.pm;
+package ua.be.wee.model.repository;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -6,13 +6,13 @@ import java.util.List;
 import org.apache.jena.query.QuerySolution;
 import org.apache.jena.query.ResultSet;
 import org.apache.jena.rdf.model.RDFNode;
-import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Repository;
 
 import ua.be.wee.model.nodes.Node;
-import ua.be.wee.model.repository.FusekiWrapper;
+import ua.be.wee.model.pm.PM;
 import ua.be.wee.model.util.Pair;
 
-@Component
+@Repository
 public class PMRepository {
 
 	public List<PM> getAllPMs() {

+ 129 - 20
src/main/java/ua/be/wee/model/pt/PTRepository.java

@@ -1,22 +1,26 @@
-package ua.be.wee.model.pt;
+package ua.be.wee.model.repository;
 
-import java.sql.Timestamp;
-import java.time.Instant;
 import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.jena.query.QuerySolution;
 import org.apache.jena.query.ResultSet;
 import org.apache.jena.rdf.model.RDFNode;
-import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Repository;
 
 import ua.be.wee.model.nodes.Activity;
 import ua.be.wee.model.nodes.ports.ControlInputPort;
 import ua.be.wee.model.nodes.ports.ControlOutputPort;
 import ua.be.wee.model.pm.PM;
-import ua.be.wee.model.repository.FusekiWrapper;
+import ua.be.wee.model.pt.EndActivityEvent;
+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.TraceArtifact;
+import ua.be.wee.model.util.DateTimeConverter;
 
-@Component
+@Repository
 public class PTRepository {
 
 	public PT createTrace(PM pm) throws Exception {
@@ -25,17 +29,37 @@ public class PTRepository {
 		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"
-				+ "INSERT DATA {\n"
+				+ "INSERT {\n"
 				+ "	<"+ traceiri + "> 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"
 				+ "    	tr:relatesTo <" + pm.getIri() + "> ;\n"
+				+ " 	tr:hasTimestamp ?now ; \n"
 				+ "     owl:sameAs  <" + traceiri + "> .\n"
+				+ "} WHERE {"
+				+ "	SELECT ?now\n"
+				+ "    WHERE\n"
+				+ "      {\n"
+				+ "      BIND(now() AS ?now) .\n"
+				+ "      }"
 				+ "}";
 		if (FusekiWrapper.getInstance().updateQuery(query) ) {
 			PT pt = new PT();
 			pt.setPmEnacted(pm);
-			pt.setTimestamp(Timestamp.from(Instant.now()));
 			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"
+					+ "SELECT ?ts  WHERE {\n"
+					+ "	?pt a tr:StartTraceEvent ;\n"
+					+ "  		tr:hasTimestamp ?ts ;\n"
+					+ "  		owl:sameAs <" + traceiri + "> .\n"
+					+ "}";
+			ResultSet results = FusekiWrapper.getInstance().execQuery(query);
+			if (results.hasNext()) {
+				QuerySolution next = results.next();
+				RDFNode rdfNode = next.get("?ts");
+				pt.setTimestamp(DateTimeConverter.convertSPARQLDateTimeToTimestamp(rdfNode.toString()));
+			}
 			return pt;
 		} else {
 			throw new Exception("Error inserting data.");
@@ -70,10 +94,11 @@ public class PTRepository {
 				+ "PREFIX tr: <http://ua.be/sdo2l/vocabulary/formalisms/processtraces#>\n"
 				+ "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
 				+ "PREFIX base: <http://ua.be/sdo2l/vocabulary/base/acyclic#>\n"
-				+ "INSERT DATA {\n"
+				+ "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";
 		if (arts != null) {
@@ -82,12 +107,32 @@ public class PTRepository {
 			}
 		}
 		query +=  "    owl:sameAs <" + iri + "> .\n"
+				+ "} WHERE {"
+				+ "	SELECT ?now\n"
+				+ "    WHERE\n"
+				+ "      {\n"
+				+ "      BIND(now() AS ?now) .\n"
+				+ "      }"
 				+ "}";
 		StartActivityEvent ev = new StartActivityEvent();
 		if (FusekiWrapper.getInstance().updateQuery(query) ) {
 			ev.setIri(iri);
 			ev.setRelatesTo(act.getCtrlInPorts().get(0));
 			pt.addEvent(ev);
+			
+			query = "PREFIX tr: <http://ua.be/sdo2l/vocabulary/formalisms/processtraces#>\n"
+					+ "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
+					+ "SELECT ?ts  WHERE {\n"
+					+ "	?pt		tr:hasTimestamp ?ts ;\n"
+					+ "  		owl:sameAs <" + iri + "> .\n"
+					+ "}";
+			ResultSet results = FusekiWrapper.getInstance().execQuery(query);
+			if (results.hasNext()) {
+				QuerySolution next = results.next();
+				RDFNode rdfNode = next.get("?ts");
+				ev.setTimestamp(DateTimeConverter.convertSPARQLDateTimeToTimestamp(rdfNode.toString()));
+			}
+			
 		} else {
 			throw new Exception("Error inserting data.");
 		}
@@ -133,6 +178,7 @@ public class PTRepository {
 				+ "    base:acyclicForward <" + pt.getEvents().get(0).getIri() + "> ;\n"
 				+ "    base:transitiveForward "+ transitive + " ;\n"
 				+ "    tr:isFollowedBy <" + pt.getEvents().get(0).getIri() + "> ;\n"
+				+ "    tr:hasTimestamp " + DateTimeConverter.convertTimestampToSPARQLdateTime(pt.getTimestamp()) + " ; \n "
 				+ "    tr:relatesTo <" + pt.getPmEnacted().getIri() + "> ;\n"
 				+ "    owl:sameAs <"+ pt.getIri() + "> .\n"
 				+ "};";
@@ -173,23 +219,45 @@ public class PTRepository {
 				+ "PREFIX tr: <http://ua.be/sdo2l/vocabulary/formalisms/processtraces#>\n"
 				+ "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
 				+ "PREFIX base: <http://ua.be/sdo2l/vocabulary/base/acyclic#>\n"
-				+ "INSERT DATA {\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"
-				+ "    tr:relatesTo <" + p.getIri() + "> ;\n";
+				+ "    tr:relatesTo <" + p.getIri() + "> ;\n"
+				+ "    tr:hasTimestamp ?now ; \n";
 				
 		for (String iri : artifactsIRI) {
 			query += "    tr:produces <" + iri + "> ;\n" ;
 		}
 		query += "    owl:sameAs <" + endiri + "> .\n"
 			  + " <"+ startiri + "> tr:isFollowedBy <" + endiri + "> .\n"
-			  + "}";
+			  + "} WHERE {"
+				+ "	SELECT ?now\n"
+				+ "    WHERE\n"
+				+ "      {\n"
+				+ "      BIND(now() AS ?now) .\n"
+				+ "      }"
+				+ "}";
 		
 		if (FusekiWrapper.getInstance().updateQuery(query) ) {
 			EndActivityEvent ev = new EndActivityEvent();
 			ev.setIri(endiri);
 			ev.setRelatesTo(p);
 			pt.addEvent(ev);
+			
+			query = "PREFIX tr: <http://ua.be/sdo2l/vocabulary/formalisms/processtraces#>\n"
+					+ "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
+					+ "SELECT ?ts  WHERE {\n"
+					+ "	?pt		tr:hasTimestamp ?ts ;\n"
+					+ "  		owl:sameAs <" + endiri + "> .\n"
+					+ "}";
+			ResultSet results = FusekiWrapper.getInstance().execQuery(query);
+			if (results.hasNext()) {
+				QuerySolution next = results.next();
+				RDFNode rdfNode = next.get("?ts");
+				ev.setTimestamp(DateTimeConverter.convertSPARQLDateTimeToTimestamp(rdfNode.toString()));
+			}
+			
+			
 			for (TraceArtifact art : arts) {
 				art.setProducedBy(ev);
 				ev.addTraceArtifact(art);
@@ -209,11 +277,12 @@ public class PTRepository {
 				+ "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
 				+ "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
 				+ "PREFIX base: <http://ua.be/sdo2l/vocabulary/base/base#>\n"
-				+ "INSERT DATA { \n"
+				+ "INSERT { \n"
 				+ " <" + art.getIri() + "> rdf:type base:Versionable , pt:Artifact , owl:Thing , pt:element , base:ImmutableThing ;\n"
 				+ "        pt:hasLocation \"" + art.getLocation() + "\" ;\n"
 				+ "        pt:isProducedBy <" + endEvIRI + "> ;\n"
 				+ "        pt:relatesTo <" + art.getRelatesTo().getIri() + "> ;\n"
+				+ "	       pt:addedAt ?now ; \n "
 				+ "        owl:sameAs  <" + art.getIri() + "> ;\n";
 				if (latest != null) {
 					String newTag = (Integer.parseInt(latest.getTag().substring(1))+1)+"";
@@ -222,18 +291,38 @@ public class PTRepository {
 					query += "        base:nextVersionOf \"" + latest.getIri() + "\" ;\n"
 					+ "        base:hasGUID \"" + art.getGUID() + "\" ;\n"
 					+ "        base:hasTag \"" + art.getTag() + "\" .\n"
-					+ "  <" +latest.getIri() + "> base:previousVersionOf <" + art.getIri() +  "> .\n" 
-					+ "}";
+					+ "  <" +latest.getIri() + "> base:previousVersionOf <" + art.getIri() +  "> .\n"; 
 				} else {
 					art.setTag("v1");
 					art.setGUID(art.getRelatesTo().getName()+"-"+art.getTag());
 					query += "        base:hasGUID \"" + art.getGUID() + "\" ;\n"
-					+ "        base:hasTag \"" + art.getTag() + "\" .\n"
-					+ "}";
+					+ "        base:hasTag \"" + art.getTag() + "\" .\n";
 				} 
+				query += "} WHERE {"
+				+ "	SELECT ?now\n"
+				+ "    WHERE\n"
+				+ "      {\n"
+				+ "      BIND(now() AS ?now) .\n"
+				+ "      }"
+				+ "}";
 				
 		if (FusekiWrapper.getInstance().updateQuery(query) ) {
-			art.setTimestamp(Timestamp.from(Instant.now()));
+			
+			
+			query = "PREFIX tr: <http://ua.be/sdo2l/vocabulary/formalisms/processtraces#>\n"
+					+ "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
+					+ "SELECT ?ts  WHERE {\n"
+					+ "	?pt		tr:addedAt ?ts ;\n"
+					+ "  		owl:sameAs <" + art.getIri() + "> .\n"
+					+ "}";
+			ResultSet results = FusekiWrapper.getInstance().execQuery(query);
+			if (results.hasNext()) {
+				QuerySolution next = results.next();
+				RDFNode rdfNode = next.get("?ts");
+				art.setTimestamp(DateTimeConverter.convertSPARQLDateTimeToTimestamp(rdfNode.toString()));
+			}
+			
+			
 			if (latest != null) {
 				List<TraceArtifact> inputs = pt.getInputs();
 				boolean found = false;
@@ -305,17 +394,37 @@ public class PTRepository {
 		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"
-				+ "INSERT DATA {\n"
+				+ "INSERT {\n"
 				+ "	<"+ traceiri + "> rdf:type <http://ua.be/sdo2l/vocabulary/base/acyclic#element> , <http://ua.be/sdo2l/vocabulary/formalisms/processtraces#EndTraceEvent> , <http://ua.be/sdo2l/vocabulary/formalisms/processtraces#Event> , <http://ua.be/sdo2l/vocabulary/formalisms/processtraces#element> , owl:Thing ;\n"
 				+ " 	tr:isPrecededBy <" + previous + "> ;\n"
 				+ "    	tr:relatesTo <" + pmIRI + "> ;\n"
+				+ "     tr:hasTimestamp ?now ; \n"
 				+ "     owl:sameAs  <" + traceiri + "> .\n"
 				+ " <" + previous + "> tr:isFollowedBy <" + traceiri + "> .\n"				
+				+ "} WHERE {"
+				+ "	SELECT ?now\n"
+				+ "    WHERE\n"
+				+ "      {\n"
+				+ "      BIND(now() AS ?now) .\n"
+				+ "      }"
 				+ "}";
+				
 		if (FusekiWrapper.getInstance().updateQuery(query) ) {
 			EndTraceEvent ev = new EndTraceEvent();
 			ev.setIri(traceiri);
-			ev.setTimestamp(Timestamp.from(Instant.now()));
+
+			query = "PREFIX tr: <http://ua.be/sdo2l/vocabulary/formalisms/processtraces#>\n"
+					+ "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"
+					+ "SELECT ?ts  WHERE {\n"
+					+ "	?pt		tr:hasTimestamp ?ts ;\n"
+					+ "  		owl:sameAs <" + traceiri + "> .\n"
+					+ "}";
+			ResultSet results = FusekiWrapper.getInstance().execQuery(query);
+			if (results.hasNext()) {
+				QuerySolution next = results.next();
+				RDFNode rdfNode = next.get("?ts");
+				ev.setTimestamp(DateTimeConverter.convertSPARQLDateTimeToTimestamp(rdfNode.toString()));
+			}
 			return ev;
 		} else {
 			throw new Exception("Error inserting data.");

+ 24 - 0
src/main/java/ua/be/wee/model/util/DateTimeConverter.java

@@ -0,0 +1,24 @@
+package ua.be.wee.model.util;
+
+import java.sql.Timestamp;
+import java.util.Calendar;
+
+import org.apache.jena.atlas.lib.DateTimeUtils;
+
+public class DateTimeConverter {
+
+	
+	
+	public static Timestamp convertSPARQLDateTimeToTimestamp(String dateTimeSparql) {
+		String[] split = dateTimeSparql.split("T");
+		return Timestamp.valueOf(split[0] + " " + split[1].split("\\.")[0]);
+	}
+
+	public static String convertTimestampToSPARQLdateTime(Timestamp timestamp) {
+		Calendar instance = Calendar.getInstance();
+		instance.setTime(timestamp);
+		String converted = DateTimeUtils.calendarToXSDDateTimeString(instance);
+		converted = "\"" + converted + "\"^^<http://www.w3.org/2001/XMLSchema#dateTime>";
+		return converted;
+	}	
+}