HHH-14744 : Refactor contextual information for SchemaManagementTool to be more easily extended by Hibernate Reactive

Move new methods out of SchemaManagementTool and into ExtractionTool
This commit is contained in:
Gail Badner 2021-07-29 14:08:30 -07:00 committed by Sanne Grinovero
parent 800436ee88
commit 8aae155c50
4 changed files with 76 additions and 35 deletions

View File

@ -34,7 +34,7 @@ public class DatabaseInformationImpl
private final ExtractionContext extractionContext; private final ExtractionContext extractionContext;
private final InformationExtractor extractor; private final InformationExtractor extractor;
private final Map<QualifiedSequenceName, SequenceInformation> sequenceInformationMap = new HashMap<QualifiedSequenceName, SequenceInformation>(); private final Map<QualifiedSequenceName, SequenceInformation> sequenceInformationMap = new HashMap<>();
public DatabaseInformationImpl( public DatabaseInformationImpl(
ServiceRegistry serviceRegistry, ServiceRegistry serviceRegistry,
@ -43,7 +43,7 @@ public class DatabaseInformationImpl
Namespace.Name defaultNamespace, Namespace.Name defaultNamespace,
SchemaManagementTool tool) throws SQLException { SchemaManagementTool tool) throws SQLException {
this.jdbcEnvironment = jdbcEnvironment; this.jdbcEnvironment = jdbcEnvironment;
this.extractionContext = tool.createExtractionContext( this.extractionContext = tool.getExtractionTool().createExtractionContext(
serviceRegistry, serviceRegistry,
jdbcEnvironment, jdbcEnvironment,
ddlTransactionIsolator, ddlTransactionIsolator,
@ -52,8 +52,7 @@ public class DatabaseInformationImpl
this this
); );
// todo : make this pluggable this.extractor = tool.getExtractionTool().createInformationExtractor( extractionContext );
this.extractor = tool.createInformationExtractor( extractionContext );
// because we do not have defined a way to locate sequence info by name // because we do not have defined a way to locate sequence info by name
initializeSequences(); initializeSequences();

View File

@ -9,12 +9,14 @@ package org.hibernate.tool.schema.internal;
import java.sql.Connection; import java.sql.Connection;
import java.util.Map; import java.util.Map;
import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.registry.selector.spi.StrategySelector; import org.hibernate.boot.registry.selector.spi.StrategySelector;
import org.hibernate.cfg.AvailableSettings; import org.hibernate.cfg.AvailableSettings;
import org.hibernate.dialect.Dialect; import org.hibernate.dialect.Dialect;
import org.hibernate.engine.jdbc.connections.spi.JdbcConnectionAccess; import org.hibernate.engine.jdbc.connections.spi.JdbcConnectionAccess;
import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo; import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo;
import org.hibernate.engine.jdbc.dialect.spi.DialectResolver; import org.hibernate.engine.jdbc.dialect.spi.DialectResolver;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
import org.hibernate.engine.jdbc.spi.JdbcServices; import org.hibernate.engine.jdbc.spi.JdbcServices;
import org.hibernate.engine.jdbc.spi.SqlExceptionHelper; import org.hibernate.engine.jdbc.spi.SqlExceptionHelper;
import org.hibernate.engine.jdbc.spi.SqlStatementLogger; import org.hibernate.engine.jdbc.spi.SqlStatementLogger;
@ -27,12 +29,17 @@ import org.hibernate.service.spi.ServiceRegistryAwareService;
import org.hibernate.service.spi.ServiceRegistryImplementor; import org.hibernate.service.spi.ServiceRegistryImplementor;
import org.hibernate.tool.schema.JdbcMetadaAccessStrategy; import org.hibernate.tool.schema.JdbcMetadaAccessStrategy;
import org.hibernate.tool.schema.TargetType; import org.hibernate.tool.schema.TargetType;
import org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl;
import org.hibernate.tool.schema.extract.spi.ExtractionContext;
import org.hibernate.tool.schema.extract.spi.InformationExtractor;
import org.hibernate.tool.schema.internal.exec.GenerationTarget; import org.hibernate.tool.schema.internal.exec.GenerationTarget;
import org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase; import org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase;
import org.hibernate.tool.schema.internal.exec.GenerationTargetToScript; import org.hibernate.tool.schema.internal.exec.GenerationTargetToScript;
import org.hibernate.tool.schema.internal.exec.GenerationTargetToStdout; import org.hibernate.tool.schema.internal.exec.GenerationTargetToStdout;
import org.hibernate.tool.schema.internal.exec.ImprovedExtractionContextImpl;
import org.hibernate.tool.schema.internal.exec.JdbcConnectionAccessProvidedConnectionImpl; import org.hibernate.tool.schema.internal.exec.JdbcConnectionAccessProvidedConnectionImpl;
import org.hibernate.tool.schema.internal.exec.JdbcContext; import org.hibernate.tool.schema.internal.exec.JdbcContext;
import org.hibernate.tool.schema.spi.ExtractionTool;
import org.hibernate.tool.schema.spi.SchemaCreator; import org.hibernate.tool.schema.spi.SchemaCreator;
import org.hibernate.tool.schema.spi.SchemaDropper; import org.hibernate.tool.schema.spi.SchemaDropper;
import org.hibernate.tool.schema.spi.SchemaFilterProvider; import org.hibernate.tool.schema.spi.SchemaFilterProvider;
@ -114,6 +121,11 @@ public class HibernateSchemaManagementTool implements SchemaManagementTool, Serv
this.customTarget = generationTarget; this.customTarget = generationTarget;
} }
@Override
public ExtractionTool getExtractionTool() {
return HibernateExtractionTool.INSTANCE;
}
GenerationTarget getCustomDatabaseGenerationTarget() { GenerationTarget getCustomDatabaseGenerationTarget() {
return customTarget; return customTarget;
} }
@ -352,4 +364,34 @@ public class HibernateSchemaManagementTool implements SchemaManagementTool, Serv
} }
} }
private static class HibernateExtractionTool implements ExtractionTool {
private static final HibernateExtractionTool INSTANCE = new HibernateExtractionTool();
private HibernateExtractionTool() {
}
@Override
public ExtractionContext createExtractionContext(
ServiceRegistry serviceRegistry,
JdbcEnvironment jdbcEnvironment,
DdlTransactionIsolator ddlTransactionIsolator,
Identifier defaultCatalog,
Identifier defaultSchema,
ExtractionContext.DatabaseObjectAccess databaseObjectAccess) {
return new ImprovedExtractionContextImpl(
serviceRegistry,
jdbcEnvironment,
ddlTransactionIsolator,
defaultCatalog,
defaultSchema,
databaseObjectAccess
);
}
@Override
public InformationExtractor createInformationExtractor(ExtractionContext extractionContext) {
return new InformationExtractorJdbcDatabaseMetaDataImpl( extractionContext );
}
}
} }

