package org.webpieces.router.impl.params; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; public class ParamTreeNode extends ParamNode { private Map<String, ParamNode> subKeyToNode = new HashMap<>(); public ParamNode get(String firstKey) { return subKeyToNode.get(firstKey); } public void put(String firstKey, ParamNode vNode) { subKeyToNode.put(firstKey, vNode); } public Set<Entry<String, ParamNode>> entrySet() { return subKeyToNode.entrySet(); } @Override public String toString() { return "{"+toString(this, 1)+"\n}"; } //TODO: refactor this so each node type prints it's own stuff but pass in numberOfTabs //to each one. ie. ArrayNode has a toString(numberOfTabs) and ValueNode does as well public String toString(ParamTreeNode treeNode, int numberOfTabs) { Map<String, ParamNode> tree = treeNode.subKeyToNode; String result = ""; for(Map.Entry<String, ParamNode> entry : tree.entrySet()) { result += "\n"+generateTabs(numberOfTabs)+entry.getKey() +"="; ParamNode value = entry.getValue(); if(value instanceof ParamTreeNode) { result += "\n"+generateTabs(numberOfTabs)+"{"; result += toString((ParamTreeNode) value, numberOfTabs+1); result += "\n"+generateTabs(numberOfTabs)+"}"; } else if(value instanceof ArrayNode) { ArrayNode n = (ArrayNode) value; result += printList(n.getList(), numberOfTabs); } else { result += entry.getValue(); } } return result; } private String printList(List<ParamNode> list, int numberOfTabs) { String result = "\n"+generateTabs(numberOfTabs)+"["; for(ParamNode n : list) { if(n == null) { result += "\n"+generateTabs(numberOfTabs+1)+"null"; } else if(n instanceof ParamTreeNode) { result += "\n"+generateTabs(numberOfTabs+1)+"{"; result += toString((ParamTreeNode) n, numberOfTabs+2); result += "\n"+generateTabs(numberOfTabs+1)+"}"; } else if(n instanceof ValueNode) { ValueNode v = (ValueNode) n; result += "\n"+generateTabs(numberOfTabs+1)+v.getValue(); } else { throw new UnsupportedOperationException("not support this type="+n.getClass().getName()); } } result += "\n"+generateTabs(numberOfTabs)+"]"; return result; } private String generateTabs(int numberOfTabs) { String s = ""; for(int i = 0; i < numberOfTabs; i++) { s += "\t"; } return s; } }