From 2b8c54f073c864c8facee510c7151a538f9df2c1 Mon Sep 17 00:00:00 2001
From: Florian Lambers <fl462057@fh-muenster.de>
Date: Mon, 8 Nov 2021 17:31:11 +0100
Subject: [PATCH] added results to frontend

---
 .../BPMNTestgenerationApplication.java        |   4 -
 .../Testgenerator/migration/ActionType.java   |   5 +
 .../migration/FlowChangeWrapper.java          |  98 ++++++++++++
 .../migration/MigrationResultWrapper.java     |  81 ++++++++++
 .../migration/MigrationService.java           | 144 +++++++++++++++++-
 .../rest/dto/FlowChangeWrapperDTO.java        |  53 +++++++
 .../rest/dto/MigrationResultDTO.java          |  36 +++++
 .../rest/dto/MigrationResultWrapperDTO.java   |  46 ++++++
 .../rest/service/change/ChangeController.java |  38 +++++
 .../Testgenerator/yaml/Configuration.java     |  35 +++++
 .../Testgenerator/yaml/MigrationResult.java   |   6 +-
 .../Testgenerator/yaml/MigrationYaml.java     |  10 ++
 .../src/main/resources/application.properties |   2 +-
 .../src/main/resources/migration.yaml         | 130 +---------------
 .../src/app/app-routing.module.ts             |   2 +-
 .../update-project.component.html             |   3 +
 .../update-project.component.ts               |   3 +
 .../migration-overview.component.html         |  39 +++++
 .../migration-overview.component.ts           |  23 ++-
 .../src/app/models/flow-change-wrapper.ts     |  11 ++
 .../app/models/migration-result-wrapper.ts    |   7 +
 .../src/app/models/migration-result.ts        |   4 +
 .../src/app/services/migration-service.ts     |  18 +++
 23 files changed, 662 insertions(+), 136 deletions(-)
 create mode 100644 Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/migration/ActionType.java
 create mode 100644 Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/migration/FlowChangeWrapper.java
 create mode 100644 Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/migration/MigrationResultWrapper.java
 create mode 100644 Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/dto/FlowChangeWrapperDTO.java
 create mode 100644 Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/dto/MigrationResultDTO.java
 create mode 100644 Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/dto/MigrationResultWrapperDTO.java
 create mode 100644 Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/yaml/Configuration.java
 create mode 100644 testgenerator-web/testgenerator-web/src/app/models/flow-change-wrapper.ts
 create mode 100644 testgenerator-web/testgenerator-web/src/app/models/migration-result-wrapper.ts
 create mode 100644 testgenerator-web/testgenerator-web/src/app/models/migration-result.ts
 create mode 100644 testgenerator-web/testgenerator-web/src/app/services/migration-service.ts

diff --git a/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/BPMNTestgenerationApplication.java b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/BPMNTestgenerationApplication.java
index 5ebf377..24ad441 100644
--- a/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/BPMNTestgenerationApplication.java
+++ b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/BPMNTestgenerationApplication.java
@@ -4,14 +4,10 @@ import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.web.support.SpringBootServletInitializer;
 
-import de.fhmuenster.masterthesis.Testgenerator.migration.MigrationService;
-
 @SpringBootApplication
 public class BPMNTestgenerationApplication extends SpringBootServletInitializer {
 
 	public static void main(String[] args) {
 		SpringApplication.run(BPMNTestgenerationApplication.class, args);
-		
-		//MigrationService service = new MigrationService();
 	}
 }
