pentaho/pentaho-kettle · error · KettleException

SingleThreaderDialog.Exception.NoValidMappingDetailsFound

Error message

SingleThreaderDialog.Exception.NoValidMappingDetailsFound

What it means

SingleThreaderDialog.loadTransformation splits a repository transformation path into directory and transformation name. If either part is empty after parsing (path missing a '/' or blank), it throws this KettleException keyed to SingleThreaderDialog.Exception.NoValidMappingDetailsFound, because the Single Threader's sub-transformation reference cannot be resolved.

Solutions

  1. Enter the full repository path of the sub-transformation (e.g. /public/flows/sub-trans)
  2. Reopen the Single Threader dialog and reselect the mapping transformation
  3. Verify the referenced transformation still exists at the saved path
  4. If using a file, ensure the file radio is selected with a valid filename instead of repository-by-name

Example fix

// before
String transPath = "sub-trans"; // no directory -> exception
// after
String transPath = "/public/flows/sub-trans";
Defensive patterns

Strategy: validation

Validate before calling

// Java: validate sub-transformation path before loading
int idx = transPath.lastIndexOf( '/' );
boolean valid = idx > 0 && !transPath.substring( 0, idx ).isEmpty() && !transPath.substring( idx + 1 ).isEmpty();

Type guard

boolean isFullRepoPath = transPath != null && transPath.contains( "/" ) && transPath.lastIndexOf( '/' ) < transPath.length() - 1;

Try / catch

try { loadTransformation( transPath ); } catch ( KettleException e ) { promptUserToReselectSubTransformation(); }

Prevention

When it happens

Trigger: Loading the Single Threader mapping transformation by name from a repository when the stored path string has no '/' separator (index == -1) or is empty, leaving realDirectory/realTransname empty.

Common situations: Single Threader configured with a transformation name only, not a repository path; references broken by copy/paste of transformations between repositories; manually edited transformation XML with an incomplete path.

Understand the failure class

Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.

Related errors


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

Appendix: source

Thrown at ui/src/main/java/org/pentaho/di/ui/trans/steps/singlethreader/SingleThreaderDialog.java:544

      case REPOSITORY_BY_NAME:
        if ( Utils.isEmpty( filename ) ) {
          return;
        }
        if ( filename.endsWith( ".ktr" ) ) {
          filename = filename.replace( ".ktr", "" );
          wPath.setText( filename );
        }
        String transPath = transMeta.environmentSubstitute( filename );
        String realTransname = transPath;
        String realDirectory = "";
        int index = transPath.lastIndexOf( "/" );
        if ( index != -1 ) {
          realTransname = transPath.substring( index + 1 );
          realDirectory = transPath.substring( 0, index );
        }

        if ( Utils.isEmpty( realDirectory ) || Utils.isEmpty( realTransname ) ) {
          throw new KettleException(
            BaseMessages.getString( PKG, "SingleThreaderDialog.Exception.NoValidMappingDetailsFound" ) );
        }
        RepositoryDirectoryInterface repdir = repository.findDirectory( realDirectory );
        if ( repdir == null ) {
          throw new KettleException( BaseMessages.getString(
            PKG, "SingleThreaderDialog.Exception.UnableToFindRepositoryDirectory)" ) );
        }
        loadRepositoryTrans( realTransname, repdir );
        break;
      case REPOSITORY_BY_REFERENCE:
        mappingTransMeta = repository.loadTransformation( referenceObjectId, null ); // load the last version
        mappingTransMeta.clearChanged();
        break;
      default:
        break;
    }

    wInjectStep.setText( getInjectorStep( mappingTransMeta ) );

View on GitHub (pinned to f3058517a1)