From 4272c176895c78a65b6ae5f72f46f6005bc336ea Mon Sep 17 00:00:00 2001 From: Robin Bygrave Date: Tue, 9 Feb 2016 14:48:41 +1300 Subject: [PATCH] #555 - Use a common timestamp value for @WhenCreated and @WhenModified --- .../generatedproperty/GeneratedCounter.java | 6 ++-- .../GeneratedCounterInteger.java | 6 ++-- .../GeneratedCounterLong.java | 6 ++-- .../GeneratedInsertDate.java | 8 +++-- .../GeneratedInsertJavaTime.java | 18 ++++------ .../GeneratedInsertJodaTime.java | 10 +++--- .../GeneratedInsertLong.java | 8 +++-- .../GeneratedInsertTimestamp.java | 8 +++-- .../generatedproperty/GeneratedProperty.java | 4 +-- .../GeneratedUpdateDate.java | 8 ++--- .../GeneratedUpdateJavaTime.java | 24 ++++++------- .../GeneratedUpdateJodaTime.java | 16 ++++----- .../GeneratedUpdateLong.java | 8 ++--- .../GeneratedUpdateTimestamp.java | 8 ++--- .../GeneratedWhoCreated.java | 4 +-- .../GeneratedWhoModified.java | 4 +-- .../generatedproperty/JavaTimeUtils.java | 34 +++++++++++++++++++ .../server/persist/dml/DmlHandler.java | 8 +++++ .../BindablePropertyInsertGenerated.java | 2 +- .../BindablePropertyUpdateGenerated.java | 2 +- .../persist/dmlbind/BindableRequest.java | 7 ++++ .../InsertTimestampFactoryTest.java | 10 +++--- .../UpdateTimestampFactoryTest.java | 8 ++--- .../generated/TestGeneratedProperties.java | 8 +++++ 24 files changed, 145 insertions(+), 80 deletions(-) create mode 100644 src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/JavaTimeUtils.java diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedCounter.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedCounter.java index 894fa1593..debb18e24 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedCounter.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedCounter.java @@ -18,14 +18,16 @@ public class GeneratedCounter implements GeneratedProperty { /** * Always returns a 1. */ - public Object getInsertValue(BeanProperty prop, EntityBean bean) { + @Override + public Object getInsertValue(BeanProperty prop, EntityBean bean, long now) { return BasicTypeConverter.convert(1, numberType); } /** * Increments the current value by one. */ - public Object getUpdateValue(BeanProperty prop, EntityBean bean) { + @Override + public Object getUpdateValue(BeanProperty prop, EntityBean bean, long now) { Number currVal = (Number) prop.getValue(bean); Integer nextVal = currVal.intValue() + 1; return BasicTypeConverter.convert(nextVal, numberType); diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedCounterInteger.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedCounterInteger.java index 9328bbb1f..c8f6dde39 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedCounterInteger.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedCounterInteger.java @@ -15,14 +15,16 @@ public class GeneratedCounterInteger implements GeneratedProperty { /** * Always returns a 1. */ - public Object getInsertValue(BeanProperty prop, EntityBean bean) { + @Override + public Object getInsertValue(BeanProperty prop, EntityBean bean, long now) { return 1; } /** * Increments the current value by one. */ - public Object getUpdateValue(BeanProperty prop, EntityBean bean) { + @Override + public Object getUpdateValue(BeanProperty prop, EntityBean bean, long now) { Integer i = (Integer) prop.getValue(bean); return i + 1; } diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedCounterLong.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedCounterLong.java index 40a53f92c..75b764de0 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedCounterLong.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedCounterLong.java @@ -15,14 +15,16 @@ public class GeneratedCounterLong implements GeneratedProperty { /** * Always returns a 1. */ - public Object getInsertValue(BeanProperty prop, EntityBean bean) { + @Override + public Object getInsertValue(BeanProperty prop, EntityBean bean, long now) { return (long) 1; } /** * Increments the current value by one. */ - public Object getUpdateValue(BeanProperty prop, EntityBean bean) { + @Override + public Object getUpdateValue(BeanProperty prop, EntityBean bean, long now) { Long i = (Long) prop.getValue(bean); return i + 1; } diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertDate.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertDate.java index 098a7dc6e..7fe171228 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertDate.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertDate.java @@ -13,14 +13,16 @@ public class GeneratedInsertDate implements GeneratedProperty { /** * Return the current time as a Timestamp. */ - public Object getInsertValue(BeanProperty prop, EntityBean bean) { - return new Date(System.currentTimeMillis()); + @Override + public Object getInsertValue(BeanProperty prop, EntityBean bean, long now) { + return new Date(now); } /** * Just returns the beans original insert timestamp value. */ - public Object getUpdateValue(BeanProperty prop, EntityBean bean) { + @Override + public Object getUpdateValue(BeanProperty prop, EntityBean bean, long now) { return prop.getValue(bean); } diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertJavaTime.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertJavaTime.java index 5b5c56fa8..a043d0eed 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertJavaTime.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertJavaTime.java @@ -3,10 +3,6 @@ package com.avaje.ebeaninternal.server.deploy.generatedproperty; import com.avaje.ebean.bean.EntityBean; import com.avaje.ebeaninternal.server.deploy.BeanProperty; -import java.time.LocalDateTime; -import java.time.OffsetDateTime; -import java.time.ZonedDateTime; - /** * Support java.time types as GeneratedProperty. */ @@ -35,7 +31,7 @@ public class GeneratedInsertJavaTime { } @Override - public Object getUpdateValue(BeanProperty prop, EntityBean bean) { + public Object getUpdateValue(BeanProperty prop, EntityBean bean, long now) { return prop.getValue(bean); } } @@ -46,8 +42,8 @@ public class GeneratedInsertJavaTime { public static class LocalDT extends Base { @Override - public Object getInsertValue(BeanProperty prop, EntityBean bean) { - return LocalDateTime.now(); + public Object getInsertValue(BeanProperty prop, EntityBean bean, long now) { + return JavaTimeUtils.toLocalDateTime(now); } } @@ -57,8 +53,8 @@ public class GeneratedInsertJavaTime { public static class OffsetDT extends Base { @Override - public Object getInsertValue(BeanProperty prop, EntityBean bean) { - return OffsetDateTime.now(); + public Object getInsertValue(BeanProperty prop, EntityBean bean, long now) { + return JavaTimeUtils.toOffsetDateTime(now); } } @@ -69,8 +65,8 @@ public class GeneratedInsertJavaTime { public static class ZonedDT extends Base { @Override - public Object getInsertValue(BeanProperty prop, EntityBean bean) { - return ZonedDateTime.now(); + public Object getInsertValue(BeanProperty prop, EntityBean bean, long now) { + return JavaTimeUtils.toZonedDateTime(now); } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertJodaTime.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertJodaTime.java index ffc7963ec..3c3729c8d 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertJodaTime.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertJodaTime.java @@ -34,7 +34,7 @@ public class GeneratedInsertJodaTime { } @Override - public Object getUpdateValue(BeanProperty prop, EntityBean bean) { + public Object getUpdateValue(BeanProperty prop, EntityBean bean, long now) { return prop.getValue(bean); } } @@ -45,8 +45,8 @@ public class GeneratedInsertJodaTime { public static class LocalDT extends Base { @Override - public Object getInsertValue(BeanProperty prop, EntityBean bean) { - return new LocalDateTime(); + public Object getInsertValue(BeanProperty prop, EntityBean bean, long now) { + return new LocalDateTime(now); } } @@ -56,8 +56,8 @@ public class GeneratedInsertJodaTime { public static class DateTimeDT extends Base { @Override - public Object getInsertValue(BeanProperty prop, EntityBean bean) { - return new DateTime(); + public Object getInsertValue(BeanProperty prop, EntityBean bean, long now) { + return new DateTime(now); } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertLong.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertLong.java index 6c6aa3683..822ff71eb 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertLong.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertLong.java @@ -11,14 +11,16 @@ public class GeneratedInsertLong implements GeneratedProperty { /** * Return the current time as a Timestamp. */ - public Object getInsertValue(BeanProperty prop, EntityBean bean) { - return System.currentTimeMillis(); + @Override + public Object getInsertValue(BeanProperty prop, EntityBean bean, long now) { + return now; } /** * Just returns the beans original insert timestamp value. */ - public Object getUpdateValue(BeanProperty prop, EntityBean bean) { + @Override + public Object getUpdateValue(BeanProperty prop, EntityBean bean, long now) { return prop.getValue(bean); } diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertTimestamp.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertTimestamp.java index eff2d5ffd..1aceee212 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertTimestamp.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedInsertTimestamp.java @@ -13,14 +13,16 @@ public class GeneratedInsertTimestamp implements GeneratedProperty, GeneratedWhe /** * Return the current time as a Timestamp. */ - public Object getInsertValue(BeanProperty prop, EntityBean bean) { - return new Timestamp(System.currentTimeMillis()); + @Override + public Object getInsertValue(BeanProperty prop, EntityBean bean, long now) { + return new Timestamp(now); } /** * Just returns the beans original insert timestamp value. */ - public Object getUpdateValue(BeanProperty prop, EntityBean bean) { + @Override + public Object getUpdateValue(BeanProperty prop, EntityBean bean, long now) { return prop.getValue(bean); } diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedProperty.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedProperty.java index d70d7dab1..28d361e7a 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedProperty.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedProperty.java @@ -12,12 +12,12 @@ public interface GeneratedProperty { /** * Get the generated insert value for a specific property of a bean. */ - Object getInsertValue(BeanProperty prop, EntityBean bean); + Object getInsertValue(BeanProperty prop, EntityBean bean, long now); /** * Get the generated update value for a specific property of a bean. */ - Object getUpdateValue(BeanProperty prop, EntityBean bean); + Object getUpdateValue(BeanProperty prop, EntityBean bean, long now); /** * Return true if this should always be includes in an update statement. diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateDate.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateDate.java index 1602102d7..11ed02e99 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateDate.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateDate.java @@ -14,15 +14,15 @@ public class GeneratedUpdateDate implements GeneratedProperty { /** * Return now as a Timestamp. */ - public Object getInsertValue(BeanProperty prop, EntityBean bean) { - return new Date(System.currentTimeMillis()); + public Object getInsertValue(BeanProperty prop, EntityBean bean, long now) { + return new Date(now); } /** * Return now as a Timestamp. */ - public Object getUpdateValue(BeanProperty prop, EntityBean bean) { - return new Date(System.currentTimeMillis()); + public Object getUpdateValue(BeanProperty prop, EntityBean bean, long now) { + return new Date(now); } /** diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateJavaTime.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateJavaTime.java index 953402dfd..e37894c45 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateJavaTime.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateJavaTime.java @@ -41,13 +41,13 @@ public class GeneratedUpdateJavaTime { public static class LocalDT extends Base { @Override - public Object getInsertValue(BeanProperty prop, EntityBean bean) { - return LocalDateTime.now(); + public Object getInsertValue(BeanProperty prop, EntityBean bean, long now) { + return JavaTimeUtils.toLocalDateTime(now); } @Override - public Object getUpdateValue(BeanProperty prop, EntityBean bean) { - return LocalDateTime.now(); + public Object getUpdateValue(BeanProperty prop, EntityBean bean, long now) { + return JavaTimeUtils.toLocalDateTime(now); } } @@ -57,13 +57,13 @@ public class GeneratedUpdateJavaTime { public static class OffsetDT extends Base { @Override - public Object getInsertValue(BeanProperty prop, EntityBean bean) { - return OffsetDateTime.now(); + public Object getInsertValue(BeanProperty prop, EntityBean bean, long now) { + return JavaTimeUtils.toOffsetDateTime(now); } @Override - public Object getUpdateValue(BeanProperty prop, EntityBean bean) { - return OffsetDateTime.now(); + public Object getUpdateValue(BeanProperty prop, EntityBean bean, long now) { + return JavaTimeUtils.toOffsetDateTime(now); } } @@ -73,13 +73,13 @@ public class GeneratedUpdateJavaTime { public static class ZonedDT extends Base { @Override - public Object getInsertValue(BeanProperty prop, EntityBean bean) { - return ZonedDateTime.now(); + public Object getInsertValue(BeanProperty prop, EntityBean bean, long now) { + return JavaTimeUtils.toZonedDateTime(now); } @Override - public Object getUpdateValue(BeanProperty prop, EntityBean bean) { - return ZonedDateTime.now(); + public Object getUpdateValue(BeanProperty prop, EntityBean bean, long now) { + return JavaTimeUtils.toZonedDateTime(now); } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateJodaTime.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateJodaTime.java index 7e3ca60b8..9c3971201 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateJodaTime.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateJodaTime.java @@ -40,13 +40,13 @@ public class GeneratedUpdateJodaTime { public static class LocalDT extends Base { @Override - public Object getInsertValue(BeanProperty prop, EntityBean bean) { - return new LocalDateTime(); + public Object getInsertValue(BeanProperty prop, EntityBean bean, long now) { + return new LocalDateTime(now); } @Override - public Object getUpdateValue(BeanProperty prop, EntityBean bean) { - return new LocalDateTime(); + public Object getUpdateValue(BeanProperty prop, EntityBean bean, long now) { + return new LocalDateTime(now); } } @@ -56,13 +56,13 @@ public class GeneratedUpdateJodaTime { public static class DateTimeDT extends Base { @Override - public Object getInsertValue(BeanProperty prop, EntityBean bean) { - return new DateTime(); + public Object getInsertValue(BeanProperty prop, EntityBean bean, long now) { + return new DateTime(now); } @Override - public Object getUpdateValue(BeanProperty prop, EntityBean bean) { - return new DateTime(); + public Object getUpdateValue(BeanProperty prop, EntityBean bean, long now) { + return new DateTime(now); } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateLong.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateLong.java index 9aa6be812..5f26b7c1b 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateLong.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateLong.java @@ -11,15 +11,15 @@ public class GeneratedUpdateLong implements GeneratedProperty { /** * Return now as a Timestamp. */ - public Object getInsertValue(BeanProperty prop, EntityBean bean) { - return System.currentTimeMillis(); + public Object getInsertValue(BeanProperty prop, EntityBean bean, long now) { + return now; } /** * Return now as a Timestamp. */ - public Object getUpdateValue(BeanProperty prop, EntityBean bean) { - return System.currentTimeMillis(); + public Object getUpdateValue(BeanProperty prop, EntityBean bean, long now) { + return now; } /** diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateTimestamp.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateTimestamp.java index 747890502..e17dd4a27 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateTimestamp.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedUpdateTimestamp.java @@ -13,15 +13,15 @@ public class GeneratedUpdateTimestamp implements GeneratedProperty, GeneratedWhe /** * Return now as a Timestamp. */ - public Object getInsertValue(BeanProperty prop, EntityBean bean) { - return new Timestamp(System.currentTimeMillis()); + public Object getInsertValue(BeanProperty prop, EntityBean bean, long now) { + return new Timestamp(now); } /** * Return now as a Timestamp. */ - public Object getUpdateValue(BeanProperty prop, EntityBean bean) { - return new Timestamp(System.currentTimeMillis()); + public Object getUpdateValue(BeanProperty prop, EntityBean bean, long now) { + return new Timestamp(now); } /** diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedWhoCreated.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedWhoCreated.java index c0b9fb950..9f53cdd5b 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedWhoCreated.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedWhoCreated.java @@ -16,12 +16,12 @@ public class GeneratedWhoCreated implements GeneratedProperty { } @Override - public Object getInsertValue(BeanProperty prop, EntityBean bean) { + public Object getInsertValue(BeanProperty prop, EntityBean bean, long now) { return currentUserProvider.currentUser(); } @Override - public Object getUpdateValue(BeanProperty prop, EntityBean bean) { + public Object getUpdateValue(BeanProperty prop, EntityBean bean, long now) { return null; } diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedWhoModified.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedWhoModified.java index dbfc93896..ec413e90e 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedWhoModified.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/GeneratedWhoModified.java @@ -16,12 +16,12 @@ public class GeneratedWhoModified implements GeneratedProperty { } @Override - public Object getInsertValue(BeanProperty prop, EntityBean bean) { + public Object getInsertValue(BeanProperty prop, EntityBean bean, long now) { return currentUserProvider.currentUser(); } @Override - public Object getUpdateValue(BeanProperty prop, EntityBean bean) { + public Object getUpdateValue(BeanProperty prop, EntityBean bean, long now) { return currentUserProvider.currentUser(); } diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/JavaTimeUtils.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/JavaTimeUtils.java new file mode 100644 index 000000000..d1077e34d --- /dev/null +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/JavaTimeUtils.java @@ -0,0 +1,34 @@ +package com.avaje.ebeaninternal.server.deploy.generatedproperty; + +import java.sql.Timestamp; +import java.time.Instant; +import java.time.OffsetDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; + +/** + * Helper methods for Java time conversion. + */ +public class JavaTimeUtils { + + /** + * Return the system millis time as a LocalDateTime. + */ + public static Object toLocalDateTime(long systemMillis) { + return new Timestamp(systemMillis).toLocalDateTime(); + } + + /** + * Return the system millis time as a OffsetDateTime. + */ + public static Object toOffsetDateTime(long systemMillis) { + return OffsetDateTime.ofInstant(Instant.ofEpochMilli(systemMillis), ZoneId.systemDefault()); + } + + /** + * Return the system millis time as a ZonedDateTime. + */ + public static Object toZonedDateTime(long systemMillis) { + return ZonedDateTime.ofInstant(Instant.ofEpochMilli(systemMillis), ZoneId.systemDefault()); + } +} diff --git a/src/main/java/com/avaje/ebeaninternal/server/persist/dml/DmlHandler.java b/src/main/java/com/avaje/ebeaninternal/server/persist/dml/DmlHandler.java index 66d1365c0..fc9473ccc 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/persist/dml/DmlHandler.java +++ b/src/main/java/com/avaje/ebeaninternal/server/persist/dml/DmlHandler.java @@ -39,6 +39,8 @@ public abstract class DmlHandler implements PersistHandler, BindableRequest { protected final boolean logLevelSql; + protected final long now; + /** * The PreparedStatement used for the dml. */ @@ -49,6 +51,7 @@ public abstract class DmlHandler implements PersistHandler, BindableRequest { protected ArrayList updateGenValues; protected DmlHandler(PersistRequestBean persistRequest, boolean emptyStringToNull) { + this.now = System.currentTimeMillis(); this.persistRequest = persistRequest; this.emptyStringToNull = emptyStringToNull; this.transaction = persistRequest.getTransaction(); @@ -60,6 +63,11 @@ public abstract class DmlHandler implements PersistHandler, BindableRequest { } } + @Override + public long now() { + return now; + } + @Override public PersistRequestBean getPersistRequest() { return persistRequest; diff --git a/src/main/java/com/avaje/ebeaninternal/server/persist/dmlbind/BindablePropertyInsertGenerated.java b/src/main/java/com/avaje/ebeaninternal/server/persist/dmlbind/BindablePropertyInsertGenerated.java index 9a6f1cd90..c7b6e8016 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/persist/dmlbind/BindablePropertyInsertGenerated.java +++ b/src/main/java/com/avaje/ebeaninternal/server/persist/dmlbind/BindablePropertyInsertGenerated.java @@ -24,7 +24,7 @@ public class BindablePropertyInsertGenerated extends BindableProperty { public void dmlBind(BindableRequest request, EntityBean bean) throws SQLException { - Object value = gen.getInsertValue(prop, bean); + Object value = gen.getInsertValue(prop, bean, request.now()); // generated value should be the correct type if (bean != null) { diff --git a/src/main/java/com/avaje/ebeaninternal/server/persist/dmlbind/BindablePropertyUpdateGenerated.java b/src/main/java/com/avaje/ebeaninternal/server/persist/dmlbind/BindablePropertyUpdateGenerated.java index 705b62051..fba5f5768 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/persist/dmlbind/BindablePropertyUpdateGenerated.java +++ b/src/main/java/com/avaje/ebeaninternal/server/persist/dmlbind/BindablePropertyUpdateGenerated.java @@ -37,7 +37,7 @@ public class BindablePropertyUpdateGenerated extends BindableProperty { public void dmlBind(BindableRequest request, EntityBean bean) throws SQLException { - Object value = gen.getUpdateValue(prop, bean); + Object value = gen.getUpdateValue(prop, bean, request.now()); // generated value should be the correct type request.bind(value, prop); diff --git a/src/main/java/com/avaje/ebeaninternal/server/persist/dmlbind/BindableRequest.java b/src/main/java/com/avaje/ebeaninternal/server/persist/dmlbind/BindableRequest.java index bc1e9c03a..004cd5fd7 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/persist/dmlbind/BindableRequest.java +++ b/src/main/java/com/avaje/ebeaninternal/server/persist/dmlbind/BindableRequest.java @@ -56,4 +56,11 @@ public interface BindableRequest { PersistRequestBean getPersistRequest(); void registerDerivedRelationship(DerivedRelationshipData assocBean); + + /** + * Return the system current time in millis. This is expected to the same time used + * by multiple generated properties for a single request. + */ + long now(); + } diff --git a/src/test/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/InsertTimestampFactoryTest.java b/src/test/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/InsertTimestampFactoryTest.java index 47cf87ced..fc770d7a4 100644 --- a/src/test/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/InsertTimestampFactoryTest.java +++ b/src/test/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/InsertTimestampFactoryTest.java @@ -8,7 +8,7 @@ import java.sql.Timestamp; import java.time.LocalDateTime; import java.time.OffsetDateTime; -import static org.junit.Assert.*; +import static org.junit.Assert.assertTrue; public class InsertTimestampFactoryTest { @@ -20,7 +20,7 @@ public class InsertTimestampFactoryTest { DeployBeanProperty prop = new DeployBeanProperty(null, LocalDateTime.class, null, null); GeneratedProperty insertTimestamp = factory.createInsertTimestamp(prop); - Object value = insertTimestamp.getInsertValue(null, null); + Object value = insertTimestamp.getInsertValue(null, null, System.currentTimeMillis()); assertTrue(value instanceof LocalDateTime); } @@ -30,7 +30,7 @@ public class InsertTimestampFactoryTest { DeployBeanProperty prop = new DeployBeanProperty(null, OffsetDateTime.class, null, null); GeneratedProperty insertTimestamp = factory.createInsertTimestamp(prop); - Object value = insertTimestamp.getInsertValue(null, null); + Object value = insertTimestamp.getInsertValue(null, null, System.currentTimeMillis()); assertTrue(value instanceof OffsetDateTime); } @@ -40,7 +40,7 @@ public class InsertTimestampFactoryTest { DeployBeanProperty prop = new DeployBeanProperty(null, Timestamp.class, null, null); GeneratedProperty insertTimestamp = factory.createInsertTimestamp(prop); - Object value = insertTimestamp.getInsertValue(null, null); + Object value = insertTimestamp.getInsertValue(null, null, System.currentTimeMillis()); assertTrue(value instanceof Timestamp); } @@ -50,7 +50,7 @@ public class InsertTimestampFactoryTest { DeployBeanProperty prop = new DeployBeanProperty(null, java.util.Date.class, null, null); GeneratedProperty insertTimestamp = factory.createInsertTimestamp(prop); - Object value = insertTimestamp.getInsertValue(null, null); + Object value = insertTimestamp.getInsertValue(null, null, System.currentTimeMillis()); assertTrue(value instanceof java.util.Date); } diff --git a/src/test/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/UpdateTimestampFactoryTest.java b/src/test/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/UpdateTimestampFactoryTest.java index 956da2a07..12b5ca2d2 100644 --- a/src/test/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/UpdateTimestampFactoryTest.java +++ b/src/test/java/com/avaje/ebeaninternal/server/deploy/generatedproperty/UpdateTimestampFactoryTest.java @@ -21,7 +21,7 @@ public class UpdateTimestampFactoryTest { DeployBeanProperty prop = new DeployBeanProperty(null, LocalDateTime.class, null, null); GeneratedProperty generatedProperty = factory.createUpdateTimestamp(prop); - Object value = generatedProperty.getInsertValue(null, null); + Object value = generatedProperty.getInsertValue(null, null, System.currentTimeMillis()); assertTrue(value instanceof LocalDateTime); } @@ -31,7 +31,7 @@ public class UpdateTimestampFactoryTest { DeployBeanProperty prop = new DeployBeanProperty(null, OffsetDateTime.class, null, null); GeneratedProperty generatedProperty = factory.createUpdateTimestamp(prop); - Object value = generatedProperty.getInsertValue(null, null); + Object value = generatedProperty.getInsertValue(null, null, System.currentTimeMillis()); assertTrue(value instanceof OffsetDateTime); } @@ -41,7 +41,7 @@ public class UpdateTimestampFactoryTest { DeployBeanProperty prop = new DeployBeanProperty(null, Timestamp.class, null, null); GeneratedProperty generatedProperty = factory.createUpdateTimestamp(prop); - Object value = generatedProperty.getInsertValue(null, null); + Object value = generatedProperty.getInsertValue(null, null, System.currentTimeMillis()); assertTrue(value instanceof Timestamp); } @@ -51,7 +51,7 @@ public class UpdateTimestampFactoryTest { DeployBeanProperty prop = new DeployBeanProperty(null, java.util.Date.class, null, null); GeneratedProperty generatedProperty = factory.createUpdateTimestamp(prop); - Object value = generatedProperty.getInsertValue(null, null); + Object value = generatedProperty.getInsertValue(null, null, System.currentTimeMillis()); assertTrue(value instanceof java.util.Date); } } \ No newline at end of file diff --git a/src/test/java/com/avaje/tests/generated/TestGeneratedProperties.java b/src/test/java/com/avaje/tests/generated/TestGeneratedProperties.java index e571c80bc..f62a4c641 100644 --- a/src/test/java/com/avaje/tests/generated/TestGeneratedProperties.java +++ b/src/test/java/com/avaje/tests/generated/TestGeneratedProperties.java @@ -5,6 +5,7 @@ import com.avaje.ebean.Ebean; import com.avaje.tests.model.EGenProps; import org.junit.Test; +import static org.assertj.core.api.StrictAssertions.assertThat; import static org.junit.Assert.assertNotNull; public class TestGeneratedProperties extends BaseTestCase { @@ -31,9 +32,16 @@ public class TestGeneratedProperties extends BaseTestCase { assertNotNull(bean.getLongCreated()); assertNotNull(bean.getLongUpdated()); + assertThat(bean.getWhenCreated().toInstant().toEpochMilli()).isEqualTo(bean.getLongCreated()); + assertThat(bean.getWhenModified().toInstant().toEpochMilli()).isEqualTo(bean.getLongCreated()); + assertThat(bean.getWhenModified().toInstant().toEpochMilli()).isEqualTo(bean.getLongCreated()); + bean.setName("updating..."); Ebean.save(bean); + assertThat(bean.getWhenModified()).isNotEqualTo(bean.getLongCreated()); + assertThat(bean.getWhenModified().toInstant().toEpochMilli()).isEqualTo(bean.getLongUpdated()); + Ebean.delete(bean); } }