diff --git a/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/migration/ActionType.java b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/migration/ActionType.java
new file mode 100644
index 0000000..e33ac0a
--- /dev/null
+++ b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/migration/ActionType.java
@@ -0,0 +1,5 @@
+package de.fhmuenster.masterthesis.Testgenerator.migration;
+
+public enum ActionType {
+	ACTIVITY_ADD_MANUAL_TASK, ACTIVITY_ADD_USER_TASK, ACTIVITY_ADD_SCRIPT_TASK, ACTIVITY_ADD_SERVICE_TASK
+}
diff --git a/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/migration/FlowChangeWrapper.java b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/migration/FlowChangeWrapper.java
new file mode 100644
index 0000000..29bcbd5
--- /dev/null
+++ b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/migration/FlowChangeWrapper.java
@@ -0,0 +1,98 @@
+package de.fhmuenster.masterthesis.Testgenerator.migration;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import de.fhmuenster.masterthesis.Testgenerator.rest.dto.BPMNFlowDTO;
+import de.fhmuenster.masterthesis.Testgenerator.rest.dto.FlowChangeWrapperDTO;
+import de.fhmuenster.masterthesis.Testgenerator.rest.dto.FlowElementDTO;
+import de.fhmuenster.masterthesis.Testgenerator.rest.dto.MigrationResultDTO;
+import de.fhmuenster.masterthesis.Testgenerator.yaml.MigrationResult;
+import de.fhmuenster.masterthesis.testgeneratorDSL.Flow;
+import de.fhmuenster.masterthesis.testgeneratorDSL.FlowElement;
+import de.fhmuenster.masterthesis.testgeneratorDSL.FlowElementReference;
+
+public class FlowChangeWrapper {
+	
+	private Flow flow;
+	private ActionType actionType;
+	private FlowElement flowElement;
+	private MigrationResult migrationResult;
+	
+	public FlowChangeWrapper() {
+		
+	}
+
+	public Flow getFlow() {
+		return flow;
+	}
+
+	public void setFlow(Flow flow) {
+		this.flow = flow;
+	}
+
+	public ActionType getActionType() {
+		return actionType;
+	}
+
+	public void setActionType(ActionType actionType) {
+		this.actionType = actionType;
+	}
+
+	public FlowElement getFlowElement() {
+		return flowElement;
+	}
+
+	public void setFlowElementReference(FlowElement flowElement) {
+		this.flowElement = flowElement;
+	}
+
+	public FlowChangeWrapper(Flow flow, ActionType actionType, FlowElement flowElement, MigrationResult migrationResult) {
+		this.flow = flow;
+		this.actionType = actionType;
+		this.flowElement = flowElement;
+		this.migrationResult = migrationResult;
+	}
+
+	public MigrationResult getMigrationResult() {
+		return migrationResult;
+	}
+
+	public void setMigrationResult(MigrationResult migrationResult) {
+		this.migrationResult = migrationResult;
+	}
+	
+	public FlowChangeWrapperDTO convertToDTO() {
+		FlowChangeWrapperDTO dto = new FlowChangeWrapperDTO();
+		
+		BPMNFlowDTO bpmnFlowDTO = new BPMNFlowDTO();
+		bpmnFlowDTO.setName(this.getFlow().getName());
+		bpmnFlowDTO.setTestCount(0);
+		
+		List<FlowElementDTO> flowElementDTOs = new ArrayList<>();
+		for(FlowElementReference f : this.getFlow().getInclElements()) {
+			FlowElementDTO fDTO = new FlowElementDTO();
+			fDTO.setId(f.getRef().getName());
+			
+			flowElementDTOs.add(fDTO);
+		}
+		
+		bpmnFlowDTO.setFlowElements(flowElementDTOs);
+		
+		dto.setFlow(bpmnFlowDTO);
+		dto.setActionType(this.actionType.name());
+		
+		FlowElementDTO flowElementDTO = new FlowElementDTO();
+		flowElementDTO.setId(this.getFlowElement().getName());
+		dto.setFlowElement(flowElementDTO);
+		
+		MigrationResultDTO migrationResultDTO = new MigrationResultDTO();
+		migrationResultDTO.setPriority(this.getMigrationResult().getPriority());
+		migrationResultDTO.setStatus(this.getMigrationResult().getStatus().name());
+		
+		dto.setMigrationResult(migrationResultDTO);
+		
+		return dto;
+	}
+	
+}
diff --git a/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/migration/MigrationResultWrapper.java b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/migration/MigrationResultWrapper.java
new file mode 100644
index 0000000..57f25c5
--- /dev/null
+++ b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/migration/MigrationResultWrapper.java
@@ -0,0 +1,81 @@
+package de.fhmuenster.masterthesis.Testgenerator.migration;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import de.fhmuenster.masterthesis.Testgenerator.rest.dto.FlowChangeWrapperDTO;
+import de.fhmuenster.masterthesis.Testgenerator.rest.dto.MigrationResultWrapperDTO;
+
+public class MigrationResultWrapper {
+	
+	private List<FlowChangeWrapper> greenResults;
+	private List<FlowChangeWrapper> yellowResults;
+	private List<FlowChangeWrapper> redResults;
+	
+	public MigrationResultWrapper() {
+		this.greenResults = new ArrayList<>();
+		this.yellowResults = new ArrayList<>();
+		this.redResults = new ArrayList<>();
+	}
+	
+	public List<FlowChangeWrapper> getGreenResults() {
+		return greenResults;
+	}
+	
+	public void setGreenResults(List<FlowChangeWrapper> greenResults) {
+		this.greenResults = greenResults;
+	}
+	
+	public List<FlowChangeWrapper> getYellowResults() {
+		return yellowResults;
+	}
+	
+	public void setYellowResults(List<FlowChangeWrapper> yellowResults) {
+		this.yellowResults = yellowResults;
+	}
+	
+	public List<FlowChangeWrapper> getRedResults() {
+		return redResults;
+	}
+	
+	public void setRedResults(List<FlowChangeWrapper> redResults) {
+		this.redResults = redResults;
+	}
+	
+	public void addToGreenResult(FlowChangeWrapper wrapper) {
+		this.greenResults.add(wrapper);
+	}
+	
+	public void addToYellowResult(FlowChangeWrapper wrapper) {
+		this.yellowResults.add(wrapper);
+	}
+	
+	public void addToRedResult(FlowChangeWrapper wrapper) {
+		this.redResults.add(wrapper);
+	}
+	
+	public MigrationResultWrapperDTO convertToDTO() {
+		MigrationResultWrapperDTO dto = new MigrationResultWrapperDTO();
+		List<FlowChangeWrapperDTO> greenDTO = new ArrayList<>();
+		List<FlowChangeWrapperDTO> yellowDTO = new ArrayList<>();
+		List<FlowChangeWrapperDTO> redDTO = new ArrayList<>();
+		
+		for(FlowChangeWrapper f : this.getGreenResults()) {
+			greenDTO.add(f.convertToDTO());
+		}
+		
+		for(FlowChangeWrapper f : this.getYellowResults()) {
+			yellowDTO.add(f.convertToDTO());
+		}
+		
+		for(FlowChangeWrapper f : this.getRedResults()) {
+			redDTO.add(f.convertToDTO());
+		}
+		
+		dto.setGreenResults(greenDTO);
+		dto.setYellowResults(yellowDTO);
+		dto.setRedResults(redDTO);
+		
+		return dto;
+	}
+}
diff --git a/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/migration/MigrationService.java b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/migration/MigrationService.java
index bf99ba7..70a08eb 100644
--- a/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/migration/MigrationService.java
+++ b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/migration/MigrationService.java
@@ -1,14 +1,156 @@
 package de.fhmuenster.masterthesis.Testgenerator.migration;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.PostConstruct;
