pentaho/pentaho-kettle · error · KettleException

Unable to load transformation from path [" + absPath + "]

Error message

Unable to load transformation from path [" + absPath + "]

What it means

Generic catch-all wrapper in PurRepository.loadTransformationByPath: any Exception that is not already a KettleException while loading a transformation from a path is re-thrown as a KettleException with this message and the original cause attached. It indicates the load pipeline (path lookup, file read at version, or TransMeta build) failed unexpectedly.

Solutions

  1. Inspect the cause via getCausingExceptions()/e.getCause() to find the real failure
  2. Verify the repository connection is alive and re-login if needed
  3. Test loading the transformation from Pentaho Spoon to check for corrupt content
  4. Disable or fix any TransformationMetaLoaded extension-point plugins

Example fix

// before
} catch ( Exception e ) {
  throw new KettleException( "Unable to load transformation from path [" + absPath + "]", e );
}
// after
} catch ( Exception e ) {
  LOG.error("Load failed for " + absPath + ", cause: " + e.getCause(), e);
  throw new KettleException( "Unable to load transformation from path [" + absPath + "]", e );
}
Defensive patterns

Strategy: try-catch

Validate before calling

if (!repo.isConnected()) repo.connect("user", "pass");
if (!repo.exists(path, RepositoryObjectType.TRANSFORMATION)) {
  throw new KettleException("Missing: " + path);
}

Try / catch

try {
  return repo.loadTransformation(path, null);
} catch (KettleException e) {
  Throwable cause = e.getCause();
  log.error("Transformation load failed for " + path + ": " + cause, e);
  throw new KettleException("Check cause for real failure", e);
}

Prevention

When it happens

Trigger: Any non-KettleException inside loadTransformation(String,...) — e.g. repository connection failure, getDataAtVersionForRead IO error, or exception thrown by the TransformationMetaLoaded extension point.

Common situations: Network outage to the BI server mid-load; corrupt transformation XML in the repository; an ExtensionPoint plugin (TransformationMetaLoaded) throwing; permission-related remote errors surfaced as generic exceptions.

Understand the failure class

Background: "failed to read file", EACCES, ENOENT and "could not read <path>" errors: when a program can't read a file from disk — this error's family across 49 libraries.

Related errors


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

Appendix: source

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

        if ( file == null ) {
          throw new KettleException( BaseMessages.getString( PKG,
            "PurRepository.ERROR_0008_TRANSFORMATION_PATH_INVALID", absPath ) );
        }

        data = pur.getDataAtVersionForRead( file.getId(), versionId, NodeRepositoryFileData.class );
      } finally {
        readWriteLock.readLock().unlock();
      }

      revision = getObjectRevision( new StringObjectId( file.getId().toString() ), versionId );
      TransMeta transMeta = buildTransMeta( bowl, file, parentDir, data, revision, parent );
      ExtensionPointHandler.callExtensionPoint( log, KettleExtensionPoint.TransformationMetaLoaded.id, transMeta );
      return transMeta;
    } catch ( final KettleException ke ) {
      // if we have a KettleException, simply re-throw it
      throw ke;
    } catch ( Exception e ) {
      throw new KettleException( "Unable to load transformation from path [" + absPath + "]", e );
    }
  }

  private TransMeta buildTransMeta( final Bowl bowl, final RepositoryFile file, 
                                    final RepositoryDirectoryInterface parentDir,
                                    final NodeRepositoryFileData data, final ObjectRevision revision,
                                    final VariableSpace parent )
    throws KettleException {
    TransMeta transMeta = new TransMeta( bowl, this, parent );
    transMeta.setName( file.getTitle() );
    transMeta.setFilename( file.getPath() );
    transMeta.setDescription( file.getDescription() );
    transMeta.setObjectId( new StringObjectId( file.getId().toString() ) );
    transMeta.setObjectRevision( revision );
    transMeta.setRepositoryDirectory( parentDir );
    transMeta.setMetaStore( MetaStoreConst.getDefaultMetastore() );
    ExtensionPointHandler.callExtensionPoint( log, KettleExtensionPoint.TransSharedObjectsLoaded.id, transMeta );
    transDelegate.dataNodeToElement( data.getNode(), transMeta );

View on GitHub (pinned to f3058517a1)