{"record":{"id":"fb743203f0b9bcf8","repo":"pentaho/pentaho-kettle","slug":"unable-to-load-job-entry-of-type-ftps-from-xml-node","errorCode":null,"errorMessage":"Unable to load job entry of type 'FTPS' from XML node","messagePattern":"Unable to load job entry of type 'FTPS' from XML node","errorType":"exception","errorClass":"KettleXMLException","httpStatus":null,"severity":"error","filePath":"plugins/ftps/impl/src/main/java/org/pentaho/di/job/entries/ftpsget/JobEntryFTPSGet.java","lineNumber":256,"sourceCode":"      }\n\n      createmovefolder = \"Y\".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, \"createmovefolder\" ) );\n\n      proxyHost = XMLHandler.getTagValue( entrynode, \"proxy_host\" );\n      proxyPort = XMLHandler.getTagValue( entrynode, \"proxy_port\" );\n      proxyUsername = XMLHandler.getTagValue( entrynode, \"proxy_username\" );\n      proxyPassword =\n        Encr.decryptPasswordOptionallyEncrypted( XMLHandler.getTagValue( entrynode, \"proxy_password\" ) );\n\n      ifFileExists = getFileExistsIndex( XMLHandler.getTagValue( entrynode, \"ifFileExists\" ) );\n      nr_limit = XMLHandler.getTagValue( entrynode, \"nr_limit\" );\n      success_condition =\n        Const.NVL( XMLHandler.getTagValue( entrynode, \"success_condition\" ), SUCCESS_IF_NO_ERRORS );\n      connectionType =\n        FTPSConnection.getConnectionTypeByCode( Const.NVL(\n          XMLHandler.getTagValue( entrynode, \"connection_type\" ), \"\" ) );\n    } catch ( Exception xe ) {\n      throw new KettleXMLException( \"Unable to load job entry of type 'FTPS' from XML node\", xe );\n    }\n  }\n\n  public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,\n                       List<SlaveServer> slaveServers ) throws KettleException {\n    try {\n      port = rep.getJobEntryAttributeString( id_jobentry, \"port\" );\n      serverName = rep.getJobEntryAttributeString( id_jobentry, \"servername\" );\n      userName = rep.getJobEntryAttributeString( id_jobentry, \"username\" );\n      password =\n        Encr.decryptPasswordOptionallyEncrypted( rep.getJobEntryAttributeString( id_jobentry, \"password\" ) );\n      FTPSDirectory = rep.getJobEntryAttributeString( id_jobentry, \"FTPSdirectory\" );\n      targetDirectory = rep.getJobEntryAttributeString( id_jobentry, \"targetdirectory\" );\n      wildcard = rep.getJobEntryAttributeString( id_jobentry, \"wildcard\" );\n      binaryMode = rep.getJobEntryAttributeBoolean( id_jobentry, \"binary\" );\n      timeout = rep.getJobEntryAttributeString( id_jobentry, \"timeout\" );\n      remove = rep.getJobEntryAttributeBoolean( id_jobentry, \"remove\" );\n      onlyGettingNewFiles = rep.getJobEntryAttributeBoolean( id_jobentry, \"only_new\" );","sourceCodeStart":238,"sourceCodeEnd":274,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/ftps/impl/src/main/java/org/pentaho/di/job/entries/ftpsget/JobEntryFTPSGet.java#L238-L274","documentation":"KettleXMLException thrown by JobEntryFTPSGet.loadXML when any step of reading the job entry's attributes from its XML node throws — e.g. malformed XML, missing tags, or a bad connection_type code passed to FTPSConnection.getConnectionTypeByCode.","triggerScenarios":"loading a .kjb job file whose FTPSGet entry node has malformed/unexpected XML, or an unrecognized connection_type value that getConnectionTypeByCode cannot map","commonSituations":"job file edited by hand or produced by a different PDI version; XML escaping broken; connection_type attribute changed/renamed between plugin versions","solutions":["Open the .kjb file in an XML editor and validate well-formedness of the FTPSGet entry node","Check the connection_type value in the XML matches a known FTPSConnection code","Regenerate or re-save the job entry in Spoon with the same plugin version","Compare with a working job file to find the missing/corrupt tag"],"exampleFix":"<!-- before -->\n<connection_type>UNKNOWN_TYPE</connection_type>\n<!-- after -->\n<connection_type>FTPES</connection_type>","handlingStrategy":"validation","validationCode":"// validate the XML node before load\nString type = XMLHandler.getTagValue(entrynode, \"connection_type\");\nif (type != null && !knownConnectionTypes.contains(type))\n  throw new KettleXMLException(\"Unknown connection_type: \" + type);","typeGuard":null,"tryCatchPattern":"try {\n  jobEntry.loadXML(entrynode, databases, metaStore);\n} catch (KettleXMLException xe) {\n  logError(\"Corrupt FTPS job entry XML: \" + xe.getMessage(), xe);\n  throw xe;\n}","preventionTips":["Do not hand-edit .kjb files; edit in Spoon","Keep the FTPS plugin version consistent with PDI","Validate XML well-formedness after external edits"],"tags":["xml","deserialization","job-entry"],"backgroundTag":"json-unmarshal-failed","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"}