9
0
mirror of https://github.com/WiIIiam278/HuskSync.git synced 2025-12-19 14:59:21 +00:00

refactor: improve data identifier map structure, fix #492

This commit is contained in:
William278
2025-05-10 13:57:03 +01:00
parent af9d32895e
commit 61298c24bb
4 changed files with 23 additions and 4 deletions

View File

@@ -31,7 +31,10 @@ public interface DataHolder {
Map<Identifier, Data> getData(); Map<Identifier, Data> getData();
default Optional<? extends Data> getData(@NotNull Identifier id) { default Optional<? extends Data> getData(@NotNull Identifier id) {
return getData().entrySet().stream().filter(e -> e.getKey().equals(id)).map(Map.Entry::getValue).findFirst(); if (getData().containsKey(id)) {
return Optional.of(getData().get(id));
}
return Optional.empty();
} }
default void setData(@NotNull Identifier identifier, @NotNull Data data) { default void setData(@NotNull Identifier identifier, @NotNull Data data) {

View File

@@ -406,7 +406,9 @@ public class DataSnapshot {
return deserialized.entrySet().stream() return deserialized.entrySet().stream()
.collect(Collectors.toMap( .collect(Collectors.toMap(
entry -> entry.getKey().toString(), entry -> entry.getKey().toString(),
entry -> plugin.serializeData(entry.getKey(), entry.getValue()) entry -> plugin.serializeData(entry.getKey(), entry.getValue()),
(a, b) -> a,
HashMap::new
)); ));
} }

View File

@@ -38,7 +38,7 @@ import java.util.stream.Stream;
* Identifiers of different types of {@link Data}s * Identifiers of different types of {@link Data}s
*/ */
@Getter @Getter
public class Identifier { public class Identifier implements Comparable<Identifier> {
// Namespace for built-in identifiers // Namespace for built-in identifiers
private static final @KeyPattern String DEFAULT_NAMESPACE = "husksync"; private static final @KeyPattern String DEFAULT_NAMESPACE = "husksync";
@@ -276,6 +276,14 @@ public class Identifier {
return Map.entry(getKeyValue(), enabledByDefault); return Map.entry(getKeyValue(), enabledByDefault);
} }
// Comparable; always sort this Identifier after any dependencies
@Override
public int compareTo(@NotNull Identifier o) {
if (this.dependsOn(o)) return 1;
if (o.dependsOn(this)) return -1;
return this.key.compareTo(o.key);
}
/** /**
* Compares two identifiers based on their dependencies. * Compares two identifiers based on their dependencies.
* <p> * <p>

View File

@@ -26,7 +26,9 @@ import org.jetbrains.annotations.NotNull;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.TreeMap;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.stream.Collectors;
/** /**
* A holder of data in the form of {@link Data}s, which can be synced * A holder of data in the form of {@link Data}s, which can be synced
@@ -46,7 +48,11 @@ public interface UserDataHolder extends DataHolder {
.filter(Identifier::isEnabled) .filter(Identifier::isEnabled)
.map(id -> Map.entry(id, getData(id))) .map(id -> Map.entry(id, getData(id)))
.filter(data -> data.getValue().isPresent()) .filter(data -> data.getValue().isPresent())
.collect(HashMap::new, (map, data) -> map.put(data.getKey(), data.getValue().get()), HashMap::putAll); .collect(Collectors.toMap(
Map.Entry::getKey,
entry -> entry.getValue().get(),
(a, b) -> a, HashMap::new
));
} }
/** /**