package models; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.OneToOne; import javax.validation.Valid; import common.DBExecutionContext; import play.Logger; import play.data.validation.Constraints.MaxLength; import play.data.validation.Constraints.MinLength; import play.data.validation.Constraints.Required; import play.db.ebean.Model; import play.libs.Akka; import play.libs.F.Function0; import play.libs.F.Function; import play.libs.F.Promise; import scala.concurrent.ExecutionContext; @Entity public class Proposal extends Model { @Id public Long id; @Required public String title; @Required @MinLength(value = 10) @MaxLength(value = 1000) @Column(length = 1000) public String proposal; @Required public SessionType type = SessionType.OneHourTalk; @Required public Boolean isApproved = false; public String keywords; @Valid @OneToOne(cascade = CascadeType.ALL) public Speaker speaker; private static Finder<Long, Proposal> find = new Finder<Long, Proposal>(Long.class, Proposal.class); public static Promise<Proposal> findKeynote() { return Promise.promise(new Function0<Proposal>(){ @Override public Proposal apply() throws Throwable { return find.where().eq("type", SessionType.Keynote).findUnique(); } }, DBExecutionContext.ctx ).recover(new Function<Throwable, Proposal>() { @Override public Proposal apply(Throwable t) throws Throwable { Logger.error("failed to feth keynote information", t); Proposal s = new Proposal(); s.title = "COMING SOON!"; s.proposal = ""; Speaker speaker = new Speaker(); speaker.name = ""; speaker.pictureUrl = ""; speaker.twitterId = ""; s.speaker = speaker; return s; } }, DBExecutionContext.ctx); } public Promise<Void> asyncSave() { return Promise.promise(new Function0<Void>() { @Override public Void apply() throws Throwable { save(); return null; } }, DBExecutionContext.ctx); } public static Promise<Proposal> selectRandomTalk() { return Promise.promise(new Function0<Proposal>() { @Override public Proposal apply() throws Throwable { // randomly select one if the first Long randomId = (long) (1 + Math.random() * (5 - 1)); return Proposal.find.byId(randomId); } } , DBExecutionContext.ctx); } }