pentaho/pentaho-kettle · error · KettleException
Unable to load job entry of type 'create Folder' from the…
Error message
Unable to load job entry of type 'create Folder' from the repository for id_jobentry=
What it means
Thrown by JobEntryFolderIsEmpty.loadRep when reading the job entry's attributes (foldername, include_subfolders, specify_wildcard, wildcard) from the repository fails with a KettleException. The original database/repository exception is attached as the cause. It indicates the 'Folder is empty' job entry could not be hydrated from the repository, despite the message text saying 'create Folder' (a copy-paste bug in the message).
Solutions
- Inspect the cause (KettleException dbe) to find the real repository/database error and fix connectivity or schema issues.
- Verify the job entry row with id_jobentry exists in the repository tables (r_jobentry / r_jobentry_attribute).
- Re-save or recreate the job entry in Spoon to regenerate missing attribute rows.
- If the repository is corrupt, restore from backup or export/re-import the job as XML.
Example fix
// before: attributes missing in repository cause load to fail
JobEntryFolderIsEmpty entry = new JobEntryFolderIsEmpty();
entry.loadRep(rep, metaStore, idJobEntry, databases, slaveServers);
// after: guard against missing/corrupt entry and surface the cause
try {
if (rep.getJobEntryAttributeString(idJobEntry, "foldername") == null) {
throw new KettleException("Entry " + idJobEntry + " has no foldername attribute; re-save the entry");
}
entry.loadRep(rep, metaStore, idJobEntry, databases, slaveServers);
} catch (KettleException e) {
logError("FolderIsEmpty load failed: " + e.getCause(), e);
} Defensive patterns
Strategy: try-catch
Validate before calling
if (idJobEntry == null || idJobEntry.getId() == null) {
throw new KettleException("No repository id for FolderIsEmpty entry; entry was never saved");
} Try / catch
try {
entry.loadRep(rep, metaStore, idJobEntry, databases, slaveServers);
} catch (KettleException e) {
Throwable cause = e.getCause();
logError("Repository read failed for id_jobentry=" + idJobEntry + ": " + (cause != null ? cause.getMessage() : e.getMessage()));
// recover: re-save entry or fall back to XML load
} Prevention
- Keep the repository database healthy and monitor connectivity before opening jobs.
- Avoid hand-editing repository tables; use Spoon to modify job entries.
- Back up the repository before migrations or bulk deletes.
- Always save job entries through Spoon so all attribute rows are written.
When it happens
Trigger: Calling loadRep on a JobEntryFolderIsEmpty when the underlying repository call rep.getJobEntryAttributeString/Boolean throws a KettleException — e.g. the r_jobentry_attribute rows are missing/corrupt, the repository connection dropped mid-read, or id_jobentry points to a nonexistent entry.
Common situations: Repository database unavailable or network failure while opening a job; a partially saved or corrupted job entry row; an id_jobentry from a different/older repository schema being passed in; repository metadata tables purged or migrated incorrectly.
Understand the failure class
Background: Database query failed: Internal Server Error 500s wrapping SQL, Prisma, and connection failures — what to check first — this error's family across 16 libraries.
Related errors
- JobEntryMSAccessBulkLoad.Meta.UnableSave
- JobEntrySimple.Error.Exception.UnableLoadRep
- JobFoldersCompare.Meta.UnableLoadRep
- JobFoldersCompare.Meta.UnableSaveRep
- JobMoveFiles.Error.Exception.UnableSaveRep
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/d4e533ca5d3898bf.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/job/entries/folderisempty/JobEntryFolderIsEmpty.java:121
super.loadXML( entrynode, databases, slaveServers );
foldername = XMLHandler.getTagValue( entrynode, "foldername" );
includeSubfolders = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "include_subfolders" ) );
specifywildcard = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "specify_wildcard" ) );
wildcard = XMLHandler.getTagValue( entrynode, "wildcard" );
} catch ( KettleXMLException xe ) {
throw new KettleXMLException( "Unable to load job entry of type 'create folder' from XML node", xe );
}
}
public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,
List<SlaveServer> slaveServers ) throws KettleException {
try {
foldername = rep.getJobEntryAttributeString( id_jobentry, "foldername" );
includeSubfolders = rep.getJobEntryAttributeBoolean( id_jobentry, "include_subfolders" );
specifywildcard = rep.getJobEntryAttributeBoolean( id_jobentry, "specify_wildcard" );
wildcard = rep.getJobEntryAttributeString( id_jobentry, "wildcard" );
} catch ( KettleException dbe ) {
throw new KettleException(
"Unable to load job entry of type 'create Folder' from the repository for id_jobentry=" + id_jobentry,
dbe );
}
}
public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_job ) throws KettleException {
try {
rep.saveJobEntryAttribute( id_job, getObjectId(), "foldername", foldername );
rep.saveJobEntryAttribute( id_job, getObjectId(), "include_subfolders", includeSubfolders );
rep.saveJobEntryAttribute( id_job, getObjectId(), "specify_wildcard", specifywildcard );
rep.saveJobEntryAttribute( id_job, getObjectId(), "wildcard", wildcard );
} catch ( KettleDatabaseException dbe ) {
throw new KettleException( "Unable to save job entry of type 'create Folder' to the repository for id_job="
+ id_job, dbe );
}
}
public void setSpecifyWildcard( boolean specifywildcard ) {View on GitHub (pinned to f3058517a1)