diff --git a/db/src/main/java/de/muehlencord/shared/db/Audit.java b/db/src/main/java/de/muehlencord/shared/db/Audit.java index 0597f9e..822e309 100644 --- a/db/src/main/java/de/muehlencord/shared/db/Audit.java +++ b/db/src/main/java/de/muehlencord/shared/db/Audit.java @@ -19,6 +19,7 @@ import java.io.Serializable; import java.util.Date; import javax.persistence.Basic; import javax.persistence.Column; +import javax.persistence.Embeddable; import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.validation.constraints.NotNull; @@ -27,6 +28,7 @@ import javax.validation.constraints.NotNull; * * @author joern.muehlencord */ +@Embeddable public class Audit implements Serializable { private static final long serialVersionUID = -955765069412891842L; diff --git a/db/src/main/java/de/muehlencord/shared/db/CommonAbstractController.java b/db/src/main/java/de/muehlencord/shared/db/CommonAbstractController.java index b3854e3..8ff1499 100644 --- a/db/src/main/java/de/muehlencord/shared/db/CommonAbstractController.java +++ b/db/src/main/java/de/muehlencord/shared/db/CommonAbstractController.java @@ -97,14 +97,20 @@ public abstract class CommonAbstractController { } if (EndDateable.class.isAssignableFrom(entity.getClass())) { EndDateable endDateable = (EndDateable) entity; - endDateable.setValidFrom(DateUtil.getCurrentTimeInUTC()); + if (endDateable.getValidity() == null) { + Validity validity = new Validity(); + endDateable.setValidity(validity); + } + if (endDateable.getValidity().getValidFrom() == null) { + endDateable.getValidity().setValidFrom(DateUtil.getCurrentTimeInUTC()); + } } em.persist(entity); return entity; } - private T executeUpdate(T entity, String updatedBy) throws ControllerException { - T currentEntity = attach(entity); + private T executeUpdate(T entity, String updatedBy) throws ControllerException { + T currentEntity = attach(entity); if (Auditable.class.isAssignableFrom(currentEntity.getClass())) { Audit audit = ((Auditable) currentEntity).getAudit(); ((Auditable) currentEntity).setAudit(applyAuditChanges(audit, false, updatedBy)); @@ -113,21 +119,28 @@ public abstract class CommonAbstractController { if (EndDateable.class.isAssignableFrom(currentEntity.getClass())) { // end date existing entity EndDateable endDateable = (EndDateable) currentEntity; - endDateable.setValidTo(DateUtil.getCurrentTimeInUTC()); + Validity validity = endDateable.getValidity(); + if (validity == null) { + validity = new Validity(); + validity.setValidFrom(DateUtil.getCurrentTimeInUTC()); + } + validity.setValidTo(DateUtil.getCurrentTimeInUTC()); + + endDateable.setValidity(validity); // and create new entity instead } - + return currentEntity; } @TransactionAttribute(TransactionAttributeType.REQUIRED) @Transactional @Lock(LockType.WRITE) - public T update(T entity, String updatedBy) throws ControllerException { - T currentEntity = executeUpdate(entity,updatedBy); + public T update(T entity, String updatedBy) throws ControllerException { + T currentEntity = executeUpdate(entity, updatedBy); T newEntity = EntityUtil.cloneToNewEntity(currentEntity); if (EndDateable.class.isAssignableFrom(entity.getClass())) { - em.merge (currentEntity); + em.merge(currentEntity); return create(newEntity, updatedBy); } else { @@ -144,7 +157,7 @@ public abstract class CommonAbstractController { // if the entity is endDateable just set the validToDate to now intead of executing the deletion if (EndDateable.class.isAssignableFrom(entity.getClass())) { T currentEntity = executeUpdate(entity, deletedBy); - em.merge (currentEntity); + em.merge(currentEntity); } else { em.remove(attach(entity)); } diff --git a/db/src/main/java/de/muehlencord/shared/db/EndDateable.java b/db/src/main/java/de/muehlencord/shared/db/EndDateable.java index e4840c3..5251b9f 100644 --- a/db/src/main/java/de/muehlencord/shared/db/EndDateable.java +++ b/db/src/main/java/de/muehlencord/shared/db/EndDateable.java @@ -15,21 +15,15 @@ */ package de.muehlencord.shared.db; -import java.util.Date; - /** * Enddateable entities are not deleted but an enddate is set to "now" * * @author Joern Muehlencord */ public interface EndDateable { - - Date getValidFrom(); - Date getValidTo(); + void setValidity(Validity v); - void setValidFrom(Date validFrom); - - void setValidTo(Date validTo); + Validity getValidity(); } diff --git a/db/src/main/java/de/muehlencord/shared/db/EntityUtil.java b/db/src/main/java/de/muehlencord/shared/db/EntityUtil.java index 4fa5267..b2cd843 100644 --- a/db/src/main/java/de/muehlencord/shared/db/EntityUtil.java +++ b/db/src/main/java/de/muehlencord/shared/db/EntityUtil.java @@ -82,7 +82,8 @@ public class EntityUtil { } /** - * clones the given entity and updates related fields so the entity appears as new.The following changes are executed + * clones the given entity and updates related fields so the entity appears as new.The following changes are + * executed *
    *
  • the Id field of the entity is set to null
  • *
  • if the entity is auditable, the audit is set to null.
  • @@ -107,8 +108,10 @@ public class EntityUtil { // set new valid dates if class is enddateable if (EndDateable.class.isAssignableFrom(newEntity.getClass())) { - ((EndDateable) newEntity).setValidFrom(DateUtil.getCurrentTimeInUTC()); - ((EndDateable) newEntity).setValidTo(null); + Validity validity = new Validity(); + validity.setValidFrom(DateUtil.getCurrentTimeInUTC()); + validity.setValidTo(null); + ((EndDateable) newEntity).setValidity(validity); } return newEntity; } diff --git a/db/src/main/java/de/muehlencord/shared/db/Validity.java b/db/src/main/java/de/muehlencord/shared/db/Validity.java new file mode 100644 index 0000000..fe5a841 --- /dev/null +++ b/db/src/main/java/de/muehlencord/shared/db/Validity.java @@ -0,0 +1,49 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package de.muehlencord.shared.db; + +import java.io.Serializable; +import java.util.Date; +import javax.persistence.Basic; +import javax.persistence.Column; +import javax.persistence.Embeddable; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.validation.constraints.NotNull; + +/** + * + * @author Joern Muehlencord + */ +@Embeddable +public class Validity implements Serializable { + + @Basic(optional = false) + @NotNull + @Column(name = "valid_from") + @Temporal(TemporalType.TIMESTAMP) + private Date validFrom; + @Column(name = "valid_to") + @Temporal(TemporalType.TIMESTAMP) + private Date validTo; + + public Date getValidFrom() { + return validFrom; + } + + public void setValidFrom(Date validFrom) { + this.validFrom = validFrom; + } + + public Date getValidTo() { + return validTo; + } + + public void setValidTo(Date validTo) { + this.validTo = validTo; + } + +} diff --git a/db/src/test/java/de/muehlencord/shared/db/TestEntity.java b/db/src/test/java/de/muehlencord/shared/db/TestEntity.java index 64c6ab4..90c2dd2 100644 --- a/db/src/test/java/de/muehlencord/shared/db/TestEntity.java +++ b/db/src/test/java/de/muehlencord/shared/db/TestEntity.java @@ -1,7 +1,6 @@ package de.muehlencord.shared.db; import java.io.Serializable; -import java.util.Date; import java.util.UUID; import javax.persistence.Basic; import javax.persistence.Column; @@ -12,8 +11,6 @@ import javax.persistence.Id; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.Table; -import javax.persistence.Temporal; -import javax.persistence.TemporalType; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; @@ -69,19 +66,16 @@ public class TestEntity implements Serializable, Auditable, EndDateable