{"record":{"id":"09d56aa03eeefa2d","repo":"pentaho/pentaho-kettle","slug":"unable-to-load-job-entry-of-type-sftpput-from-xml-node","errorCode":null,"errorMessage":"Unable to load job entry of type 'SFTPPUT' from XML node","messagePattern":"Unable to load job entry of type 'SFTPPUT' from XML node","errorType":"exception","errorClass":"KettleXMLException","httpStatus":null,"severity":"error","filePath":"plugins/put-file-sftp/impl/src/main/java/org/pentaho/di/job/entries/sftpput/JobEntrySFTPPUT.java","lineNumber":233,"sourceCode":"      proxyPort = XMLHandler.getTagValue( entrynode, \"proxyPort\" );\n      proxyUsername = XMLHandler.getTagValue( entrynode, \"proxyUsername\" );\n      proxyPassword =\n        Encr.decryptPasswordOptionallyEncrypted( XMLHandler.getTagValue( entrynode, \"proxyPassword\" ) );\n\n      createRemoteFolder = \"Y\".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, \"createRemoteFolder\" ) );\n\n      boolean remove = \"Y\".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, \"remove\" ) );\n      setAfterFTPS( getAfterSFTPPutByCode( Const.NVL( XMLHandler.getTagValue( entrynode, \"aftersftpput\" ), \"\" ) ) );\n      if ( remove && getAfterFTPS() == AFTER_FTPSPUT_NOTHING ) {\n        setAfterFTPS( AFTER_FTPSPUT_DELETE );\n      }\n      destinationfolder = XMLHandler.getTagValue( entrynode, \"destinationfolder\" );\n      createDestinationFolder =\n        \"Y\".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, \"createdestinationfolder\" ) );\n      successWhenNoFile = \"Y\".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, \"successWhenNoFile\" ) );\n\n    } catch ( KettleXMLException xe ) {\n      throw new KettleXMLException( \"Unable to load job entry of type 'SFTPPUT' from XML node\", xe );\n    }\n  }\n\n  public static int getAfterSFTPPutByCode( String tt ) {\n    if ( tt == null ) {\n      return 0;\n    }\n\n    for ( int i = 0; i < afterFTPSCode.length; i++ ) {\n      if ( afterFTPSCode[i].equalsIgnoreCase( tt ) ) {\n        return i;\n      }\n    }\n    return 0;\n  }\n\n  public static String getAfterSFTPPutDesc( int i ) {\n    if ( i < 0 || i >= afterFTPSDesc.length ) {","sourceCodeStart":215,"sourceCodeEnd":251,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/put-file-sftp/impl/src/main/java/org/pentaho/di/job/entries/sftpput/JobEntrySFTPPUT.java#L215-L251","documentation":"JobEntrySFTPPUT.loadXML catches KettleXMLException while reading the SFTP Put entry's tags from the XML node and rethrows 'Unable to load job entry of type SFTPPUT from XML node' with the original exception chained. It means the entry could not be deserialized from the .kjb XML.","triggerScenarios":"Calling loadXML when XMLHandler.getTagValue encounters malformed/missing structure in the entrynode — corrupted <entry> block, unexpected null node, or wrong node type passed to this loader.","commonSituations":"Truncated or hand-edited .kjb files; XML produced by incompatible Pentaho versions; copy-paste corruption; merging job files incorrectly in version control.","solutions":["Open the .kjb in an editor and validate the SFTPPUT entry XML block (tags like destinationfolder, createdestinationfolder, successWhenNoFile).","Check the chained KettleXMLException (xe) for the exact parse error and line.","Recreate the SFTP Put entry in Spoon and re-save the job.","Restore the job file from version control or a backup if it was corrupted by editing/merging."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"Node entryNode = XMLHandler.getSubNode(jobnode, \"entry\"); if ( entryNode == null || XMLHandler.getTagValue(entryNode, \"type\") == null ) { throw new IllegalArgumentException(\"Invalid SFTPPUT entry node\"); }","typeGuard":null,"tryCatchPattern":"try { entry.loadXML(node, databases, slaveServers, rep, metaStore); } catch (KettleXMLException e) { log.error(\"SFTPPUT XML load failed: \" + e.getCause(), e); }","preventionTips":["Edit job files only via Spoon; avoid manual XML merging.","Round-trip test .kjb files (load + save) in CI.","Keep Pentaho versions in sync across environments."],"tags":["xml","job-entry","sftp","deserialization"],"backgroundTag":"xml-parse-error","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"}