diff --git a/common/src/main/java/net/william278/husksync/data/DataHolder.java b/common/src/main/java/net/william278/husksync/data/DataHolder.java index b901ba4f..6b132bf2 100644 --- a/common/src/main/java/net/william278/husksync/data/DataHolder.java +++ b/common/src/main/java/net/william278/husksync/data/DataHolder.java @@ -31,7 +31,10 @@ public interface DataHolder { Map getData(); default Optional 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) { diff --git a/common/src/main/java/net/william278/husksync/data/DataSnapshot.java b/common/src/main/java/net/william278/husksync/data/DataSnapshot.java index eb037d77..5d11719a 100644 --- a/common/src/main/java/net/william278/husksync/data/DataSnapshot.java +++ b/common/src/main/java/net/william278/husksync/data/DataSnapshot.java @@ -406,7 +406,9 @@ public class DataSnapshot { return deserialized.entrySet().stream() .collect(Collectors.toMap( entry -> entry.getKey().toString(), - entry -> plugin.serializeData(entry.getKey(), entry.getValue()) + entry -> plugin.serializeData(entry.getKey(), entry.getValue()), + (a, b) -> a, + HashMap::new )); } diff --git a/common/src/main/java/net/william278/husksync/data/Identifier.java b/common/src/main/java/net/william278/husksync/data/Identifier.java index 94b40fe9..538cd203 100644 --- a/common/src/main/java/net/william278/husksync/data/Identifier.java +++ b/common/src/main/java/net/william278/husksync/data/Identifier.java @@ -38,7 +38,7 @@ import java.util.stream.Stream; * Identifiers of different types of {@link Data}s */ @Getter -public class Identifier { +public class Identifier implements Comparable { // Namespace for built-in identifiers private static final @KeyPattern String DEFAULT_NAMESPACE = "husksync"; @@ -276,6 +276,14 @@ public class Identifier { 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. *

diff --git a/common/src/main/java/net/william278/husksync/data/UserDataHolder.java b/common/src/main/java/net/william278/husksync/data/UserDataHolder.java index 3cce1952..408b47d7 100644 --- a/common/src/main/java/net/william278/husksync/data/UserDataHolder.java +++ b/common/src/main/java/net/william278/husksync/data/UserDataHolder.java @@ -26,7 +26,9 @@ import org.jetbrains.annotations.NotNull; import java.util.HashMap; import java.util.Map; +import java.util.TreeMap; 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 @@ -46,7 +48,11 @@ public interface UserDataHolder extends DataHolder { .filter(Identifier::isEnabled) .map(id -> Map.entry(id, getData(id))) .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 + )); } /**