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

  1. Inspect the cause KettleFileException for the actual reason (not-found, auth, provider).
  2. Verify the S3 URI format (s3://bucket/path) and that the bucket/prefix exists.
  3. Check AWS credentials/region so the S3 VFS provider can resolve the file.
  4. 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

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


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 use

View on GitHub (pinned to f3058517a1)