package ru.ulstu.paper.model; import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; import org.hibernate.validator.constraints.NotBlank; import ru.ulstu.core.model.BaseEntity; import ru.ulstu.core.model.UserContainer; import ru.ulstu.deadline.model.Deadline; import ru.ulstu.file.model.FileData; import ru.ulstu.user.model.User; import javax.persistence.*; import java.util.*; @Entity public class Paper extends BaseEntity implements UserContainer { public enum PaperStatus { ATTENTION("Обратить внимание"), ON_PREPARATION("На подготовке"), ON_REVIEW("Отправлена на проверку"), ACCEPTED("Принята"), NOT_ACCEPTED("Не принята"), COMPLETED("Завершена (опубликована)"), DRAFT("Черновик"), FAILED("Провалены сроки"); private String statusName; PaperStatus(String name) { this.statusName = name; } public String getStatusName() { return statusName; } } @NotBlank private String title; @Enumerated(value = EnumType.STRING) private PaperStatus status = PaperStatus.DRAFT; @Column(name = "create_date") @Temporal(TemporalType.TIMESTAMP) private Date createDate = new Date(); @Column(name = "update_date") @Temporal(TemporalType.TIMESTAMP) private Date updateDate = new Date(); @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) @JoinColumn(name = "paper_id", unique = true) @Fetch(FetchMode.SUBSELECT) @OrderBy("date") private List deadlines = new ArrayList<>(); private String comment; private Boolean locked = false; @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) @JoinColumn(name = "paper_id", unique = true) @Fetch(FetchMode.SUBSELECT) private List files = new ArrayList<>(); @ManyToMany(fetch = FetchType.EAGER) private Set authors = new HashSet<>(); public PaperStatus getStatus() { return status; } public void setStatus(PaperStatus status) { this.status = status; } public Date getCreateDate() { return createDate; } public void setCreateDate(Date createDate) { this.createDate = createDate; } public Date getUpdateDate() { return updateDate; } public void setUpdateDate(Date updateDate) { this.updateDate = updateDate; } public List getDeadlines() { return deadlines; } public void setDeadlines(List deadlines) { this.deadlines = deadlines; } public String getComment() { return comment; } public void setComment(String comment) { this.comment = comment; } public Boolean getLocked() { return locked; } public void setLocked(Boolean locked) { this.locked = locked; } public List getFiles() { return files; } public void setFiles(List files) { this.files = files; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public Set getAuthors() { return authors; } public void setAuthors(Set authors) { this.authors = authors; } @Override public Set getUsers() { return getAuthors(); } public Optional getNextDeadline() { return deadlines .stream() .filter(deadline -> deadline.getDate() != null) .sorted(Comparator.comparing(Deadline::getDate)) .filter(d -> d.getDate().after(new Date())) .findFirst(); } public boolean lastDeadlineFailed() { return !deadlines .stream() .filter(deadline -> deadline.getDate() != null) .filter(d -> d.getDate().after(new Date())) .findAny() .isPresent(); } }