package org.hibernate.examples.utils; import lombok.extern.slf4j.Slf4j; import org.hibernate.criterion.DetachedCriteria; import org.hibernate.criterion.Restrictions; import org.hibernate.examples.hibernate.repository.HibernateDao; import org.hibernate.examples.model.HibernateTreeEntity; import org.hibernate.examples.model.TreeNodePosition; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; /** * org.hibernate.examples.utils.EntityTool * * @author 배성혁 sunghyouk.bae@gmail.com * @since 2013. 11. 28. 오후 2:09 */ @Slf4j public class EntityTool { private EntityTool() { } public static final String GET_LIST_BY_META_KEY = "select distinct me from %s me where :key in indices(me.metaMap)"; public static final String GET_LIST_BY_META_VALUE = "select distinct me from %s me join me.metaMap meta where meta.value = :value"; public static <T extends HibernateTreeEntity<T>> void updateTreeNodePosition(T entity) { assert (entity != null); TreeNodePosition np = entity.getNodePosition(); if (entity.getParent() != null) { np.setLevel(entity.getParent().getNodePosition().getLevel() + 1); if (!entity.getParent().getChildren().contains(entity)) { np.setOrder(entity.getParent().getChildren().size()); } } else { np.setPosition(0, 0); } } public static <T extends HibernateTreeEntity<T>> long getChildCount(HibernateDao dao, T entity) { DetachedCriteria dc = DetachedCriteria.forClass(entity.getClass()); dc.add(Restrictions.eq("parent", entity)); return dao.count(dc); } public static <T extends HibernateTreeEntity<T>> boolean hasChildren(HibernateDao dao, T entity) { DetachedCriteria dc = DetachedCriteria.forClass(entity.getClass()); dc.add(Restrictions.eq("parent", entity)); return dao.exists(entity.getClass(), dc); } public static <T extends HibernateTreeEntity<T>> void setNodeOrder(T node, int order) { assert (node != null); if (node.getParent() != null) { for (T child : node.getParent().getChildren()) { if (child.getNodePosition().getOrder() >= order) { child.getNodePosition().setOrder(child.getNodePosition().getOrder() + 1); } } } node.getNodePosition().setOrder(order); } public static <T extends HibernateTreeEntity<T>> void adjustChildOrders(T parent) { assert (parent != null); List<T> children = new ArrayList<T>(parent.getChildren()); Collections.sort(children, new Comparator<T>() { @Override public int compare(T o1, T o2) { return o1.getNodePosition().getOrder() - o2.getNodePosition().getOrder(); } }); int order = 0; for (T node : children) { node.getNodePosition().setOrder(order); order++; } } public static <T extends HibernateTreeEntity<T>> void changeParent(T node, T oldParent, T newParent) { assert (node != null); if (oldParent != null) { oldParent.getChildren().remove(node); } if (newParent != null) { newParent.getChildren().add(node); } node.setParent(newParent); updateTreeNodePosition(node); } public static <T extends HibernateTreeEntity<T>> void setParent(T node, T parent) { assert (node != null); changeParent(node, node.getParent(), parent); } public static <T extends HibernateTreeEntity<T>> void insertChildNode(T parent, T child, int order) { assert (parent != null); assert (child != null); int ord = Math.max(0, Math.min(order, parent.getChildren().size() - 1)); parent.addChild(child); setNodeOrder(child, ord); } public static <T extends HibernateTreeEntity<T>> List<T> getAncestors(T current) { List<T> ancestors = new ArrayList<T>(); if (current != null) { T parent = current; while (parent != null) { ancestors.add(parent); parent = parent.getParent(); } } return ancestors; } public static <T extends HibernateTreeEntity<T>> T getRoot(T current) { if (current == null) return current; T root = current; T parent = current.getParent(); while (parent != null) { root = parent; parent = parent.getParent(); } return root; } }