
org.tinygroup.tinyscript.tree.impl.TreeDataNode Maven / Gradle / Ivy
The newest version!
package org.tinygroup.tinyscript.tree.impl;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.tinygroup.tinyscript.tree.DataNode;
/**
* 树型存储节点,支持属性/子节点/子节点列表
* @author yancheng11334
*
*/
public class TreeDataNode implements DataNode{
private DataNode parent;
private Map maps = new LinkedHashMap();
private String name;
private Object value;
public TreeDataNode(){
}
public TreeDataNode(String name){
this.name = name;
}
public TreeDataNode(Map maps){
this.maps = maps;
}
public TreeDataNode(String name,Map maps){
this.name = name;
this.maps = maps;
}
public DataNode getParent() {
return parent;
}
public void setParent(DataNode parent) {
this.parent = parent;
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
public Object get(String name) {
return maps.get(name);
}
public TreeDataNode put(String name,Object value) {
maps.put(name, value);
return this;
}
public Map getAttributes(){
return maps;
}
@SuppressWarnings("unchecked")
public T getSource() {
return (T) this;
}
public String getName() {
return name;
}
public boolean isLeaf() {
for(Object value:maps.values()){
if(value instanceof DataNodeArray){
return false;
}
}
return true;
}
public boolean isRoot() {
return parent==null;
}
public List getChildren() {
List children = new ArrayList();
for(Object value:maps.values()){
if(value instanceof DataNodeArray){
DataNodeArray array = (DataNodeArray) value;
children.addAll(array.getChildren());
}
}
return children;
}
public DataNode getChild(int i) {
List children = getChildren();
return children.get(i);
}
public DataNode getChild(String name) {
List children = getChildren();
for(DataNode node:children){
if(node.getName().equals(name)){
return node;
}
}
return null;
}
public DataNode findNode(String name) {
return findNode(this,name);
}
private DataNode findNode(DataNode node,String name){
if(node.getName()!=null && node.getName().equals(name)){
return node;
}
if(!node.isLeaf()){
DataNode result = null;
for(DataNode child:node.getChildren()){
result = findNode(child,name);
if(result!=null){
return result;
}
}
}
return null;
}
public DataNode addNode(DataNode node) {
return addNode(node.getName(),node);
}
public DataNode addNode(String name, Object value) {
if(value instanceof DataNode){
DataNode node = (DataNode) value;
DataNodeArray array = (DataNodeArray) maps.get(name);
if(array==null){
array = new DataNodeArray();
maps.put(name, array);
}
array.addDataNode(node);
node.setParent(this);
}else{
maps.put(name, value);
}
return this;
}
public DataNode addArray(String name, DataNode node) {
DataNodeArray array = (DataNodeArray) maps.get(name);
if(array==null){
array = new DataNodeArray(true);
maps.put(name, array);
}
if(node!=null){
array.addDataNode(node);
node.setParent(this);
}
return this;
}
public DataNode removeNode(DataNode node) {
DataNodeArray array = (DataNodeArray) maps.get(node.getName());
if(array!=null){
array.removeDataNode(node);
if(array.getLength()==0){
maps.remove(node.getName());
}
node.setParent(null);
}
return this;
}
public DataNode removeNode(String name) {
maps.remove(name);
return this;
}
/**
* 子节点结构
* @author yancheng11334
*
*/
static class DataNodeArray{
private List children = new ArrayList();
private boolean array = false; //是否强制数组
public DataNodeArray(){
}
public DataNodeArray(boolean tag){
array = tag;
}
public boolean isArray() {
return array;
}
public DataNodeArray addDataNode(DataNode node){
children.add(node);
return this;
}
public DataNodeArray removeDataNode(DataNode node){
children.remove(node);
return this;
}
public int getLength(){
return children.size();
}
public List getChildren(){
return children;
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy