All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.rt.core.beans.TreeElement Maven / Gradle / Ivy

The newest version!
package com.rt.core.beans;

import com.json.JSONArray;
import com.json.JSONObject;
import com.rt.core.constant.RTConst;

import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * TreeElement原本不是继承自JSONObject
 * 这是一个普通的树形结构,作为java图形化界面的数据结构使用.
 * 后来发现在其他地方很可以方便的迁移和使用,所以继承了JSONObject对象
 * 继承JSONObject对象后,主要问题是序列化时如果对象之间相互引用.
 * 如果父对象与子对象互相引用,在toString()时会发生死循环,目前尚未解决.
 *
 * @author msc
 */
public class TreeElement extends JSONObject {

    private static final long serialVersionUID = 1L;

    protected static final String ID = "id";
    protected static final String QNAME = "qname";
    protected static final String NAME = "name";
    protected static final String TAG = "tag";
    protected static final String INDEXS = "indexs";
    protected static final String MULTI_PARENT = "multiParent";
    protected static final String CHILD = "child";
    protected static final String PARENT = "parent";

    public TreeElement() {
        super();
    }

    public TreeElement(Map map) {
        super(map);
    }

    public TreeElement(String string) throws Exception {
        super(string);
    }

    /**
     * 获取目标
     *
     * @return Object
     */
    public Object getTag() {
        return get(TAG);
    }

    /**
     * 设置目标
     *
     * @param tag tag
     */
    public void setTag(Object tag) {
        put(TAG, tag);
    }

    /**
     * 索引
     *
     * @return long
     */
    public Long getIndexs() {
        return getLong(INDEXS);
    }

    /**
     * 索引
     *
     * @param indexs indexs
     */
    public void setIndexs(Long indexs) {
        put(INDEXS, indexs);
    }

    /**
     * 获取所有子对象
     *
     * @return Map
     */
    public Map getChild() {
        Map child = getJSONObject(CHILD);
        if (child == null) {
            child = new JSONObject();
            put(CHILD, child);
        }
        return child;
    }

    /**
     * 获取所有子对象
     *
     * @return List
     */
    public List getChildList() {
        return new JSONArray(getChild().values());
    }

    /**
     * 是否有子节点
     *
     * @return boolean
     */
    public boolean hasChild() {
        return getChild().size() > 0;
    }

    /**
     * 是否包含子节点
     *
     * @param key key
     * @return boolean
     */
    public boolean hasChild(String key) {
        return getChild().containsKey(key);
    }

    /**
     * 是否有父节点
     *
     * @return boolean
     */
    public boolean hasParent() {
        return containsKey(PARENT);
    }

    /**
     * 获取父节点
     * @param  object
     * @return T object
     */
    public  T getParent() {
        return (T) get(PARENT);
    }

    /**
     * 设置父节点
     *
     * @param parent parent
     */
    public void setParent(TreeElement parent) {
        // 指定父节点为空或与现有父节点一样,不进行任何操作
        if (parent == null || parent == getParent()) {
            return;
        }
        // 如果已有父节点,且不允许有多个父节点,先从原父类中删除自身,再加到新父类中.
        if (hasParent() && !isMultiParent() && getParent() != null) {
            TreeElement p = getParent();
            p.removeChild(getId());
        }
        // 设置新父节点
        put(PARENT, parent);
        // 删除此行为,避免死循环, 把自己加到父节点的子节点中
        // ((Map) parent).put(getId(), this);
    }

    /**
     * 获取子节点
     *
     * @param child child
     */
    public void addChild(JSONObject child) {
        if (child == null) {
            return;
        }
        getChild().put(child.getId(), child);
    }

    /**
     * 添加子节点
     *
     * @param child child
     */
    public void addChild(List child) {
        if (child == null) {
            return;
        }
        for (JSONObject item : child) {
            getChild().put(item.getId(), item);
        }
    }

    /**
     * 获取子节点
     *
     * @param key key
     * @param  object
     * @return T object
     */
    public  T getChild(String key) {
        return (T) getChild().get(key);
    }

    /**
     * 删除子节点
     *
     * @param key key
     */
    public void removeChild(String key) {
        if (hasChild(key)) {
            getChild().remove(key);
        }
    }

    /**
     * 删除所有子节点
     */
    public void removeChild() {
        remove(CHILD);
    }

    /**
     * 重置所有子节点
     *
     * @param child child
     */
    public void setChild(Map child) {
        if (child == null) {
            return;
        }
        put(CHILD, child);
    }

    /**
     * 重置所有子节点
     *
     * @param child child
     */
    public void setChildren(List child) {
        if (child == null) {
            return;
        }
        removeChild();
        for (Iterator iterator = child.iterator(); iterator.hasNext(); ) {
            addChild((TreeElement) iterator.next());
        }
    }

    /**
     * 获取child的值(child没有子节点的情况下使用)
     *
     * @param id id
     * @return String
     */
    public String getChildValue(String id) {
        if (id == null) {
            return RTConst.EMPTY;
        }
        JSONObject obj = getChild(id);
        if (obj == null) {
            return RTConst.EMPTY;
        }
        return obj.getValueToString();
    }

    /**
     * 获取指定child的子child
     *
     * @param id id
     * @param contentId contentId
     * @param  object
     * @return T object
     */
    public  T getChildContent(String id, String contentId) {
        TreeElement p = getChild(id);
        if (p == null) {
            return null;
        }
        return p.getChild(contentId);
    }

    /**
     * 获取子节点
     *
     * @param id id
     * @return List
     */
    public List getChildContentList(String id) {
        Map p = getChildContent(id);
        if (p == null) {
            return null;
        }
        return new JSONArray(p.values());
    }

    /**
     * 获取Property所有子内容
     *
     * @param id id
     * @return Map
     */
    public Map getChildContent(String id) {
        Property p = getChild(id);
        if (p == null) {
            return null;
        }
        return p.getChild();
    }

    /**
     * 获取指定Property内容Property中的值
     *
     * @param id id
     * @param contentId contentId
     * @return String
     */
    public String getChildContentValue(String id, String contentId) {
        TreeElement p = getChild(id);
        if (p == null) {
            return null;
        }
        return p.getChildValue(contentId);
    }

    /**
     * xml转换时xml节点名存储到QName属性中
     *
     * @return String
     */
    public String getQName() {
        return getString(QNAME);
    }

    /**
     * xml转换时xml节点名存储到QName属性中
     *
     * @param qname qname
     */
    public void setQName(String qname) {
        put(QNAME, qname);
    }

    /**
     * 名称
     *
     * @return String
     */
    public String getName() {
        return getString(NAME);
    }

    /**
     * 名称
     *
     * @param name name
     */
    public void setName(String name) {
        put(NAME, name);
    }

    /**
     * 是否允许有多个父节点
     *
     * @return the multiParent
     */
    public boolean isMultiParent() {
        return getBoolean(MULTI_PARENT);
    }

    /**
     * 设置是否允许有多个父节点
     *
     * @param multiParent the multiParent to set
     */
    public void setMultiParent(boolean multiParent) {
        put(MULTI_PARENT, multiParent);
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy