{"record":{"id":"4944bcf957d139b9","repo":"pentaho/pentaho-kettle","slug":"unknown-repositoryobjecttype-should-be-transformation-or-job","errorCode":null,"errorMessage":"Unknown RepositoryObjectType. Should be TRANSFORMATION or JOB ","messagePattern":"Unknown RepositoryObjectType\\. Should be TRANSFORMATION or JOB ","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"plugins/pur/core/src/main/java/org/pentaho/di/repository/pur/PurRepository.java","lineNumber":3427,"sourceCode":"   * @throws KettleException\n   *           if any of aforementioned conditions is {@code true}\n   */\n  protected void saveKettleEntity( RepositoryElementInterface element,\n                                   String versionComment, Calendar versionDate,\n                                   boolean saveSharedObjects,\n                                   boolean checkLock, boolean checkRename,\n                                   boolean loadRevision, boolean checkDeleted )\n    throws KettleException {\n    ISharedObjectsTransformer objectTransformer;\n    switch ( element.getRepositoryElementType() ) {\n      case TRANSFORMATION:\n        objectTransformer = transDelegate;\n        break;\n      case JOB:\n        objectTransformer = jobDelegate;\n        break;\n      default:\n        throw new KettleException(\n          \"Unknown RepositoryObjectType. Should be TRANSFORMATION or JOB \" );\n    }\n    saveTransOrJob( objectTransformer, element, versionComment, versionDate, saveSharedObjects, checkLock, checkRename,\n      loadRevision, checkDeleted );\n  }\n\n  protected void saveTransOrJob( ISharedObjectsTransformer objectTransformer, RepositoryElementInterface element,\n                                 String versionComment, Calendar versionDate,\n                                 boolean saveSharedObjects,\n                                 boolean checkLock, boolean checkRename,\n                                 boolean loadRevision, boolean checkDeleted ) throws KettleException {\n    if ( Import.ROOT_DIRECTORY.equals( element.getRepositoryDirectory().toString() ) ) {\n      // We don't have possibility to read this file via UI\n      throw new KettleException( BaseMessages.getString( PKG, \"PurRepository.fileCannotBeSavedInRootDirectory\",\n        element.getName() + element.getRepositoryElementType().getExtension() ) );\n    }\n\n    ExtensionPointHandler.callExtensionPoint( log, KettleExtensionPoint.BeforeSaveToRepository.id, element );","sourceCodeStart":3409,"sourceCodeEnd":3445,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/pur/core/src/main/java/org/pentaho/di/repository/pur/PurRepository.java#L3409-L3445","documentation":"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.","triggerScenarios":"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).","commonSituations":"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.","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"],"exampleFix":"// before\nrepository.save(unsupportedElement, \"v1\", null, true);\n// after\nif (RepositoryObjectType.TRANSFORMATION.equals(el.getRepositoryElementType())\n    || RepositoryObjectType.JOB.equals(el.getRepositoryElementType())) {\n  repository.save(el, \"v1\", null, true);\n} else {\n  throw new KettleException(\"Element type not supported for PUR save: \" + el.getRepositoryElementType());\n}","handlingStrategy":"validation","validationCode":"RepositoryObjectType t = element.getRepositoryElementType();\nif (!RepositoryObjectType.TRANSFORMATION.equals(t) && !RepositoryObjectType.JOB.equals(t)) {\n  throw new KettleException(\"Unsupported repository element type: \" + t);\n}","typeGuard":"boolean isTransOrJob(RepositoryElementInterface el) {\n  RepositoryObjectType t = el.getRepositoryElementType();\n  return RepositoryObjectType.TRANSFORMATION.equals(t) || RepositoryObjectType.JOB.equals(t);\n}","tryCatchPattern":null,"preventionTips":["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"],"tags":["kettle","pentaho","repository","unsupported-element-type"],"backgroundTag":"invalid-enum-value","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"}