pentaho/pentaho-kettle · error · UnsupportedOperationException
Cannot assemble shared object of type
Error message
Cannot assemble shared object of type [%s]
What it means
During shared object loading, PurRepository looks up a SharedObjectAssembler for each repository object type found (e.g. DATABASE, TRANSFORMATION). If a file of a type with no registered assembler is present, an UnsupportedOperationException with this message is thrown.
Solutions
- Upgrade the PDI/pur plugin to a version that supports all object types present in the repository.
- Identify the offending type from the message and remove/move those files from the shared objects area.
- Register a custom SharedObjectAssembler for the type if you own the extension.
- Pin client and server to matching versions.
Example fix
// before // older client hits unknown type and throws // after // upgrade client <dependency> <groupId>org.pentaho.di</groupId> <artifactId>pdi-core</artifactId> <version>9.3.0.0-428</version> <!-- match server version --> </dependency>
Defensive patterns
Strategy: try-catch
Validate before calling
// keep client and server versions aligned; check known types before load Set<RepositoryObjectType> supported = sharedObjectAssemblerMap.keySet(); // ensure repository only contains types in `supported`
Type guard
boolean assemblable = t -> sharedObjectAssemblerMap.containsKey(t);
Try / catch
try { readSharedObjects(); } catch (UnsupportedOperationException e) { log.error("unknown shared type", e); } Prevention
- Match PDI client version with Pentaho server/repository version.
- Avoid manually injecting unknown file types into shared folders.
- Filter unsupported types before calling shared object loading.
- Keep the pur plugin updated.
When it happens
Trigger: The repository contains files of a RepositoryObjectType that this PDI version does not know how to assemble (e.g. newer repository content read by an older client, or unsupported types like RDBMS-partitioned metadata in the shared folder).
Common situations: Version mismatch between PDI client and Pentaho Server/repository content; custom or new object types added server-side.
Understand the failure class
Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.
Related errors
- It's not possible to save Class [" +…
- AbsSecurityProvider.ERROR_0002_UNABLE_TO_ACCESS_IS_ALLOWED
- AccessInputMeta.Exception.ErrorReadingRepository
- AddSequenceMeta.Exception.UnableToReadStepInfo
- AddSequenceMeta.Exception.UnableToSaveStepInfo
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/11d4249b2047a3e2.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/pur/core/src/main/java/org/pentaho/di/repository/pur/PurRepository.java:1411
// Since type is not preserved in the RepositoryFile we fetch files by type so we don't rely on parsing the name to
// determine type afterward
// Map must be ordered or we can't match up files with data and version summary
LinkedHashMap<RepositoryObjectType, List<RepositoryFile>> filesByType = getFilesByType( allFiles, types );
readWriteLock.readLock().lock();
try {
List<NodeRepositoryFileData> data;
List<VersionSummary> versions;
data = pur.getDataForReadInBatch( allFiles, NodeRepositoryFileData.class );
versions = pur.getVersionSummaryInBatch( allFiles );
Iterator<NodeRepositoryFileData> dataIter = data.iterator();
Iterator<VersionSummary> versionsIter = versions.iterator();
// Assemble into completely loaded SharedObjectInterfaces by type
for ( Entry<RepositoryObjectType, List<RepositoryFile>> entry : filesByType.entrySet() ) {
SharedObjectAssembler<?> assembler = sharedObjectAssemblerMap.get( entry.getKey() );
if ( assembler == null ) {
throw new UnsupportedOperationException(
String.format( "Cannot assemble shared object of type [%s]", entry.getKey() ) ); //$NON-NLS-1$
}
// For all files of this type, assemble them from the pieces of data pulled from the repository
Iterator<RepositoryFile> filesIter = entry.getValue().iterator();
List<SharedObjectInterface<?>> sharedObjects = new ArrayList<>( entry.getValue().size() );
// Exceptions are thrown during lookup if data or versions aren't found so all the lists should be the same size
// (no need to check for next on all iterators)
while ( filesIter.hasNext() ) {
RepositoryFile file = filesIter.next();
NodeRepositoryFileData repoData = dataIter.next();
VersionSummary version = versionsIter.next();
// TODO: inexistent db types can cause exceptions assembling; prevent total failure
try {
sharedObjects.add( assembler.assemble( file, repoData, version ) );
} catch ( Exception ex ) {
// TODO i18n
getLog().logError( "Unable to load shared objects", ex );View on GitHub (pinned to f3058517a1)