diff --git a/pom.xml b/pom.xml index b89b0af2c..8c619ae8c 100644 --- a/pom.xml +++ b/pom.xml @@ -1,11 +1,11 @@ 4.0.0 - - org.avaje - avaje-javaparent - 1.1 - + + + + + org.avaje.ebeanorm avaje-ebeanorm-server diff --git a/src/main/java/com/avaje/ebeaninternal/api/SpiEbeanPlugin.java b/src/main/java/com/avaje/ebeaninternal/api/SpiEbeanPlugin.java new file mode 100644 index 000000000..4496b69d5 --- /dev/null +++ b/src/main/java/com/avaje/ebeaninternal/api/SpiEbeanPlugin.java @@ -0,0 +1,22 @@ +package com.avaje.ebeaninternal.api; + +import com.avaje.ebean.config.ServerConfig; +import com.avaje.ebean.config.dbplatform.DatabasePlatform; + +/** + * Allows us to have more than one plugin (the ddl generator) active based on flags. + * + * author: Richard Vowles - http://gplus.to/RichardVowles + */ +public interface SpiEbeanPlugin { + /** + * initializes the plugin. + * + * @param server - the ebean server with extensions for all of the Ebean internals + * @param dbPlatform - the database we are using - this is available from the server, but it is provided for convenience + * @param serverConfig - the configured server information. It allows access to pre-collected information (but not the collector PropertySource, yet) + */ + public void setup(SpiEbeanServer server, DatabasePlatform dbPlatform, ServerConfig serverConfig); + + public void execute(boolean online); +} diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java index 05dc938b4..349a32877 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java @@ -14,6 +14,7 @@ import java.util.Set; import java.util.concurrent.FutureTask; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.ServiceLoader; import javax.management.InstanceAlreadyExistsException; import javax.management.MBeanServer; @@ -68,6 +69,7 @@ import com.avaje.ebeaninternal.api.LoadManyRequest; import com.avaje.ebeaninternal.api.ScopeTrans; import com.avaje.ebeaninternal.api.SpiBackgroundExecutor; import com.avaje.ebeaninternal.api.SpiEbeanServer; +import com.avaje.ebeaninternal.api.SpiEbeanPlugin; import com.avaje.ebeaninternal.api.SpiQuery; import com.avaje.ebeaninternal.api.SpiQuery.Mode; import com.avaje.ebeaninternal.api.SpiQuery.Type; @@ -177,7 +179,8 @@ public final class DefaultServer implements SpiEbeanServer { private final CQueryEngine cqueryEngine; - private final DdlGenerator ddlGenerator; + @Deprecated + private DdlGenerator ddlGenerator; private final ExpressionFactory ldapExpressionFactory = new LdapExpressionFactory(); @@ -213,6 +216,12 @@ public final class DefaultServer implements SpiEbeanServer { */ private PstmtBatch pstmtBatch; + + /** + * holds plugins (e.g. ddl generator) detected by the service loader + */ + private List ebeanPlugins; + /** * Create the DefaultServer. */ @@ -254,7 +263,6 @@ public final class DefaultServer implements SpiEbeanServer { this.autoFetchManager = config.createAutoFetchManager(this); this.adminAutofetch = new MAdminAutofetch(autoFetchManager); - this.ddlGenerator = new DdlGenerator(this, config.getDatabasePlatform(), config.getServerConfig()); this.beanLoader = new DefaultBeanLoader(this, config.getDebugLazyLoad()); this.jsonContext = config.createJsonContext(this); @@ -265,9 +273,40 @@ public final class DefaultServer implements SpiEbeanServer { this.ldapQueryEngine = new LdapOrmQueryEngine(ldapConfig.isVanillaMode(), ldapConfig.getContextFactory()); } + loadAndInitializePlugins(config); + ShutdownManager.register(new Shutdown()); } + protected void loadAndInitializePlugins(InternalConfiguration config) { + List spiPlugins = new ArrayList(); + + final Iterator plugins = ServiceLoader.load(SpiEbeanPlugin.class).iterator(); + + while (plugins.hasNext()) { + SpiEbeanPlugin plugin = plugins.next(); + + spiPlugins.add(plugin); + + plugin.setup(this, this.getDatabasePlatform(), config.getServerConfig()); + + if (plugin instanceof DdlGenerator) // backwards compatible + ddlGenerator = (DdlGenerator)plugin; + } + + ebeanPlugins = Collections.unmodifiableList(spiPlugins); + } + + public List getSpiEbeanPlugins() { + return ebeanPlugins; + } + + public void executePlugins(boolean online) { + for(SpiEbeanPlugin plugin : ebeanPlugins) { + plugin.execute(online); + } + } + public boolean isDefaultDeleteMissingChildren() { return defaultDeleteMissingChildren; } diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServerFactory.java b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServerFactory.java index 1a6e87bfb..571bae7e7 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServerFactory.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServerFactory.java @@ -227,7 +227,8 @@ public class DefaultServerFactory implements BootupEbeanManager { server.registerMBeans(mbeanServer, uniqueServerId); // generate and run DDL if required - executeDDL(server, online); + // if there are any other tasks requiring action in their plugins, do them as well + server.executePlugins(online); // initialise prior to registering with clusterManager server.initialise(); diff --git a/src/main/java/com/avaje/ebeaninternal/server/ddl/DdlGenerator.java b/src/main/java/com/avaje/ebeaninternal/server/ddl/DdlGenerator.java index 2fbf0cff3..17e47207f 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/ddl/DdlGenerator.java +++ b/src/main/java/com/avaje/ebeaninternal/server/ddl/DdlGenerator.java @@ -22,18 +22,19 @@ import com.avaje.ebean.Transaction; import com.avaje.ebean.config.NamingConvention; import com.avaje.ebean.config.ServerConfig; import com.avaje.ebean.config.dbplatform.DatabasePlatform; +import com.avaje.ebeaninternal.api.SpiEbeanPlugin; import com.avaje.ebeaninternal.api.SpiEbeanServer; /** * Controls the generation of DDL and potentially runs the resulting scripts. */ -public class DdlGenerator { +public class DdlGenerator implements SpiEbeanPlugin { - private static final Logger logger = Logger.getLogger(DdlGenerator.class.getName()); + private static final Logger logger = Logger.getLogger(DdlGenerator.class.getName()); - private final SpiEbeanServer server; + private SpiEbeanServer server; - private final DatabasePlatform dbPlatform; + private DatabasePlatform dbPlatform; private int summaryLength = 80; @@ -45,7 +46,7 @@ public class DdlGenerator { private NamingConvention namingConvention; - public DdlGenerator(SpiEbeanServer server, DatabasePlatform dbPlatform, ServerConfig serverConfig) { + public void setup(SpiEbeanServer server, DatabasePlatform dbPlatform, ServerConfig serverConfig) { this.server = server; this.dbPlatform = dbPlatform; this.generateDdl = serverConfig.isDdlGenerate(); diff --git a/src/main/resources/META-INF/services/com.avaje.ebeaninternal.api.SpiEbeanPlugin b/src/main/resources/META-INF/services/com.avaje.ebeaninternal.api.SpiEbeanPlugin new file mode 100644 index 000000000..374594bea --- /dev/null +++ b/src/main/resources/META-INF/services/com.avaje.ebeaninternal.api.SpiEbeanPlugin @@ -0,0 +1 @@ +com.avaje.ebeaninternal.server.ddl.DdlGenerator