DbDialectFactory.java

package org.itsallcode.jdbc;

import java.util.ServiceLoader;
import java.util.ServiceLoader.Provider;
import java.util.logging.Logger;

import org.itsallcode.jdbc.dialect.DbDialect;
import org.itsallcode.jdbc.dialect.GenericDialect;

class DbDialectFactory {

    private static final Logger LOG = Logger.getLogger(DbDialectFactory.class.getName());

    public DbDialect createDialect(final String url) {
        final ServiceLoader<DbDialect> serviceLoader = ServiceLoader.load(DbDialect.class,
                Thread.currentThread().getContextClassLoader());
        return serviceLoader.stream()
                .map(Provider::get)
                .filter(dialect -> dialect.supportsUrl(url))
                .findAny()
                .orElseGet(() -> {
                    LOG.warning(() -> "No dialect found for URL '%s', using generic dialect.".formatted(url));
                    return GenericDialect.INSTANCE;
                });
    }
}