pentaho/pentaho-kettle · critical · FileSystemException
Unable to obtain a IUnifiedRepository instance
Error message
Unable to obtain a IUnifiedRepository instance
What it means
PurFileSystem's constructor obtains the IUnifiedRepository from RepositoryAccess and throws a FileSystemException if it is null. Without a repository client the whole VFS filesystem cannot function, so construction fails fast.
Solutions
- Initialize the repository connection (login) before creating the PurFileSystem and ensure RepositoryAccess.getPur() returns a non-null IUnifiedRepository
- Check repository configuration (URL, credentials) in the PUR/VFS options
- If using a local server, verify the embedded jackrabbit repository started successfully and check its logs
- Reconnect/re-login to the repository and retry filesystem construction
Example fix
// before RepositoryAccess access = new RepositoryAccess(); // getPur() == null FileSystem fs = new PurFileSystem( rootName, opts, access ); // after IUnifiedRepository pur = connectAndLogin( cfg ); // non-null RepositoryAccess access = new RepositoryAccess( pur, contentHandler, outputConverter ); FileSystem fs = new PurFileSystem( rootName, opts, access );
Defensive patterns
Strategy: validation
Validate before calling
// Before building the filesystem, verify the repository is connected
IUnifiedRepository pur = repoAccess.getPur();
if ( pur == null ) {
throw new IllegalStateException( "Connect/login to the repository before creating PurFileSystem" );
} Type guard
boolean repositoryReady( RepositoryAccess ra ) {
return ra != null && ra.getPur() != null && ra.getContentHandler() != null;
} Try / catch
try {
FileSystem fs = new PurFileSystem( rootName, opts, repoAccess );
} catch ( FileSystemException e ) {
if ( String.valueOf( e.getMessage() ).contains( "IUnifiedRepository" ) ) {
repoAccess.login(); // reconnect then retry
fs = new PurFileSystem( rootName, opts, repoAccess );
}
} Prevention
- Always establish the PUR connection (login) before VFS construction
- Validate repository configuration (URL, credentials) at startup
- For local mode, confirm the embedded jackrabbit server started
- Wrap VFS construction with a connectivity check and clear startup error
When it happens
Trigger: Constructing PurFileSystem with a RepositoryAccess whose getPur() returns null - e.g. PUR connection not established, missing repository configuration, or failed login before VFS setup.
Common situations: Missing/incorrect repository connection settings in kettle.properties or VFS options; repository plugin not initialized; local server (jackrabbit) not started when isRemote() is false; DI server unavailable for remote clients.
Understand the failure class
Background: "not installed", "pip install", "required for": how missing-dependency errors surface across open-source libraries — this error's family across 34 libraries.
Related errors
- Error initialize repo:// VFS
- Append file in repository is not possible
- ConnectionFileProvider.FailedLoadConnectionManager
- Failed to initialize connection variables
- Invalid repository type
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/1ec10c5e3cf78dce.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/repo-vfs/repo-vfs-pur/src/main/java/org/pentaho/di/plugins/repofvs/pur/vfs/PurFileSystem.java:46
import org.apache.commons.vfs2.provider.AbstractFileSystem;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PurFileSystem extends AbstractFileSystem {
private static final Logger log = LoggerFactory.getLogger( PurFileSystem.class );
private final IUnifiedRepository repo;
private final IRepositoryContentConverterHandler contentHandler;
private final Optional<OutputConverter> outputConverter;
PurFileSystem( FileName rootName, FileSystemOptions fileSystemOptions, RepositoryAccess repoAccess ) throws FileSystemException {
super( rootName, null, fileSystemOptions );
this.repo = repoAccess.getPur();
this.contentHandler = repoAccess.getContentHandler();
this.outputConverter = repoAccess.getOutputConverter();
if ( this.repo == null ) {
throw new FileSystemException( "Unable to obtain a IUnifiedRepository instance" );
}
log.debug( "Unified repository VFS created ({})", new PurFileSystemConfig( fileSystemOptions ).isRemote() ?
"remote client" : "local server" );
}
@Override
protected void addCapabilities( Collection<Capability> caps ) {
caps.addAll( PurProvider.capabilities );
}
@Override
protected PurFileObject createFile( AbstractFileName name ) throws Exception {
log.debug( "FS.createFile: {}", name );
String path = name.getPath();
RepositoryFile repoFile = repo.getFile( path );
if ( repoFile == null ) {
repoFile = new RepositoryFile.Builder( name.getBaseName() ).path( path ).build();
}View on GitHub (pinned to f3058517a1)