pentaho/pentaho-kettle · error · IllegalStateException
Repository does not support revisions
Error message
Repository does not support revisions
What it means
RevisionController.sourceToTarget throws this IllegalStateException when the currently connected repository does not implement IRevisionObject, meaning the repository backend has no revision/version history support. The controller checks `instanceof IRevisionObject` after connecting and refuses to build the revisions UI panel for repositories lacking it. This bubbles to the UI as a RuntimeException.
Solutions
- Connect to a Pentaho Enterprise Repository (Pur) that supports revision history via IRevisionObject.
- Enable revision support on the repository server if using a Pentaho EE install where it was disabled.
- Avoid opening the Revisions panel when the repository lacks revision support; hide the revision UI for unsupported repositories.
- Catch the RuntimeException in the UI layer and show a friendly 'revisions not supported' message instead of a stack trace.
Example fix
// before
revisions = ((IRevisionObject) rc).getRevisions();
// after
if ( rc instanceof IRevisionObject ) {
revisions = ( (IRevisionObject) rc ).getRevisions();
} else {
// hide revision UI instead of throwing
revisionActive = false;
} Defensive patterns
Strategy: type-guard
Validate before calling
boolean revisionsSupported = repository != null && repository.getService() != null && repository.getService().getObject() instanceof IRevisionObject;
Type guard
boolean supportsRevisions(Object rc) { return rc instanceof IRevisionObject; } Try / catch
try { controller.sourceToTarget(); } catch (RuntimeException e) { if (e.getCause() instanceof KettleException) { showNotSupportedMessage(); } else { throw e; } } Prevention
- Only expose the Revisions panel for Pentaho Enterprise repositories.
- Check IRevisionObject support before binding the revisions controller.
- Feature-detect repository capabilities at connect time and store them in the main controller.
When it happens
Trigger: Calling sourceToTarget (the UI browser controller's repository-change callback) while connected to a repository whose IRepositoryService/repo does not implement IRevisionObject — e.g. a standard Kettle file or database repository instead of an Enterprise (Pur) repository.
Common situations: Opening the revisions view of Spoon against a non-Enterprise repository; connecting to a repository type without versioning enabled; repositories migrated or downgraded from Pentaho Enterprise to community editions.
Understand the failure class
Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.
Related errors
- GetRepositoryNames.Exception.NotConnectedToRepository
- SimpleMappingDialog.Exception.UnableToFindRepositoryDirector…
- SimpleMappingDialog.Exception.NotConnectedToRepository.Messa…
- SimpleMappingDialog.Exception.NoValidMappingDetailsFound
- SingleThreaderDialog.Exception.UnableToFindRepositoryDirecto…
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/ad84aec2a65c5b82.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/pur/core/src/main/java/org/pentaho/di/ui/repository/pur/repositoryexplorer/controller/RevisionController.java:187
UIRepositoryObjectRevisions revisions = null;
try {
UIRepositoryContent rc = (UIRepositoryContent) ro.get( 0 );
if ( rc instanceof IRevisionObject ) {
Boolean versioningEnabled = ( (IRevisionObject) rc ).getVersioningEnabled();
// Show/hide the Verison History tab
historyTab.setVisible( versioningEnabled );
if ( !versioningEnabled ) {
return new UIRepositoryObjectRevisions();
}
Boolean versionCommentEnabled = ( (IRevisionObject) rc ).getVersionCommentEnabled();
// Show/Hide the version comment column
setRevisionTableColumns( versionCommentEnabled );
revisions = ( (IRevisionObject) rc ).getRevisions();
} else {
throw new IllegalStateException( BaseMessages.getString( PKG,
"RevisionsController.RevisionsNotSupported" ) ); //$NON-NLS-1$
}
} catch ( KettleException e ) {
if ( mainController == null || !mainController.handleLostRepository( e ) ) {
// convert to runtime exception so it bubbles up through the UI
throw new RuntimeException( e );
}
}
return revisions;
}
@Override
public List<UIRepositoryObject> targetToSource( UIRepositoryObjectRevisions elements ) {
return null;
}
} );
View on GitHub (pinned to f3058517a1)