Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
60 changes: 27 additions & 33 deletions src/main/java/com/github/sttk/sabi/internal/DataSrcManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@

public class DataSrcManager {
final boolean local;
final List<DataSrcContainer> listUnready;
final List<DataSrcContainer> listReady;
final List<DataSrcContainer> listUnready; // Elements whose .ds is null are possible.
final List<DataSrcContainer> listReady; // Elements whose .ds is null are impossible.

DataSrcManager(boolean local) {
this.local = local;
Expand All @@ -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();
Expand Down Expand Up @@ -121,7 +114,7 @@ List<ErrEntry> setupWithOrder(List<String> names) {
indexedMap.put(names.get(i), i);
}

var orderedIndexes = new ArrayList<Integer>(this.listUnready.size());
var orderedIndexes = new ArrayList<Integer>(Math.max(names.size(), this.listUnready.size()));
for (int i = 0, n = names.size(); i < n; i++) {
orderedIndexes.add(null); // null indicates unset
}
Expand All @@ -147,9 +140,9 @@ List<ErrEntry> setupWithOrder(List<String> 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++;
Expand All @@ -173,9 +166,9 @@ List<ErrEntry> setupWithOrder(List<String> 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();
Expand All @@ -185,9 +178,10 @@ List<ErrEntry> setupWithOrder(List<String> 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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -512,7 +512,7 @@ void setupWithOrderContainingDuplicatedNameAndOk() {
}

@Test
void setupWithOrderContainingDuplicatedNameAndOk2() {
void setupWithOrderContainingDuplicatedNameAndOk_2() {
var logger = new ArrayList<String>();

var manager = new DataSrcManager(true);
Expand Down Expand Up @@ -605,6 +605,33 @@ void setupWithOrderButOneOfNamesIsNotUsed() {
assertThat(iter.hasNext()).isFalse();
}

@Test
void setupWithOrderButOneOfNamesIsNotUsed_2() {
var logger = new ArrayList<String>();

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<String>();
Expand Down Expand Up @@ -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<String>();

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<String, DataSrcContainer>();
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<String, DataSrcContainer>();
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();
}
}
}