pentaho/pentaho-kettle · error · KettleException

Unknown RepositoryObjectType. Should be TRANSFORMATION or…

Error message

Unknown RepositoryObjectType. Should be TRANSFORMATION or JOB 

What it means

Pentaho's PUR repository can only persist objects it recognizes as a transformation or a job. When saveRepositoryObject is called with a RepositoryObjectType outside {TRANSFORMATION, JOB}, the switch has no transformer delegate to serialize the element, so a generic KettleException is thrown. This is an internal invariant/unsupported element type guard.

Solutions

  1. Only pass JobMeta or TransMeta objects (repository type TRANSFORMATION or JOB) to PurRepository.save
  2. Check element.getRepositoryElementType() before calling save and route unsupported types to a different storage path
  3. If you need a new object type supported, extend the switch to add a transformer delegate for it in PurRepository

Example fix

// before
repository.save(unsupportedElement, "v1", null, true);
// after
if (RepositoryObjectType.TRANSFORMATION.equals(el.getRepositoryElementType())
    || RepositoryObjectType.JOB.equals(el.getRepositoryElementType())) {
  repository.save(el, "v1", null, true);
} else {
  throw new KettleException("Element type not supported for PUR save: " + el.getRepositoryElementType());
}
Defensive patterns

Strategy: validation

Validate before calling

RepositoryObjectType t = element.getRepositoryElementType();
if (!RepositoryObjectType.TRANSFORMATION.equals(t) && !RepositoryObjectType.JOB.equals(t)) {
  throw new KettleException("Unsupported repository element type: " + t);
}

Type guard

boolean isTransOrJob(RepositoryElementInterface el) {
  RepositoryObjectType t = el.getRepositoryElementType();
  return RepositoryObjectType.TRANSFORMATION.equals(t) || RepositoryObjectType.JOB.equals(t);
}

Prevention

When it happens

Trigger: Calling PurRepository.save(...) with an ETL element whose getRepositoryElementType() returns something other than RepositoryObjectType.TRANSFORMATION or JOB (e.g. a new plugin-defined repository element type, or a corrupted/unset type).

Common situations: Custom repository plugins or third-party code saving unsupported element types through the PUR repository; upgrading/adding new repository object kinds that PUR's save path was never extended to handle; metadata elements erroneously routed into the trans/job save switch.

Understand the failure class

Background: Invalid enum value errors: "Unknown type", "Invalid scope", "must be one of" — when a string is not on the library's allowed list — this error's family across 23 libraries.

Related errors


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

Appendix: source

Thrown at plugins/pur/core/src/main/java/org/pentaho/di/repository/pur/PurRepository.java:3427

   * @throws KettleException
   *           if any of aforementioned conditions is {@code true}
   */
  protected void saveKettleEntity( RepositoryElementInterface element,
                                   String versionComment, Calendar versionDate,
                                   boolean saveSharedObjects,
                                   boolean checkLock, boolean checkRename,
                                   boolean loadRevision, boolean checkDeleted )
    throws KettleException {
    ISharedObjectsTransformer objectTransformer;
    switch ( element.getRepositoryElementType() ) {
      case TRANSFORMATION:
        objectTransformer = transDelegate;
        break;
      case JOB:
        objectTransformer = jobDelegate;
        break;
      default:
        throw new KettleException(
          "Unknown RepositoryObjectType. Should be TRANSFORMATION or JOB " );
    }
    saveTransOrJob( objectTransformer, element, versionComment, versionDate, saveSharedObjects, checkLock, checkRename,
      loadRevision, checkDeleted );
  }

  protected void saveTransOrJob( ISharedObjectsTransformer objectTransformer, RepositoryElementInterface element,
                                 String versionComment, Calendar versionDate,
                                 boolean saveSharedObjects,
                                 boolean checkLock, boolean checkRename,
                                 boolean loadRevision, boolean checkDeleted ) throws KettleException {
    if ( Import.ROOT_DIRECTORY.equals( element.getRepositoryDirectory().toString() ) ) {
      // We don't have possibility to read this file via UI
      throw new KettleException( BaseMessages.getString( PKG, "PurRepository.fileCannotBeSavedInRootDirectory",
        element.getName() + element.getRepositoryElementType().getExtension() ) );
    }

    ExtensionPointHandler.callExtensionPoint( log, KettleExtensionPoint.BeforeSaveToRepository.id, element );

View on GitHub (pinned to f3058517a1)