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
- Inspect the cause via getCausingExceptions()/e.getCause() to find the real failure
- Verify the repository connection is alive and re-login if needed
- Test loading the transformation from Pentaho Spoon to check for corrupt content
- 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
- Check repository connectivity before bulk loads
- Log e.getCause() — the message alone hides the real failure
- Validate stored content by loading the file in Spoon if corruption is suspected
- Audit TransformationMetaLoaded extension-point plugins
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
- Unable to load transformation with id [" + idTransformation…
- The number of hops read
- The number of notes read
- TransLoadProgressDialog.Exception.ErrorLoadingTransformation
- TransSaveProgressDialog.Exception.ErrorSavingTransformation
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)