pentaho/pentaho-kettle · error · KettleException
GetXMLData.Log.RequiredFilesMissing (localized message with…
Error message
GetXMLData.Log.RequiredFilesMissing (localized message with file list)
What it means
At the start of processing, GetXMLData's handleMissingFiles checks the resolved file list for non-existent files. If any required input files are missing, it logs them and throws a KettleException with the localized RequiredFilesMissing message including the list of missing files, aborting the step. This is a fail-fast guard rather than silently skipping.
Solutions
- Fix the file names/directories listed in the error message in the step's File tab
- Verify the files exist from the machine/agent actually running the transformation (paths are relative to it)
- Use environment variables (${Internal.Transformation.Filename.Directory}, ${ENV_VAR}) instead of hard-coded absolute paths
- If files may legitimately be absent, enable 'Ignore missing file' / add existence checks in a preceding job entry
Example fix
// before
File: /data/input/sales.xml
// after
File: ${Internal.Transformation.Filename.Directory}/input/sales.xml Defensive patterns
Strategy: validation
Validate before calling
File f = new File(resolvedPath);
if (!f.isFile()) failFast("Input XML missing before running transformation: " + resolvedPath); Try / catch
try { runTransformation(); }
catch (KettleException ke) {
if (ke.getMessage() != null && ke.getMessage().contains("required files")) {
logError("Missing input files — check paths and upstream job delivery");
}
} Prevention
- Use variables/relative paths instead of hard-coded absolute paths
- Check file existence in a preceding job entry (file exists check)
- Ensure upstream jobs finish delivering files before the transformation starts
When it happens
Trigger: processRow → handleMissingFiles finds data.files.getNonExistantFiles() non-empty — i.e. one or more files matching the step's file/wildcard specification do not exist on the filesystem/VFS.
Common situations: Filename typos or wrong directory; files not yet delivered by an upstream job; wildcard matching zero real files plus a fixed missing file; permissions causing existence checks to fail; changing environment (dev vs prod paths).
Understand the failure class
Background: "File not found" and ENOENT errors: why libraries can't find a file that should exist — this error's family across 50 libraries.
Related errors
- AccessInput.Log.RequiredFilesMissing
- Cannot open control file
- Cannot open data file
- ChangeFileEncoding.Error.SourceFileNotExists
- CubeInputMeta.Exception.ErrorOpeningOrReadingCubeFile
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/1878cea5b50e3e98.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/xml/core/src/main/java/org/pentaho/di/trans/steps/getxmldata/GetXMLData.java:313
}
/**
* Build an empty row based on the meta-data.
*
* @return empty row built
*/
private Object[] buildEmptyRow() {
return RowDataUtil.allocateRowData( data.outputRowMeta.size() );
}
private void handleMissingFiles() throws KettleException {
List<FileObject> nonExistantFiles = data.files.getNonExistantFiles();
if ( nonExistantFiles.size() != 0 ) {
String message = FileInputList.getRequiredFilesDescription( nonExistantFiles );
logError( BaseMessages.getString( PKG, "GetXMLData.Log.RequiredFilesTitle" ), BaseMessages.getString( PKG,
"GetXMLData.Log.RequiredFiles", message ) );
throw new KettleException( BaseMessages.getString( PKG, "GetXMLData.Log.RequiredFilesMissing", message ) );
}
List<FileObject> nonAccessibleFiles = data.files.getNonAccessibleFiles();
if ( nonAccessibleFiles.size() != 0 ) {
String message = FileInputList.getRequiredFilesDescription( nonAccessibleFiles );
logError( BaseMessages.getString( PKG, "GetXMLData.Log.RequiredFilesTitle" ), BaseMessages.getString( PKG,
"GetXMLData.Log.RequiredNotAccessibleFiles", message ) );
throw new KettleException( BaseMessages.getString( PKG, "GetXMLData.Log.RequiredNotAccessibleFilesMissing",
message ) );
}
}
private boolean ReadNextString() {
try {
// Grab another row ...
data.readrow = getRow();View on GitHub (pinned to f3058517a1)