package models; import com.avaje.ebean.annotation.CreatedTimestamp; import com.avaje.ebean.annotation.UpdatedTimestamp; import org.ocpsoft.prettytime.PrettyTime; import play.db.ebean.Model; import play.mvc.Http; import play.mvc.PathBindable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import java.util.Date; import java.util.Locale; @Entity public abstract class BaseModel<T extends BaseModel<T>> extends Model implements PathBindable<T> { @Id public Long id; @CreatedTimestamp @Column(name = "created_at") private Date createdAt; @UpdatedTimestamp @Column(name = "updated_at") private Date updatedAt; public BaseModel() { } public Finder<Long, T> getFinder() { return new Model.Finder(Long.class, this.getClass()); } @Override public void update() { updatedAt = new Date(); super.update(); } public Date getCreatedAt() { return createdAt; } public Date getUpdatedAt() { return updatedAt; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; BaseModel baseModel = (BaseModel) o; return !(id != null ? !id.equals(baseModel.id) : baseModel.id != null); } @Override public int hashCode() { return id != null ? id.hashCode() : 0; } @Override public T bind(String key, String value) { return (T) getFinder().byId(Long.valueOf(value)); } @Override public String unbind(String s) { return id.toString(); } @Override public String javascriptUnbind() { return null; } public String getCreatedSince() { if (createdAt == null) { return ""; } return new PrettyTime(Http.Context.current().lang().toLocale()).format(createdAt); } public String getUpdatedSince() { if (updatedAt == null) { return ""; } return new PrettyTime(Http.Context.current().lang().toLocale()).format(updatedAt); } public String getCreatedSinceInFrench() { if (createdAt == null) { return ""; } return new PrettyTime(Locale.FRENCH).format(createdAt); } }