You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2022/11/15 14:27:26 UTC
[cayenne] 02/03: CAY-2774 Overriding service ordering in DI List causes DIRuntimeException
This is an automated email from the ASF dual-hosted git repository.
ntimofeev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git
commit 96c75bd5dbbced79122c8cbccbd20cd69b4d26ce
Author: Nikita Timofeev <st...@gmail.com>
AuthorDate: Tue Nov 15 17:25:45 2022 +0300
CAY-2774 Overriding service ordering in DI List causes DIRuntimeException
---
.../src/main/java/org/apache/cayenne/di/spi/DIGraph.java | 10 +++++++++-
.../src/main/java/org/apache/cayenne/di/spi/ListProvider.java | 8 ++++----
.../src/test/java/org/apache/cayenne/di/spi/DIGraphTest.java | 10 +++++++++-
3 files changed, 22 insertions(+), 6 deletions(-)
diff --git a/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DIGraph.java b/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DIGraph.java
index e2678e9d5..531ad03c6 100644
--- a/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DIGraph.java
+++ b/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DIGraph.java
@@ -68,10 +68,18 @@ class DIGraph<V> {
public void add(V from, V to) {
this.add(from);
this.add(to);
- neighbors.get(to).remove(from);
neighbors.get(from).add(to);
}
+ /**
+ * Add an edge to the graph; if either vertex does not exist, it's added.
+ * This implementation allows the creation of multi-edges and self-loops.
+ */
+ public void addWithOverride(V from, V to) {
+ add(from, to);
+ neighbors.get(to).remove(from);
+ }
+
/**
* True iff graph contains vertex.
*/
diff --git a/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ListProvider.java b/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ListProvider.java
index 053bf2c5b..62c8c69fc 100644
--- a/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ListProvider.java
+++ b/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ListProvider.java
@@ -73,12 +73,12 @@ class ListProvider<T> implements Provider<List<T>> {
void addAfter(Key<? extends T> key, Provider<? extends T> provider, Key<? extends T> after) {
providers.put(key, provider);
- graph.add(key, after);
+ graph.addWithOverride(key, after);
}
void insertBefore(Key<? extends T> key, Provider<? extends T> provider, Key<? extends T> before) {
providers.put(key, provider);
- graph.add(before, key);
+ graph.addWithOverride(before, key);
}
void addAll(Map<Key<? extends T>, Provider<? extends T>> keyProviderMap) {
@@ -89,14 +89,14 @@ class ListProvider<T> implements Provider<List<T>> {
void addAllAfter(Map<Key<? extends T>, Provider<? extends T>> keyProviderMap, Key<? extends T> after) {
providers.putAll(keyProviderMap);
for (Key<? extends T> key : keyProviderMap.keySet()) {
- graph.add(key, after);
+ graph.addWithOverride(key, after);
}
}
void insertAllBefore(Map<Key<? extends T>, Provider<? extends T>> keyProviderMap, Key<? extends T> before) {
providers.putAll(keyProviderMap);
for (Key<? extends T> key : keyProviderMap.keySet()) {
- graph.add(before, key);
+ graph.addWithOverride(before, key);
}
}
}
diff --git a/cayenne-di/src/test/java/org/apache/cayenne/di/spi/DIGraphTest.java b/cayenne-di/src/test/java/org/apache/cayenne/di/spi/DIGraphTest.java
index 0d391e8b0..d2558b698 100644
--- a/cayenne-di/src/test/java/org/apache/cayenne/di/spi/DIGraphTest.java
+++ b/cayenne-di/src/test/java/org/apache/cayenne/di/spi/DIGraphTest.java
@@ -39,11 +39,19 @@ public class DIGraphTest {
assertEquals(asList("y", "a", "z", "x"), sorted);
}
- @Test
+ @Test(expected = DIRuntimeException.class)
public void testTopSortDirectCycle() {
DIGraph<String> graph = new DIGraph<>();
graph.add("x", "y");
graph.add("y", "x");
+ graph.topSort();
+ }
+
+ @Test
+ public void testTopSortDirectCycleOverride() {
+ DIGraph<String> graph = new DIGraph<>();
+ graph.addWithOverride("x", "y");
+ graph.addWithOverride("y", "x");
List<String> sorted = graph.topSort();
assertEquals(asList("x", "y"), sorted);
}