package org.cloudgraph.web.model.taxonomy; import java.util.Stack; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.cloudgraph.web.model.tree.TreeNodeModel; import org.cloudgraph.web.model.tree.TreeNodeTypeMap; import org.cloudgraph.web.sdo.categorization.Category; import org.cloudgraph.web.sdo.categorization.Taxonomy; import org.plasma.sdo.PlasmaDataGraphVisitor; import org.plasma.sdo.PlasmaDataObject; import org.plasma.sdo.PlasmaNode; import commonj.sdo.DataObject; public class TaxonomyTreeAssembler implements PlasmaDataGraphVisitor { private static Log log = LogFactory.getLog(TaxonomyTreeAssembler.class); private long ids = 0; private TreeNodeModel treeRoot; private Stack<TreeNodeModel> stack = new Stack<TreeNodeModel>(); private int currentLevel = -1; private TreeNodeTypeMap typeMap; public TaxonomyTreeAssembler() { this.typeMap = new DefaultTreeNodeTypeMap(); } public TaxonomyTreeAssembler(TreeNodeTypeMap typeMap) { this.typeMap = typeMap; } public TreeNodeModel getTreeRoot() { return treeRoot; } public void visit(DataObject target, DataObject source, String sourceKey, int level) { TreeNodeModel node = null; if (source == null) { node = new TreeNodeModel(++ids); node.setUserData(target); treeRoot = node; stack.push(node); } else { node = new TreeNodeModel(++ids); node.setEnabled(true); node.setName(((Category)target).getName()); node.setLabel(((Category)target).getName()); node.setTooltip(((Category)target).getDefinition()); node.setType(this.typeMap.getTreeNodeType(level)); node.setUserData(target); if (log.isDebugEnabled()) log.debug("created node: " + "(" + node.getType() + ") " + node.getLabel()); } if (source != null) { if (level > currentLevel) { stack.peek().addNode(node); stack.push(node); } else if (level <= currentLevel) { // pop till we find the parent String sourceHashKey = getSourceHashKey(source); while (stack.size() > 0) { PlasmaNode top = (PlasmaNode)stack.peek().getUserData(); if (!top.getUUIDAsString().equals(sourceHashKey)) stack.pop(); else break; } stack.peek().addNode(node); stack.push(node); } } currentLevel = level; } private String getSourceHashKey(DataObject source) { if (source instanceof Category) { return ((PlasmaDataObject)source).getUUIDAsString(); } else if (source instanceof Taxonomy) { return ((PlasmaDataObject)source).getUUIDAsString(); } else throw new IllegalArgumentException("unexpected instance class, " + source.getClass().getName()); } }