#2073 - Refactor internals for DdlGenerator use use ServiceLoader

This commit is contained in:
rob bygrave
2020-10-09 22:58:47 +13:00
parent a6f5ab8074
commit b9047bf280
23 changed files with 84 additions and 43 deletions
@@ -0,0 +1,15 @@
package io.ebeaninternal.api;
/**
* DDL generate and run for drop all/create all.
*/
public interface SpiDdlGenerator {
/**
* Generate and run the DDL for drop-all and create-all scripts.
* <p>
* Run based on on property settings for ebean.ddl.generate and ebean.ddl.run etc.
*/
void execute(boolean online);
}
@@ -0,0 +1,13 @@
package io.ebeaninternal.api;
/**
* Provides the DDL Generator for create-all/drop-all.
*/
public interface SpiDdlGeneratorProvider {
/**
* Provide the DDL generator.
*/
SpiDdlGenerator generator(SpiEbeanServer server);
}
@@ -16,7 +16,6 @@ import io.ebean.config.dbplatform.DatabasePlatform;
import io.ebean.event.readaudit.ReadAuditLogger;
import io.ebean.event.readaudit.ReadAuditPrepare;
import io.ebean.meta.MetricVisitor;
import io.ebeaninternal.dbmigration.ddlgeneration.DdlHandler;
import io.ebeaninternal.server.core.SpiResultSet;
import io.ebeaninternal.server.core.timezone.DataTimeZone;
import io.ebeaninternal.server.deploy.BeanDescriptor;
@@ -215,11 +214,6 @@ public interface SpiEbeanServer extends ExtendedServer, EbeanServer, BeanCollect
*/
void slowQueryCheck(long executionTimeMicros, int rowCount, SpiQuery<?> query);
/**
* Create DDL handler given the platform and configuration of the server.
*/
DdlHandler createDdlHandler();
/**
* Start an enhanced transactional method.
*/
@@ -7,6 +7,7 @@ import io.ebean.config.dbplatform.DatabasePlatform;
import io.ebean.migration.ddl.DdlRunner;
import io.ebean.migration.runner.ScriptTransform;
import io.ebean.util.JdbcClose;
import io.ebeaninternal.api.SpiDdlGenerator;
import io.ebeaninternal.api.SpiEbeanServer;
import io.ebeaninternal.dbmigration.model.CurrentModel;
import io.ebeaninternal.dbmigration.model.MTable;
@@ -33,7 +34,7 @@ import java.sql.SQLException;
* Typically the "Create All" DDL is executed for running tests etc and has nothing to do
* with DB Migration (diff based) DDL.
*/
public class DdlGenerator {
public class DdlGenerator implements SpiDdlGenerator {
private static final Logger log = LoggerFactory.getLogger(DdlGenerator.class);
private static final String[] BUILD_DIRS = {"target", "build"};
@@ -54,10 +55,11 @@ public class DdlGenerator {
private CurrentModel currentModel;
private String dropAllContent;
private String createAllContent;
private File baseDir;
private final File baseDir;
public DdlGenerator(SpiEbeanServer server, DatabaseConfig config) {
public DdlGenerator(SpiEbeanServer server) {
this.server = server;
final DatabaseConfig config = server.getServerConfig();
this.jaxbPresent = config.getClassLoadConfig().isJavaxJAXBPresent();
this.generateDdl = config.isDdlGenerate();
this.extraDdl = config.isDdlExtra();
@@ -88,10 +90,7 @@ public class DdlGenerator {
return new File(".");
}
/**
* Generate the DDL and then run the DDL based on property settings
* (ebean.ddl.generate and ebean.ddl.run etc).
*/
@Override
public void execute(boolean online) {
generateDdl();
if (online) {
@@ -162,7 +161,7 @@ public class DdlGenerator {
/**
* Execute all the DDL statements in the script.
*/
public void runScript(Connection connection, boolean expectErrors, String content, String scriptName) {
void runScript(Connection connection, boolean expectErrors, String content, String scriptName) {
DdlRunner runner = createDdlRunner(expectErrors, scriptName);
try {
@@ -0,0 +1,13 @@
package io.ebeaninternal.dbmigration;
import io.ebeaninternal.api.SpiDdlGenerator;
import io.ebeaninternal.api.SpiDdlGeneratorProvider;
import io.ebeaninternal.api.SpiEbeanServer;
public class DdlGeneratorProvider implements SpiDdlGeneratorProvider {
@Override
public SpiDdlGenerator generator(SpiEbeanServer server) {
return new DdlGenerator(server);
}
}
@@ -1,4 +1,4 @@
package io.ebeaninternal.server.core;
package io.ebeaninternal.dbmigration.ddlgeneration;
import io.ebean.config.dbplatform.DatabasePlatform;
import io.ebeaninternal.dbmigration.ddlgeneration.platform.ClickHouseDdl;
@@ -13,6 +13,7 @@ import io.ebeaninternal.dbmigration.model.visitor.VisitAllUsing;
import io.ebeaninternal.extraddl.model.DdlScript;
import io.ebeaninternal.extraddl.model.ExtraDdl;
import io.ebeaninternal.extraddl.model.ExtraDdlXmlReader;
import io.ebeaninternal.dbmigration.ddlgeneration.PlatformDdlBuilder;
import java.io.IOException;
import java.util.List;
@@ -195,7 +196,7 @@ public class CurrentModel {
* Return the platform specific DdlHandler (to generate DDL).
*/
private DdlHandler handler() {
return server.createDdlHandler();
return PlatformDdlBuilder.create(databasePlatform).createDdlHandler(server.getServerConfig());
}
/**
@@ -6,11 +6,11 @@ import io.ebean.config.dbplatform.DatabasePlatform;
import io.ebeaninternal.dbmigration.ddlgeneration.DdlBuffer;
import io.ebeaninternal.dbmigration.ddlgeneration.DdlHandler;
import io.ebeaninternal.dbmigration.ddlgeneration.DdlWrite;
import io.ebeaninternal.dbmigration.ddlgeneration.PlatformDdlBuilder;
import io.ebeaninternal.dbmigration.ddlgeneration.platform.PlatformDdl;
import io.ebeaninternal.dbmigration.migration.ChangeSet;
import io.ebeaninternal.dbmigration.migration.ChangeSetType;
import io.ebeaninternal.dbmigration.migration.Migration;
import io.ebeaninternal.server.core.PlatformDdlBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -51,6 +51,7 @@ import io.ebean.config.SlowQueryListener;
import io.ebean.config.TenantMode;
import io.ebean.config.dbplatform.DatabasePlatform;
import io.ebean.event.BeanPersistController;
import io.ebean.event.ShutdownManager;
import io.ebean.event.readaudit.ReadAuditLogger;
import io.ebean.event.readaudit.ReadAuditPrepare;
import io.ebean.meta.MetaInfoManager;
@@ -70,6 +71,7 @@ import io.ebeaninternal.api.LoadManyRequest;
import io.ebeaninternal.api.QueryPlanManager;
import io.ebeaninternal.api.ScopedTransaction;
import io.ebeaninternal.api.SpiBackgroundExecutor;
import io.ebeaninternal.api.SpiDdlGenerator;
import io.ebeaninternal.api.SpiDtoQuery;
import io.ebeaninternal.api.SpiEbeanServer;
import io.ebeaninternal.api.SpiJsonContext;
@@ -83,8 +85,6 @@ import io.ebeaninternal.api.SpiSqlUpdate;
import io.ebeaninternal.api.SpiTransaction;
import io.ebeaninternal.api.SpiTransactionManager;
import io.ebeaninternal.api.TransactionEventTable;
import io.ebeaninternal.dbmigration.DdlGenerator;
import io.ebeaninternal.dbmigration.ddlgeneration.DdlHandler;
import io.ebeaninternal.server.autotune.AutoTuneService;
import io.ebeaninternal.server.cache.RemoteCacheEvent;
import io.ebeaninternal.server.core.timezone.DataTimeZone;
@@ -96,7 +96,6 @@ import io.ebeaninternal.server.dto.DtoBeanDescriptor;
import io.ebeaninternal.server.dto.DtoBeanManager;
import io.ebeaninternal.server.el.ElFilter;
import io.ebeaninternal.server.grammer.EqlParser;
import io.ebean.event.ShutdownManager;
import io.ebeaninternal.server.query.CQuery;
import io.ebeaninternal.server.query.CQueryEngine;
import io.ebeaninternal.server.query.CallableQueryCount;
@@ -204,7 +203,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer {
private final List<Plugin> serverPlugins;
private final DdlGenerator ddlGenerator;
private final SpiDdlGenerator ddlGenerator;
private final ScriptRunner scriptRunner;
@@ -295,7 +294,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer {
this.queryPlanManager = config.initQueryPlanManager(transactionManager);
this.metaInfoManager = new DefaultMetaInfoManager(this);
this.serverPlugins = config.getPlugins();
this.ddlGenerator = new DdlGenerator(this, this.config);
this.ddlGenerator = config.initDdlGenerator(this);
this.scriptRunner = new DScriptRunner(this);
configureServerPlugins();
@@ -377,11 +376,6 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer {
return scriptRunner;
}
@Override
public DdlHandler createDdlHandler() {
return PlatformDdlBuilder.create(databasePlatform).createDdlHandler(config);
}
@Override
public DataTimeZone getDataTimeZone() {
return dataTimeZone;
@@ -25,6 +25,8 @@ import io.ebean.plugin.SpiServer;
import io.ebeaninternal.api.ExtraMetrics;
import io.ebeaninternal.api.QueryPlanManager;
import io.ebeaninternal.api.SpiBackgroundExecutor;
import io.ebeaninternal.api.SpiDdlGenerator;
import io.ebeaninternal.api.SpiDdlGeneratorProvider;
import io.ebeaninternal.api.SpiEbeanServer;
import io.ebeaninternal.api.SpiJsonContext;
import io.ebeaninternal.api.SpiLogManager;
@@ -646,4 +648,19 @@ public class InternalConfiguration {
return new QueryPlanLoggerExplain();
}
}
/**
* Return the DDL generator.
*/
public SpiDdlGenerator initDdlGenerator(SpiEbeanServer server) {
final SpiDdlGeneratorProvider service = config.service(SpiDdlGeneratorProvider.class);
return service == null ? new NoopDdl() : service.generator(server);
}
private static class NoopDdl implements SpiDdlGenerator {
@Override
public void execute(boolean online) {
// do nothing
}
}
}
@@ -0,0 +1 @@
io.ebeaninternal.dbmigration.DdlGeneratorProvider
@@ -2,7 +2,7 @@ package io.ebean.config.dbplatform;
import io.ebean.config.dbplatform.h2.H2Platform;
import io.ebeaninternal.dbmigration.ddlgeneration.platform.PlatformDdl;
import io.ebeaninternal.server.core.PlatformDdlBuilder;
import io.ebeaninternal.dbmigration.ddlgeneration.PlatformDdlBuilder;
import org.junit.Test;
import static org.assertj.core.api.Assertions.assertThat;
@@ -3,7 +3,7 @@ package io.ebean.config.dbplatform;
import io.ebean.config.PlatformConfig;
import io.ebean.config.dbplatform.hana.HanaPlatform;
import io.ebeaninternal.dbmigration.ddlgeneration.platform.PlatformDdl;
import io.ebeaninternal.server.core.PlatformDdlBuilder;
import io.ebeaninternal.dbmigration.ddlgeneration.PlatformDdlBuilder;
import org.junit.Test;
import static org.assertj.core.api.Assertions.assertThat;
@@ -3,7 +3,7 @@ package io.ebean.config.dbplatform;
import io.ebean.config.PlatformConfig;
import io.ebean.config.dbplatform.mysql.MySqlPlatform;
import io.ebeaninternal.dbmigration.ddlgeneration.platform.PlatformDdl;
import io.ebeaninternal.server.core.PlatformDdlBuilder;
import io.ebeaninternal.dbmigration.ddlgeneration.PlatformDdlBuilder;
import org.junit.Test;
import static org.assertj.core.api.Assertions.assertThat;
@@ -3,7 +3,7 @@ package io.ebean.config.dbplatform;
import io.ebean.config.PlatformConfig;
import io.ebean.config.dbplatform.oracle.OraclePlatform;
import io.ebeaninternal.dbmigration.ddlgeneration.platform.PlatformDdl;
import io.ebeaninternal.server.core.PlatformDdlBuilder;
import io.ebeaninternal.dbmigration.ddlgeneration.PlatformDdlBuilder;
import org.junit.Test;
import static org.assertj.core.api.Assertions.assertThat;
@@ -3,7 +3,7 @@ package io.ebean.config.dbplatform;
import io.ebean.config.PlatformConfig;
import io.ebean.config.dbplatform.postgres.PostgresPlatform;
import io.ebeaninternal.dbmigration.ddlgeneration.platform.PlatformDdl;
import io.ebeaninternal.server.core.PlatformDdlBuilder;
import io.ebeaninternal.dbmigration.ddlgeneration.PlatformDdlBuilder;
import org.junit.Test;
import static org.assertj.core.api.Assertions.assertThat;
@@ -3,7 +3,7 @@ package io.ebean.config.dbplatform;
import io.ebean.config.PlatformConfig;
import io.ebean.config.dbplatform.sqlserver.SqlServer17Platform;
import io.ebeaninternal.dbmigration.ddlgeneration.platform.PlatformDdl;
import io.ebeaninternal.server.core.PlatformDdlBuilder;
import io.ebeaninternal.dbmigration.ddlgeneration.PlatformDdlBuilder;
import org.junit.Test;
import static org.assertj.core.api.Assertions.assertThat;
@@ -167,11 +167,6 @@ public class TDSpiEbeanServer implements SpiEbeanServer {
return null;
}
@Override
public DdlHandler createDdlHandler() {
return null;
}
@Override
public CallOrigin createCallOrigin() {
return null;
@@ -11,7 +11,6 @@ import io.ebean.config.dbplatform.sqlserver.SqlServer17Platform;
import io.ebeaninternal.api.SpiEbeanServer;
import io.ebeaninternal.dbmigration.migration.ChangeSet;
import io.ebeaninternal.dbmigration.model.CurrentModel;
import io.ebeaninternal.server.core.PlatformDdlBuilder;
import org.junit.Ignore;
import org.junit.Test;
@@ -12,7 +12,7 @@ import io.ebeaninternal.dbmigration.migration.AddTableComment;
import io.ebeaninternal.dbmigration.migration.AlterColumn;
import io.ebeaninternal.dbmigration.migration.Column;
import io.ebeaninternal.dbmigration.migration.CreateTable;
import io.ebeaninternal.server.core.PlatformDdlBuilder;
import io.ebeaninternal.dbmigration.ddlgeneration.PlatformDdlBuilder;
import org.junit.Test;
import java.io.IOException;
@@ -8,7 +8,7 @@ import io.ebeaninternal.dbmigration.model.CurrentModel;
import io.ebeaninternal.dbmigration.model.MConfiguration;
import io.ebeaninternal.dbmigration.model.ModelContainer;
import io.ebeaninternal.api.SpiEbeanServer;
import io.ebeaninternal.server.core.PlatformDdlBuilder;
import io.ebeaninternal.dbmigration.ddlgeneration.PlatformDdlBuilder;
import org.junit.Test;
import static org.assertj.core.api.Assertions.assertThat;
@@ -10,7 +10,7 @@ import io.ebean.config.dbplatform.oracle.OraclePlatform;
import io.ebean.config.dbplatform.postgres.PostgresPlatform;
import io.ebean.config.dbplatform.sqlserver.SqlServer17Platform;
import io.ebeaninternal.dbmigration.migration.AlterColumn;
import io.ebeaninternal.server.core.PlatformDdlBuilder;
import io.ebeaninternal.dbmigration.ddlgeneration.PlatformDdlBuilder;
import org.junit.Test;
import static org.assertj.core.api.Assertions.assertThat;
@@ -7,7 +7,7 @@ import io.ebean.config.dbplatform.mysql.MySqlPlatform;
import io.ebean.config.dbplatform.oracle.OraclePlatform;
import io.ebean.config.dbplatform.postgres.PostgresPlatform;
import io.ebean.config.dbplatform.sqlserver.SqlServer17Platform;
import io.ebeaninternal.server.core.PlatformDdlBuilder;
import io.ebeaninternal.dbmigration.ddlgeneration.PlatformDdlBuilder;
import org.junit.Test;
import static org.junit.Assert.assertEquals;