diff --git a/src/main/java/io/ebean/EbeanServerFactory.java b/src/main/java/io/ebean/EbeanServerFactory.java index 76bfc2dac..090e23e9a 100644 --- a/src/main/java/io/ebean/EbeanServerFactory.java +++ b/src/main/java/io/ebean/EbeanServerFactory.java @@ -1,12 +1,12 @@ package io.ebean; -import io.ebean.common.SpiContainer; import io.ebean.config.ContainerConfig; import io.ebean.config.ServerConfig; -import io.ebean.service.SpiContainerShutdown; +import io.ebean.service.SpiContainer; +import io.ebean.service.SpiContainerFactory; import javax.persistence.PersistenceException; -import java.lang.reflect.Constructor; +import java.util.Iterator; import java.util.Properties; import java.util.ServiceLoader; @@ -31,8 +31,6 @@ import java.util.ServiceLoader; public class EbeanServerFactory { - private static final String DEFAULT_CONTAINER = "io.ebeaninternal.server.core.DefaultContainer"; - private static SpiContainer container; /** @@ -100,9 +98,7 @@ public class EbeanServerFactory { *

*/ public static synchronized void shutdown() { - for (SpiContainerShutdown shutdown : ServiceLoader.load(SpiContainerShutdown.class)) { - shutdown.shutdown(); - } + container.shutdown(); } @@ -138,14 +134,10 @@ public class EbeanServerFactory { */ protected static SpiContainer createContainer(ContainerConfig containerConfig) { - String implClassName = System.getProperty("ebean.container", DEFAULT_CONTAINER); - - try { - Class cls = Class.forName(implClassName); - Constructor constructor = cls.getConstructor(ContainerConfig.class); - return (SpiContainer) constructor.newInstance(containerConfig); - } catch (Exception ex) { - throw new RuntimeException(ex); + Iterator factories = ServiceLoader.load(SpiContainerFactory.class).iterator(); + if (factories.hasNext()) { + return factories.next().create(containerConfig); } + throw new IllegalStateException("Service loader didn't find a SpiContainerFactory?"); } } diff --git a/src/main/java/io/ebean/common/SpiContainer.java b/src/main/java/io/ebean/service/SpiContainer.java similarity index 96% rename from src/main/java/io/ebean/common/SpiContainer.java rename to src/main/java/io/ebean/service/SpiContainer.java index 7e7833634..3f1ffc9a1 100644 --- a/src/main/java/io/ebean/common/SpiContainer.java +++ b/src/main/java/io/ebean/service/SpiContainer.java @@ -1,4 +1,4 @@ -package io.ebean.common; +package io.ebean.service; import io.ebean.EbeanServer; import io.ebean.config.ServerConfig; diff --git a/src/main/java/io/ebean/service/SpiContainerFactory.java b/src/main/java/io/ebean/service/SpiContainerFactory.java new file mode 100644 index 000000000..42c86e676 --- /dev/null +++ b/src/main/java/io/ebean/service/SpiContainerFactory.java @@ -0,0 +1,14 @@ +package io.ebean.service; + +import io.ebean.config.ContainerConfig; + +/** + * Provides shutdown of the entire container. + */ +public interface SpiContainerFactory { + + /** + * Create the Container that builds EbeanServer instances. + */ + SpiContainer create(ContainerConfig containerConfig); +} diff --git a/src/main/java/io/ebean/service/SpiContainerShutdown.java b/src/main/java/io/ebean/service/SpiContainerShutdown.java deleted file mode 100644 index 1be722077..000000000 --- a/src/main/java/io/ebean/service/SpiContainerShutdown.java +++ /dev/null @@ -1,12 +0,0 @@ -package io.ebean.service; - -/** - * Provides shutdown of the entire container. - */ -public interface SpiContainerShutdown { - - /** - * Shutdown the entire container - all EbeanServer instances. - */ - void shutdown(); -} diff --git a/src/main/java/io/ebeaninternal/server/DContainerFactory.java b/src/main/java/io/ebeaninternal/server/DContainerFactory.java new file mode 100644 index 000000000..ea9f0b109 --- /dev/null +++ b/src/main/java/io/ebeaninternal/server/DContainerFactory.java @@ -0,0 +1,17 @@ +package io.ebeaninternal.server; + +import io.ebean.config.ContainerConfig; +import io.ebean.service.SpiContainer; +import io.ebean.service.SpiContainerFactory; +import io.ebeaninternal.server.core.DefaultContainer; + +/** + * Default container factory found via service loader. + */ +public class DContainerFactory implements SpiContainerFactory { + + @Override + public SpiContainer create(ContainerConfig containerConfig) { + return new DefaultContainer(containerConfig); + } +} diff --git a/src/main/java/io/ebeaninternal/server/core/DefaultContainer.java b/src/main/java/io/ebeaninternal/server/core/DefaultContainer.java index c2564af6a..5b511cf8b 100644 --- a/src/main/java/io/ebeaninternal/server/core/DefaultContainer.java +++ b/src/main/java/io/ebeaninternal/server/core/DefaultContainer.java @@ -4,7 +4,7 @@ import io.ebean.BackgroundExecutor; import io.ebean.cache.ServerCacheFactory; import io.ebean.cache.ServerCacheOptions; import io.ebean.cache.ServerCachePlugin; -import io.ebean.common.SpiContainer; +import io.ebean.service.SpiContainer; import io.ebean.config.ContainerConfig; import io.ebean.config.PropertyMap; import io.ebean.config.ServerConfig; @@ -71,7 +71,7 @@ public class DefaultContainer implements SpiContainer { @Override public void shutdown() { - clusterManager.shutdown(); + ShutdownManager.shutdown(); } /** diff --git a/src/main/java/io/ebeaninternal/server/lib/DContainerShutdown.java b/src/main/java/io/ebeaninternal/server/lib/DContainerShutdown.java deleted file mode 100644 index 0b83469c9..000000000 --- a/src/main/java/io/ebeaninternal/server/lib/DContainerShutdown.java +++ /dev/null @@ -1,14 +0,0 @@ -package io.ebeaninternal.server.lib; - -import io.ebean.service.SpiContainerShutdown; - -/** - * Default container shutdown implementation. - */ -public class DContainerShutdown implements SpiContainerShutdown { - - @Override - public void shutdown() { - ShutdownManager.shutdown(); - } -} diff --git a/src/main/java/io/ebeaninternal/server/lib/ShutdownManager.java b/src/main/java/io/ebeaninternal/server/lib/ShutdownManager.java index 032592700..beed51f59 100644 --- a/src/main/java/io/ebeaninternal/server/lib/ShutdownManager.java +++ b/src/main/java/io/ebeaninternal/server/lib/ShutdownManager.java @@ -1,6 +1,6 @@ package io.ebeaninternal.server.lib; -import io.ebean.common.SpiContainer; +import io.ebean.service.SpiContainer; import io.ebeaninternal.api.ClassUtil; import io.ebeaninternal.api.SpiEbeanServer; import org.slf4j.Logger; diff --git a/src/main/resources/META-INF/services/io.ebean.service.SpiContainerFactory b/src/main/resources/META-INF/services/io.ebean.service.SpiContainerFactory new file mode 100644 index 000000000..ebf1f50d5 --- /dev/null +++ b/src/main/resources/META-INF/services/io.ebean.service.SpiContainerFactory @@ -0,0 +1 @@ +io.ebeaninternal.server.DContainerFactory diff --git a/src/main/resources/META-INF/services/io.ebean.service.SpiContainerShutdown b/src/main/resources/META-INF/services/io.ebean.service.SpiContainerShutdown deleted file mode 100644 index ffcbd2b22..000000000 --- a/src/main/resources/META-INF/services/io.ebean.service.SpiContainerShutdown +++ /dev/null @@ -1 +0,0 @@ -io.ebeaninternal.server.lib.DContainerShutdown