Skip to content

Commit bd611e1

Browse files
authored
[somfytahoma] fix exception when invalid event history response received (#18419)
Signed-off-by: Ondrej Pecta <[email protected]>
1 parent 4abd965 commit bd611e1

File tree

1 file changed

+56
-13
lines changed

1 file changed

+56
-13
lines changed

bundles/org.openhab.binding.jablotron/src/main/java/org/openhab/binding/jablotron/internal/handler/JablotronBridgeHandler.java

+56-13
Original file line numberDiff line numberDiff line change
@@ -365,22 +365,65 @@ protected void logout() {
365365
}
366366

367367
private @Nullable JablotronHistoryDataEvent parseEventHistoryResponse(String response) {
368-
JsonObject jsonObject = JsonParser.parseString(response).getAsJsonObject();
369-
JsonArray edges = jsonObject.getAsJsonObject("data").getAsJsonObject("forEndUser").getAsJsonObject("events")
370-
.getAsJsonObject("events").getAsJsonArray("edges");
371-
372-
JsonObject node = edges.get(0).getAsJsonObject().getAsJsonObject("node").getAsJsonObject();
368+
JablotronHistoryDataEvent event = new JablotronHistoryDataEvent();
369+
JsonObject jsonObject;
373370

374-
JsonObject invoker = node.getAsJsonArray("invokers").get(0).getAsJsonObject();
375-
JsonObject subject = node.getAsJsonArray("subjects").get(0).getAsJsonObject();
371+
try {
372+
jsonObject = JsonParser.parseString(response).getAsJsonObject();
373+
} catch (JsonSyntaxException ex) {
374+
logger.debug("Invalid JSON received: {}", response);
375+
return null;
376+
}
376377

377-
JablotronHistoryDataEvent event = new JablotronHistoryDataEvent();
378-
event.setIconType(node.get("icon").getAsString());
379-
event.setEventText(node.getAsJsonObject("name").get("translation").getAsString());
380-
event.setDate(node.get("occurredAt").getAsString());
381-
event.setSectionName(subject.getAsJsonObject("defaultName").get("translation").getAsString());
382-
event.setInvokerName(invoker.getAsJsonObject("defaultName").get("translation").getAsString());
378+
JsonObject data = jsonObject.has("data") ? jsonObject.getAsJsonObject("data") : null;
379+
JsonObject forEndUser = (data != null && data.has("forEndUser")) ? data.getAsJsonObject("forEndUser") : null;
380+
JsonObject events = (forEndUser != null && forEndUser.has("events")) ? forEndUser.getAsJsonObject("events")
381+
: null;
382+
JsonObject eventsInner = (events != null && events.has("events")) ? events.getAsJsonObject("events") : null;
383+
JsonArray edges = (eventsInner != null && eventsInner.has("edges")) ? eventsInner.getAsJsonArray("edges")
384+
: null;
385+
386+
if (edges != null && !edges.isEmpty()) {
387+
JsonObject node = edges.get(0).isJsonNull() ? null : edges.get(0).getAsJsonObject();
388+
389+
if (node != null) {
390+
JsonArray invokers = node.has("invokers") ? node.getAsJsonArray("invokers") : null;
391+
JsonArray subjects = node.has("subjects") ? node.getAsJsonArray("subjects") : null;
392+
393+
JsonObject invoker = (invokers != null && !invokers.isEmpty() && !invokers.get(0).isJsonNull())
394+
? invokers.get(0).getAsJsonObject()
395+
: null;
396+
JsonObject subject = (subjects != null && !subjects.isEmpty() && !subjects.get(0).isJsonNull())
397+
? subjects.get(0).getAsJsonObject()
398+
: null;
399+
400+
event.setIconType(
401+
node.has("icon") && !node.get("icon").isJsonNull() ? node.get("icon").getAsString() : "");
402+
event.setEventText(node.has("name") && node.getAsJsonObject("name").has("translation")
403+
&& !node.getAsJsonObject("name").get("translation").isJsonNull()
404+
? node.getAsJsonObject("name").get("translation").getAsString()
405+
: "");
406+
event.setDate(node.has("occurredAt") && !node.get("occurredAt").isJsonNull()
407+
? node.get("occurredAt").getAsString()
408+
: "");
409+
410+
if (subject != null && subject.has("defaultName")
411+
&& subject.getAsJsonObject("defaultName").has("translation")) {
412+
event.setSectionName(!subject.getAsJsonObject("defaultName").get("translation").isJsonNull()
413+
? subject.getAsJsonObject("defaultName").get("translation").getAsString()
414+
: "");
415+
}
383416

417+
if (invoker != null && invoker.has("defaultName")
418+
&& invoker.getAsJsonObject("defaultName").has("translation")) {
419+
event.setInvokerName(!invoker.getAsJsonObject("defaultName").get("translation").isJsonNull()
420+
? invoker.getAsJsonObject("defaultName").get("translation").getAsString()
421+
: "");
422+
}
423+
}
424+
} else {
425+
logger.debug("JSON edges member is null or empty");
426+
}
384427
return event;
385428
}
386429

0 commit comments

Comments
 (0)