package org.hibernate.engine.jdbc.dialect.internal;
import java.util.Map;
import org.hibernate.HibernateException;
import org.hibernate.annotations.common.util.StringHelper;
import org.hibernate.boot.registry.selector.spi.StrategySelector;
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.dialect.Dialect;
import org.hibernate.engine.jdbc.dialect.spi.DialectFactory;
import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo;
import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfoSource;
import org.hibernate.engine.jdbc.dialect.spi.DialectResolver;
import org.hibernate.service.spi.ServiceRegistryAwareService;
import org.hibernate.service.spi.ServiceRegistryImplementor;
public class DialectFactoryImpl implements DialectFactory, ServiceRegistryAwareService {
private StrategySelector strategySelector;
private DialectResolver dialectResolver;
@Override
public void injectServices(ServiceRegistryImplementor serviceRegistry) {
this.strategySelector = serviceRegistry.getService( StrategySelector.class );
this.dialectResolver = serviceRegistry.getService( DialectResolver.class );
}
public void setDialectResolver(DialectResolver dialectResolver) {
this.dialectResolver = dialectResolver;
}
@Override
public Dialect buildDialect(Map configValues, DialectResolutionInfoSource resolutionInfoSource) throws HibernateException {
final String dialectName = (String) configValues.get( AvailableSettings.DIALECT );
if ( !StringHelper.isEmpty( dialectName ) ) {
return constructDialect( dialectName );
}
else {
return determineDialect( resolutionInfoSource );
}
}
private Dialect constructDialect(String dialectName) {
final Dialect dialect;
try {
dialect = strategySelector.resolveStrategy( Dialect.class, dialectName );
if ( dialect == null ) {
throw new HibernateException( "Unable to construct requested dialect [" + dialectName+ "]" );
}
return dialect;
}
catch (HibernateException e) {
throw e;
}
catch (Exception e) {
throw new HibernateException( "Unable to construct requested dialect [" + dialectName+ "]", e );
}
}
private Dialect determineDialect(DialectResolutionInfoSource resolutionInfoSource) {
if ( resolutionInfoSource == null ) {
throw new HibernateException( "Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set" );
}
final DialectResolutionInfo info = resolutionInfoSource.getDialectResolutionInfo();
final Dialect dialect = dialectResolver.resolveDialect( info );
if ( dialect == null ) {
throw new HibernateException(
"Unable to determine Dialect to use [name=" + info.getDatabaseName() +
", majorVersion=" + info.getDatabaseMajorVersion() +
"]; user must register resolver or explicitly set 'hibernate.dialect'"
);
}
return dialect;
}
}