diff --git a/src/main/java/com/github/sttk/sabi/internal/DataSrcContainer.java b/src/main/java/com/github/sttk/sabi/internal/DataSrcContainer.java index 90e413b..ea0e6e4 100644 --- a/src/main/java/com/github/sttk/sabi/internal/DataSrcContainer.java +++ b/src/main/java/com/github/sttk/sabi/internal/DataSrcContainer.java @@ -9,7 +9,7 @@ public class DataSrcContainer { final boolean local; final String name; - DataSrc ds; + final DataSrc ds; DataSrcContainer(boolean local, String name, DataSrc ds) { this.local = local; diff --git a/src/main/java/com/github/sttk/sabi/internal/DataSrcManager.java b/src/main/java/com/github/sttk/sabi/internal/DataSrcManager.java index 3321d35..c66b0b6 100644 --- a/src/main/java/com/github/sttk/sabi/internal/DataSrcManager.java +++ b/src/main/java/com/github/sttk/sabi/internal/DataSrcManager.java @@ -16,8 +16,8 @@ public class DataSrcManager { final boolean local; - final List listUnready; - final List listReady; + final List listUnready; // Elements whose .ds is null are possible. + final List listReady; // Elements whose .ds is null are impossible. DataSrcManager(boolean local) { this.local = local; @@ -30,32 +30,25 @@ void add(String name, DataSrc ds) { } void remove(String name) { - for (var cont : this.listReady) { - if (Objects.equals(cont.name, name) && cont.ds != null) { - cont.ds.close(); - cont.ds = null; - } - } - for (var cont : this.listUnready) { - if (Objects.equals(cont.name, name) && cont.ds != null) { - cont.ds = null; - } - } + this.listReady.removeIf( + cont -> { + if (Objects.equals(cont.name, name)) { + cont.ds.close(); + return true; + } else { + return false; + } + }); + this.listUnready.removeIf( + cont -> { + return (Objects.equals(cont.name, name) || cont.ds == null); + }); } void close() { for (int i = this.listReady.size() - 1; i >= 0; i--) { var cont = this.listReady.get(i); - if (cont.ds != null) { - cont.ds.close(); - cont.ds = null; - } - } - for (int i = this.listUnready.size() - 1; i >= 0; i--) { - var cont = this.listUnready.get(i); - if (cont.ds != null) { - cont.ds = null; - } + cont.ds.close(); } this.listReady.clear(); this.listUnready.clear(); @@ -121,7 +114,7 @@ List setupWithOrder(List names) { indexedMap.put(names.get(i), i); } - var orderedIndexes = new ArrayList(this.listUnready.size()); + var orderedIndexes = new ArrayList(Math.max(names.size(), this.listUnready.size())); for (int i = 0, n = names.size(); i < n; i++) { orderedIndexes.add(null); // null indicates unset } @@ -147,9 +140,9 @@ List setupWithOrder(List names) { continue; } var cont = this.listUnready.get(listIndex); - if (cont == null || cont.ds == null) { - continue; - } + // if (cont == null || cont.ds == null) { // impossible + // continue; + // } ag._name = cont.name; ag._index = ii; ii++; @@ -173,9 +166,9 @@ List setupWithOrder(List names) { continue; } var cont = this.listUnready.get(listIndex); - if (cont == null || cont.ds == null) { - continue; - } + // if (cont == null || cont.ds == null) { // impossible + // continue; + // } this.listReady.add(cont); } this.listUnready.clear(); @@ -185,9 +178,10 @@ List setupWithOrder(List names) { Integer listIndex = orderedIndexes.get(orderIndex); if (listIndex != null) { // Ignore unset var cont = this.listUnready.get(listIndex); - if (cont.ds != null) { - cont.ds.close(); - } + // if (cont.ds == null) { // impossible + // continue + // } + cont.ds.close(); } } return errors; diff --git a/src/test/java/com/github/sttk/sabi/internal/DataSrcManagerTest.java b/src/test/java/com/github/sttk/sabi/internal/DataSrcManagerTest.java index 7e24631..7182178 100644 --- a/src/test/java/com/github/sttk/sabi/internal/DataSrcManagerTest.java +++ b/src/test/java/com/github/sttk/sabi/internal/DataSrcManagerTest.java @@ -512,7 +512,7 @@ void setupWithOrderContainingDuplicatedNameAndOk() { } @Test - void setupWithOrderContainingDuplicatedNameAndOk2() { + void setupWithOrderContainingDuplicatedNameAndOk_2() { var logger = new ArrayList(); var manager = new DataSrcManager(true); @@ -605,6 +605,33 @@ void setupWithOrderButOneOfNamesIsNotUsed() { assertThat(iter.hasNext()).isFalse(); } + @Test + void setupWithOrderButOneOfNamesIsNotUsed_2() { + var logger = new ArrayList(); + + var manager = new DataSrcManager(true); + try { + var ds1 = new SyncDataSrc(1, logger, Fail.Not); + manager.add("foo", ds1); + + var ds2 = new SyncDataSrc(2, logger, Fail.Not); + manager.add("bar", ds2); + + assertThat(manager.local).isTrue(); + assertThat(manager.listUnready).hasSize(2); + assertThat(manager.listReady).hasSize(0); + + var errors = manager.setupWithOrder(List.of("baz", "xxx", "foo")); + + assertThat(manager.local).isTrue(); + assertThat(manager.listUnready).hasSize(0); + assertThat(manager.listReady).hasSize(2); + assertThat(errors).isEmpty(); + } finally { + manager.close(); + } + } + @Test void testCopyDsReadyToMap() { var logger = new ArrayList(); @@ -657,4 +684,44 @@ void testCopyDsReadyToMap() { assertThat(contMap.get("baz").local).isFalse(); assertThat(contMap.get("baz").name).isEqualTo("baz"); } + + @Test + void add_copyDsReadyToMap_remove_copyDsReadyToMap() { + var logger = new ArrayList(); + + var manager = new DataSrcManager(true); + try { + var ds1 = new SyncDataSrc(1, logger, Fail.Not); + manager.add("foo", ds1); + + var ds2 = new SyncDataSrc(2, logger, Fail.Not); + manager.add("bar", ds2); + + var errors = manager.setup(); + assertThat(errors).isEmpty(); + + var contMap = new HashMap(); + manager.copyDsReadyToMap(contMap); + assertThat(contMap).hasSize(2); + assertThat(contMap.get("foo").local).isTrue(); + assertThat(contMap.get("foo").name).isEqualTo("foo"); + assertThat(contMap.get("foo").ds).isNotNull(); + assertThat(contMap.get("bar").local).isTrue(); + assertThat(contMap.get("bar").name).isEqualTo("bar"); + assertThat(contMap.get("bar").ds).isNotNull(); + + manager.remove("foo"); + errors = manager.setup(); + assertThat(errors).isEmpty(); + + contMap = new HashMap(); + manager.copyDsReadyToMap(contMap); + assertThat(contMap).hasSize(1); + assertThat(contMap.get("bar").local).isTrue(); + assertThat(contMap.get("bar").name).isEqualTo("bar"); + assertThat(contMap.get("bar").ds).isNotNull(); + } finally { + manager.close(); + } + } }