View File

@ -0,0 +1,30 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.tool.schema.spi;
import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
import org.hibernate.resource.transaction.spi.DdlTransactionIsolator;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.tool.schema.extract.spi.ExtractionContext;
import org.hibernate.tool.schema.extract.spi.InformationExtractor;
/**
* @author Gail Badner
*/
public interface ExtractionTool {
ExtractionContext createExtractionContext(
ServiceRegistry serviceRegistry,
JdbcEnvironment jdbcEnvironment,
DdlTransactionIsolator ddlTransactionIsolator,
Identifier defaultCatalog,
Identifier defaultSchema,
ExtractionContext.DatabaseObjectAccess databaseObjectAccess);
InformationExtractor createInformationExtractor(ExtractionContext extractionContext);
}

View File

@ -7,21 +7,10 @@
package org.hibernate.tool.schema.spi; package org.hibernate.tool.schema.spi;
import java.util.Map; import java.util.Map;
import java.util.function.BiFunction;
import java.util.function.Function;
import org.hibernate.Incubating; import org.hibernate.Incubating;
import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.relational.Namespace;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
import org.hibernate.resource.transaction.spi.DdlTransactionIsolator;
import org.hibernate.service.Service; import org.hibernate.service.Service;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl;
import org.hibernate.tool.schema.extract.spi.ExtractionContext;
import org.hibernate.tool.schema.extract.spi.InformationExtractor;
import org.hibernate.tool.schema.internal.exec.GenerationTarget; import org.hibernate.tool.schema.internal.exec.GenerationTarget;
import org.hibernate.tool.schema.internal.exec.ImprovedExtractionContextImpl;
/** /**
* Contract for schema management tool integration. * Contract for schema management tool integration.
@ -44,24 +33,5 @@ public interface SchemaManagementTool extends Service {
*/ */
void setCustomDatabaseGenerationTarget(GenerationTarget generationTarget); void setCustomDatabaseGenerationTarget(GenerationTarget generationTarget);
default ExtractionContext createExtractionContext( ExtractionTool getExtractionTool();
ServiceRegistry serviceRegistry,
JdbcEnvironment jdbcEnvironment,
DdlTransactionIsolator ddlTransactionIsolator,
Identifier defaultCatalog,
Identifier defaultSchema,
ExtractionContext.DatabaseObjectAccess databaseObjectAccess) {
return new ImprovedExtractionContextImpl(
serviceRegistry,
jdbcEnvironment,
ddlTransactionIsolator,
defaultCatalog,
defaultSchema,
databaseObjectAccess
);
}
default InformationExtractor createInformationExtractor(ExtractionContext extractionContext) {
return new InformationExtractorJdbcDatabaseMetaDataImpl( extractionContext );
}
} }