pentaho/pentaho-kettle · error · KettleException
Unable to get object information for object with id=" +…
Error message
Unable to get object information for object with id=" + objectId
What it means
PurRepository throws ERROR_0005_INCORRECT_PERMISSION when the current user lacks the permissions the repository requires for an operation. It builds a localized KettleSecurityException listing the missing permissions in a [perm1, perm2] format.
Solutions
- Grant the missing permissions to the user/role in the Pentaho Administration perspective
- Log in as a user with the required role (e.g. Administrator) for the operation
- Check the object's and parent folder's ACLs (repository.getPermissionsAcl) and adjust
- Confirm you are connected to the intended repository/security tenant
Example fix
// before
repo.save(jobMeta, "v1"); // throws KettleSecurityException ERROR_0005
// after
if (repo.getSecurityUser() != null && hasWriteAccess(repo, jobMeta.getRepositoryDirectory())) {
repo.save(jobMeta, "v1");
} else {
throw new KettleSecurityException("User lacks WRITE permission on " + jobMeta.getRepositoryDirectory().getPath());
} Defensive patterns
Strategy: try-catch
Validate before calling
if (objectId == null || objectId.getId() == null) {
throw new IllegalArgumentException("objectId required");
}
if (!repo.isConnected()) repo.connect("user", "pass"); Type guard
boolean isResolvableId(ObjectId id) {
return id != null && id.getId() != null && !id.getId().isEmpty();
} Try / catch
try {
RepositoryObject info = repo.getObjectInformation(id, null);
} catch (KettleException e) {
if (!repo.exists(id)) {
// stale id — re-resolve from path
} else {
throw e; // permission or connectivity issue
}
} Prevention
- Verify ids exist before metadata lookups
- Refresh stale ids after external deletions
- Check ACL read permissions for the user
- Reconnect on suspected connection drops
When it happens
Trigger: Calling repository operations (e.g. save, delete, create) when the authenticated Pentaho user's effective ACL on the target folder/file lacks required permissions such as READ, WRITE, DELETE, or ADMINISTER.
Common situations: User account not granted the right Pentaho security role; object owner changed; repository permissions tightened after an upgrade; trying to write into a read-only shared folder.
Understand the failure class
Background: "You do not have permission" / 403 Forbidden errors: authenticated but not allowed — causes and fixes across open-source libraries — this error's family across 31 libraries.
Related errors
- ERROR_0014_INSUFFICIENT_PRIVILEGES
- AbsSecurityProvider.ERROR_0003_UNABLE_TO_ACCESS_GET_ALLOWED_ACTIONS
- MODIFY_TRANSFORMATION : repository is read-only
- PropertyOutput.Log.CanNotCreateParentFolder
- Repository does not support access control
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/fdf2c0a0ad991162.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/pur/core/src/main/java/org/pentaho/di/repository/pur/PurRepository.java:3168
repositoryFileAcl = pur.getAcl( repositoryFile.getId() );
} finally {
readWriteLock.readLock().unlock();
}
String parentPath = getParentPath( repositoryFile.getPath() );
String name = repositoryFile.getTitle();
String description = repositoryFile.getDescription();
Date modifiedDate = repositoryFile.getLastModifiedDate();
// String creatorId = repositoryFile.getCreatorId();
String ownerName = repositoryFileAcl != null ? repositoryFileAcl.getOwner().getName() : "";
boolean deleted = isDeleted( repositoryFile );
RepositoryDirectoryInterface directory = findDirectory( parentPath );
return new RepositoryObject( objectId, name, directory, ownerName, modifiedDate, objectType, description,
deleted );
} catch ( Exception e ) {
throw new KettleException( "Unable to get object information for object with id=" + objectId, e );
}
}
@Override
public RepositoryDirectoryInterface findDirectory( String directory ) throws KettleException {
RepositoryDirectoryInterface repositoryDirectoryInterface = null;
// check if we have a rootRef cached
boolean usingRootDirCache = rootRef.getRef() != null;
repositoryDirectoryInterface = getRootDir().findDirectory( directory );
// if we are using a cached version of the repository interface, allow a reload if we do not find
if ( repositoryDirectoryInterface == null && usingRootDirCache ) {
repositoryDirectoryInterface = loadRepositoryDirectoryTree().findDirectory( directory );
}
return repositoryDirectoryInterface;
}
@Override
public RepositoryDirectoryInterface findDirectory( ObjectId directory ) throws KettleException {View on GitHub (pinned to f3058517a1)