diff --git a/plugins/command-manager/src/main/java/com/wazuh/commandmanager/jobscheduler/SearchThread.java b/plugins/command-manager/src/main/java/com/wazuh/commandmanager/jobscheduler/SearchThread.java index 6e268a94..309d4679 100644 --- a/plugins/command-manager/src/main/java/com/wazuh/commandmanager/jobscheduler/SearchThread.java +++ b/plugins/command-manager/src/main/java/com/wazuh/commandmanager/jobscheduler/SearchThread.java @@ -54,9 +54,9 @@ */ public class SearchThread implements Runnable { public static final String COMMAND_STATUS_FIELD = - Command.COMMAND + "." + Command.STATUS + ".keyword"; + Command.COMMAND + "." + Command.STATUS; public static final String COMMAND_ORDER_ID_FIELD = - Command.COMMAND + "." + Command.ORDER_ID + ".keyword"; + Command.COMMAND + "." + Command.ORDER_ID; public static final String COMMAND_TIMEOUT_FIELD = Command.COMMAND + "." + Command.TIMEOUT; private static final Logger log = LogManager.getLogger(SearchThread.class); public static final String ORDERS_OBJECT = "/orders"; @@ -79,14 +79,24 @@ public SearchThread(Client client) { */ public static T getNestedObject(Map map, String key, Class type) { Object value = map.get(key); + if (value == null) { + return null; + } if (type.isInstance(value)) { + // Make a defensive copy for supported types like Map or List + if (value instanceof Map) { + return type.cast(new HashMap<>((Map) value)); + } else if (value instanceof List) { + return type.cast(new ArrayList<>((List) value)); + } + // Return the value directly if it is immutable (e.g., String, Integer) return type.cast(value); } else { throw new ClassCastException( - "Expected " - + type - + " but found " - + (value != null ? value.getClass() : "null")); + "Expected " + + type.getName() + + " but found " + + value.getClass().getName()); } } @@ -101,16 +111,13 @@ public static T getNestedObject(Map map, String key, Class orders = new ArrayList<>(); - for (SearchHit hit : searchHits) { - // Create a JSON representation of each hit and add it to the orders array. - Map orderMap = - getNestedObject(hit.getSourceAsMap(), Command.COMMAND, Map.class); - // Add document id to the object. - orderMap.put("document_id", hit.getId()); - orders.add(orderMap); + Map orderMap = getNestedObject(hit.getSourceAsMap(), Command.COMMAND, Map.class); + if (orderMap != null) { + orderMap.put("document_id", hit.getId()); + orders.add(orderMap); + } } - String payload = null; try (XContentBuilder builder = XContentFactory.jsonBuilder()) { payload = builder.map(Collections.singletonMap("orders", orders)).toString(); @@ -160,21 +167,21 @@ private SimpleHttpResponse deliverOrders(String orders) { @SuppressWarnings("unchecked") private void setSentStatus(SearchHit hit) throws IllegalStateException { Map commandMap = - getNestedObject( - hit.getSourceAsMap(), - CommandManagerPlugin.COMMAND_DOCUMENT_PARENT_OBJECT_NAME, - Map.class); + getNestedObject( + hit.getSourceAsMap(), + CommandManagerPlugin.COMMAND_DOCUMENT_PARENT_OBJECT_NAME, + Map.class); commandMap.put(Command.STATUS, Status.SENT); hit.getSourceAsMap() - .put(CommandManagerPlugin.COMMAND_DOCUMENT_PARENT_OBJECT_NAME, commandMap); + .put(CommandManagerPlugin.COMMAND_DOCUMENT_PARENT_OBJECT_NAME, commandMap); IndexRequest indexRequest = - new IndexRequest() - .index(CommandManagerPlugin.COMMAND_MANAGER_INDEX_NAME) - .source(hit.getSourceAsMap()) - .id(hit.getId()); + new IndexRequest() + .index(CommandManagerPlugin.COMMAND_MANAGER_INDEX_NAME) + .source(hit.getSourceAsMap()) + .id(hit.getId()); this.client - .index(indexRequest) - .actionGet(CommandManagerPlugin.DEFAULT_TIMEOUT_SECONDS * 1000); + .index(indexRequest) + .actionGet(CommandManagerPlugin.DEFAULT_TIMEOUT_SECONDS * 1000); } /**