package br.com.caelum.calopsita.model; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.Transient; import br.com.caelum.calopsita.repository.CardRepository; import com.google.common.collect.Iterators; @Entity public class Card implements Identifiable, FromProject { @Id @GeneratedValue private Long id; private String name; @Column(length=1024) private String description; @ManyToOne private User creator; @ManyToOne private Project project; @ManyToOne private Iteration iteration; @ManyToOne private Card parent; @OneToMany(mappedBy = "parent") private List<Card> subcards; @Enumerated(EnumType.STRING) private Status status = Status.TODO; public static enum Status { TODO, DONE } @Transient private CardRepository repository; public Card(CardRepository repository) { this.repository = repository; } public Card() { } private CardRepository getRepository() { if (repository == null) { throw new IllegalStateException("Repository was not set. You should inject it first"); } return repository; } @Transient private List<Gadget> gadgets; public List<Gadget> getGadgets() { if (gadgets == null) { gadgets = getRepository().listGadgets(this); } return gadgets; } public <T extends Gadget> T getGadget(Class<T> type) { Iterator<T> iterator = Iterators.filter(getGadgets().iterator(),type); return iterator.hasNext() ? iterator.next() : null; } public void update() { getRepository().update(this); } public Card load() { return getRepository().load(this); } public void updateGadgets(List<Gadgets> gadgets) { getRepository().updateGadgets(this, gadgets); } public List<Long> deleteSubCards() { List<Long> ids = new ArrayList<Long>(); for (Card sub : getSubcards()) { ids.add(sub.getId()); getRepository().remove(sub); } return ids; } public void detachSubCards() { for (Card sub : getSubcards()) { sub.setParent(null); repository.update(sub); } } public void delete() { repository.remove(this); } public void addGadgets(List<Gadgets> gadgets) { for (Gadgets gadget : gadgets) { repository.add(gadget.createGadgetFor(this)); } } public List<Card> getSubcards() { if (subcards == null) { subcards = getRepository().listSubcards(this); } return subcards; } public void save() { getRepository().add(this); } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public Project getProject() { return this.project; } public void setProject(Project project) { this.project = project; } public void setIteration(Iteration iteration) { this.iteration = iteration; } public Iteration getIteration() { return iteration; } public void setStatus(Status status) { this.status = status; } public Status getStatus() { return status; } public void setParent(Card parent) { this.parent = parent; } public Card getParent() { return parent; } public void setCreator(User creator) { this.creator = creator; } public User getCreator() { return creator; } }