{"record":{"id":"7ad4960f03aa6f14","repo":"pentaho/pentaho-kettle","slug":"repositorylogin-errorlogintorepository","errorCode":null,"errorMessage":"RepositoryLogin.ErrorLoginToRepository","messagePattern":"RepositoryLogin\\.ErrorLoginToRepository","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"ui/src/main/java/org/pentaho/di/ui/repository/RepositoriesHelper.java","lineNumber":266,"sourceCode":"\n  public void setPreferredRepositoryName( String repname ) {\n    prefRepositoryName = repname;\n  }\n\n  public void loginToRepository() throws KettleException, KettleSecurityException {\n    if ( model != null && model.getSelectedRepository() != null ) {\n      RepositoryMeta repositoryMeta =\n        input.getRepository( model.getRepositoryIndex( model.getSelectedRepository() ) );\n      repository =\n        PluginRegistry.getInstance().loadClass(\n          RepositoryPluginType.class, repositoryMeta.getId(), Repository.class );\n      repository.init( repositoryMeta );\n      repository.connect( model.getUsername(), model.getPassword() );\n      props.setLastRepository( repositoryMeta.getName() );\n      props.setLastRepositoryLogin( model.getUsername() );\n    } else {\n      log.logDetailed( BaseMessages.getString( PKG, \"RepositoryLogin.ErrorLoginToRepository\" ) );\n      throw new KettleException( BaseMessages.getString( PKG, \"RepositoryLogin.ErrorLoginToRepository\" ) );\n    }\n  }\n\n  public void updateShowDialogOnStartup( boolean value ) {\n    props.setRepositoriesDialogAtStartupShown( value );\n  }\n\n  private void writeData() {\n    try {\n      input.writeData();\n    } catch ( Exception e ) {\n      log.logDetailed( BaseMessages.getString( PKG, \"RepositoryLogin.ErrorSavingRepositoryDefinition\", e\n        .getLocalizedMessage() ) );\n      new ErrorDialog( shell, BaseMessages.getString( PKG, \"Dialog.Error\" ), BaseMessages.getString(\n        PKG, \"RepositoryLogin.ErrorSavingRepositoryDefinition\", e.getLocalizedMessage() ), e );\n    }\n  }\n}","sourceCodeStart":248,"sourceCodeEnd":284,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/ui/src/main/java/org/pentaho/di/ui/repository/RepositoriesHelper.java#L248-L284","documentation":"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.","triggerScenarios":"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).","commonSituations":"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.","solutions":["Ensure a repository is selected and RepositoriesHelper.getRepository()/repositoryMeta is non-null before calling loginToRepository().","Call fillRepositories()/resolveRepositoryMeta first so the repository object is constructed.","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."],"exampleFix":"// before\nhelper.loginToRepository( model );\n// after\nif ( helper.getRepository() == null || model.getSelectedRepositoryMeta() == null ) {\n  showErrorDialog( \"Select a repository before logging in\" );\n  return;\n}\nhelper.loginToRepository( model );","handlingStrategy":"validation","validationCode":"if ( model.getSelectedRepository() == null ) {\n  throw new IllegalStateException( \"No repository selected before login\" );\n}\nif ( helper.getRepository() == null ) {\n  helper.fillRepositories(); // resolve repositoryMeta and construct the Repository object first\n}","typeGuard":null,"tryCatchPattern":"try {\n  helper.loginToRepository( model );\n} catch ( KettleException e ) {\n  if ( e.getMessage().contains( \"ErrorLoginToRepository\" ) ) {\n    showError( \"No repository was resolved for login. Select a repository first.\" );\n  } else {\n    throw e;\n  }\n}","preventionTips":["Disable the login button until a repository row is selected in the repositories list.","Call fillRepositories() before loginToRepository() so repositoryMeta/repository are populated.","Validate repositories.xml content at startup; drop entries that cannot be resolved.","Distinguish 'no repository object' from 'wrong credentials' in error handling."],"tags":["kettle","repository","login","null-state"],"backgroundTag":"missing-required-config","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}