com.rt.core.beans.TreeElement Maven / Gradle / Ivy
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);
}
}