+
+import org.eclipse.emf.common.util.BasicEList;
+import org.eclipse.emf.common.util.EList;
+import org.springframework.stereotype.Service;
+
+import de.fhmuenster.masterthesis.Testgenerator.rest.dto.MigrationResultWrapperDTO;
 import de.fhmuenster.masterthesis.Testgenerator.yaml.MigrationYaml;
 import de.fhmuenster.masterthesis.Testgenerator.yaml.YamlReader;
+import de.fhmuenster.masterthesis.serialization.TestgeneratorDSLSerializer;
+import de.fhmuenster.masterthesis.testgeneratorDSL.Flow;
+import de.fhmuenster.masterthesis.testgeneratorDSL.FlowElement;
+import de.fhmuenster.masterthesis.testgeneratorDSL.FlowElementReference;
+import de.fhmuenster.masterthesis.testgeneratorDSL.ManualTaskFlowElement;
+import de.fhmuenster.masterthesis.testgeneratorDSL.UserTaskFlowElement;
+import de.fhmuenster.masterthesis.testgeneratorDSL.SequenceFlowElement;
+import de.fhmuenster.masterthesis.testgeneratorDSL.ServiceTaskFlowElement;
+import de.fhmuenster.masterthesis.testgeneratorDSL.BusinessRuleTaskFlowElement;
+import de.fhmuenster.masterthesis.utils.TestgeneratorDSLUtils;
+import org.camunda.bpm.model.bpmn.instance.SequenceFlow;
+import org.camunda.bpm.model.bpmn.instance.ServiceTask;
+import org.camunda.bpm.model.bpmn.instance.ManualTask;
 
+@Service
 public class MigrationService {
+	
+	private MigrationYaml yaml;
+	
 	public MigrationService() {
+	}
+	
+	@PostConstruct
+	public void initYaml() {
+		
+	}
+	
+	public MigrationResultWrapper detectChanges(TestgeneratorDSLSerializer oldDSL, TestgeneratorDSLSerializer newDSL) {
+		//Annahme: Flows sind identisch
+		
+		MigrationResultWrapper migrationResultWrapper = new MigrationResultWrapper();
+		List<FlowChangeWrapper> result = new ArrayList<>();
+		
+		//oldDSL.getVariables().get(0).
+		
+		// 1. Schritt: Prüfen, ob in einem Flow neue Elemente hinzugekommen sind
+		List<FlowChangeWrapper> activityAddActionResults = detectActivityAddActions(oldDSL.getFlows(), newDSL.getFlows());
+		transferResultsToCorrespondingCategory(migrationResultWrapper, activityAddActionResults);
+
+		System.out.println("Ergebnis addAction");
+		for(FlowChangeWrapper fcw : activityAddActionResults) {
+			System.out.println("+++ Neu: " + fcw.getFlowElement().getName() + " [" + fcw.getActionType() + "] in Flow " + fcw.getFlow().getName()
+					+ " mit Status: " + fcw.getMigrationResult().getPriority());
+		}
+		
+		return migrationResultWrapper;
+	}
+	
+	private List<FlowChangeWrapper> detectActivityAddActions(List<Flow> oldFlows, List<Flow> newFlows) {
+		List<FlowChangeWrapper> result = new ArrayList<>();
+		//Flows miteinander vergleichen
+		for(int i=0; i < oldFlows.size(); i++) {
+			result.addAll(compareFlowsForAddAction(oldFlows.get(i), newFlows.get(i)));
+		}
+		
+		return result;
+	}
+	
+	private List<FlowChangeWrapper> compareFlowsForAddAction(Flow oldFlow, Flow newFlow) {
+		List<FlowElementReference> addedFlowElements = new ArrayList<>();
+		List<FlowElementReference> oldElements = TestgeneratorDSLUtils.getInclElements(oldFlow);
+		List<FlowElementReference> newElements = TestgeneratorDSLUtils.getInclElements(newFlow);
+		
+		List<FlowChangeWrapper> result = new ArrayList<>();
+		
+		for(FlowElementReference fer : newElements) {
+			if (fer.getRef() instanceof SequenceFlowElement) continue;
+			
+			if(!checkIfElementExistsInFlowElements(fer, oldElements)) {
+				addedFlowElements.add(fer);
+			}
+		}
+		
+		if(addedFlowElements.size() == 0) return result;
+		
 		//Yaml laden
 		YamlReader yamlReader = new YamlReader();
 		MigrationYaml yaml = yamlReader.loadMigrationYaml();
 		
-		System.out.println(yaml.getGateway().getAdd().getXor().getStatus());
+		for(FlowElementReference e : addedFlowElements) {
+			if(e.getRef() instanceof ManualTaskFlowElement) {
+				result.add(new FlowChangeWrapper(newFlow, ActionType.ACTIVITY_ADD_MANUAL_TASK,
+						e.getRef(), yaml.getActivity().getAdd().getManualTask()));
+			}
+			if(e.getRef() instanceof UserTaskFlowElement) {
+				result.add(new FlowChangeWrapper(newFlow, ActionType.ACTIVITY_ADD_USER_TASK,
+						e.getRef(), yaml.getActivity().getAdd().getManualTask()));
+			}
+			if(e.getRef() instanceof BusinessRuleTaskFlowElement) {
+				BusinessRuleTaskFlowElement element = (BusinessRuleTaskFlowElement) e.getRef();
+				//element.get
+				//element.get
+				result.add(new FlowChangeWrapper(newFlow, ActionType.ACTIVITY_ADD_USER_TASK,
+						e.getRef(), yaml.getActivity().getAdd().getManualTask()));
+			}
+		}
+		
+		return result;
+		
+	}
+	
+	private boolean checkIfElementExistsInFlowElements(FlowElementReference fer, List<FlowElementReference> elements) {
+		String id = fer.getRef().getName();
+		
+		for(FlowElementReference e : elements) {
+			if(e.getRef().getName().equals(id)) {
+				return true;
+			}
+		}
+		return false;
+	}
+	
+	private void transferResultsToCorrespondingCategory(MigrationResultWrapper wrapper, List<FlowChangeWrapper> changes) {
+		if(changes.isEmpty()) return;
+		
+		for(FlowChangeWrapper change : changes) {
+			switch(change.getMigrationResult().getStatus()) {
+			case GREEN:
+				wrapper.addToGreenResult(change);
+				break;
+			case YELLOW:
+				wrapper.addToYellowResult(change);
+				break;
+			case RED:
+				wrapper.addToRedResult(change);
+				break;
+			default:
+				wrapper.addToGreenResult(change);
+				break;
+			}
+		}
+	}
+	
+	public MigrationResultWrapperDTO convertMigrationResultWrapper(MigrationResultWrapper wrapper) {
+		MigrationResultWrapperDTO dto = new MigrationResultWrapperDTO();
+		dto = wrapper.convertToDTO();
+		
+		return dto;
 	}
 }
