pentaho/pentaho-kettle · error · KettleException

RepositoryLogin.ErrorLoginToRepository

Error message

RepositoryLogin.ErrorLoginToRepository

What it means

loginToRepository() only performs repository.init/repository.connect when a repositoryMeta and repository are available; otherwise it logs and throws KettleException 'RepositoryLogin.ErrorLoginToRepository'. The else-branch means the login was attempted without a resolved repository object, so no connection could even be tried.

Solutions

  1. Ensure a repository is selected and RepositoriesHelper.getRepository()/repositoryMeta is non-null before calling loginToRepository().
  2. Call fillRepositories()/resolveRepositoryMeta first so the repository object is constructed.
  3. If connect() itself fails, check the repository server/DB is reachable and credentials are correct — this error means no repository object existed, not bad credentials.

Example fix

// before
helper.loginToRepository( model );
// after
if ( helper.getRepository() == null || model.getSelectedRepositoryMeta() == null ) {
  showErrorDialog( "Select a repository before logging in" );
  return;
}
helper.loginToRepository( model );
Defensive patterns

Strategy: validation

Validate before calling

if ( model.getSelectedRepository() == null ) {
  throw new IllegalStateException( "No repository selected before login" );
}
if ( helper.getRepository() == null ) {
  helper.fillRepositories(); // resolve repositoryMeta and construct the Repository object first
}

Try / catch

try {
  helper.loginToRepository( model );
} catch ( KettleException e ) {
  if ( e.getMessage().contains( "ErrorLoginToRepository" ) ) {
    showError( "No repository was resolved for login. Select a repository first." );
  } else {
    throw e;
  }
}

Prevention

When it happens

Trigger: Calling loginToRepository() when the selected repository metadata was never resolved into a Repository object (e.g. getRepository() returned null because repositoryMeta was null or the connect branch was not entered).

Common situations: User clicks login before a repository is selected; repositories.xml missing the selected entry so repositoryMeta is null; plugin lookup failed earlier leaving repository unset; race between dialog fill and login button.

Understand the failure class

Background: "X is required", "must be set", "cannot be empty": the missing-required-config error family, from Vertex AI project/location to WeChat keys — this error's family across 18 libraries.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/7ad4960f03aa6f14. Report an issue: GitHub.

Appendix: source

Thrown at ui/src/main/java/org/pentaho/di/ui/repository/RepositoriesHelper.java:266

  public void setPreferredRepositoryName( String repname ) {
    prefRepositoryName = repname;
  }

  public void loginToRepository() throws KettleException, KettleSecurityException {
    if ( model != null && model.getSelectedRepository() != null ) {
      RepositoryMeta repositoryMeta =
        input.getRepository( model.getRepositoryIndex( model.getSelectedRepository() ) );
      repository =
        PluginRegistry.getInstance().loadClass(
          RepositoryPluginType.class, repositoryMeta.getId(), Repository.class );
      repository.init( repositoryMeta );
      repository.connect( model.getUsername(), model.getPassword() );
      props.setLastRepository( repositoryMeta.getName() );
      props.setLastRepositoryLogin( model.getUsername() );
    } else {
      log.logDetailed( BaseMessages.getString( PKG, "RepositoryLogin.ErrorLoginToRepository" ) );
      throw new KettleException( BaseMessages.getString( PKG, "RepositoryLogin.ErrorLoginToRepository" ) );
    }
  }

  public void updateShowDialogOnStartup( boolean value ) {
    props.setRepositoriesDialogAtStartupShown( value );
  }

  private void writeData() {
    try {
      input.writeData();
    } catch ( Exception e ) {
      log.logDetailed( BaseMessages.getString( PKG, "RepositoryLogin.ErrorSavingRepositoryDefinition", e
        .getLocalizedMessage() ) );
      new ErrorDialog( shell, BaseMessages.getString( PKG, "Dialog.Error" ), BaseMessages.getString(
        PKG, "RepositoryLogin.ErrorSavingRepositoryDefinition", e.getLocalizedMessage() ), e );
    }
  }
}

View on GitHub (pinned to f3058517a1)