diff --git a/sdk/fleetmdm/src/main/java/com/openframe/sdk/fleetmdm/FleetMdmClient.java b/sdk/fleetmdm/src/main/java/com/openframe/sdk/fleetmdm/FleetMdmClient.java index 80cdbba45..08fea4de8 100644 --- a/sdk/fleetmdm/src/main/java/com/openframe/sdk/fleetmdm/FleetMdmClient.java +++ b/sdk/fleetmdm/src/main/java/com/openframe/sdk/fleetmdm/FleetMdmClient.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.type.CollectionType; import com.openframe.sdk.fleetmdm.exception.FleetMdmApiException; import com.openframe.sdk.fleetmdm.exception.FleetMdmException; import com.openframe.sdk.fleetmdm.model.Host; @@ -410,9 +411,8 @@ public List listPolicies() { try { HttpResponse response = sendRequest(POLICIES_URL, "GET", null); checkResponse(response, "list Fleet policies"); - return MAPPER.convertValue( - requireNode(response.body(), "policies"), - MAPPER.getTypeFactory().constructCollectionType(List.class, Policy.class)); + String body = response.body(); + return parseList(body, "policies", Policy.class); } catch (FleetMdmApiException e) { throw e; } catch (Exception e) { @@ -472,9 +472,8 @@ public List listScheduledQueries() { try { HttpResponse response = sendRequest(QUERIES_URL, "GET", null); checkResponse(response, "list Fleet scheduled queries"); - return MAPPER.convertValue( - requireNode(response.body(), "queries"), - MAPPER.getTypeFactory().constructCollectionType(List.class, Query.class)); + String body = response.body(); + return parseList(body, "queries", Query.class); } catch (FleetMdmApiException e) { throw e; } catch (Exception e) { @@ -537,9 +536,8 @@ public CompletableFuture> listPoliciesAsync() { .thenApply(response -> { checkResponse(response, "list Fleet policies"); try { - return MAPPER.convertValue( - requireNode(response.body(), "policies"), - MAPPER.getTypeFactory().constructCollectionType(List.class, Policy.class)); + String body = response.body(); + return parseList(body, "policies", Policy.class); } catch (Exception e) { throw new FleetMdmException("Failed to parse list policies response", e); } @@ -603,9 +601,8 @@ public CompletableFuture> listScheduledQueriesAsync() { .thenApply(response -> { checkResponse(response, "list Fleet scheduled queries"); try { - return MAPPER.convertValue( - requireNode(response.body(), "queries"), - MAPPER.getTypeFactory().constructCollectionType(List.class, Query.class)); + String body = response.body(); + return parseList(body, "queries", Query.class); } catch (Exception e) { throw new FleetMdmException("Failed to parse list scheduled queries response", e); } @@ -813,6 +810,16 @@ private static void checkResponse(HttpResponse response, String action) + (body.isEmpty() ? "" : ": " + body), response.statusCode(), body); } + private static List parseList(String responseBody, String fieldName, Class itemType) throws Exception { + JsonNode root = MAPPER.readTree(responseBody); + JsonNode node = root.get(fieldName); + if (node == null || node.isNull()) { + return List.of(); + } + CollectionType listType = MAPPER.getTypeFactory().constructCollectionType(List.class, itemType); + return MAPPER.convertValue(node, listType); + } + private static JsonNode requireNode(String responseBody, String fieldName) throws Exception { JsonNode root = MAPPER.readTree(responseBody); JsonNode node = root.get(fieldName);