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
- Only pass JobMeta or TransMeta objects (repository type TRANSFORMATION or JOB) to PurRepository.save
- Check element.getRepositoryElementType() before calling save and route unsupported types to a different storage path
- 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
- Only pass TransMeta/JobMeta instances to PurRepository.save
- Check repository element type before any save/rename call
- Treat PUR as trans/job storage only; use other stores for other element types
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
- AbsSecurityProvider.ERROR_0002_UNABLE_TO_ACCESS_IS_ALLOWED
- AddSequenceMeta.Exception.UnableToReadStepInfo
- AddSequenceMeta.Exception.UnableToSaveStepInfo
- Error loading job details
- File is currently locked by another user for editing
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)