#312 - Ability to remove deregister BeanPersistListeners removed

This commit is contained in:
rbygrave
2015-06-24 22:32:12 +12:00
parent 46a1324f58
commit 29a6bbb6e6
6 changed files with 170 additions and 19 deletions
@@ -1819,8 +1819,7 @@ public class ServerConfig {
String classNames = properties.get("classes", null);
if (classNames == null) {
return null;
return classes;
}
List<Class<?>> classes = new ArrayList<Class<?>>();
@@ -1525,17 +1525,35 @@ public class BeanDescriptor<T> 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<T> 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<T> 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);
}
}
}
@@ -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.
*/
@@ -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<BeanPersistListener> list) {
this.list = list;
@@ -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<EBasic> desc = ebeanServer.getBeanDescriptor(EBasic.class);
persistListenerRegistrationTests(desc);
persistControllerRegistrationTests(desc);
}
private void persistControllerRegistrationTests(BeanDescriptor<EBasic> 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<EBasic> 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);
}
}
}
+5
View File
@@ -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=