Skip to content
Snippets Groups Projects
Commit 4cee0bb3 authored by tfli's avatar tfli
Browse files

Merge branch 'master' into prio

parents 46bd7f55 68089ef2
No related branches found
No related tags found
No related merge requests found
Showing
with 1119 additions and 1943 deletions
package de.sample.onlineschuhdemo;
public class ManualTasks {
public static final String WARE_EINSORTIEREN = "Ware_einsortieren";
public static final String WARE_AUSPACKEN_NORMAL = "Ware_auspacken_normal";
public static final String WARE_AUSPACKEN_LUXUS = "Ware_auspacken_luxus";
}
package de.sample.onlineschuhdemo;
public class ManualTasks {
public static final String WARE_EINSORTIEREN = "Ware_einsortieren";
public static final String WARE_AUSPACKEN_NORMAL = "Ware_auspacken_normal";
public static final String WARE_AUSPACKEN_LUXUS = "Ware_auspacken_luxus";
}
......@@ -87,9 +87,9 @@ public class FlowChangeWrapper {
dto.setFlowElement(flowElementDTO);
MigrationResultDTO migrationResultDTO = new MigrationResultDTO();
migrationResultDTO.setPriority(this.getMigrationResult().getPriority());
migrationResultDTO.setPriority(this.getMigrationResult().getPriority());
migrationResultDTO.setStatus(this.getMigrationResult().getStatus().name());
dto.setMigrationResult(migrationResultDTO);
......
......@@ -9,9 +9,13 @@ import javax.annotation.PostConstruct;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.EList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import de.fhmuenster.masterthesis.Testgenerator.rest.dto.MigrationResultWrapperDTO;
import de.fhmuenster.masterthesis.Testgenerator.rest.service.change.ChangeService;
import de.fhmuenster.masterthesis.Testgenerator.rest.service.test.TestService;
import de.fhmuenster.masterthesis.Testgenerator.yaml.MigrationResultStatus;
import de.fhmuenster.masterthesis.Testgenerator.yaml.MigrationYaml;
import de.fhmuenster.masterthesis.Testgenerator.yaml.YamlReader;
import de.fhmuenster.masterthesis.serialization.TestgeneratorDSLSerializer;
......@@ -33,6 +37,9 @@ public class MigrationService {
private MigrationYaml yaml;
@Autowired
private ChangeService changeService;
public MigrationService() {
}
......@@ -47,8 +54,6 @@ public class MigrationService {
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);
......@@ -64,10 +69,20 @@ public class MigrationService {
private List<FlowChangeWrapper> detectActivityAddActions(List<Flow> oldFlows, List<Flow> newFlows) {
List<FlowChangeWrapper> result = new ArrayList<>();
//Flow Matching
Flow [][] matchingFlows = this.changeService.compareFlows(newFlows, oldFlows);
for(int i=0; i < matchingFlows.length; i++) {
result.addAll(compareFlowsForAddAction(matchingFlows[i][1], matchingFlows[i][0]));
}
//Flows miteinander vergleichen
/*
for(int i=0; i < oldFlows.size(); i++) {
result.addAll(compareFlowsForAddAction(oldFlows.get(i), newFlows.get(i)));
}
*/
return result;
}
......@@ -95,12 +110,22 @@ public class MigrationService {
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()));
FlowChangeWrapper fcw = new FlowChangeWrapper(newFlow, ActionType.ACTIVITY_ADD_MANUAL_TASK,
e.getRef(), yaml.getActivity().getAdd().getManualTask());
if(fcw.getMigrationResult().getPriority() == null) {
fcw.getMigrationResult().setPriority(this.loadGlobalPriority(fcw.getMigrationResult().getStatus(), yaml));
}
result.add(fcw);
}
if(e.getRef() instanceof UserTaskFlowElement) {
result.add(new FlowChangeWrapper(newFlow, ActionType.ACTIVITY_ADD_USER_TASK,
e.getRef(), yaml.getActivity().getAdd().getManualTask()));
FlowChangeWrapper fcw = new FlowChangeWrapper(newFlow, ActionType.ACTIVITY_ADD_USER_TASK,
e.getRef(), yaml.getActivity().getAdd().getUserTask());
if(fcw.getMigrationResult().getPriority() == null) {
fcw.getMigrationResult().setPriority(this.loadGlobalPriority(fcw.getMigrationResult().getStatus(), yaml));
}
result.add(fcw);
}
if(e.getRef() instanceof BusinessRuleTaskFlowElement) {
BusinessRuleTaskFlowElement element = (BusinessRuleTaskFlowElement) e.getRef();
......@@ -153,4 +178,24 @@ public class MigrationService {
return dto;
}
private Integer loadGlobalPriority(MigrationResultStatus status, MigrationYaml yaml) {
Integer globalPriority = 0;
switch(status) {
case GREEN:
globalPriority = yaml.getConfiguration().getGreen();
break;
case YELLOW:
globalPriority = yaml.getConfiguration().getYellow();
break;
case RED:
globalPriority = yaml.getConfiguration().getRed();
break;
default:
globalPriority = yaml.getConfiguration().getGreen();
break;
}
return globalPriority;
}
}
......@@ -4,8 +4,10 @@ import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
......@@ -38,6 +40,8 @@ import de.fhmuenster.masterthesis.serialization.TestgeneratorDSLSerializer;
import de.fhmuenster.masterthesis.Testgenerator.rest.service.test.TestService;
import de.fhmuenster.masterthesis.Testgenerator.utils.ProjectDirectoryUtils;
import de.fhmuenster.masterthesis.serialization.TestgeneratorDSLSerializer;
import de.fhmuenster.masterthesis.services.TestgeneratorDSLGrammarAccess.FlowElements;
import de.fhmuenster.masterthesis.testgeneratorDSL.BPMNReference;
import de.fhmuenster.masterthesis.testgeneratorDSL.Flow;
import de.fhmuenster.masterthesis.testgeneratorDSL.FlowElement;
import de.fhmuenster.masterthesis.testgeneratorDSL.FlowElementReference;
......@@ -53,59 +57,21 @@ public class ChangeController {
@Autowired
private FlowService flowService;
@Autowired
private TestService testService;
private ChangeService changeService;
@Autowired
private MigrationService migrationService;
@Autowired
private TestService testService;
@RequestMapping(path = "/project/{projectId}/match", method = RequestMethod.GET)
public String getNewFlows(@PathVariable(required = true) Long projectId) {
public void getNewFlows(@PathVariable(required = true) Long projectId) {
boolean success = true;
List <List<String>> newFlowsElements = new ArrayList<List<String>>();
List <List<String>> oldFlowsElements = new ArrayList<List<String>>();
//neue Flow ist erste Element, alte Flow zweite
List <List<String>> matchingFlows = new ArrayList<List<String>>();
// String[] keywords = { "Flow Flow_", "with elements", "without elements"};
// try {
// BufferedReader reader = new BufferedReader(new FileReader("C:\\Users\\tillb\\Desktop\\fe_projekt\\fe-pda-testing-tool\\OnlineSchuhDemo\\dsl_matching\\Testcollection1.bpmn-testgen"));
// String line = reader.readLine();
// while(line !=null)
// {
// for(int i = 0 ; i<keywords.length;i++){
// if(line.startsWith(keywords[i])){
// System.out.println(line);
// }
// }
// line=reader.readLine();
// }
// } catch (Exception ex) {
// System.out.println(ex.getMessage());
// }
Project projectForId = projectService.getProjectForId(projectId);
//speichern von neuen Flow Elementen aller Flows
//speichern aller neuen Flows
List<Flow> newFlows = flowService.getFlows(projectForId.getProjectDirectories());
List<Flow> newFlows = flowService.getFlows(projectForId.getProjectDirectories());
List<BPMNFlowDTO> newFlowDtos = MAPPER_FLOW.mapToList(newFlows, BPMNFlowDTO.class);
System.out.println("neu:");
//for Schleife durchläuft alle Flows
for (int i= 0; i<newFlowDtos.size(); i++) {
List<String> currentFlow = new ArrayList<String>();
currentFlow.add("Flow_"+i);
//for Schleife durchläuft alle Flow-Elemente
for(FlowElementDTO flowElement : newFlowDtos.get(i).getFlowElements()){
currentFlow.add(flowElement.getId());
}
newFlowsElements.add(currentFlow);
}
// System.out.println("new: " +newFlowsElements);
......@@ -115,112 +81,17 @@ public class ChangeController {
//für alte Flows
String pathOld = "D:\\VSProjects\\fe-pda-testing-tool\\OnlineSchuhDemo\\dsl_matching\\MatchingTestcollectionOld.bpmn-testgen";
List<Flow> oldFlows = flowService.getOldFlows(pathOld);
List<BPMNFlowDTO> oldFlowDtos = MAPPER_FLOW.mapToList(oldFlows, BPMNFlowDTO.class);
//for Schleife durchläuft alle alten Flows
for (int i= 0; i<oldFlowDtos.size(); i++) {
List<String> currentFlow = new ArrayList<String>();
currentFlow.add("Flow_"+i);
//for Schleife durchläuft alle Flow-Elemente
for(FlowElementDTO flowElement : oldFlowDtos.get(i).getFlowElements()){
currentFlow.add(flowElement.getId());
}
oldFlowsElements.add(currentFlow);
}
// System.out.println("old :"+ oldFlowsElements);
// System.out.println("alt:");
// for(FlowElementReference e : oldFlows.get(0).getInclElements()){
// System.out.println(e.getRef().getName());
// }
matchingFlows = compareFlows(newFlowsElements, oldFlowsElements);
System.out.println(matchingFlows);
return "false";
}
private List<List<String>> compareFlows(List<List<String>> newFlowsElements, List<List<String>> oldFlowsElements) {
List <Integer> checkedFlowsOld = new ArrayList <Integer>();
List <String> checkedElements = new ArrayList <String>();
//an Stelle [x][0] ist neuer Flow, [x][1] alter Flow, [x][2] Gemeinsamkeiten, [x][3] Unterschiede
String [][] matchingFlows = new String [newFlowsElements.size()][4];
int currentNewFlow = 0;
for (List newFlow: newFlowsElements) {
int currentOldFlow = 0;
for (List oldFlow: oldFlowsElements) {
int similarities = 0;
int differences = 0;
if(checkedFlowsOld.contains(currentOldFlow));
else {
for (Object newFlowElement: newFlow) {
if((newFlowElement.toString().contains("Flow_"+currentNewFlow)&& newFlowElement.toString().length()==6) || checkedElements.contains(newFlowElement.toString())) {}
else {
for (Object oldFlowElement: oldFlow) {
if((oldFlowElement.toString().contains("Flow_"+currentOldFlow)&& oldFlowElement.toString().length()==6) || checkedElements.contains(oldFlowElement.toString())) {}
else {
if(newFlowElement.equals(oldFlowElement)) {
similarities++;
checkedElements.add(newFlowElement.toString());
}
}
}
}
}
}
//berechnen der Elemente, die aus dem alten und neuen Flow nicht zueinander gepasst haben
differences = oldFlow.size()-similarities + newFlow.size()-similarities;
// System.out.println("Neuer Flow: "+ currentNewFlow+ " ; alter Flow: "+currentOldFlow+" ; similarities: "+similarities + " ; difference: "+ differences);
// falls aktuell übprüfte Flow alt und neu Kombination die meisten Gemeinsamkeiten haben oder noch nichts in matchingFlows gespeichert wurde
if(matchingFlows[currentNewFlow][2]==null || Integer.parseInt(matchingFlows[currentNewFlow][2])<similarities ||
(Integer.parseInt(matchingFlows[currentNewFlow][2])==similarities && Integer.parseInt(matchingFlows[currentNewFlow][3])> differences)) {
// System.out.println(currentNewFlow +" "+ currentOldFlow +" "+ similarities+ " "+ differences);
matchingFlows[currentNewFlow][0] = "Flow_"+currentNewFlow;
matchingFlows[currentNewFlow][1] = "Flow_"+currentOldFlow;
matchingFlows[currentNewFlow][2] = Integer.toString(similarities);
matchingFlows[currentNewFlow][3] = Integer.toString(differences);
// System.out.println("checked: "+checkedElements + " "+ checkedElements.size());
}
checkedElements = new ArrayList <String>();
currentOldFlow++;
}
currentNewFlow++;
}
for (int i=0; i<newFlowsElements.size();i++) {
System.out.println(matchingFlows[i][0]+" "+matchingFlows[i][1]+" "+matchingFlows[i][2]+" "+matchingFlows[i][3]);
Flow [][] matchingFlows = changeService.compareFlows(newFlows, oldFlows);
// for (int i=0; i<newFlows.size();i++) {
// System.out.println(matchingFlows[i][0]+" "+matchingFlows[i][1]);
//
// }
}
return null;
}
@RequestMapping(path = "/project/{projectId}/migration/changes", method = RequestMethod.GET)
......@@ -230,10 +101,33 @@ public class ChangeController {
Project project = projectService.getProjectForId(projectId);
MigrationResultWrapperDTO migrationResultWrapperDTO = new MigrationResultWrapperDTO();
//Alte und neue DSL einlesen
//Alte DSL kopieren und neu generieren
Path testFilePath = ProjectDirectoryUtils.getTestspecificationPath(project.getProjectDirectories());
Path source = Paths.get(testFilePath.toString());
Path target = Paths.get(project.getProjectDirectories().getProjectRootPath().toString(),
project.getProjectDirectories().getModelPath(), this.projectService.getBackupFolderName(),
"Testcollection.bpmn-testgen");
try {
Files.move(source, target, StandardCopyOption.REPLACE_EXISTING);
}
catch(Exception e) {
}
//Path testFilePath = ProjectDirectoryUtils.getTestspecificationPath(project.getProjectDirectories());
Path newDSLFile = Paths.get(testFilePath.toString());
Path oldDSLFile = Paths.get(project.getProjectDirectories().resolveTestPath(), "Testcollection-old.bpmn-testgen");
//Path oldDSLFile = Paths.get(project.getProjectDirectories().resolveTestPath(), "Testcollection-old.bpmn-testgen");
Path oldDSLFile = Paths.get(project.getProjectDirectories().getProjectRootPath().toString(),
project.getProjectDirectories().getModelPath(), this.projectService.getBackupFolderName(),
"Testcollection.bpmn-testgen");
testService.initLoops(project);
testService.initTestcollection(project);
try {
TestgeneratorDSLSerializer oldDSL = new TestgeneratorDSLSerializer(oldDSLFile.toString());
TestgeneratorDSLSerializer newDSL = new TestgeneratorDSLSerializer(newDSLFile.toString());
......
package de.fhmuenster.masterthesis.Testgenerator.rest.service.change;
import java.io.IOException;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import org.eclipse.emf.common.util.EList;
import org.springframework.stereotype.Service;
import de.fhmuenster.masterthesis.Testgenerator.rest.service.project.ProjectDirectories;
import de.fhmuenster.masterthesis.Testgenerator.rest.service.test.FlowNotFoundException;
import de.fhmuenster.masterthesis.Testgenerator.utils.ProjectDirectoryUtils;
import de.fhmuenster.masterthesis.serialization.TestgeneratorDSLObjectCreator;
import de.fhmuenster.masterthesis.serialization.TestgeneratorDSLSerializer;
import de.fhmuenster.masterthesis.testgeneratorDSL.Flow;
import de.fhmuenster.masterthesis.testgeneratorDSL.FlowElementReference;
import de.fhmuenster.masterthesis.testgeneratorDSL.Loop;
import de.fhmuenster.masterthesis.testgeneratorDSL.ServiceTaskFlowElement;
@Service
public class ChangeService {
public ChangeService() {
}
public Flow[][] compareFlows(List<Flow> newFlows, List<Flow> oldFlows) {
//hier werden die Flows gespeichert, die zurückgegeben werden. [x][0] -> Flow neu, [x][1] -> passender Flow alt
Flow [][] matchingFlows = new Flow [newFlows.size()][2];
List <Integer> checkedFlowsOld = new ArrayList <Integer>();
List <String> checkedElements = new ArrayList <String>();
int currentNewFlow = 0;
for (Flow newFlow: newFlows) {
EList<FlowElementReference> newFlowElements = newFlow.getInclElements();
int mostSimilarities = 0;
int leastDifferences = 10000;
int currentOldFlow = 0;
for (Flow oldFlow: oldFlows) {
EList<FlowElementReference> oldFlowElements = oldFlow.getInclElements();
int similarities = 0;
int differences = 0;
if(checkedFlowsOld.contains(currentOldFlow));
else {
FlowElementReference newNeighbourBefore = null;
FlowElementReference newNeighbourAfter;
FlowElementReference oldNeighbourBefore = null;
FlowElementReference oldNeighbourAfter;
//Zeiger auf aktuelles Flow Element des neuen Flows
int currentNewFlowElement = 0;
for (FlowElementReference newFlowElement: newFlowElements) {
//Zeiger auf aktuelles Flow Element des alten Flows
int currentOldFlowElement = 0;
if(checkedElements.contains(newFlowElement.getRef().getName())) {}
else {
for (FlowElementReference oldFlowElement: oldFlowElements) {
if(checkedElements.contains(oldFlowElement.getRef().getName())) {}
else {
if(newFlowElement.getRef().getName().equals(oldFlowElement.getRef().getName())) {
similarities++;
checkedElements.add(newFlowElement.getRef().getName());
}
}
currentOldFlowElement++;
}
}
}
}
//berechnen der Elemente, die aus dem alten und neuen Flow nicht zueinander gepasst haben
differences = oldFlow.getInclElements().size()-similarities + newFlow.getInclElements().size()-similarities;
// falls aktuell übprüfte Flow alt und neu Kombination die meisten Gemeinsamkeiten haben oder noch nichts in matchingFlows gespeichert wurde
if(mostSimilarities<similarities || (mostSimilarities==similarities && leastDifferences> differences)) {
mostSimilarities=similarities;
leastDifferences = differences;
matchingFlows[currentNewFlow][0] = newFlow;
matchingFlows[currentNewFlow][1] = oldFlow;
}
checkedElements = new ArrayList <String>();
currentOldFlow++;
}
currentNewFlow++;
}
// for (int i=0; i<newFlows.size();i++) {
// System.out.println(matchingFlows[i][0]+" "+matchingFlows[i][1]);
//
// }
return matchingFlows;
}
}
\ No newline at end of file
......@@ -52,9 +52,14 @@ public class FileController {
String rootPath = projectForId.getProjectDirectories().getProjectRootPath(); // D:\Eclipse orkspace\bpmn-testgenerator-tool-master\OnlineSchuhDemo
// Hardcoded, die Funktion getBpmnFiles() findet nicht mehrere bpmn dateien sonder nur eine
String bpmnPath = "src\\main\\resources\\backup\\diagram.bpmn";
Path bpmn = Paths.get(rootPath, bpmnPath);
File bpmnFile = new File(bpmn.toString());
//String bpmnPath = "src\\main\\resources\\backup\\diagram.bpmn";
Path pathToBpmnFile = Paths.get(projectForId.getBpmnFiles().get(0).getPath());
Path bpmnPath = Paths.get(rootPath,
projectForId.getProjectDirectories().getModelPath(), this.projectService.getBackupFolderName(),
pathToBpmnFile.getFileName().toString());
//Path bpmn = Paths.get(rootPath, bpmnPath);
File bpmnFile = new File(bpmnPath.toString());
String bpmnContent = readFile(bpmnFile);
return bpmnContent;
......
......@@ -42,6 +42,8 @@ public class ProjectService {
@Value("${testgenerator.projects}")
private String projectsPath;
private String backupFolderName = "backup";
private Path projectConfigPath;
......@@ -321,7 +323,8 @@ public class ProjectService {
LOGGER.info("starting copy process to backup folder");
Project project = getProjectForId(projectId);
//project.getProjectDirectories().getProjectRootPath().conc
Path p = Paths.get(project.getProjectDirectories().getProjectRootPath().toString(), project.getProjectDirectories().getModelPath(), "backup");
Path p = Paths.get(project.getProjectDirectories().getProjectRootPath().toString(),
project.getProjectDirectories().getModelPath(), this.backupFolderName);
File directory = new File(p.toUri());
if(!directory.exists()) {
directory.mkdir();
......@@ -405,4 +408,8 @@ public class ProjectService {
}
*/
}
public String getBackupFolderName() {
return this.backupFolderName;
}
}
......@@ -10,6 +10,7 @@ import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.camunda.bpm.model.bpmn.BpmnModelInstance;
import org.camunda.bpm.model.bpmn.instance.BusinessRuleTask;
import org.camunda.bpm.model.bpmn.instance.ServiceTask;
import org.camunda.bpm.model.dmn.DmnModelInstance;
......@@ -223,6 +224,11 @@ public class BPMNParseUtils {
return externalTopic;
}
public static String getResultVariable(BusinessRuleTask businessRuleTask) {
String resultVariable = businessRuleTask.getAttributeValueNs(NAMESPACE_URI_BPMN, "resultVariable");
return resultVariable;
}
public static List<VariableDeclaration> getHardcodedVariables(String flowElementId, List<Variable> variables,
BPMNIOParameters bpmnIOParameters) {
List<VariableDeclaration> hardcodedVariables = new ArrayList<>();
......
logging.level.root=INFO
testgenerator.projects=C:\\CodePro\\projects.json
testgenerator.projects=C:\\Users\\tillb\\Desktop\\fe_projekt\\projects.json
......@@ -26,5 +26,4 @@ activity:
status: RED
priority: 0
manualTask:
status: GREEN
priority: 0
\ No newline at end of file
status: GREEN
\ No newline at end of file
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { MigrationResultWrapper } from '../models/migration-result-wrapper';
import { MigrationService } from '../services/migration-service';
import { MigrationResultWrapper } from '../../models/migration-result-wrapper';
import { MigrationService } from '../../services/migration-service';
@Component({
selector: 'app-migration-overview',
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment