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

  1. Connect to a Pentaho Enterprise Repository (Pur) that supports revision history via IRevisionObject.
  2. Enable revision support on the repository server if using a Pentaho EE install where it was disabled.
  3. Avoid opening the Revisions panel when the repository lacks revision support; hide the revision UI for unsupported repositories.
  4. 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

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


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)