pentaho/pentaho-kettle · error · FileSystemException
FileSystemException wrapping KettleFileException
Error message
FileSystemException wrapping KettleFileException
What it means
The S3 VFS file chooser dialog's resolveFile delegates to KettleVFS.getFileObject and converts KettleFileException into org.apache.commons.vfs2.FileSystemException, since the VFS API declares FileSystemException. The message is therefore a wrapper; the meaningful cause is the nested KettleFileException.
Solutions
- Inspect the cause KettleFileException for the actual reason (not-found, auth, provider).
- Verify the S3 URI format (s3://bucket/path) and that the bucket/prefix exists.
- Check AWS credentials/region so the S3 VFS provider can resolve the file.
- Resolve any unresolvable ${variables} used in the path before browsing.
Example fix
// before
return KettleVFS.getInstance( spoon.getExecutionBowl() )
.getFileObject( fileUri, getVariableSpace(), getFileSystemOptions() );
// after: pre-validate the URI
if ( fileUri == null || !fileUri.startsWith( "s3://" ) ) {
throw new FileSystemException( "Invalid S3 URI: " + fileUri );
}
return KettleVFS.getInstance( spoon.getExecutionBowl() )
.getFileObject( fileUri, getVariableSpace(), getFileSystemOptions() ); Defensive patterns
Strategy: try-catch
Validate before calling
// check the URI shape before resolving
if ( fileUri == null || !fileUri.matches( "^s3://[^/]+/.+" ) ) {
throw new IllegalArgumentException( "Expected s3://bucket/key URI" );
} Try / catch
try {
FileObject fo = dialog.resolveFile( uri );
} catch ( org.apache.commons.vfs2.FileSystemException e ) {
logError( "Resolve failed: " + e.getCause(), e );
} Prevention
- Validate s3:// URI format before browsing
- Ensure AWS credentials are configured for the S3 VFS provider
- Confirm the bucket/prefix exists
- Resolve ${variables} before passing the URI
When it happens
Trigger: newRoot -> resolveFile(fileUri) when KettleVFS cannot resolve the given S3 URI: invalid or unresolvable URI, missing bucket, VFS provider not registered, or variable substitution failures in the URI.
Common situations: Browsing to a bucket/folder that does not exist; typos in s3:// URIs; missing AWS credentials causing the S3 VFS provider to fail resolution; variables in the path that don't resolve in the Spoon context.
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
- Exception getting the list of buckets
- FileSystemException wrapping SdkClientException
- vfs.provider/copy-file.error
- vfs.provider/copy-missing-file.error
- vfs.provider/create-file.error
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/5612dc306dee034d.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/s3-vfs/core/src/main/java/org/pentaho/amazon/s3/S3VfsFileChooserBaseDialog.java:91
vfsFileChooserDialog.vfsBrowser.fileSystemTree.removeAll();
super.activate();
try {
String filename = Props.getInstance().getCustomParameter( "S3VfsFileChooserDialog.Filename", buildS3FileSystemUrlString() );
FileObject newRoot = resolveFile( filename );
vfsFileChooserDialog.vfsBrowser.resetVfsRoot( newRoot );
} catch ( FileSystemException ignored ) {
//ignored
}
}
public FileObject resolveFile( String fileUri ) throws FileSystemException {
Spoon spoon = Spoon.getInstance();
try {
return KettleVFS.getInstance( spoon.getExecutionBowl() )
.getFileObject( fileUri, getVariableSpace(), getFileSystemOptions() );
} catch ( KettleFileException e ) {
throw new FileSystemException( e );
}
}
public FileObject resolveFile( String fileUri, FileSystemOptions opts ) throws FileSystemException {
Spoon spoon = Spoon.getInstance();
try {
return KettleVFS.getInstance( spoon.getExecutionBowl() ).getFileObject( fileUri, getVariableSpace(), opts );
} catch ( KettleFileException e ) {
throw new FileSystemException( e );
}
}
private FileSystemOptions getFileSystemOptions() throws FileSystemException {
FileSystemOptions opts = new FileSystemOptions();
try {
String accessKey = "";
String secretKey = "";
/* For legacy transformations containing AWS S3 access credentials, {@link Const#KETTLE_USE_AWS_DEFAULT_CREDENTIALS} can force Spoon to useView on GitHub (pinned to f3058517a1)