package fr.openwide.core.jpa.more.business.audit.model.embeddable; import java.io.Serializable; import java.util.Date; import javax.persistence.MappedSuperclass; import javax.persistence.Temporal; import javax.persistence.TemporalType; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import org.hibernate.search.annotations.Analyzer; import org.hibernate.search.annotations.DateBridge; import org.hibernate.search.annotations.Field; import org.hibernate.search.annotations.Fields; import org.hibernate.search.annotations.Resolution; import org.hibernate.search.annotations.SortableField; import com.google.common.base.Objects; import fr.openwide.core.commons.util.CloneUtils; import fr.openwide.core.jpa.search.util.HibernateSearchAnalyzer; @MappedSuperclass public abstract class AbstractAuditableProperty<T> implements Serializable { private static final long serialVersionUID = -5707236459217540376L; public static final String LAST_EDIT_DATE_SORT = "lastEditDateSort"; @DateBridge(resolution = Resolution.MILLISECOND) @Temporal(TemporalType.TIMESTAMP) @Fields({ @Field(analyzer = @Analyzer(definition = HibernateSearchAnalyzer.KEYWORD)), @Field(name = LAST_EDIT_DATE_SORT, analyzer = @Analyzer(definition = HibernateSearchAnalyzer.TEXT_SORT)) }) @SortableField(forField = LAST_EDIT_DATE_SORT) private Date lastEditDate; public abstract T getValue(); public abstract void setValue(T value); public final Date getLastEditDate() { return CloneUtils.clone(lastEditDate); } public final void setLastEditDate(Date lastEditDate) { this.lastEditDate = CloneUtils.clone(lastEditDate); } @Override public String toString() { return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE) .append("value", getValue()) .append("lastEditDate", getLastEditDate()) .build(); } @Override public final boolean equals(Object object) { if (object == null) { return false; } if (object == this) { return true; } if (!(getClass().equals(object.getClass()))) { return false; } AbstractAuditableProperty<?> other = (AbstractAuditableProperty<?>) object; return Objects.equal(getValue(), other.getValue()); } @Override public final int hashCode() { return Objects.hashCode(getValue()); } }