8181import java .util .concurrent .ConcurrentHashMap ;
8282import java .util .concurrent .ConcurrentMap ;
8383import java .util .concurrent .atomic .AtomicBoolean ;
84+ import java .util .function .Function ;
8485import java .util .function .Supplier ;
8586
8687import static com .google .common .base .Preconditions .checkArgument ;
@@ -213,7 +214,7 @@ public synchronized void stop()
213214 }
214215 }
215216
216- public synchronized void addConnectorFactory (ConnectorFactory connectorFactory , Supplier < ClassLoader > duplicatePluginClassLoaderFactory )
217+ public synchronized void addConnectorFactory (ConnectorFactory connectorFactory , Function < CatalogName , ClassLoader > duplicatePluginClassLoaderFactory )
217218 {
218219 requireNonNull (connectorFactory , "connectorFactory is null" );
219220 requireNonNull (duplicatePluginClassLoaderFactory , "duplicatePluginClassLoaderFactory is null" );
@@ -253,9 +254,13 @@ private synchronized void createCatalog(CatalogName catalogName, String connecto
253254 // create all connectors before adding, so a broken connector does not leave the system half updated
254255 MaterializedConnector connector = new MaterializedConnector (catalogName , createConnector (catalogName , factory , properties ));
255256
256- ConnectorHandleResolver connectorHandleResolver = connector .getConnector ().getHandleResolver ()
257- .orElseGet (factory .getConnectorFactory ()::getHandleResolver );
258- checkArgument (connectorHandleResolver != null , "Connector %s does not have a handle resolver" , factory );
257+ Set <Class <?>> handleClasses = connector .getConnector ().getHandleClasses ();
258+ if (handleClasses .isEmpty ()) {
259+ handleClasses = connector .getConnector ().getHandleResolver ()
260+ .or (() -> Optional .ofNullable (factory .getConnectorFactory ().getHandleResolver ()))
261+ .map (ConnectorHandleResolver ::getHandleClasses )
262+ .orElseThrow (() -> new IllegalArgumentException (format ("Connector %s does not have a handle resolver" , factory )));
263+ }
259264
260265 MaterializedConnector informationSchemaConnector = new MaterializedConnector (
261266 createInformationSchemaCatalogName (catalogName ),
@@ -298,10 +303,10 @@ private synchronized void createCatalog(CatalogName catalogName, String connecto
298303 addConnectorInternal (informationSchemaConnector );
299304 addConnectorInternal (systemConnector );
300305 catalogManager .registerCatalog (catalog );
301- handleResolver .addCatalogHandleResolver (catalogName .getCatalogName (), connectorHandleResolver );
306+ handleResolver .addCatalogHandleClasses (catalogName .getCatalogName (), handleClasses );
302307 }
303308 catch (Throwable e ) {
304- handleResolver .removeCatalogHandleResolver (catalogName .getCatalogName ());
309+ handleResolver .removeCatalogHandleClasses (catalogName .getCatalogName ());
305310 catalogManager .removeCatalog (catalog .getCatalogName ());
306311 removeConnectorInternal (systemConnector .getCatalogName ());
307312 removeConnectorInternal (informationSchemaConnector .getCatalogName ());
@@ -362,7 +367,7 @@ public synchronized void dropConnection(String catalogName)
362367 removeConnectorInternal (catalog );
363368 removeConnectorInternal (createInformationSchemaCatalogName (catalog ));
364369 removeConnectorInternal (createSystemTablesCatalogName (catalog ));
365- handleResolver .removeCatalogHandleResolver (catalogName );
370+ handleResolver .removeCatalogHandleClasses (catalogName );
366371 });
367372 }
368373
@@ -405,7 +410,7 @@ private Connector createConnector(CatalogName catalogName, InternalConnectorFact
405410 new InternalMetadataProvider (metadataManager , typeManager ),
406411 pageSorter ,
407412 pageIndexerFactory ,
408- factory .getDuplicatePluginClassLoaderFactory ());
413+ factory .getDuplicatePluginClassLoaderFactory (catalogName ));
409414
410415 try (ThreadContextClassLoader ignored = new ThreadContextClassLoader (factory .getConnectorFactory ().getClass ().getClassLoader ())) {
411416 return factory .getConnectorFactory ().create (catalogName .getCatalogName (), properties , context );
@@ -415,9 +420,9 @@ private Connector createConnector(CatalogName catalogName, InternalConnectorFact
415420 private static class InternalConnectorFactory
416421 {
417422 private final ConnectorFactory connectorFactory ;
418- private final Supplier < ClassLoader > duplicatePluginClassLoaderFactory ;
423+ private final Function < CatalogName , ClassLoader > duplicatePluginClassLoaderFactory ;
419424
420- public InternalConnectorFactory (ConnectorFactory connectorFactory , Supplier < ClassLoader > duplicatePluginClassLoaderFactory )
425+ public InternalConnectorFactory (ConnectorFactory connectorFactory , Function < CatalogName , ClassLoader > duplicatePluginClassLoaderFactory )
421426 {
422427 this .connectorFactory = connectorFactory ;
423428 this .duplicatePluginClassLoaderFactory = duplicatePluginClassLoaderFactory ;
@@ -428,9 +433,9 @@ public ConnectorFactory getConnectorFactory()
428433 return connectorFactory ;
429434 }
430435
431- public Supplier <ClassLoader > getDuplicatePluginClassLoaderFactory ()
436+ public Supplier <ClassLoader > getDuplicatePluginClassLoaderFactory (CatalogName catalogName )
432437 {
433- return duplicatePluginClassLoaderFactory ;
438+ return () -> duplicatePluginClassLoaderFactory . apply ( catalogName ) ;
434439 }
435440
436441 @ Override
0 commit comments