diff --git a/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/dto/FlowChangeWrapperDTO.java b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/dto/FlowChangeWrapperDTO.java
new file mode 100644
index 0000000..47a2b80
--- /dev/null
+++ b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/dto/FlowChangeWrapperDTO.java
@@ -0,0 +1,53 @@
+package de.fhmuenster.masterthesis.Testgenerator.rest.dto;
+
+public class FlowChangeWrapperDTO {
+
+	private BPMNFlowDTO flow;
+	private String actionType;
+	private FlowElementDTO flowElement;
+	private MigrationResultDTO migrationResult;
+	
+	public FlowChangeWrapperDTO() {
+		
+	}
+
+	public FlowChangeWrapperDTO(BPMNFlowDTO flow, String actionType, FlowElementDTO flowElement,
+			MigrationResultDTO migrationResult) {
+		this.flow = flow;
+		this.actionType = actionType;
+		this.flowElement = flowElement;
+		this.migrationResult = migrationResult;
+	}
+
+	public BPMNFlowDTO getFlow() {
+		return flow;
+	}
+
+	public void setFlow(BPMNFlowDTO flow) {
+		this.flow = flow;
+	}
+
+	public String getActionType() {
+		return actionType;
+	}
+
+	public void setActionType(String actionType) {
+		this.actionType = actionType;
+	}
+
+	public FlowElementDTO getFlowElement() {
+		return flowElement;
+	}
+
+	public void setFlowElement(FlowElementDTO flowElement) {
+		this.flowElement = flowElement;
+	}
+
+	public MigrationResultDTO getMigrationResult() {
+		return migrationResult;
+	}
+
+	public void setMigrationResult(MigrationResultDTO migrationResult) {
+		this.migrationResult = migrationResult;
+	}
+}
diff --git a/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/dto/MigrationResultDTO.java b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/dto/MigrationResultDTO.java
new file mode 100644
index 0000000..32c472b
--- /dev/null
+++ b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/dto/MigrationResultDTO.java
@@ -0,0 +1,36 @@
+package de.fhmuenster.masterthesis.Testgenerator.rest.dto;
+
+public class MigrationResultDTO {
+	private String status;
+	private int priority;
+	
+	public MigrationResultDTO() {
+		
+	}
+
+	public MigrationResultDTO(String status, int priority) {
+		super();
+		this.status = status;
+		this.priority = priority;
+	}
+
+
+
+	public String getStatus() {
+		return status;
+	}
+
+	public void setStatus(String status) {
+		this.status = status;
+	}
+
+	public int getPriority() {
+		return priority;
+	}
+
+	public void setPriority(int priority) {
+		this.priority = priority;
+	}
+	
+	
+}
diff --git a/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/dto/MigrationResultWrapperDTO.java b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/dto/MigrationResultWrapperDTO.java
new file mode 100644
index 0000000..d2b4ca9
--- /dev/null
+++ b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/dto/MigrationResultWrapperDTO.java
@@ -0,0 +1,46 @@
+package de.fhmuenster.masterthesis.Testgenerator.rest.dto;
+
+import java.util.List;
+
+public class MigrationResultWrapperDTO {
+	
+	private List<FlowChangeWrapperDTO> greenResults;
+	private List<FlowChangeWrapperDTO> yellowResults;
+	private List<FlowChangeWrapperDTO> redResults;
+	
+	public MigrationResultWrapperDTO() {
+		
+	}
+	
+	public MigrationResultWrapperDTO(List<FlowChangeWrapperDTO> greenResults, List<FlowChangeWrapperDTO> yellowResults,
+			List<FlowChangeWrapperDTO> redResults) {
+		super();
+		this.greenResults = greenResults;
+		this.yellowResults = yellowResults;
+		this.redResults = redResults;
+	}
+
+	public List<FlowChangeWrapperDTO> getGreenResults() {
+		return greenResults;
+	}
+
+	public void setGreenResults(List<FlowChangeWrapperDTO> greenResults) {
+		this.greenResults = greenResults;
+	}
+
+	public List<FlowChangeWrapperDTO> getYellowResults() {
+		return yellowResults;
+	}
+
+	public void setYellowResults(List<FlowChangeWrapperDTO> yellowResults) {
+		this.yellowResults = yellowResults;
+	}
+
+	public List<FlowChangeWrapperDTO> getRedResults() {
+		return redResults;
+	}
+
+	public void setRedResults(List<FlowChangeWrapperDTO> redResults) {
+		this.redResults = redResults;
+	}
+}
diff --git a/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/service/change/ChangeController.java b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/service/change/ChangeController.java
index 0ff46e5..815260e 100644
--- a/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/service/change/ChangeController.java
+++ b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/service/change/ChangeController.java
@@ -15,8 +15,13 @@ import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.servlet.config.annotation.EnableWebMvc;
 
