Skip to content

Commit c98e02e

Browse files
committed
[68] Prevent cyclic dependencies creation
Prevent dependency creation between : - A task and one of its child - A task depending on one of the target task's parent Issue: #68
1 parent a16f5a4 commit c98e02e

1 file changed

Lines changed: 37 additions & 1 deletion

File tree

backend/pepper-starter/src/main/java/pepper/starter/services/view/PepperMMJavaService.java

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,27 @@ public void createDependencyLink(EObject target, EObject source, org.eclipse.sir
299299
}
300300
}
301301

302-
private static boolean isCycle(DependencyRelatedObject sourceObject, DependencyRelatedObject targetObject) {
302+
/**
303+
* Checks if the source task already depends on one of the target task's ancestor tasks.
304+
*
305+
* @param sourceObject the {@link DependencyRelatedObject} source
306+
* @param parent the parent {@link Task} of the target
307+
* @return {@code true} if the source already depends on the specified parent or one of its ancestors; {@code false} otherwise
308+
*/
309+
private boolean isParentCycle(DependencyRelatedObject sourceObject, Task parent) {
310+
for (DependencyLink dep : sourceObject.getDependencies()) {
311+
if (dep.getSource().equals(parent)) {
312+
return true;
313+
}
314+
}
315+
boolean isParentCycle = false;
316+
if (parent.eContainer() instanceof Task grandParent) {
317+
isParentCycle = isParentCycle(sourceObject, grandParent);
318+
}
319+
return isParentCycle;
320+
}
321+
322+
private boolean isCycle(DependencyRelatedObject sourceObject, DependencyRelatedObject targetObject) {
303323
boolean isCycle = false;
304324
for (DependencyLink dep : sourceObject.getDependencies()) {
305325
if (dep.getSource().equals(targetObject)) {
@@ -320,9 +340,25 @@ private static boolean isCycle(DependencyRelatedObject sourceObject, DependencyR
320340
*/
321341
private boolean isDuplicateOrCycle(DependencyRelatedObject sourceObject, DependencyRelatedObject targetObject) {
322342
//to prevent cycles
343+
boolean isParentChildDependency = sourceObject.equals(targetObject.eContainer()) || targetObject.equals(sourceObject.eContainer());
344+
boolean isParentCycle = false;
345+
if (targetObject.eContainer() instanceof Task parent) {
346+
isParentCycle = isParentCycle(sourceObject, parent);
347+
}
348+
323349
boolean isCycle = isCycle(sourceObject, targetObject);
350+
351+
if (isParentChildDependency) {
352+
this.feedbackMessageService.addFeedbackMessage(new Message("Creating a dependency between a parent task and one of its children is not possible.", MessageLevel.ERROR));
353+
}
354+
if (isParentCycle) {
355+
this.feedbackMessageService.addFeedbackMessage(new Message("Creating a dependency when the source task already depends on one of the target task's parent tasks is not possible", MessageLevel.ERROR));
356+
}
324357
if (isCycle) {
325358
this.feedbackMessageService.addFeedbackMessage(new Message("Creating a cyclic dependency is not possible.", MessageLevel.ERROR));
359+
}
360+
361+
if (isCycle || isParentCycle || isParentChildDependency) {
326362
return true;
327363
} else {
328364
//to prevent duplicates

0 commit comments

Comments
 (0)