pentaho/pentaho-kettle · error · MetaStoreException

The shared objects metadata store doesn't support creating…

Error message

The shared objects metadata store doesn't support creating new element types

What it means

SharedObjectsMetaStore derives element types from fixed defaults (e.g. the database element type); users cannot register new element types, so createElementType() always throws MetaStoreException. The set of element types is fixed by what the shared-objects file can represent.

Solutions

  1. Do not create custom element types in the shared-objects metastore; use the built-in types returned by getElementTypes
  2. Switch to MemoryMetaStore, PentahoMetaStore, or a database metastore for custom types
  3. Restructure code to detect an unwritable metastore and skip type creation

Example fix

// before
metaStore.createElementType( ns, myType );
// after
if ( metaStore instanceof SharedObjectsMetaStore ) {
  throw new IllegalArgumentException( "Custom element types unsupported; use built-in types" );
}
metaStore.createElementType( ns, myType );
Defensive patterns

Strategy: validation

Validate before calling

boolean supportsCustomTypes = !( metaStore instanceof SharedObjectsMetaStore );
if ( !supportsCustomTypes ) {
  // verify the type already exists instead of creating it
  boolean exists = metaStore.getElementTypes( namespace ).stream()
    .anyMatch( t -> t.getName().equals( elementType.getName() ) );
}

Type guard

boolean isReadOnlyTypeStore = metaStore instanceof SharedObjectsMetaStore;

Try / catch

try {
  metaStore.createElementType( ns, type );
} catch ( MetaStoreException e ) {
  logger.warn( "Cannot create element type {} in this metastore; using built-in types", type.getName() );
}

Prevention

When it happens

Trigger: Any call to SharedObjectsMetaStore.createElementType(namespace, elementType), e.g. generic metastore provisioning of custom element types.

Common situations: Porting code that used MemoryMetaStore to define custom types (governance metadata, custom models) to the shared-objects metastore; plugins assuming a fully writable metastore.

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


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/shared/SharedObjectsMetaStore.java:101

      return databaseElementType;
    }
    return null;
  }

  @Override
  public IMetaStoreElementType getElementTypeByName( String namespace, String elementTypeName ) throws MetaStoreException {
    for ( IMetaStoreElementType elementType : getElementTypes( namespace ) ) {
      if ( elementType.getName() != null && elementType.getName().equalsIgnoreCase( elementTypeName ) ) {
        return elementType;
      }
    }
    return null;
  }

  @Override
  public void createElementType( String namespace, IMetaStoreElementType elementType ) throws MetaStoreException,
    MetaStoreElementTypeExistsException {
    throw new MetaStoreException( "The shared objects metadata store doesn't support creating new element types" );
  }

  @Override
  public void updateElementType( String namespace, IMetaStoreElementType elementType ) throws MetaStoreException {
    throw new MetaStoreException( "The shared objects metadata store doesn't support updating element types" );
  }

  @Override
  public void deleteElementType( String namespace, IMetaStoreElementType elementType ) throws MetaStoreException,
    MetaStoreDependenciesExistsException {
    throw new MetaStoreException( "The shared objects metadata store doesn't support deleting element types" );
  }

  @Override
  public List<IMetaStoreElement> getElements( String namespace, IMetaStoreElementType elementType ) throws MetaStoreException {
    List<IMetaStoreElement> list = new ArrayList<IMetaStoreElement>();
    for ( SharedObjectInterface sharedObject : sharedObjects.getObjectsMap().values() ) {
      // The databases...

View on GitHub (pinned to f3058517a1)