{"record":{"id":"432df2e2e6435183","repo":"apache/seatunnel","slug":"event-must-not-be-empty","errorCode":null,"errorMessage":"event must not be empty","messagePattern":"event must not be empty","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"seatunnel-edge-agent/seatunnel-edge-agent-connector/src/main/java/org/apache/seatunnel/edge/agent/connector/file/output/JsonOutputFormatter.java","lineNumber":38,"sourceCode":"import org.apache.seatunnel.shade.com.fasterxml.jackson.core.JsonProcessingException;\nimport org.apache.seatunnel.shade.com.fasterxml.jackson.databind.JsonNode;\nimport org.apache.seatunnel.shade.com.fasterxml.jackson.databind.ObjectMapper;\nimport org.apache.seatunnel.shade.com.fasterxml.jackson.databind.node.ArrayNode;\nimport org.apache.seatunnel.shade.com.fasterxml.jackson.databind.node.ObjectNode;\n\nimport org.apache.seatunnel.edge.agent.connector.file.multiline.MultilineAssembler;\nimport org.apache.seatunnel.edge.agent.connector.record.CollectedRecord;\n\nimport java.util.List;\n\npublic class JsonOutputFormatter implements OutputFormatter {\n\n    private final ObjectMapper objectMapper = new ObjectMapper();\n\n    @Override\n    public CollectedRecord format(List<MultilineAssembler.LineElement> event, String sourceId) {\n        if (event.isEmpty()) {\n            throw new IllegalArgumentException(\"event must not be empty\");\n        }\n        MultilineAssembler.LineElement first = event.get(0);\n        MultilineAssembler.LineElement last = event.get(event.size() - 1);\n        try {\n            String json;\n            if (event.size() == 1) {\n                ObjectNode node = buildLineObjectWithParsedPayload(0, first, first.getText());\n                json = objectMapper.writeValueAsString(node);\n            } else {\n                ArrayNode array = objectMapper.createArrayNode();\n                for (int i = 0; i < event.size(); i++) {\n                    MultilineAssembler.LineElement e = event.get(i);\n                    array.add(buildLineObjectWithParsedPayload(i, e, e.getText()));\n                }\n                json = objectMapper.writeValueAsString(array);\n            }\n            return new CollectedRecord(\n                    json,","sourceCodeStart":20,"sourceCodeEnd":56,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-edge-agent/seatunnel-edge-agent-connector/src/main/java/org/apache/seatunnel/edge/agent/connector/file/output/JsonOutputFormatter.java#L20-L56","documentation":"JsonOutputFormatter.format() requires a non-empty list of LineElement because it reads the first and last elements to build the CollectedRecord's boundaries. An empty event cannot produce a meaningful record, so it is rejected with IllegalArgumentException.","triggerScenarios":"Calling format(Collections.emptyList(), sourceId) — typically when a MultilineAssembler flushes an empty buffer (e.g. forced flush before any line was appended).","commonSituations":"A flush triggered on an empty buffer during shutdown or file rotation; a bug in assembler event emission; passing an unfiltered list that had all lines removed upstream.","solutions":["Guard the caller: skip format() when event == null || event.isEmpty()","Fix the MultilineAssembler flush path so it never emits empty events","Catch IllegalArgumentException around format() and log/skip if you cannot control the input"],"exampleFix":"// before\nformatter.format(event, sourceId);\n// after\nif (event != null && !event.isEmpty()) {\n    formatter.format(event, sourceId);\n}","handlingStrategy":"type-guard","validationCode":"if (event == null || event.isEmpty()) { return; }","typeGuard":"boolean hasEvent(List<MultilineAssembler.LineElement> e) { return e != null && !e.isEmpty(); }","tryCatchPattern":"try { formatter.format(event, sourceId); } catch (IllegalArgumentException e) { LOG.warn(\"Skipping empty event\", e); }","preventionTips":["Check buffer size before flushing assemblers","Skip formatter calls for empty lists at the pipeline layer","Add asserts/tests that flush() never emits empty events"],"tags":["java","empty-collection","precondition"],"backgroundTag":"empty-required-field","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}