fix: Handle Bukkit objects that don't fully implement `Keyed`

feat/data-edit-commands 3.2.1
William 1 year ago
parent a3e269c00b
commit 414246f243
No known key found for this signature in database

@ -48,7 +48,7 @@ import java.util.logging.Level;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
import static net.william278.husksync.util.BukkitTypeMatcher.*; import static net.william278.husksync.util.BukkitKeyedAdapter.*;
public abstract class BukkitData implements Data { public abstract class BukkitData implements Data {
@ -696,7 +696,8 @@ public abstract class BukkitData implements Data {
public Map<String, Map<String, Integer>> getBlockStatistics() { public Map<String, Map<String, Integer>> getBlockStatistics() {
return blockStatistics.entrySet().stream().filter(entry -> entry.getKey() != null).collect( return blockStatistics.entrySet().stream().filter(entry -> entry.getKey() != null).collect(
TreeMap::new, TreeMap::new,
(m, e) -> m.put(e.getKey().getKey().toString(), convertStatistics(e.getValue())), TreeMap::putAll (m, e) -> getKeyName(e.getKey()).ifPresent(key -> m.put(key, convertStatistics(e.getValue()))),
TreeMap::putAll
); );
} }
@ -705,7 +706,8 @@ public abstract class BukkitData implements Data {
public Map<String, Map<String, Integer>> getItemStatistics() { public Map<String, Map<String, Integer>> getItemStatistics() {
return itemStatistics.entrySet().stream().filter(entry -> entry.getKey() != null).collect( return itemStatistics.entrySet().stream().filter(entry -> entry.getKey() != null).collect(
TreeMap::new, TreeMap::new,
(m, e) -> m.put(e.getKey().getKey().toString(), convertStatistics(e.getValue())), TreeMap::putAll (m, e) -> getKeyName(e.getKey()).ifPresent(key -> m.put(key, convertStatistics(e.getValue()))),
TreeMap::putAll
); );
} }
@ -714,7 +716,8 @@ public abstract class BukkitData implements Data {
public Map<String, Map<String, Integer>> getEntityStatistics() { public Map<String, Map<String, Integer>> getEntityStatistics() {
return entityStatistics.entrySet().stream().filter(entry -> entry.getKey() != null).collect( return entityStatistics.entrySet().stream().filter(entry -> entry.getKey() != null).collect(
TreeMap::new, TreeMap::new,
(m, e) -> m.put(e.getKey().getKey().toString(), convertStatistics(e.getValue())), TreeMap::putAll (m, e) -> getKeyName(e.getKey()).ifPresent(key -> m.put(key, convertStatistics(e.getValue()))),
TreeMap::putAll
); );
} }
@ -722,13 +725,8 @@ public abstract class BukkitData implements Data {
private <T extends Keyed> Map<String, Integer> convertStatistics(@NotNull Map<T, Integer> stats) { private <T extends Keyed> Map<String, Integer> convertStatistics(@NotNull Map<T, Integer> stats) {
return stats.entrySet().stream().filter(entry -> entry.getKey() != null).collect( return stats.entrySet().stream().filter(entry -> entry.getKey() != null).collect(
TreeMap::new, TreeMap::new,
(m, e) -> { (m, e) -> getKeyName(e.getKey()).ifPresent(key -> m.put(key, e.getValue())),
try { TreeMap::putAll
m.put(e.getKey().getKey().toString(), e.getValue());
} catch (Throwable t) {
// Ignore; skip elements with invalid keys (e.g., legacy materials)
}
}, TreeMap::putAll
); );
} }

@ -40,7 +40,7 @@ import java.util.Arrays;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.logging.Level; import java.util.logging.Level;
import static net.william278.husksync.util.BukkitTypeMatcher.matchMaterial; import static net.william278.husksync.util.BukkitKeyedAdapter.matchMaterial;
/** /**
* Bukkit platform implementation of an {@link OnlineUser} * Bukkit platform implementation of an {@link OnlineUser}

@ -19,6 +19,7 @@
package net.william278.husksync.util; package net.william278.husksync.util;
import org.bukkit.Keyed;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.Statistic; import org.bukkit.Statistic;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
@ -26,26 +27,48 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.Arrays; import java.util.Arrays;
import java.util.Optional;
public final class BukkitTypeMatcher { // Utility class for adapting "Keyed" Bukkit objects
public final class BukkitKeyedAdapter {
@Nullable @Nullable
public static Statistic matchStatistic(@NotNull String key) { public static Statistic matchStatistic(@NotNull String key) {
return Arrays.stream(Statistic.values()) try {
.filter(stat -> stat.getKey().toString().equals(key)) return Arrays.stream(Statistic.values())
.findFirst().orElse(null); .filter(stat -> stat.getKey().toString().equals(key))
.findFirst().orElse(null);
} catch (Throwable e) {
return null;
}
} }
@Nullable @Nullable
public static EntityType matchEntityType(@NotNull String key) { public static EntityType matchEntityType(@NotNull String key) {
return Arrays.stream(EntityType.values()) try {
.filter(entityType -> entityType.getKey().toString().equals(key)) return Arrays.stream(EntityType.values())
.findFirst().orElse(null); .filter(entityType -> entityType.getKey().toString().equals(key))
.findFirst().orElse(null);
} catch (Throwable e) {
return null;
}
} }
@Nullable @Nullable
public static Material matchMaterial(@NotNull String key) { public static Material matchMaterial(@NotNull String key) {
return Material.matchMaterial(key); try {
return Material.matchMaterial(key);
} catch (Throwable e) {
return null;
}
}
public static Optional<String> getKeyName(@NotNull Keyed keyed) {
try {
return Optional.of(keyed.getKey().toString());
} catch (Throwable e) {
return Optional.empty();
}
} }
} }

@ -44,7 +44,7 @@ import java.time.OffsetDateTime;
import java.util.*; import java.util.*;
import java.util.logging.Level; import java.util.logging.Level;
import static net.william278.husksync.util.BukkitTypeMatcher.*; import static net.william278.husksync.util.BukkitKeyedAdapter.*;
public class BukkitLegacyConverter extends LegacyConverter { public class BukkitLegacyConverter extends LegacyConverter {

Loading…
Cancel
Save