package org.objectstyle.wolips.eomodeler.core.model;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
/**
* EOEntityForest represents a collection of EOEntityTreeNodes. An arbitrary
* collection of EOEntityTreeNodes constitutes a forest as you can have multiple
* root nodes.
*
* @author mschrag
*/
public class EOEntityForest {
private Map<EOEntity, EOEntityTreeNode> _nodes;
public EOEntityForest() {
_nodes = new TreeMap<EOEntity, EOEntityTreeNode>();
}
public Set<EOEntityTreeNode> getRootNodes() {
Set<EOEntityTreeNode> rootNodes = new TreeSet<EOEntityTreeNode>();
for (EOEntityTreeNode node : _nodes.values()) {
if (node.isRoot()) {
rootNodes.add(node);
}
}
return rootNodes;
}
public void add(Collection<EOEntity> entities) {
for (EOEntity entity : entities) {
add(entity);
}
}
public EOEntityTreeNode add(EOEntity entity) {
EOEntityTreeNode node = _nodes.get(entity);
if (node == null) {
node = new EOEntityTreeNode(entity);
_nodes.put(entity, node);
EOEntity parentEntity = entity.getParent();
if (parentEntity != null) {
EOEntityTreeNode parentNode = _nodes.get(parentEntity);
if (parentNode != null) {
parentNode.addChild(node);
}
}
Set<EOEntity> childrenEntities = entity.getChildrenEntities();
for (EOEntity childEntity : childrenEntities) {
EOEntityTreeNode childNode = _nodes.get(childEntity);
if (childNode != null) {
node.addChild(childNode);
}
}
}
return node;
}
public List<EOEntity> breadthFirst() {
List<EOEntity> entities = new LinkedList<EOEntity>();
Set<EOEntityTreeNode> rootNodes = getRootNodes();
for (EOEntityTreeNode rootNode : rootNodes) {
entities.add(rootNode.getEntity());
}
for (EOEntityTreeNode rootNode : rootNodes) {
rootNode._breadthFirst(entities);
}
return entities;
}
}