From fb39b3cb35593ddc555ae76bd55eabf4ad98630b Mon Sep 17 00:00:00 2001 From: soloturn Date: Thu, 27 Aug 2026 20:09:41 +0200 Subject: [PATCH] fix: strip phantom null dependencies from trailing-comma module.txt Closes #133 --- .../module/ModuleMetadataJsonAdapter.java | 8 +++++++- .../module/ModuleMetadataJsonAdapterTest.java | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/gestalt-module/src/main/java/org/terasology/gestalt/module/ModuleMetadataJsonAdapter.java b/gestalt-module/src/main/java/org/terasology/gestalt/module/ModuleMetadataJsonAdapter.java index 88c29451..da3765fd 100644 --- a/gestalt-module/src/main/java/org/terasology/gestalt/module/ModuleMetadataJsonAdapter.java +++ b/gestalt-module/src/main/java/org/terasology/gestalt/module/ModuleMetadataJsonAdapter.java @@ -42,6 +42,7 @@ import java.lang.reflect.Type; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; /** @@ -183,7 +184,12 @@ public ModuleMetadata deserialize(JsonElement json, Type typeOfT, JsonDeserializ metadata.setDescription(context.deserialize(entry.getValue(), I18nMap.class)); break; case ModuleMetadata.DEPENDENCIES: - metadata.getDependencies().addAll((List) context.deserialize(entry.getValue(), DEPENDENCY_LIST_TYPE)); + // Trailing comma -> Gson emits a phantom null element; strip it (#133). + List dependencyInfos = context.deserialize(entry.getValue(), DEPENDENCY_LIST_TYPE); + if (dependencyInfos != null) { + dependencyInfos.removeIf(Objects::isNull); + metadata.getDependencies().addAll(dependencyInfos); + } break; case ModuleMetadata.REQUIRED_PERMISSIONS: metadata.getRequiredPermissions().addAll((Set) context.deserialize(entry.getValue(), STRING_SET_TYPE)); diff --git a/gestalt-module/src/test/java/org/terasology/gestalt/module/ModuleMetadataJsonAdapterTest.java b/gestalt-module/src/test/java/org/terasology/gestalt/module/ModuleMetadataJsonAdapterTest.java index d9ca7247..8118fbb2 100644 --- a/gestalt-module/src/test/java/org/terasology/gestalt/module/ModuleMetadataJsonAdapterTest.java +++ b/gestalt-module/src/test/java/org/terasology/gestalt/module/ModuleMetadataJsonAdapterTest.java @@ -66,4 +66,22 @@ public void testReadWrite() { Assert.assertEquals(meta, parsedMeta); } + + @Test + public void testTrailingCommaInDependenciesDoesNotProduceNullElement() { + // Gson's lenient reader accepts this invalid JSON (trailing comma) and would + // otherwise leave a null element in the dependencies list. See #133. + String json = "{" + + "\"id\": \"ModuleNameId\"," + + "\"dependencies\": [" + + "{\"id\": \"myDependency\", \"minVersion\": \"1.0.0\", \"maxVersion\": \"2.0.0\"}," + + "]" + + "}"; + + ModuleMetadataJsonAdapter adapter = new ModuleMetadataJsonAdapter(); + ModuleMetadata parsedMeta = adapter.read(new StringReader(json)); + + Assert.assertEquals(1, parsedMeta.getDependencies().size()); + Assert.assertFalse(parsedMeta.getDependencies().contains(null)); + } }