package br.com.triadworks.issuetracker.model; import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.PrePersist; import javax.persistence.PreUpdate; import javax.persistence.SequenceGenerator; import javax.persistence.Temporal; import javax.persistence.TemporalType; import org.conventionsframework.model.BaseEntity; @Entity public class Issue implements Serializable ,BaseEntity{ private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy=GenerationType.AUTO, generator="SEQ_ISSUE") @SequenceGenerator(name="SEQ_ISSUE", sequenceName="SEQ_ISSUE", allocationSize=1) private Long id; private String sumario; @Column(length=1000) private String descricao; @ManyToOne private Projeto projeto; @Enumerated(EnumType.STRING) private TipoDeIssue tipo; @Temporal(TemporalType.TIMESTAMP) private Date reportadoEm; @ManyToOne private Usuario reportadoPor; @ManyToOne private Usuario assinadoPara; @Temporal(TemporalType.TIMESTAMP) private Date atualizadoEm; @Enumerated(EnumType.STRING) private Status status = Status.ABERTA; @OneToMany(cascade=CascadeType.ALL, orphanRemoval=true, fetch=FetchType.LAZY) @JoinTable(name="issue_comentario", joinColumns=@JoinColumn(name="issue_id"), inverseJoinColumns=@JoinColumn(name="comentario_id")) private List<Comentario> comentarios = new ArrayList<Comentario>(); public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getSumario() { return sumario; } public void setSumario(String sumario) { this.sumario = sumario; } public String getDescricao() { return descricao; } public void setDescricao(String descricao) { this.descricao = descricao; } public Projeto getProjeto() { return projeto; } public void setProjeto(Projeto projeto) { this.projeto = projeto; } public TipoDeIssue getTipo() { return tipo; } public void setTipo(TipoDeIssue tipo) { this.tipo = tipo; } public Date getReportadoEm() { return reportadoEm; } public void setReportadoEm(Date reportadoEm) { this.reportadoEm = reportadoEm; } public Usuario getReportadoPor() { return reportadoPor; } public void setReportadoPor(Usuario reportadoPor) { this.reportadoPor = reportadoPor; } public Usuario getAssinadoPara() { return assinadoPara; } public void setAssinadoPara(Usuario assinadoPara) { this.assinadoPara = assinadoPara; } public Date getAtualizadoEm() { return atualizadoEm; } public void setAtualizadoEm(Date atualizadoEm) { this.atualizadoEm = atualizadoEm; } public Status getStatus() { return status; } public void setStatus(Status status) { this.status = status; } public List<Comentario> getComentarios() { return Collections.unmodifiableList(comentarios); } /** * Adiciona comentários à issue. */ public void comenta(Comentario comentario) { if (comentario.getAutor() == null) throw new IllegalArgumentException("Autor nao pode ser vazio."); comentarios.add(comentario); } /** * Fecha issue com um comentário. */ public void fecha(Comentario comentario) { this.status = Status.FECHADA; this.comenta(comentario); } public boolean isFechada() { return Status.FECHADA.equals(status); } @PrePersist @PreUpdate public void onSaveOrUpdate() { this.atualizadoEm = new Date(); } @Override public String toString() { return descricao ; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Issue other = (Issue) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; return true; } }