From 3471f6d2066dfe1fd5d530e7f6e2b2ff2a64a5ff Mon Sep 17 00:00:00 2001
From: rob bygrave
Date: Thu, 5 Oct 2017 00:57:40 +1300
Subject: [PATCH] Refactor EbeanServerFactory internals - use
SpiContainerShutdown interface for container shutdown mechanism
---
src/main/java/io/ebean/EbeanServerFactory.java | 7 +++++--
.../io/ebean/service/SpiContainerShutdown.java | 12 ++++++++++++
.../server/lib/DContainerShutdown.java | 14 ++++++++++++++
.../services/io.ebean.service.SpiContainerShutdown | 1 +
src/test/resources/extra-ddl.xml | 4 ++--
5 files changed, 34 insertions(+), 4 deletions(-)
create mode 100644 src/main/java/io/ebean/service/SpiContainerShutdown.java
create mode 100644 src/main/java/io/ebeaninternal/server/lib/DContainerShutdown.java
create mode 100644 src/main/resources/META-INF/services/io.ebean.service.SpiContainerShutdown
diff --git a/src/main/java/io/ebean/EbeanServerFactory.java b/src/main/java/io/ebean/EbeanServerFactory.java
index a915b26f3..76bfc2dac 100644
--- a/src/main/java/io/ebean/EbeanServerFactory.java
+++ b/src/main/java/io/ebean/EbeanServerFactory.java
@@ -3,11 +3,12 @@ package io.ebean;
import io.ebean.common.SpiContainer;
import io.ebean.config.ContainerConfig;
import io.ebean.config.ServerConfig;
-import io.ebeaninternal.server.lib.ShutdownManager;
+import io.ebean.service.SpiContainerShutdown;
import javax.persistence.PersistenceException;
import java.lang.reflect.Constructor;
import java.util.Properties;
+import java.util.ServiceLoader;
/**
* Creates EbeanServer instances.
@@ -99,7 +100,9 @@ public class EbeanServerFactory {
*
*/
public static synchronized void shutdown() {
- ShutdownManager.shutdown();
+ for (SpiContainerShutdown shutdown : ServiceLoader.load(SpiContainerShutdown.class)) {
+ shutdown.shutdown();
+ }
}
diff --git a/src/main/java/io/ebean/service/SpiContainerShutdown.java b/src/main/java/io/ebean/service/SpiContainerShutdown.java
new file mode 100644
index 000000000..1be722077
--- /dev/null
+++ b/src/main/java/io/ebean/service/SpiContainerShutdown.java
@@ -0,0 +1,12 @@
+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/lib/DContainerShutdown.java b/src/main/java/io/ebeaninternal/server/lib/DContainerShutdown.java
new file mode 100644
index 000000000..0b83469c9
--- /dev/null
+++ b/src/main/java/io/ebeaninternal/server/lib/DContainerShutdown.java
@@ -0,0 +1,14 @@
+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/resources/META-INF/services/io.ebean.service.SpiContainerShutdown b/src/main/resources/META-INF/services/io.ebean.service.SpiContainerShutdown
new file mode 100644
index 000000000..ffcbd2b22
--- /dev/null
+++ b/src/main/resources/META-INF/services/io.ebean.service.SpiContainerShutdown
@@ -0,0 +1 @@
+io.ebeaninternal.server.lib.DContainerShutdown
diff --git a/src/test/resources/extra-ddl.xml b/src/test/resources/extra-ddl.xml
index 555aacecc..d90265d34 100644
--- a/src/test/resources/extra-ddl.xml
+++ b/src/test/resources/extra-ddl.xml
@@ -18,7 +18,7 @@
from o_order_detail d
group by d.order_id;
-
+
drop view if exists order_agg_vw;
create view order_agg_vw as
@@ -28,7 +28,7 @@
group by d.order_id;
-
+
IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = 'order_agg_vw')
DROP VIEW order_agg_vw;