From f3e66c459a6f3448f6ab757690557f31145ad3ed Mon Sep 17 00:00:00 2001 From: Robin Bygrave Date: Tue, 25 Aug 2015 13:54:34 +1200 Subject: [PATCH] #390 - ChangeLog - Add ServerConfig.isChangeLogIncludeInserts() and ChangeLogInsertMode enum with associated changes --- .../com/avaje/ebean/annotation/ChangeLog.java | 9 ++++-- .../ebean/annotation/ChangeLogInsertMode.java | 22 +++++++++++++ .../com/avaje/ebean/config/ServerConfig.java | 20 ++++++++++++ .../changelog/DefaultChangeLogRegister.java | 24 ++++++++++++-- .../server/core/InternalConfiguration.java | 3 +- .../DefaultChangeLogRegisterTest.java | 31 +++++++++++++++++-- .../com/avaje/tests/model/basic/Country.java | 17 +++++----- .../com/avaje/tests/model/basic/Customer.java | 3 +- 8 files changed, 111 insertions(+), 18 deletions(-) create mode 100644 src/main/java/com/avaje/ebean/annotation/ChangeLogInsertMode.java diff --git a/src/main/java/com/avaje/ebean/annotation/ChangeLog.java b/src/main/java/com/avaje/ebean/annotation/ChangeLog.java index e5798cb4e..9fa699498 100644 --- a/src/main/java/com/avaje/ebean/annotation/ChangeLog.java +++ b/src/main/java/com/avaje/ebean/annotation/ChangeLog.java @@ -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. + *

+ * If not defined explicitly then the server default behaviour defined + * on ServerConfig is used. + *

*/ - boolean excludeInserts() default false; + ChangeLogInsertMode inserts() default ChangeLogInsertMode.DEFAULT; /** * When specified only include update requests that have at least one diff --git a/src/main/java/com/avaje/ebean/annotation/ChangeLogInsertMode.java b/src/main/java/com/avaje/ebean/annotation/ChangeLogInsertMode.java new file mode 100644 index 000000000..2cb17e9de --- /dev/null +++ b/src/main/java/com/avaje/ebean/annotation/ChangeLogInsertMode.java @@ -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 +} diff --git a/src/main/java/com/avaje/ebean/config/ServerConfig.java b/src/main/java/com/avaje/ebean/config/ServerConfig.java index 5dd492047..1cdc2290c 100644 --- a/src/main/java/com/avaje/ebean/config/ServerConfig.java +++ b/src/main/java/com/avaje/ebean/config/ServerConfig.java @@ -288,6 +288,11 @@ public class ServerConfig { private List configStartupListeners = new ArrayList(); private List transactionEventListeners = new ArrayList(); + /** + * 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); diff --git a/src/main/java/com/avaje/ebeaninternal/server/changelog/DefaultChangeLogRegister.java b/src/main/java/com/avaje/ebeaninternal/server/changelog/DefaultChangeLogRegister.java index af7968708..4d8d1d0da 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/changelog/DefaultChangeLogRegister.java +++ b/src/main/java/com/avaje/ebeaninternal/server/changelog/DefaultChangeLogRegister.java @@ -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 updateProps = new HashSet(); @@ -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; } /** diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/InternalConfiguration.java b/src/main/java/com/avaje/ebeaninternal/server/core/InternalConfiguration.java index b38230e55..f0b0e0b30 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/InternalConfiguration.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/InternalConfiguration.java @@ -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)); } /** diff --git a/src/test/java/com/avaje/ebeaninternal/server/changelog/DefaultChangeLogRegisterTest.java b/src/test/java/com/avaje/ebeaninternal/server/changelog/DefaultChangeLogRegisterTest.java index 85a10bf72..1db0c8400 100644 --- a/src/test/java/com/avaje/ebeaninternal/server/changelog/DefaultChangeLogRegisterTest.java +++ b/src/test/java/com/avaje/ebeaninternal/server/changelog/DefaultChangeLogRegisterTest.java @@ -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); } diff --git a/src/test/java/com/avaje/tests/model/basic/Country.java b/src/test/java/com/avaje/tests/model/basic/Country.java index 499e54ab8..494dc5228 100644 --- a/src/test/java/com/avaje/tests/model/basic/Country.java +++ b/src/test/java/com/avaje/tests/model/basic/Country.java @@ -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 diff --git a/src/test/java/com/avaje/tests/model/basic/Customer.java b/src/test/java/com/avaje/tests/model/basic/Customer.java index 12ef8d2d1..2c45ed610 100644 --- a/src/test/java/com/avaje/tests/model/basic/Customer.java +++ b/src/test/java/com/avaje/tests/model/basic/Customer.java @@ -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 {