/*
* (c) Rob Gordon 2005
*/
package org.oddjob.webapp.struts.forms;
import java.util.LinkedHashMap;
import java.util.Map;
import org.oddjob.webapp.model.JobInfoLookup;
import org.oddjob.webapp.model.NodeInfo;
/**
* Build a TreeNodeBean hierarchy.
*
* @author Rob Gordon
*/
public class TreeNodeBeanBuilder {
private final JobInfoLookup lookup;
private final String currentRefId;
/**
* Constructor.
*
* @param lookup Lookup to use for building.
*/
public TreeNodeBeanBuilder(JobInfoLookup lookup, String currentRefId) {
if (lookup == null) {
throw new NullPointerException("Lookup can't be null!");
}
this.lookup = lookup;
this.currentRefId = currentRefId;
}
/**
* Build the root bean.
*/
public TreeNodeBean buildRoot() {
TreeNodeBean root = new TreeNodeBean();
root.setRefId(lookup.getRootRefId());
buildBean(root, 0);
return root;
}
/**
* Recursively refresh the {@link TreeNodeBean} hierarchy.
*
* @param bean
*/
public void refresh(TreeNodeBean bean) {
String refId = bean.getRefId();
if (refId.equals(currentRefId)) {
bean.setStyleClass("selected");
}
else {
bean.setStyleClass("");
}
NodeInfo nodeInfo = lookup.nodeInfoFor(refId);
bean.setTreeNodeBeanBuilder(this);
bean.setNodeName(nodeInfo.getNodeName());
bean.setIconId(nodeInfo.getIconId());
Map<String, TreeNodeBean> childMap = bean.getChildMap();
bean.setHasChildren(nodeInfo.getHasChildren());
if (childMap == null) {
return;
}
Map<String, TreeNodeBean> newMap =
new LinkedHashMap<String, TreeNodeBean>();
String[] childRefIds = nodeInfo.getChildRefIds();
// compare the refIds to see if we can refresh the child node
// or we need to build a new one.
for (int i = 0; i < childRefIds.length; ++i) {
TreeNodeBean child = (TreeNodeBean) childMap.get(childRefIds[i]);
if (child == null) {
child = new TreeNodeBean();
child.setRefId(childRefIds[i]);
buildBean(child, bean.getDepth() + 1);
}
else {
refresh(child);
}
newMap.put(child.getRefId(), child);
}
bean.setChildMap(newMap);
}
/**
* Build the children.
*
* @param parent
* @return
*/
public Map<String, TreeNodeBean> buildChildren(TreeNodeBean parent) {
String refId = parent.getRefId();
NodeInfo nodeInfo = lookup.nodeInfoFor(refId);
Map<String, TreeNodeBean> children = new LinkedHashMap<String, TreeNodeBean>();
String [] childRefIds = nodeInfo.getChildRefIds();
for (int i = 0; i < childRefIds.length; ++i) {
TreeNodeBean child = new TreeNodeBean();
child.setRefId(childRefIds[i]);
buildBean(child, parent.getDepth() + 1);
children.put(child.getRefId(), child);
}
return children;
}
/**
* Helper function to build the bean.
*
* @param bean The bean we're building.
* @param level The depth the bean is at.
*/
void buildBean(TreeNodeBean bean, int level) {
String refId = bean.getRefId();
NodeInfo nodeInfo = lookup.nodeInfoFor(refId);
bean.setTreeNodeBeanBuilder(this);
bean.setDepth(level);
bean.setNodeName(nodeInfo.getNodeName());
bean.setIconId(nodeInfo.getIconId());
bean.setHasChildren(nodeInfo.getHasChildren());
if (refId.equals(currentRefId)) {
bean.setStyleClass("selected");
}
else {
bean.setStyleClass("");
}
}
}