class BlobSchemaInfo implements SchemaInfo {

    public static final String NAME = "blob";

    private final ClusterService clusterService;
    private final BlobTableInfoFactory blobTableInfoFactory;
    private final ConcurrentHashMap<String, BlobTableInfo> tableByName = new ConcurrentHashMap<>();

    @Inject
    public BlobSchemaInfo(ClusterService clusterService,
                          BlobTableInfoFactory blobTableInfoFactory) {
        this.clusterService = clusterService;
        this.blobTableInfoFactory = blobTableInfoFactory;
    }

    @Override
    public TableInfo getTableInfo(String name) {<FILL_FUNCTION_BODY>}

    @Override
    public String name() {
        return NAME;
    }

    @Override
    public void invalidateTableCache(String tableName) {
        tableByName.remove(tableName);
    }

    @Override
    public void update(ClusterChangedEvent event) {
        if (event.metadataChanged()) {
            tableByName.clear();
        }
    }

    @Override
    public Iterable<TableInfo> getTables() {
        return Stream.of(clusterService.state().metadata().getConcreteAllOpenIndices())
            .filter(BlobIndex::isBlobIndex)
            .map(BlobIndex::stripPrefix)
            .map(this::getTableInfo)
            ::iterator;
    }

    @Override
    public Iterable<ViewInfo> getViews() {
        return Collections.emptyList();
    }

    @Override
    public void close() throws Exception {
    }
}

        try {
            return tableByName.computeIfAbsent(
                name,
                n -> blobTableInfoFactory.create(new RelationName(NAME, n), clusterService.state())
            );
        } catch (Exception e) {
            if (e instanceof ResourceUnknownException) {
                return null;
            }
            throw e;
        }
    
<no_super_class>