From 608274114319853131ff5bcaef360d2138c6c9c3 Mon Sep 17 00:00:00 2001 From: themode Date: Tue, 28 Dec 2021 12:30:42 +0100 Subject: [PATCH] Add fallback for block properties with > 10 entries --- .../server/utils/block/BlockUtils.java | 92 ++++++++++--------- src/test/java/instance/BlockTest.java | 2 +- 2 files changed, 49 insertions(+), 45 deletions(-) diff --git a/src/main/java/net/minestom/server/utils/block/BlockUtils.java b/src/main/java/net/minestom/server/utils/block/BlockUtils.java index eae278277..75ebf9de8 100644 --- a/src/main/java/net/minestom/server/utils/block/BlockUtils.java +++ b/src/main/java/net/minestom/server/utils/block/BlockUtils.java @@ -5,6 +5,7 @@ import net.minestom.server.instance.Instance; import net.minestom.server.instance.block.Block; import net.minestom.server.utils.StringUtils; +import java.util.HashMap; import java.util.Map; public class BlockUtils { @@ -54,18 +55,14 @@ public class BlockUtils { } public static Map parseProperties(String query) { - if (!query.startsWith("[") || !query.endsWith("]") || - query.equals("[]")) { - return Map.of(); - } + if (!query.startsWith("[") || !query.endsWith("]")) return Map.of(); final String propertiesString = query.substring(1, query.length() - 1).trim(); - if (propertiesString.isEmpty()) { - return Map.of(); - } + if (propertiesString.isEmpty()) return Map.of(); - final int capacity = StringUtils.countMatches(propertiesString, ',') + 1; - String[] entries = new String[capacity * 2]; - int entryIndex = 0; + final int entries = StringUtils.countMatches(propertiesString, ',') + 1; + String[] keys = new String[entries]; + String[] values = new String[entries]; + int entryCount = 0; final int length = propertiesString.length(); int start = 0; @@ -80,46 +77,53 @@ public class BlockUtils { if (equalIndex != -1) { final String key = property.substring(0, equalIndex).trim(); final String value = property.substring(equalIndex + 1).trim(); - entries[entryIndex++] = key.intern(); - entries[entryIndex++] = value.intern(); + keys[entryCount] = key.intern(); + values[entryCount++] = value.intern(); } start = end + 1; } index++; } - return switch (entryIndex / 2) { + assert entryCount == entries; + return switch (entryCount) { case 0 -> Map.of(); - case 1 -> Map.of(entries[0], entries[1]); - case 2 -> Map.of(entries[0], entries[1], entries[2], entries[3]); - case 3 -> Map.of(entries[0], entries[1], - entries[2], entries[3], entries[4], entries[5]); - case 4 -> Map.of(entries[0], entries[1], entries[2], entries[3], - entries[4], entries[5], entries[6], entries[7]); - case 5 -> Map.of(entries[0], entries[1], entries[2], entries[3], - entries[4], entries[5], entries[6], entries[7], - entries[8], entries[9]); - case 6 -> Map.of(entries[0], entries[1], entries[2], entries[3], - entries[4], entries[5], entries[6], entries[7], - entries[8], entries[9], entries[10], entries[11]); - case 7 -> Map.of(entries[0], entries[1], entries[2], entries[3], - entries[4], entries[5], entries[6], entries[7], - entries[8], entries[9], entries[10], entries[11], - entries[12], entries[13]); - case 8 -> Map.of(entries[0], entries[1], entries[2], entries[3], - entries[4], entries[5], entries[6], entries[7], - entries[8], entries[9], entries[10], entries[11], - entries[12], entries[13], entries[14], entries[15]); - case 9 -> Map.of(entries[0], entries[1], entries[2], entries[3], - entries[4], entries[5], entries[6], entries[7], - entries[8], entries[9], entries[10], entries[11], - entries[12], entries[13], entries[14], entries[15], - entries[16], entries[17]); - case 10 -> Map.of(entries[0], entries[1], entries[2], entries[3], - entries[4], entries[5], entries[6], entries[7], - entries[8], entries[9], entries[10], entries[11], - entries[12], entries[13], entries[14], entries[15], - entries[16], entries[17], entries[18], entries[19]); - default -> throw new IllegalArgumentException("Too many properties: " + (entryIndex / 2)); + case 1 -> Map.of(keys[0], values[0]); + case 2 -> Map.of(keys[0], values[0], keys[1], values[1]); + case 3 -> Map.of(keys[0], values[0], + keys[1], values[1], keys[2], values[2]); + case 4 -> Map.of(keys[0], values[0], keys[1], values[1], + keys[2], values[2], keys[3], values[3]); + case 5 -> Map.of(keys[0], values[0], keys[1], values[1], + keys[2], values[2], keys[3], values[3], + keys[4], values[4]); + case 6 -> Map.of(keys[0], values[0], keys[1], values[1], + keys[2], values[2], keys[3], values[3], + keys[4], values[4], keys[5], values[5]); + case 7 -> Map.of(keys[0], values[0], keys[1], values[1], + keys[2], values[2], keys[3], values[3], + keys[4], values[4], keys[5], values[5], + keys[6], values[6]); + case 8 -> Map.of(keys[0], values[0], keys[1], values[1], + keys[2], values[2], keys[3], values[3], + keys[4], values[4], keys[5], values[5], + keys[6], values[6], keys[7], values[7]); + case 9 -> Map.of(keys[0], values[0], keys[1], values[1], + keys[2], values[2], keys[3], values[3], + keys[4], values[4], keys[5], values[5], + keys[6], values[6], keys[7], values[7], + keys[8], values[8]); + case 10 -> Map.of(keys[0], values[0], keys[1], values[1], + keys[2], values[2], keys[3], values[3], + keys[4], values[4], keys[5], values[5], + keys[6], values[6], keys[7], values[7], + keys[8], values[8], keys[9], values[9]); + default -> { + Map map = new HashMap<>(entryCount); + for (int i = 0; i < entryCount; i++) { + map.put(keys[i], values[i]); + } + yield Map.copyOf(map); + } }; } } diff --git a/src/test/java/instance/BlockTest.java b/src/test/java/instance/BlockTest.java index 1e0dc2361..879d4c7ae 100644 --- a/src/test/java/instance/BlockTest.java +++ b/src/test/java/instance/BlockTest.java @@ -54,7 +54,7 @@ public class BlockTest { assertEquals(Map.of("facing", "east", "key", "value"), BlockUtils.parseProperties("[ facing = east, key= value ]")); // Verify until the limit of 10 entries - for (int i = 0; i < 11; i++) { + for (int i = 0; i < 13; i++) { StringBuilder properties = new StringBuilder("["); for (int j = 0; j < i; j++) { properties.append("key").append(j).append("=value").append(j);