package com.mfh.comn.code.bean; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import com.mfh.comn.code.ICodeItem; import com.mfh.comn.code.ITreeCodeItem; import com.mfh.comn.code.UnionCode; /** * 一个树编码项 * T: 编码值类型 * @author zhangyz created on 2013-6-7 * @since Framework 1.0 */ public class ParentChildItem<T> implements Cloneable, ITreeCodeItem<T>, Serializable{ private static final long serialVersionUID = 1L; protected T pid; protected String codeTypeId;//相当于属于哪个level protected List<ICodeItem<T>> items = null; private boolean bHasChild = true;//默认认为有子节点,但不能根据items判断 protected T id;//编码值 protected String name;//编码描述 public ParentChildItem() { super(); } public ParentChildItem(T entity) { ParentChildItem<T> parentChildItem = (ParentChildItem) entity; this.pid = (T) ((ParentChildItem) entity).getPid(); this.codeTypeId = ((ParentChildItem) entity).getCodeTypeId(); this.items = ((ParentChildItem) entity).getChildItems(); this.bHasChild = ((ParentChildItem) entity).bHasChild; this.id = (T) ((ParentChildItem) entity).getId(); this.name = ((ParentChildItem) entity).getValue(); // return parentChildItem; } @Override public ParentChildItem<T> clone(){ ParentChildItem<T> ret = new ParentChildItem<T>(this.id, this.name); ret.codeTypeId = this.codeTypeId; ret.pid = this.pid; ret.bHasChild = this.bHasChild; ret.items = this.items; return ret; } /** * 创建一个对象 * @param name 名称 * @param value 值 * @param levelName level名 * @param noChild 是否还有子节点 * @return * @author zhangyz created on 2012-4-11 */ public static <T> ParentChildItem<T> makeOption(T name, String value, String levelName, boolean noChild){ ParentChildItem<T> item = new ParentChildItem<T>(name, value, null, levelName); if (noChild) item.notifyNoChild(); return item; } public ParentChildItem(T id, String name) { super(); this.id = id; this.name = name; } public ParentChildItem(T id, String name, T pid) { super(); this.id = id; this.name = name; this.pid = pid; } /** * 完整的构造函数 * @param id 编码值 * @param name 编码名称 * @param pid 父编码值 * @param levelName 属于哪个级别 */ public ParentChildItem(T id, String name, T pid, String levelName) { super(); this.id = id; this.name = name; this.pid = pid; this.codeTypeId = levelName; } /** * 获取该编码所属的level名,若为空,代表只是一个level * @return * @author zhangyz created on 2012-4-9 */ public String getLevelName() { return codeTypeId; } /** * 设置该编码所属的level名,若为空,代表只是一个level * @return * @author zhangyz created on 2012-4-9 */ public void setLevelName(String levelName) { this.codeTypeId = levelName; } /** * 告知不会有子节点 * @see hasChildAbility hasChildFact * @author zhangyz created on 2012-4-11 */ @Override public void notifyNoChild(){ bHasChild = false; if (items != null) items.clear(); } /** * 告知含有子节点 * * @author zhangyz created on 2012-4-11 */ @Override public void notifyHaveChild(){ bHasChild = true; } /** * 是否可能有子节点 * @return * @author zhangyz created on 2012-4-11 */ public boolean hasChildAbility(){ return bHasChild; } /** * 当前是否有子节点;未来通过进一步读取可能有,但是不管了。 * @return * @author zhangyz created on 2012-4-1 */ @Override public boolean hasChildFact(){ if (items == null) return false; else if (items.size() > 0) return true; else return false; } /*public String[] getTypes() { return types; } public void setTypes(String[] types) { this.types = types; } public long getPk() { return pk; } public void setPk(long pk) { this.pk = pk; }*/ /** * @return Returns the items. */ @Override public List<ICodeItem<T>> getChildItems() { return items; } /** * 直接赋予所有子节点 * @param inItems * @author zhangyz created on 2012-4-11 */ public void setChildItems(List<ICodeItem<T>> inItems){ items = inItems; if (items != null && items.size() > 0){ this.bHasChild = true; for (int ii = 0; ii < inItems.size(); ii++){ ParentChildItem<T> pi = (ParentChildItem<T>)inItems.get(ii); if (pi.getPid() == null) pi.setPid(this.getCode()); } } } public void addChildItem(ICodeItem<T> item) { if (items == null) items = new ArrayList<ICodeItem<T>>(); items.add(item); ParentChildItem<T> pi = (ParentChildItem<T>)item; if (pi.getPid() == null) pi.setPid(this.getCode()); this.bHasChild = true; } public boolean isTopParent() { if (pid == null || pid.toString().length() == 0) { return true; } return false; } /** * @return Returns the pid. */ public T getPid() { return pid; } /** * @param pid The pid to set. */ public void setPid(T pid) { this.pid = pid; } /** * @see java.lang.Object#equals(Object) */ public boolean equals(Object object) { if (!(object instanceof ParentChildItem)) { return false; } @SuppressWarnings("unchecked") ParentChildItem<T> rhs = (ParentChildItem<T>) object; if (this.id.equals(rhs.id)) { if (this.name.equals(rhs.name)) { if (this.getPid() == null && rhs.getPid() == null) { return true; } if (this.getPid() != null && rhs.getPid() == null) { return false; } if (this.getPid() == null && rhs.getPid() != null) { return false; } else { return false; } } else { return false; } } else { return false; } } public String getCodeTypeId() { return codeTypeId; } public void setCodeTypeId(String codeTypeId) { this.codeTypeId = codeTypeId; } @Override public String getKind() { return codeTypeId; } @Override public UnionCode getUnionCode() { return new UnionCode(id.toString()); } public T getId() { return id; } public void setId(T id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public T getCode() { return id; } @Override public String getValue() { return name; } @Override public boolean isNullId() { return CodeItem.isNullId(id); } @Override public void setKind(String levelName) { setLevelName(levelName); } }