{"record":{"id":"ff50987201b5944a","repo":"pentaho/pentaho-kettle","slug":"unable-to-load-job-entry-of-type-create-folder-from-xml-node-ff5098","errorCode":null,"errorMessage":"Unable to load job entry of type 'create folder' from XML node","messagePattern":"Unable to load job entry of type 'create folder' from XML node","errorType":"exception","errorClass":"KettleXMLException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/job/entries/folderisempty/JobEntryFolderIsEmpty.java","lineNumber":109,"sourceCode":"    retval.append( \"      \" ).append( XMLHandler.addTagValue( \"include_subfolders\", includeSubfolders ) );\n    retval.append( \"      \" ).append( XMLHandler.addTagValue( \"specify_wildcard\", specifywildcard ) );\n    retval.append( \"      \" ).append( XMLHandler.addTagValue( \"wildcard\", wildcard ) );\n    if ( parentJobMeta != null ) {\n      parentJobMeta.getNamedClusterEmbedManager().registerUrl( foldername );\n    }\n    return retval.toString();\n  }\n\n  public void loadXML( Node entrynode, List<DatabaseMeta> databases, List<SlaveServer> slaveServers,\n    Repository rep, IMetaStore metaStore ) throws KettleXMLException {\n    try {\n      super.loadXML( entrynode, databases, slaveServers );\n      foldername = XMLHandler.getTagValue( entrynode, \"foldername\" );\n      includeSubfolders = \"Y\".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, \"include_subfolders\" ) );\n      specifywildcard = \"Y\".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, \"specify_wildcard\" ) );\n      wildcard = XMLHandler.getTagValue( entrynode, \"wildcard\" );\n    } catch ( KettleXMLException xe ) {\n      throw new KettleXMLException( \"Unable to load job entry of type 'create folder' 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      foldername = rep.getJobEntryAttributeString( id_jobentry, \"foldername\" );\n      includeSubfolders = rep.getJobEntryAttributeBoolean( id_jobentry, \"include_subfolders\" );\n      specifywildcard = rep.getJobEntryAttributeBoolean( id_jobentry, \"specify_wildcard\" );\n      wildcard = rep.getJobEntryAttributeString( id_jobentry, \"wildcard\" );\n    } catch ( KettleException dbe ) {\n      throw new KettleException(\n        \"Unable to load job entry of type 'create Folder' from the repository for id_jobentry=\" + id_jobentry,\n        dbe );\n    }\n  }\n\n  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_job ) throws KettleException {","sourceCodeStart":91,"sourceCodeEnd":127,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/job/entries/folderisempty/JobEntryFolderIsEmpty.java#L91-L127","documentation":"Thrown by JobEntryFolderIsEmpty.loadXML when the 'folder is empty' job entry cannot be deserialized from its XML node. It wraps the KettleXMLException with a hardcoded (non-localized) message. Note the message misleadingly says 'create folder' although the entry is folderisempty. It means the entry's XML attributes could not be read.","triggerScenarios":"Loading a .kjb whose <entry> node for this type is malformed or missing foldername/include_subfolders/specify_wildcard/wildcard tags, or whose super.loadXML fails on base attributes.","commonSituations":"Hand-edited .kjb; truncated file; XML from a different Kettle version with renamed tags; copy-paste from a 'create folder' entry producing wrong structure.","solutions":["Re-create the entry in Spoon to regenerate valid XML","Verify the node contains foldername, include_subfolders, specify_wildcard and wildcard child tags","Inspect the chained KettleXMLException cause for the parse error","Restore the .kjb from version control or a backup"],"exampleFix":"// before\n<entry name='FolderEmpty'><foldername>/data</foldername></entry>\n// after\n<entry name='FolderEmpty'><foldername>/data</foldername><include_subfolders>N</include_subfolders><specify_wildcard>N</specify_wildcard><wildcard></wildcard></entry>","handlingStrategy":"try-catch","validationCode":"// Java: validate required tags before loading\nif (XMLHandler.getSubNode(entrynode, \"foldername\") == null) {\n    throw new IllegalArgumentException(\"folderisempty entry missing <foldername>\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    jobEntry.loadXML(entrynode, databases, slaveServers, rep, metaStore);\n} catch (KettleXMLException e) {\n    logError(\"Corrupt folderisempty entry XML (message says 'create folder' but is folderisempty): \" + e.getMessage(), e);\n    // skip or rebuild the entry\n}","preventionTips":["Do not copy XML between different entry types (create folder vs folder isempty)","Edit entries only via Spoon","Validate .kjb XML after external transformations","Keep Kettle versions consistent across environments"],"tags":["xml","deserialization","job-entry"],"backgroundTag":"xml-parse-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"}