diff --git a/src/main/java/com/avaje/ebean/config/ServerConfig.java b/src/main/java/com/avaje/ebean/config/ServerConfig.java index 20f0ea183..a9145a3c0 100644 --- a/src/main/java/com/avaje/ebean/config/ServerConfig.java +++ b/src/main/java/com/avaje/ebean/config/ServerConfig.java @@ -1819,8 +1819,7 @@ public class ServerConfig { String classNames = properties.get("classes", null); if (classNames == null) { - - return null; + return classes; } List> classes = new ArrayList>(); diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptor.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptor.java index af4db3894..37d0df7e7 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptor.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptor.java @@ -1525,17 +1525,35 @@ public class BeanDescriptor implements MetaBeanInfo { return queryAdapter; } + /** + * De-register the BeanPersistListener. + */ + public void deregister(BeanPersistListener listener) { + + // volatile read... + BeanPersistListener currentListener = persistListener; + if (currentListener != null) { + if (currentListener instanceof ChainedBeanPersistListener) { + // remove it from the existing chain + persistListener = ((ChainedBeanPersistListener) currentListener).deregister(listener); + } else if (currentListener.equals(listener)) { + persistListener = null; + } + } + } + /** * De-register the BeanPersistController. */ public void deregister(BeanPersistController controller) { + // volatile read... - BeanPersistController c = persistController; - if (c != null) { - if (c instanceof ChainedBeanPersistController) { + BeanPersistController currentController = persistController; + if (currentController != null) { + if (currentController instanceof ChainedBeanPersistController) { // remove it from the existing chain - persistController = ((ChainedBeanPersistController) c).deregister(controller); - } else if (c.equals(controller)) { + persistController = ((ChainedBeanPersistController) currentController).deregister(controller); + } else if (currentController.equals(controller)) { persistController = null; } } @@ -1549,16 +1567,16 @@ public class BeanDescriptor implements MetaBeanInfo { if (newPersistListener.isRegisterFor(beanType)) { // volatile read... - BeanPersistListener currListener = persistListener; - if (currListener == null) { + BeanPersistListener currentListener = persistListener; + if (currentListener == null) { persistListener = newPersistListener; } else { - if (currListener instanceof ChainedBeanPersistListener) { + if (currentListener instanceof ChainedBeanPersistListener) { // add it to the existing chain - persistListener = ((ChainedBeanPersistListener) currListener).register(newPersistListener); + persistListener = ((ChainedBeanPersistListener) currentListener).register(newPersistListener); } else { // build new chain of the 2 - persistListener = new ChainedBeanPersistListener(currListener, newPersistListener); + persistListener = new ChainedBeanPersistListener(currentListener, newPersistListener); } } } @@ -1571,16 +1589,16 @@ public class BeanDescriptor implements MetaBeanInfo { if (newController.isRegisterFor(beanType)) { // volatile read... - BeanPersistController c = persistController; - if (c == null) { + BeanPersistController currentController = persistController; + if (currentController == null) { persistController = newController; } else { - if (c instanceof ChainedBeanPersistController) { + if (currentController instanceof ChainedBeanPersistController) { // add it to the existing chain - persistController = ((ChainedBeanPersistController) c).register(newController); + persistController = ((ChainedBeanPersistController) currentController).register(newController); } else { // build new chain of the 2 - persistController = new ChainedBeanPersistController(c, newController); + persistController = new ChainedBeanPersistController(currentController, newController); } } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/ChainedBeanPersistController.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/ChainedBeanPersistController.java index ac389efd1..8f87fe230 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/ChainedBeanPersistController.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/ChainedBeanPersistController.java @@ -9,6 +9,11 @@ import java.util.Set; import com.avaje.ebean.event.BeanPersistController; import com.avaje.ebean.event.BeanPersistRequest; +/** + * Chains multiple BeanPersistController's together. + * + * Used when multiple BeanPersistController register for the same bean type. + */ public class ChainedBeanPersistController implements BeanPersistController { private static final Sorter SORTER = new Sorter(); @@ -43,7 +48,14 @@ public class ChainedBeanPersistController implements BeanPersistController { Arrays.sort(c, SORTER); this.chain = c; } - + + /** + * Return the size of the chain. + */ + protected int size() { + return chain.length; + } + /** * Register a new BeanPersistController and return the resulting chain. */ diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/ChainedBeanPersistListener.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/ChainedBeanPersistListener.java index 889dbd164..71930ceec 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/ChainedBeanPersistListener.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/ChainedBeanPersistListener.java @@ -22,6 +22,13 @@ public class ChainedBeanPersistListener implements BeanPersistListener { this(addList(c1, c2)); } + /** + * Return the size of the chain. + */ + protected int size() { + return chain.length; + } + @Override public boolean isRegisterFor(Class cls) { // never called @@ -40,7 +47,6 @@ public class ChainedBeanPersistListener implements BeanPersistListener { /** * Construct given the list of BeanPersistController's. - * @param list */ public ChainedBeanPersistListener(List list) { this.list = list; diff --git a/src/test/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptorTest.java b/src/test/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptorTest.java new file mode 100644 index 000000000..bb9cde51c --- /dev/null +++ b/src/test/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptorTest.java @@ -0,0 +1,111 @@ +package com.avaje.ebeaninternal.server.deploy; + +import com.avaje.ebean.EbeanServerFactory; +import com.avaje.ebean.config.ServerConfig; +import com.avaje.ebean.event.AbstractBeanPersistListener; +import com.avaje.ebean.event.BeanPersistAdapter; +import com.avaje.ebean.event.BeanPersistListener; +import com.avaje.ebeaninternal.api.SpiEbeanServer; +import com.avaje.tests.model.basic.EBasic; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + */ +public class BeanDescriptorTest { + + @Test + public void testRegisterDeregister() throws Exception { + + ServerConfig config = new ServerConfig(); + + config.setName("h2other"); + config.loadFromProperties(); + config.setRegister(false); + config.setDefaultServer(false); + config.getClasses().add(EBasic.class); + + SpiEbeanServer ebeanServer = (SpiEbeanServer)EbeanServerFactory.create(config); + BeanDescriptor desc = ebeanServer.getBeanDescriptor(EBasic.class); + + persistListenerRegistrationTests(desc); + persistControllerRegistrationTests(desc); + } + + private void persistControllerRegistrationTests(BeanDescriptor desc) { + + Controller1 controller1 = new Controller1(); + + assertNull(desc.getPersistController()); + desc.register(controller1); + assertSame(controller1, desc.getPersistController()); + + Controller2 controller2 = new Controller2(); + desc.register(controller2); + + assertEquals(2, ((ChainedBeanPersistController) desc.getPersistController()).size()); + + desc.deregister(controller1); + assertEquals(1, ((ChainedBeanPersistController)desc.getPersistController()).size()); + + desc.deregister(controller2); + assertEquals(0, ((ChainedBeanPersistController)desc.getPersistController()).size()); + } + + private void persistListenerRegistrationTests(BeanDescriptor desc) { + + Listener1 listener1 = new Listener1(); + + assertNull(desc.getPersistListener()); + desc.register(listener1); + assertSame(listener1, desc.getPersistListener()); + + Listener2 listener2 = new Listener2(); + desc.register(listener2); + + BeanPersistListener persistListener = desc.getPersistListener(); + assertTrue(persistListener instanceof ChainedBeanPersistListener); + assertEquals(2, ((ChainedBeanPersistListener) persistListener).size()); + + desc.deregister(listener1); + assertEquals(1, ((ChainedBeanPersistListener)desc.getPersistListener()).size()); + + desc.deregister(listener2); + assertEquals(0, ((ChainedBeanPersistListener)desc.getPersistListener()).size()); + } + + public static class Listener1 extends AbstractBeanPersistListener { + + @Override + public boolean isRegisterFor(Class cls) { + return EBasic.class.isAssignableFrom(cls); + } + + } + + public static class Listener2 extends AbstractBeanPersistListener { + + @Override + public boolean isRegisterFor(Class cls) { + return EBasic.class.isAssignableFrom(cls); + } + + } + + public static class Controller1 extends BeanPersistAdapter { + + @Override + public boolean isRegisterFor(Class cls) { + return EBasic.class.isAssignableFrom(cls); + } + } + + public static class Controller2 extends BeanPersistAdapter { + + @Override + public boolean isRegisterFor(Class cls) { + return EBasic.class.isAssignableFrom(cls); + } + } +} \ No newline at end of file diff --git a/src/test/resources/ebean.properties b/src/test/resources/ebean.properties index daa5877f2..acf4ebc40 100644 --- a/src/test/resources/ebean.properties +++ b/src/test/resources/ebean.properties @@ -68,6 +68,11 @@ datasource.h2autocommit.password= datasource.h2autocommit.databaseUrl=jdbc:h2:mem:autocommittests datasource.h2autocommit.databaseDriver=org.h2.Driver +datasource.h2other.username=sa +datasource.h2other.password= +datasource.h2other.databaseUrl=jdbc:h2:mem:h2other;DB_CLOSE_DELAY=-1 +datasource.h2other.databaseDriver=org.h2.Driver + datasource.sqlite.username= datasource.sqlite.password=