package foundation.json.tree; import java.util.List; import foundation.json.JSONBuilder; import foundation.json.JSONReader; import foundation.json.JType; import foundation.util.MapList; public abstract class JNode { protected JNode parent; protected String fullName; protected String name; protected JType type; protected MapList children; protected int level; public JNode(String fullName, String name, JType type, int level) { this.fullName = fullName; this.name = name; this.type = type; this.level = level; } public static JNode newInstance(JType type, String fullName, String name, int level) { if (JType.Unknown == type) { return null; } if (JType.Array == type ) { return new JArrayNode(fullName, name, level); } else if (JType.Object == type ) { return new JObjectNode(fullName, name, level); } else { return new JValueNode(fullName, name, level); } } public List getChildren() { if (children == null) { return null; } return children.getItemList(); } public void addOneChild(String name, JNode node) { children.add(name, node); } public static JNode createInstance(JNode parent, String name, JType type, int level) { JNode result = null; String fullName = parent.getFullName() + "." + name; if (JType.Array == type) { result = new JArrayNode(fullName, name, level); } else if (JType.Object == type) { result = new JObjectNode(fullName, name, level); } else { result = new JValueNode(fullName, name, level); } parent.addOneChild(name, result); return result; } public void loadJSON(JSONReader parentReader, int level) { JType type; JNode node = null; String fullName, name; for (JSONReader reader: parentReader) { type = reader.getType(); name = reader.getName(); if (JType.Array == type) { fullName = this.fullName + "." + name + "[]"; node = new JArrayNode(fullName, name, level); children.add(fullName, node); node.loadJSON(reader, level + 1); } else if (JType.Object == type) { if (JType.Array == this.type) { fullName = this.fullName + "." + name + "[" + children.size() + "]"; } else { fullName = this.fullName + "." + name; } node = new JObjectNode(fullName, parentReader.getName(), level); children.add(fullName, node); node.loadJSON(reader, level + 1); } else { fullName = parent.fullName + "." + name + "[]"; node = new JValueNode(fullName, parentReader.getName(), level); children.add(fullName, node); } } } public abstract void toJSON(JSONBuilder builder); public abstract void toBand(JBand band); protected abstract void loadBandItem(JBand band, JBandItem bandItem); public boolean isSameName(String another) { return name.equalsIgnoreCase(another); } public String getFullName() { return fullName; } public String getName() { return name; } }