+import de.fhmuenster.masterthesis.Testgenerator.migration.MigrationResultWrapper;
+import de.fhmuenster.masterthesis.Testgenerator.migration.MigrationService;
+import de.fhmuenster.masterthesis.Testgenerator.rest.dto.MigrationResultWrapperDTO;
 import de.fhmuenster.masterthesis.Testgenerator.rest.service.project.Project;
 import de.fhmuenster.masterthesis.Testgenerator.rest.service.project.ProjectService;
+import de.fhmuenster.masterthesis.Testgenerator.utils.ProjectDirectoryUtils;
+import de.fhmuenster.masterthesis.serialization.TestgeneratorDSLSerializer;
 
 @RestController
 public class ChangeController {
@@ -24,6 +29,9 @@ public class ChangeController {
 	@Autowired
 	private ProjectService projectService;
 	
+	@Autowired
+	private MigrationService migrationService;
+	
 	@RequestMapping(path = "/project/{projectId}/match", method = RequestMethod.GET)
 	public String test() {
 		boolean success = true;
@@ -54,4 +62,34 @@ public class ChangeController {
 		
 		return "false";
 	}
+	
+	@RequestMapping(path = "/project/{projectId}/migration/changes", method = RequestMethod.GET)
+	public MigrationResultWrapperDTO detectChanges(@PathVariable(required = true) Long projectId) {
+		//Annahme: Flows stimmen überein
+		
+		Project project = projectService.getProjectForId(projectId);
+		
+		MigrationResultWrapperDTO migrationResultWrapperDTO = new MigrationResultWrapperDTO();
+		//Alte und neue DSL einlesen
+		Path testFilePath = ProjectDirectoryUtils.getTestspecificationPath(project.getProjectDirectories());
+		Path newDSLFile = Paths.get(testFilePath.toString());
+		Path oldDSLFile = Paths.get(project.getProjectDirectories().resolveTestPath(), "Testcollection-old.bpmn-testgen");
+		try {
+			TestgeneratorDSLSerializer oldDSL = new TestgeneratorDSLSerializer(oldDSLFile.toString());
+			TestgeneratorDSLSerializer newDSL = new TestgeneratorDSLSerializer(newDSLFile.toString());
+			
+			MigrationResultWrapper migrationResultWrapper = migrationService.detectChanges(oldDSL, newDSL);
+			
+			migrationResultWrapperDTO = migrationService.convertMigrationResultWrapper(migrationResultWrapper);
+			
+			return migrationResultWrapperDTO;
+			
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		
+		return migrationResultWrapperDTO;
+		
+	}
 }
diff --git a/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/yaml/Configuration.java b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/yaml/Configuration.java
new file mode 100644
index 0000000..d7ee5dc
--- /dev/null
+++ b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/yaml/Configuration.java
@@ -0,0 +1,35 @@
+package de.fhmuenster.masterthesis.Testgenerator.yaml;
+
+public class Configuration {
+	private int green;
+	private int yellow;
+	private int red;
+	
+	public Configuration() {
+		
+	}
+
+	public int getGreen() {
+		return green;
+	}
+
+	public void setGreen(int green) {
+		this.green = green;
+	}
+
+	public int getYellow() {
+		return yellow;
+	}
+
+	public void setYellow(int yellow) {
+		this.yellow = yellow;
+	}
+
+	public int getRed() {
+		return red;
+	}
+
+	public void setRed(int red) {
+		this.red = red;
+	}
+}
diff --git a/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/yaml/MigrationResult.java b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/yaml/MigrationResult.java
index 18ce0a3..bff5f32 100644
--- a/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/yaml/MigrationResult.java
+++ b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/yaml/MigrationResult.java
@@ -3,7 +3,7 @@ package de.fhmuenster.masterthesis.Testgenerator.yaml;
 public class MigrationResult {
 	
 	private MigrationResultStatus status;
-	private int priority;
+	private Integer priority;
 	
 	public MigrationResult() {
 		
@@ -17,11 +17,11 @@ public class MigrationResult {
 		this.status = status;
 	}
 
-	public int getPriority() {
+	public Integer getPriority() {
 		return priority;
 	}
 
-	public void setPriority(int priority) {
+	public void setPriority(Integer priority) {
 		this.priority = priority;
 	}
 }
diff --git a/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/yaml/MigrationYaml.java b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/yaml/MigrationYaml.java
index 5fba177..55eded9 100644
--- a/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/yaml/MigrationYaml.java
+++ b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/yaml/MigrationYaml.java
@@ -1,6 +1,7 @@
 package de.fhmuenster.masterthesis.Testgenerator.yaml;
 
 public class MigrationYaml {
+	private Configuration configuration;
 	private Gateway gateway;
 	private Activity activity;
 	
@@ -23,6 +24,15 @@ public class MigrationYaml {
 	public void setActivity(Activity activity) {
 		this.activity = activity;
 	}
+
+	public Configuration getConfiguration() {
+		return configuration;
+	}
+
+	public void setConfiguration(Configuration configuration) {
+		this.configuration = configuration;
+	}
+	
 	
 	
 }
diff --git a/Testgenerator/src/main/resources/application.properties b/Testgenerator/src/main/resources/application.properties
index 59dee82..f7d1dac 100644
--- a/Testgenerator/src/main/resources/application.properties
+++ b/Testgenerator/src/main/resources/application.properties
@@ -1,3 +1,3 @@
 logging.level.root=INFO
 
-testgenerator.projects=C:\\Users\\tillb\\Desktop\\fe_projekt\\projects.json
+testgenerator.projects=C:\\CodePro\\projects.json
diff --git a/Testgenerator/src/main/resources/migration.yaml b/Testgenerator/src/main/resources/migration.yaml
index 7953ceb..7ba751b 100644
--- a/Testgenerator/src/main/resources/migration.yaml
+++ b/Testgenerator/src/main/resources/migration.yaml
@@ -1,3 +1,8 @@
+# globale Konfiguration für Status, kann dann spezieller überschrieben werden
+configuration:
+  green: 100
+  yellow: 200
+  red: 500
 gateway:
   add:
     xor:
@@ -22,128 +27,3 @@ activity:
       priority: 0
     manualTask:
       status: GREEN
-      priority: 0
-    businessRuleTask:
-      withOutput:
-        status: RED
-        priority: 0
-      withoutOutput:
-        status: GREEN
-        priority: 0            
-    serviceTask:
-      withOutput:
-        status: RED
-        priority: 0
-      withoutOutput:
-        status: GREEN
-        priority: 0
-    scriptTask:
-      withOutput:
-        status: RED
-        priority: 0
-      withoutOutput:
-        status: GREEN
-        priority: 0                
-  delete:
-    userTask:
-      status: YELLOW
-      priority: 0
-    manualTask:
-      status: GREEN
-      priority: 0
-    businessRuleTask:
-      withOutput:
-        status: YELLOW
-        priority: 0
-      withoutOutput:
-        status: GREEN
-        priority: 0            
-    serviceTask:
-      withOutput:
-        status: YELLOW
-        priority: 0
-      withoutOutput:
-        status: GREEN
-        priority: 0
-    scriptTask:
-      withOutput:
-        status: YELLOW
-        priority: 0
-      withoutOutput:
-        status: GREEN
-        priority: 0
-  changeConstraints:
-    betweenMinAndMax:
-      status: GREEN
-      priority: 0
-    notBetweenMinAndMax:
-      status: RED
-      priority: 0
-  addProcessVariable:
-    withOutput:
-      status: RED
-      priority: 0
-    withoutOutput:
-      status: GREEN
-      priority: 0
-  deleteProcessVariable:
-    withOutput:
-      status: YELLOW
-      priority: 0
-    withoutOutput:
-      status: GREEN
-      priority: 0
-  changeTaskType:
-    toUserask:
-      status: RED
-      priority: 0
-    toManualTask:
-      status: GREEN
-      priority: 0
-    toBusinessRuleTask:
-      withOutput:
-        status: RED
-        priority: 0
-      withoutOutput:
-        status: GREEN
-        priority: 0
-    toServiceTask:
-      withOutput:
-        status: RED
-        priority: 0
-      withoutOutput:
-        status: GREEN
-        priority: 0
-    toScriptTask:
-      withOutput:
-        status: RED
-        priority: 0
-      withoutOutput:
-        status: GREEN
-        priority: 0
-event:
-  rename:
-    status: GREEN
-    priority: 0
-  newVariable:
-    status: RED
-    priority: 0
-  add:
-    status: RED
-    priority: 0
-  delete:
-    status: RED
-    priority: 0
-  changeConstraints:
-    betweenMinAndMax:
-      status: GREEN
-      priority: 0
-    notBetweenMinAndMax:
-      status: RED
-      priority: 0
-  changeOutgoing:
-    status: RED
-    priority: 0
-  changeIncoming:
-    status: RED
-    priority: 0
\ No newline at end of file
diff --git a/testgenerator-web/testgenerator-web/src/app/app-routing.module.ts b/testgenerator-web/testgenerator-web/src/app/app-routing.module.ts
index 1fa6b2e..6b34003 100644
--- a/testgenerator-web/testgenerator-web/src/app/app-routing.module.ts
+++ b/testgenerator-web/testgenerator-web/src/app/app-routing.module.ts
@@ -35,8 +35,8 @@ const routes: Routes = [
       { path: 'project/:projectId/mocks/external/:mockId', component: NewExternalMockComponent },
       { path: 'project/:projectId/mocks/manual', component: NewManualMockComponent },
       { path: 'project/:projectId/mocks/manual/:mockId', component: NewManualMockComponent },
+      { path: 'project/:projectId/update/migration', component: MigrationOverviewComponent },
       { path: 'project/:projectId/update', component: UpdateProjectComponent }, // new Update Component
-      { path: 'project/:projectId/migration-overview', component: MigrationOverviewComponent },
       { path: 'impressum', component: ImprintComponent },
       { path: 'notfound', component: NotfoundComponent },
       { path: '**', redirectTo: 'notfound'} //has to be the last entry
diff --git a/testgenerator-web/testgenerator-web/src/app/components/update-project/update-project.component.html b/testgenerator-web/testgenerator-web/src/app/components/update-project/update-project.component.html
index d7cf7a1..a305ea7 100644
--- a/testgenerator-web/testgenerator-web/src/app/components/update-project/update-project.component.html
+++ b/testgenerator-web/testgenerator-web/src/app/components/update-project/update-project.component.html
@@ -23,6 +23,9 @@
                 <button mdbBtn type="submit" (click)="compareProjects()" class="testgen-btn-rounded testgen-primary" rounded="true"
                 i18n="compare bpmn">Compare BPMN-Diagrams</button>
             </div>
+            <div class="col-md-6">
+                <a class="testgen-cardmenu testgen-card-basic" [routerLink]="['migration']">Migration starten</a>
+            </div>
             <div class="col-md-6">
                 <button mdbBtn type="submit" (click)="parseFiles()" class="testgen-btn-rounded testgen-primary" rounded="true"
                 i18n="compare bpmn">@Henning parseFiles Testing-Button</button>
diff --git a/testgenerator-web/testgenerator-web/src/app/components/update-project/update-project.component.ts b/testgenerator-web/testgenerator-web/src/app/components/update-project/update-project.component.ts
index 07b9803..63e0c90 100644
--- a/testgenerator-web/testgenerator-web/src/app/components/update-project/update-project.component.ts
+++ b/testgenerator-web/testgenerator-web/src/app/components/update-project/update-project.component.ts
@@ -91,6 +91,9 @@ export class UpdateProjectComponent implements OnInit {
     }
     console.log(this.actualProject)
     this.getMatchingFlowsMessage();
+
+    const url = `${environment.apiBaseUrl}project/${this.actualProject}/migration/changes`;
+    console.log(this.http.get(url, {responseType: 'json'}).toPromise());
   }
 
   identifyMatchingFlows(projectId: number): Promise<string> {
diff --git a/testgenerator-web/testgenerator-web/src/app/migration-overview/migration-overview.component.html b/testgenerator-web/testgenerator-web/src/app/migration-overview/migration-overview.component.html
index e69de29..a64581b 100644
--- a/testgenerator-web/testgenerator-web/src/app/migration-overview/migration-overview.component.html
+++ b/testgenerator-web/testgenerator-web/src/app/migration-overview/migration-overview.component.html
@@ -0,0 +1,39 @@
+<div class="container">
+    <div class="row row mt-5">
+        <div class="col">
+            <h2 class="testgen-headline-message" i18n="new-project header">Migration - Ãœbersicht</h2>
+            <span>Die folgenden Änderungen wurden erkannt und durchgeführt.</span>
+            <div *ngIf="result">
+              <div class="alert alert-success" role="alert">
+                <h5>Automatische Ãœbernahme</h5>
+                <span *ngFor="let greenResult of result.greenResults">
+                  ActionType: {{greenResult.actionType}} {{greenResult.flowElement.id}} in <b>{{greenResult.flow.name}}</b>
+  
+                
+                </span>
+                <div *ngIf="result.greenResults.length == 0">keine Daten</div>
+              </div>
+              <div class="alert alert-warning" role="alert">
+                <h5>Automatische Ãœbernahme, aber Analyse durch Prozessanalysten vorteilhaft</h5>
+                <span *ngFor="let yellowResult of result.yellowResults">
+                  ActionType: {{yellowResult.actionType}} {{yellowResult.flowElement.id}} in <b>{{yellowResult.flow.name}}</b>
+  
+                
+                </span>
+                <div *ngIf="result.yellowResults.length == 0">keine Daten</div>
+              </div>
+              <div class="alert alert-danger" role="alert">
+                <h5>Automatische Übernahme nicht möglich, der Prozessanalyst muss eingreifen</h5>
+                <span *ngFor="let redResult of result.redResults">
+                  ActionType: {{redResult.actionType}} {{redResult.flowElement.id}} in <b>{{redResult.flow.name}}</b>
+  
+                
+                </span>
+                <div *ngIf="result.redResults.length == 0">keine Daten</div>
+              </div>
+          </div>
+        </div>
+    </div>
+</div>
+
+<app-loading *ngIf="isLoading"></app-loading>
\ No newline at end of file
diff --git a/testgenerator-web/testgenerator-web/src/app/migration-overview/migration-overview.component.ts b/testgenerator-web/testgenerator-web/src/app/migration-overview/migration-overview.component.ts
index 9d807a5..a0aec04 100644
--- a/testgenerator-web/testgenerator-web/src/app/migration-overview/migration-overview.component.ts
+++ b/testgenerator-web/testgenerator-web/src/app/migration-overview/migration-overview.component.ts
@@ -1,4 +1,7 @@
 import { Component, OnInit } from '@angular/core';
+import { ActivatedRoute } from '@angular/router';
+import { MigrationResultWrapper } from '../models/migration-result-wrapper';
+import { MigrationService } from '../services/migration-service';
 
 @Component({
   selector: 'app-migration-overview',
@@ -7,9 +10,27 @@ import { Component, OnInit } from '@angular/core';
 })
 export class MigrationOverviewComponent implements OnInit {
 
-  constructor() { }
+  projectId: number;
+  result: MigrationResultWrapper;
+  isLoading: boolean;
+
+  constructor(private migrationService: MigrationService, private route: ActivatedRoute) {
+    this.route.params.subscribe(params =>
+      this.projectId = params['projectId']
+    )
+  }
 
   ngOnInit(): void {
+    this.startMigration();
+    
+  }
+
+  async startMigration() {
+    this.isLoading = true;
+    this.result = await this.migrationService.getMigrationResultWrapper(this.projectId);
+    this.isLoading = false;
+    console.log(this.result);
+
   }
 
 }
diff --git a/testgenerator-web/testgenerator-web/src/app/models/flow-change-wrapper.ts b/testgenerator-web/testgenerator-web/src/app/models/flow-change-wrapper.ts
new file mode 100644
index 0000000..127e272
--- /dev/null
+++ b/testgenerator-web/testgenerator-web/src/app/models/flow-change-wrapper.ts
@@ -0,0 +1,11 @@
+import { BPMNFlow } from "./bpmn-flow";
+import { BPMNFlowElement } from "./bpmn-flow-element";
+import { MigrationResult } from "./migration-result";
+import { MigrationResultWrapper } from "./migration-result-wrapper";
+
+export interface FlowChangeWrapper {
+    flow: BPMNFlow;
+    actionType: string;
+    flowElement: BPMNFlowElement;
+    migrationResult: MigrationResult;
+}
\ No newline at end of file
diff --git a/testgenerator-web/testgenerator-web/src/app/models/migration-result-wrapper.ts b/testgenerator-web/testgenerator-web/src/app/models/migration-result-wrapper.ts
new file mode 100644
index 0000000..7b7a980
--- /dev/null
+++ b/testgenerator-web/testgenerator-web/src/app/models/migration-result-wrapper.ts
@@ -0,0 +1,7 @@
+import { FlowChangeWrapper } from "./flow-change-wrapper";
+
+export interface MigrationResultWrapper {
+    greenResults: Array<FlowChangeWrapper>;
+    yellowResults: Array<FlowChangeWrapper>;
+    redResults: Array<FlowChangeWrapper>;
+}
\ No newline at end of file
diff --git a/testgenerator-web/testgenerator-web/src/app/models/migration-result.ts b/testgenerator-web/testgenerator-web/src/app/models/migration-result.ts
new file mode 100644
index 0000000..f19a998
--- /dev/null
+++ b/testgenerator-web/testgenerator-web/src/app/models/migration-result.ts
@@ -0,0 +1,4 @@
+export interface MigrationResult {
+    status: string;
+    priority: number;
+}
\ No newline at end of file
diff --git a/testgenerator-web/testgenerator-web/src/app/services/migration-service.ts b/testgenerator-web/testgenerator-web/src/app/services/migration-service.ts
new file mode 100644
index 0000000..73a85a4
--- /dev/null
+++ b/testgenerator-web/testgenerator-web/src/app/services/migration-service.ts
@@ -0,0 +1,18 @@
+import { Injectable } from '@angular/core';
+import { HttpClient } from '@angular/common/http';
+import { environment } from 'src/environments/environment';
+import { BPMNFlowSet } from '../models/bpmn-flow-set';
+import { MigrationResultWrapper } from '../models/migration-result-wrapper';
+
+@Injectable({
+  providedIn: 'root'
+})
+export class MigrationService {
+
+  constructor(public http: HttpClient) { }
+
+  public async getMigrationResultWrapper(projectId: number): Promise<MigrationResultWrapper> {
+    const url = `${environment.apiBaseUrl}project/${projectId}/migration/changes`;
+    return <MigrationResultWrapper>await this.http.get(url).toPromise();
+  }
+}
-- 
GitLab