Skip to content

Commit 9497acd

Browse files
committed
fix(settings): improve JSON handling in SettingsServiceBean and add tests for arrays #11654
Enhanced `listAllAsJson` to robustly handle JSON parsing with proper fallback for invalid JSON, which means it is some primitive setting. Added new unit tests to ensure accurate processing of JSON arrays and objects in settings.
1 parent 5eea9d5 commit 9497acd

File tree

2 files changed

+31
-6
lines changed

2 files changed

+31
-6
lines changed

src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import jakarta.json.Json;
1414
import jakarta.json.JsonArray;
1515
import jakarta.json.JsonArrayBuilder;
16+
import jakarta.json.JsonException;
1617
import jakarta.json.JsonObject;
1718
import jakarta.json.JsonObjectBuilder;
1819
import jakarta.json.JsonString;
@@ -1188,13 +1189,14 @@ public JsonObject listAllAsJson() {
11881189
settings.forEach(setting -> {
11891190
String name = convertToJsonKey(setting);
11901191

1191-
// In case the setting is a JSON object, treat it a such in the output (so the API can return valid JSON)
1192-
if (setting.getContent().trim().startsWith("{"))
1193-
response.add(name, Json.createObjectBuilder(JsonUtil.getJsonObject(setting.getContent())));
1194-
else
1192+
try {
1193+
// In case the setting is JSON, treat it as such in the output (so the API can return valid JSON)
1194+
response.add(name, JsonUtil.getJsonValue(setting.getContent()));
1195+
} catch (JsonException e) {
1196+
// This wasn't valid JSON, so we just add it as a string
11951197
response.add(name, setting.getContent());
11961198
}
1197-
);
1199+
});
11981200

11991201
return response.build();
12001202
}

src/test/java/edu/harvard/iq/dataverse/settings/SettingsServiceBeanTest.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package edu.harvard.iq.dataverse.settings;
22

33
import jakarta.json.Json;
4+
import jakarta.json.JsonArray;
45
import jakarta.json.JsonObject;
56
import jakarta.persistence.EntityManager;
67
import jakarta.persistence.TypedQuery;
@@ -197,7 +198,7 @@ void testListAllAsJson_nonLocalizedSettings() {
197198
}
198199

199200
@Test
200-
void testListAllAsJson_jsonSetting() {
201+
void testListAllAsJson_jsonObjectSetting() {
201202
// Given
202203
JsonObject expected = Json.createObjectBuilder()
203204
.add("default", "2147483648")
@@ -218,6 +219,28 @@ void testListAllAsJson_jsonSetting() {
218219
assertEquals(expected.toString(), result.getJsonObject(SettingsServiceBean.Key.MaxFileUploadSizeInBytes.toString()).toString());
219220
}
220221

222+
@Test
223+
void testListAllAsJson_jsonArraySetting() {
224+
// Given
225+
JsonArray expected = Json.createArrayBuilder()
226+
.add(2147483648L)
227+
.add("4000000000")
228+
.add("8000000000")
229+
.build();
230+
231+
List<Setting> resultList = List.of(
232+
new Setting(SettingsServiceBean.Key.MaxFileUploadSizeInBytes.toString(), "[2147483648, \"4000000000\", \"8000000000\"]")
233+
);
234+
when(typedQuery.getResultList()).thenReturn(resultList);
235+
236+
// When
237+
JsonObject result = settingsServiceBean.listAllAsJson();
238+
239+
// Then
240+
assertEquals(1, result.size());
241+
assertEquals(expected.toString(), result.getJsonArray(SettingsServiceBean.Key.MaxFileUploadSizeInBytes.toString()).toString());
242+
}
243+
221244
@Test
222245
void testListAllAsJson_localizedSettings() {
223246
// Given

0 commit comments

Comments
 (0)