#390 - ChangeLog - Add ServerConfig.isChangeLogIncludeInserts() and ChangeLogInsertMode enum with associated changes

This commit is contained in:
Robin Bygrave
2015-08-25 13:54:34 +12:00
parent 16d5e04809
commit f3e66c459a
8 changed files with 111 additions and 18 deletions
@@ -13,10 +13,13 @@ import java.lang.annotation.Target;
public @interface ChangeLog {
/**
* Set this to true to exclude inserts on the associated bean type
* from being included in the change log.
* Specify if inserts should be explicitly Included or Excluded.
* <p>
* If not defined explicitly then the server default behaviour defined
* on ServerConfig is used.
* </p>
*/
boolean excludeInserts() default false;
ChangeLogInsertMode inserts() default ChangeLogInsertMode.DEFAULT;
/**
* When specified only include update requests that have at least one
@@ -0,0 +1,22 @@
package com.avaje.ebean.annotation;
/**
* The mode used to determine if inserts should be included or not for a given bean type.
*/
public enum ChangeLogInsertMode {
/**
* Use the default behaviour as defined on ServerConfig.
*/
DEFAULT,
/**
* Include inserts in the change log.
*/
INCLUDE,
/**
* Exclude inserts in the change log.
*/
EXCLUDE
}
@@ -288,6 +288,11 @@ public class ServerConfig {
private List<ServerConfigStartup> configStartupListeners = new ArrayList<ServerConfigStartup>();
private List<TransactionEventListener> transactionEventListeners = new ArrayList<TransactionEventListener>();
/**
* By default inserts are included in the change log.
*/
private boolean changeLogIncludeInserts = true;
private ChangeLogPrepare changeLogPrepare;
private ChangeLogListener changeLogListener;
@@ -706,6 +711,20 @@ public class ServerConfig {
this.changeLogRegister = changeLogRegister;
}
/**
* Return true if inserts should be included in the change log by default.
*/
public boolean isChangeLogIncludeInserts() {
return changeLogIncludeInserts;
}
/**
* Set if inserts should be included in the change log by default.
*/
public void setChangeLogIncludeInserts(boolean changeLogIncludeInserts) {
this.changeLogIncludeInserts = changeLogIncludeInserts;
}
/**
* Return the DB migration configuration.
*/
@@ -2054,6 +2073,7 @@ public class ServerConfig {
persistenceContextScope = PersistenceContextScope.valueOf(p.get("persistenceContextScope", "TRANSACTION"));
changeLogIncludeInserts = p.getBoolean("changeLogIncludeInserts", changeLogIncludeInserts);
expressionEqualsWithNullAsNoop = p.getBoolean("expressionEqualsWithNullAsNoop", expressionEqualsWithNullAsNoop);
diffFlatMode = p.getBoolean("diffFlatMode", diffFlatMode);
asOfViewSuffix = p.get("asOfViewSuffix", asOfViewSuffix);
@@ -1,6 +1,7 @@
package com.avaje.ebeaninternal.server.changelog;
import com.avaje.ebean.annotation.ChangeLog;
import com.avaje.ebean.annotation.ChangeLogInsertMode;
import com.avaje.ebean.event.BeanPersistRequest;
import com.avaje.ebean.event.changelog.ChangeLogFilter;
import com.avaje.ebean.event.changelog.ChangeLogRegister;
@@ -17,6 +18,14 @@ public class DefaultChangeLogRegister implements ChangeLogRegister {
private static final BasicFilter EXCLUDE_INSERTS = new BasicFilter(false);
private final boolean defaultInsertsInclude;
/**
* Create with the default insertsIncluded from ServerConfig.
*/
public DefaultChangeLogRegister(boolean defaultInsertsInclude) {
this.defaultInsertsInclude = defaultInsertsInclude;
}
@Override
public ChangeLogFilter getChangeFilter(Class<?> beanType) {
@@ -28,7 +37,7 @@ public class DefaultChangeLogRegister implements ChangeLogRegister {
String[] updatesThatInclude = changeLog.updatesThatInclude();
if (updatesThatInclude.length == 0) {
return changeLog.excludeInserts() ? EXCLUDE_INSERTS : INCLUDE_INSERTS;
return insertModeInclude(changeLog.inserts()) ? INCLUDE_INSERTS : EXCLUDE_INSERTS;
}
Set<String> updateProps = new HashSet<String>();
@@ -36,7 +45,18 @@ public class DefaultChangeLogRegister implements ChangeLogRegister {
updateProps.add(updatesThatInclude[i]);
}
return new UpdateFilter(!changeLog.excludeInserts(), updateProps);
return new UpdateFilter(insertModeInclude(changeLog.inserts()), updateProps);
}
/**
* Return true if inserts should be included in the change log.
*/
private boolean insertModeInclude(ChangeLogInsertMode inserts) {
if (inserts == ChangeLogInsertMode.DEFAULT) {
// return the default as per the ServerConfig
return defaultInsertsInclude;
}
return ChangeLogInsertMode.INCLUDE == inserts;
}
/**
@@ -180,7 +180,8 @@ public class InternalConfiguration {
* Return the ChangeLogRegister to use with a default implementation if none defined.
*/
public ChangeLogRegister changeLogRegister(ChangeLogRegister register) {
return plugin((register != null) ? register : new DefaultChangeLogRegister());
boolean includeInserts = serverConfig.isChangeLogIncludeInserts();
return plugin((register != null) ? register : new DefaultChangeLogRegister(includeInserts));
}
/**
@@ -15,10 +15,11 @@ import static org.junit.Assert.assertTrue;
public class DefaultChangeLogRegisterTest extends BaseTestCase {
DefaultChangeLogRegister register = new DefaultChangeLogRegister();
@Test
public void test() {
public void test_defaultInsertTrue() {
DefaultChangeLogRegister register = new DefaultChangeLogRegister(true);
assertNull(register.getChangeFilter(Address.class));
@@ -27,13 +28,37 @@ public class DefaultChangeLogRegisterTest extends BaseTestCase {
assertFalse(updateFilter.includeInserts);
assertThat(updateFilter.updateProperties).containsExactly("name", "status");
changeFilter = register.getChangeFilter(Country.class);
DefaultChangeLogRegister.BasicFilter countryFilter = (DefaultChangeLogRegister.BasicFilter)changeFilter;
assertTrue(countryFilter.includeInserts);
// use default setting
changeFilter = register.getChangeFilter(Contact.class);
DefaultChangeLogRegister.BasicFilter contactFilter = (DefaultChangeLogRegister.BasicFilter)changeFilter;
assertTrue(contactFilter.includeInserts);
}
@Test
public void test_defaultInsertFalse() {
DefaultChangeLogRegister register = new DefaultChangeLogRegister(false);
assertNull(register.getChangeFilter(Address.class));
ChangeLogFilter changeFilter = register.getChangeFilter(Customer.class);
DefaultChangeLogRegister.UpdateFilter updateFilter = (DefaultChangeLogRegister.UpdateFilter)changeFilter;
assertFalse(updateFilter.includeInserts);
assertThat(updateFilter.updateProperties).containsExactly("name", "status");
changeFilter = register.getChangeFilter(Country.class);
DefaultChangeLogRegister.BasicFilter countryFilter = (DefaultChangeLogRegister.BasicFilter)changeFilter;
assertFalse(countryFilter.includeInserts);
assertTrue(countryFilter.includeInserts);
// use default setting
changeFilter = register.getChangeFilter(Contact.class);
DefaultChangeLogRegister.BasicFilter contactFilter = (DefaultChangeLogRegister.BasicFilter)changeFilter;
assertFalse(contactFilter.includeInserts);
}
@@ -1,22 +1,23 @@
package com.avaje.tests.model.basic;
import com.avaje.ebean.annotation.CacheStrategy;
import com.avaje.ebean.annotation.CacheTuning;
import com.avaje.ebean.annotation.ChangeLog;
import com.avaje.ebean.annotation.ChangeLogInsertMode;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.Size;
import com.avaje.ebean.annotation.CacheStrategy;
import com.avaje.ebean.annotation.CacheTuning;
import com.avaje.ebean.annotation.ChangeLog;
/**
* Country entity bean.
*/
@ChangeLog(excludeInserts = true)
@CacheStrategy(readOnly=true,warmingQuery="order by name")
@CacheTuning(maxSize=500)
@ChangeLog(inserts = ChangeLogInsertMode.INCLUDE)
@CacheStrategy(readOnly = true, warmingQuery = "order by name")
@CacheTuning(maxSize = 500)
@Entity
@Table(name="o_country")
@Table(name = "o_country")
public class Country {
@Id
@@ -1,6 +1,7 @@
package com.avaje.tests.model.basic;
import com.avaje.ebean.annotation.ChangeLog;
import com.avaje.ebean.annotation.ChangeLogInsertMode;
import com.avaje.ebean.annotation.EnumValue;
import com.avaje.ebean.annotation.JsonIgnore;
import com.avaje.ebean.annotation.Where;
@@ -21,7 +22,7 @@ import java.util.concurrent.locks.ReentrantLock;
/**
* Customer entity bean.
*/
@ChangeLog(excludeInserts = true, updatesThatInclude = {"name","status"})
@ChangeLog(inserts = ChangeLogInsertMode.EXCLUDE, updatesThatInclude = {"name","status"})
@Entity
@Table(name = "o_customer")
public class Customer extends BasicDomain {