/******************************************************************************
* 概述:     更新树的部分节点,如果是sds的就创建socket
* 函数名:    UpdatePoints
* 返回值:
* 参数列表:  参数名          参数类型      取值范围     描述
*            res            *dzhyun.SDSResponse
*
*******************************************************************************/
func (this *DataCache) UpdatePoints(res *dzhyun.SDSResponse) {
	if res.Endpoints == nil {
		return
	}
	ps := &res.Endpoints
	subName := res.GetSubName()
	mainregChans := make([]chan dzhyun.SDSEndpoint, 0)

	this.mregRWMutex.RLock()
	defer this.mregRWMutex.RUnlock()
	this.mpointGroup.GetRegChans(&mainregChans, subName)

	for i := 0; i < len(*ps); i++ {
		subregChans := make([]chan dzhyun.SDSEndpoint, 0)
		this.insertSocket((*ps)[i])
		if (*ps)[i].GetState() == DEFAULT_PointStateOk {
			this.mpointGroup.InsertPoint((*ps)[i], &subregChans, subName)
		} else {
			this.mpointGroup.DelPoint((*ps)[i], &subregChans, subName)
		}
		for j := 0; j < len(mainregChans); j++ {
			select {
			case mainregChans[j] <- *(*ps)[i]:
			default:
				{
					log4.Error("chan full, so lose data")
				}
			}
		}
		for k := 0; k < len(subregChans); k++ {
			select {
			case subregChans[k] <- *(*ps)[i]:
			default:
				{
					log4.Error("chan full, so lose data")
				}
			}
		}
	}
}
/******************************************************************************
* 概述:     刷新树的一个分支,要与sds一致
* 函数名:    RefleshPoints
* 返回值:
* 参数列表:  参数名          参数类型      取值范围     描述
*            Servicepath    string
*            res            *dzhyun.SDSResponse
*
*******************************************************************************/
func (this *DataCache) RefleshPoints(Servicepath string, res *dzhyun.SDSResponse) {
	oldppoint := this.mpointGroup.SearchAll(Servicepath)
	var newppoint *[]*dzhyun.SDSEndpoint
	if res.Endpoints == nil {
		newppoint = nil
	} else {
		newppoint = &res.Endpoints
	}

	tmpMap := make(map[string]*dzhyun.SDSEndpoint)
	for j := 0; newppoint != nil && j < len(*newppoint); j++ {
		this.insertSocket((*newppoint)[j])
		tmpMap[(*newppoint)[j].GetBusiPath()+"/"+(*newppoint)[j].GetNodeName()] = (*newppoint)[j]
	}

	for i := 0; oldppoint != nil && i < len(*oldppoint); i++ {
		str := (*oldppoint)[i].GetBusiPath() + "/" + (*oldppoint)[i].GetNodeName()
		if value, ok := tmpMap[str]; ok {
			if value.GetLoading() == (*oldppoint)[i].GetLoading() && value.GetState() == (*oldppoint)[i].GetState() {
				delete(tmpMap, str)
			}
		} else {
			if (*oldppoint)[i].State == nil {
				(*oldppoint)[i].State = new(int32)
			}
			*(*oldppoint)[i].State = DEFAULT_PointStateDel
			tmpMap[str] = &(*oldppoint)[i]
		}
	}

	subName := res.GetSubName()
	mainregChans := make([]chan dzhyun.SDSEndpoint, 0)

	this.mregRWMutex.RLock()
	defer this.mregRWMutex.RUnlock()
	this.mpointGroup.GetRegChans(&mainregChans, subName)

	for _, value := range tmpMap {
		subregChans := make([]chan dzhyun.SDSEndpoint, 0)
		if value.GetState() == DEFAULT_PointStateOk {
			this.mpointGroup.InsertPoint(value, &subregChans, subName)
		} else {
			this.mpointGroup.DelPoint(value, &subregChans, subName)
		}
		for j := 0; j < len(mainregChans); j++ {
			select {
			case mainregChans[j] <- *value:
			default:
				{
					log4.Error("chan full, so lose data")
				}
			}

		}
		for k := 0; k < len(subregChans); k++ {
			select {
			case subregChans[k] <- *value:
			default:
				{
					log4.Error("chan full, so lose data")
				}
			}
		}
	}

}