package br.com.caelum.calopsita.persistence.dao; import java.util.ArrayList; import java.util.List; import org.hibernate.Session; import org.hibernate.criterion.Restrictions; import br.com.caelum.calopsita.model.Card; import br.com.caelum.calopsita.model.Gadget; import br.com.caelum.calopsita.model.Gadgets; import br.com.caelum.calopsita.model.Project; import br.com.caelum.calopsita.plugins.PluginResultTransformer; import br.com.caelum.calopsita.repository.CardRepository; import br.com.caelum.vraptor.ioc.Component; @Component public class CardDao implements CardRepository { private final Session session; private final PluginResultTransformer transformer; public CardDao(Session session, PluginResultTransformer transformer) { this.session = session; this.transformer = transformer; } public void add(Card card) { session.save(card); } public Card load(Card card) { return (Card) session.load(Card.class, card.getId()); } public void update(Card card) { session.update(card); } public void remove(Card card) { session.delete(card); } public List<Card> listRootFrom(Project project) { return this.session.createQuery("from Card c where c.project = :project and c.parent is null") .setParameter("project", project) .setResultTransformer(transformer) .list(); } public List<Card> listSubcards(Card card) { return session.createQuery("from Card s where s.parent = :card") .setResultTransformer(transformer) .setParameter("card", card).list(); } public void add(Gadget gadget) { session.save(gadget); } public List<Gadget> listGadgets(Card card) { return session.createCriteria(Gadget.class).add(Restrictions.eq("id", card.getId())).list(); } public void updateGadgets(Card card, List<Gadgets> gadgets) { if (gadgets == null) { gadgets = new ArrayList<Gadgets>(); } List<Gadgets> cardGadgets = Gadgets.valueOf(listGadgets(card)); for (Gadgets gadget : gadgets) { if (!cardGadgets.contains(gadget)) { add(gadget.createGadgetFor(card)); } } for (Gadgets gadget : cardGadgets) { if (!gadgets.contains(gadget)) { session.createQuery("delete from " + gadget.gadgetClass().getSimpleName() + " where id = :id").setParameter("id", card.getId()).executeUpdate(); } } } }