{"record":{"id":"8814a67f745e7902","repo":"pentaho/pentaho-kettle","slug":"unexpected-error-reading-back-a-resultfile-object-from-xml","errorCode":null,"errorMessage":"Unexpected error reading back a ResultFile object from XML","messagePattern":"Unexpected error reading back a ResultFile object from XML","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"core/src/main/java/org/pentaho/di/core/Result.java","lineNumber":702,"sourceCode":"\n    logChannelId = XMLHandler.getTagValue( node, \"log_channel_id\" );\n    String tagText = XMLHandler.getTagValue( node, \"log_text\" );\n    if ( tagText != null ) {\n      logText = new StringBuilder( tagText );\n    }\n    elapsedTimeMillis = Const.toLong( XMLHandler.getTagValue( node, \"elapsedTimeMillis\" ), 0L );\n    executionId = XMLHandler.getTagValue( node, \"executionId\" );\n\n    // Now read back the result files...\n    //\n    Node resultFilesNode = XMLHandler.getSubNode( node, XML_FILES_TAG );\n    int nrResultFiles = XMLHandler.countNodes( resultFilesNode, XML_FILE_TAG );\n    for ( int i = 0; i < nrResultFiles; i++ ) {\n      try {\n        ResultFile resultFile = new ResultFile( XMLHandler.getSubNodeByNr( resultFilesNode, XML_FILE_TAG, i ) );\n        resultFiles.put( resultFile.getFile().toString(), resultFile );\n      } catch ( KettleFileException e ) {\n        throw new KettleException( \"Unexpected error reading back a ResultFile object from XML\", e );\n      }\n    }\n\n    // Let's also read back the result rows...\n    //\n    Node resultRowsNode = XMLHandler.getSubNode( node, XML_ROWS_TAG );\n    List<Node> resultNodes = XMLHandler.getNodes( resultRowsNode, RowMeta.XML_DATA_TAG );\n    if ( !resultNodes.isEmpty() ) {\n      // OK, get the metadata first...\n      //\n      RowMeta rowMeta = new RowMeta( XMLHandler.getSubNode( resultRowsNode, RowMeta.XML_META_TAG ) );\n      for ( Node resultNode : resultNodes ) {\n        Object[] rowData = rowMeta.getRow( resultNode );\n        rows.add( new RowMetaAndData( rowMeta, rowData ) );\n      }\n    }\n\n  }","sourceCodeStart":684,"sourceCodeEnd":720,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/core/src/main/java/org/pentaho/di/core/Result.java#L684-L720","documentation":"The Result(Node) XML-deserialization constructor throws KettleException when a ResultFile node cannot be reconstructed — its ResultFile constructor raised a KettleFileException (missing/invalid attributes such as file type, encoding, or timestamp).","triggerScenarios":"Reading a Result XML blob (e.g. from job executor results or serialized job entry output) where the <result-file> element lacks required child nodes or has invalid values, causing new ResultFile(Node) to fail.","commonSituations":"Hand-edited or truncated result XML, XML produced by a different PDI version with a changed ResultFile schema, XML stored in a database/repo and corrupted, copying result XML between environments.","solutions":["Validate the source XML against the expected Result schema (result-files nodes with file/type/timestamp children)","Regenerate the XML from a successful run instead of trusting stored/corrupted XML","Check PDI version compatibility of the XML producer and consumer","Wrap the Result(Node) construction and handle KettleException to skip/repair bad result-file entries"],"exampleFix":"// before\nResult result = new Result(resultNode);\n// after\ntry {\n  Result result = new Result(resultNode);\n} catch (KettleException e) {\n  log.warn(\"Result XML contains invalid result-file entries\", e);\n  result = new Result();\n}","handlingStrategy":"try-catch","validationCode":"// pre-check the XML before constructing Result\nNode filesNode = XMLHandler.getSubNode(node, \"result-files\");\nif (filesNode != null && XMLHandler.countNodes(filesNode, \"result-file\") > 0) {\n  for (int i = 0; i < XMLHandler.countNodes(filesNode, \"file\"); i++) {\n    Node f = XMLHandler.getSubNodeByNr(filesNode, \"file\", i);\n    if (XMLHandler.getNodeValue(XMLHandler.getSubNode(f, \"path\")) == null) {\n      throw new IllegalArgumentException(\"Invalid result-file entry at index \" + i);\n    }\n  }\n}","typeGuard":null,"tryCatchPattern":"try {\n  Result result = new Result(node);\n} catch (KettleException e) {\n  // regenerate result or fall back to an empty Result\n}","preventionTips":["Don't hand-edit stored result XML; regenerate from runs","Keep producer/consumer PDI versions aligned","Validate stored XML structure before deserialization"],"tags":["xml","deserialization","resultfile","schema"],"backgroundTag":"unexpected-response-shape","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}