Skip to content

Commit 743f2cc

Browse files
Add the list of filters ids to the exception when a cycle is detected (#93)
Signed-off-by: benrejebmoh <[email protected]> Co-authored-by: Joris Mancini <[email protected]>
1 parent 764839c commit 743f2cc

File tree

4 files changed

+41
-30
lines changed

4 files changed

+41
-30
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
* Copyright (c) 2025, RTE (http://www.rte-france.com)
3+
* This Source Code Form is subject to the terms of the Mozilla Public
4+
* License, v. 2.0. If a copy of the MPL was not distributed with this
5+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
6+
*/
7+
package org.gridsuite.filter.exception;
8+
9+
import lombok.Getter;
10+
11+
import java.util.List;
12+
import java.util.Objects;
13+
import java.util.UUID;
14+
15+
/**
16+
* @author Mohamed BENREJEB <mohamed.ben-rejeb at rte-france.com>
17+
*/
18+
@Getter
19+
public class FilterCycleException extends RuntimeException {
20+
21+
private final List<UUID> cycleFilterIds;
22+
23+
public FilterCycleException(String message, List<UUID> cycleFilterIds) {
24+
super(Objects.requireNonNull(message, "message must not be null"));
25+
this.cycleFilterIds = List.copyOf(Objects.requireNonNull(cycleFilterIds, "cycleFilterIds must not be null"));
26+
}
27+
}

src/main/java/org/gridsuite/filter/exceptions/FilterCycleException.java

Lines changed: 0 additions & 17 deletions
This file was deleted.

src/main/java/org/gridsuite/filter/utils/expertfilter/FilterCycleDetector.java

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,13 @@
99

1010
import org.gridsuite.filter.AbstractFilter;
1111
import org.gridsuite.filter.FilterLoader;
12-
import org.gridsuite.filter.exceptions.FilterCycleException;
12+
import org.gridsuite.filter.exception.FilterCycleException;
1313
import org.gridsuite.filter.expertfilter.ExpertFilter;
1414
import org.gridsuite.filter.expertfilter.expertrule.AbstractExpertRule;
1515
import org.gridsuite.filter.expertfilter.expertrule.CombinatorExpertRule;
1616
import org.gridsuite.filter.expertfilter.expertrule.FilterUuidExpertRule;
1717

18-
import java.util.HashSet;
19-
import java.util.List;
20-
import java.util.Set;
21-
import java.util.UUID;
18+
import java.util.*;
2219

2320
/**
2421
* @author Mohamed BENREJEB <mohamed.ben-rejeb at rte-france.com>
@@ -36,30 +33,32 @@ private FilterCycleDetector() {
3633
* @param filterLoader loader used to retrieve referenced filters
3734
*/
3835
public static void checkNoCycle(AbstractFilter filter, FilterLoader filterLoader) {
39-
checkNoCycle(filter, filterLoader, new HashSet<>());
36+
checkNoCycle(filter, filterLoader, new ArrayList<>());
4037
}
4138

4239
private static void checkNoCycle(AbstractFilter filter, FilterLoader loader,
43-
Set<UUID> visiting) {
40+
List<UUID> visiting) {
4441
UUID id = filter.getId();
4542
if (id != null) {
4643
if (visiting.contains(id)) {
47-
throw new FilterCycleException("Cycle detected in filters");
44+
visiting.addLast(id);
45+
int startIndex = visiting.indexOf(id);
46+
throw new FilterCycleException("Cycle detected in filters", visiting.subList(startIndex, visiting.size()));
4847
}
49-
visiting.add(id);
48+
visiting.addLast(id);
5049
}
5150

5251
if (filter instanceof ExpertFilter expertFilter) {
5352
checkRule(expertFilter.getRules(), loader, visiting);
5453
}
5554

56-
if (id != null) {
57-
visiting.remove(id);
55+
if (id != null && !visiting.isEmpty()) {
56+
visiting.removeLast();
5857
}
5958
}
6059

6160
private static void checkRule(AbstractExpertRule rule, FilterLoader loader,
62-
Set<UUID> visiting) {
61+
List<UUID> visiting) {
6362
switch (rule) {
6463
case CombinatorExpertRule combinatorRule -> {
6564
List<AbstractExpertRule> rules = combinatorRule.getRules();

src/test/java/org/gridsuite/filter/utils/FilterCycleDetectorTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
import org.gridsuite.filter.AbstractFilter;
1010
import org.gridsuite.filter.FilterLoader;
11-
import org.gridsuite.filter.exceptions.FilterCycleException;
11+
import org.gridsuite.filter.exception.FilterCycleException;
1212
import org.gridsuite.filter.expertfilter.ExpertFilter;
1313
import org.gridsuite.filter.expertfilter.expertrule.AbstractExpertRule;
1414
import org.gridsuite.filter.expertfilter.expertrule.CombinatorExpertRule;
@@ -21,6 +21,7 @@
2121

2222
import java.util.*;
2323

24+
import static org.assertj.core.api.Assertions.assertThat;
2425
import static org.junit.jupiter.api.Assertions.*;
2526

2627
/**
@@ -60,6 +61,7 @@ void testDetectCycleBetweenExpertFilters() {
6061

6162
FilterCycleException ex = assertThrows(FilterCycleException.class, () -> FilterCycleDetector.checkNoCycle(filterA, loader));
6263
assertEquals("Cycle detected in filters", ex.getMessage());
64+
assertThat(ex.getCycleFilterIds()).containsExactly(filterIdA, filterIdB, filterIdA);
6365
}
6466

6567
@Test

0 commit comments

Comments
 (0)