package com.alibaba.dubbo.governance.service.impl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import com.alibaba.dubbo.common.Constants;
import com.alibaba.dubbo.common.utils.StringUtils;
import com.alibaba.dubbo.governance.service.OverrideService;
import com.alibaba.dubbo.governance.service.OwnerService;
import com.alibaba.dubbo.governance.service.ProviderService;
import com.alibaba.dubbo.registry.common.domain.Override;
import com.alibaba.dubbo.registry.common.domain.Owner;
import com.alibaba.dubbo.registry.common.domain.Provider;
public class OwnerServiceImpl extends AbstractService implements OwnerService {
@Autowired
ProviderService providerService;
@Autowired
OverrideService overrideService;
public List<String> findAllServiceNames() {
// TODO Auto-generated method stub
return null;
}
public List<String> findServiceNamesByUsername(String username) {
// TODO Auto-generated method stub
return null;
}
public List<String> findUsernamesByServiceName(String serviceName) {
// TODO Auto-generated method stub
return null;
}
public List<Owner> findByService(String serviceName) {
List<Provider> pList = providerService.findByService(serviceName);
List<Override> cList = overrideService.findByServiceAndAddress(serviceName, Constants.ANYHOST_VALUE);
return toOverrideLiset(pList,cList);
}
public List<Owner> findAll() {
List<Provider> pList = providerService.findAll();
List<Override> cList = overrideService.findAll();
return toOverrideLiset(pList,cList);
}
public Owner findById(Long id) {
return null;
}
private List<Owner> toOverrideLiset(List<Provider> pList, List<Override> cList){
Map<String, Owner> oList = new HashMap<String, Owner>();
for(Provider p : pList){
if(p.getUsername() != null){
for (String username : Constants.COMMA_SPLIT_PATTERN.split(p.getUsername())) {
Owner o = new Owner();
o.setService(p.getService());
o.setUsername(username);
oList.put(o.getService() + "/" + o.getUsername(), o);
}
}
}
for(Override c : cList){
Map<String, String> params = StringUtils.parseQueryString(c.getParams());
String usernames = params.get("owner");
if(usernames != null && usernames.length() > 0){
for (String username : Constants.COMMA_SPLIT_PATTERN.split(usernames)) {
Owner o = new Owner();
o.setService(c.getService());
o.setUsername(username);
oList.put(o.getService() + "/" + o.getUsername(), o);
}
}
}
return new ArrayList<Owner>(oList.values());
}
public void saveOwner(Owner owner) {
List<Override> overrides = overrideService.findByServiceAndAddress(owner.getService(), Constants.ANYHOST_VALUE);
if (overrides == null || overrides.size() == 0) {
Override override = new Override();
override.setAddress(Constants.ANYHOST_VALUE);
override.setService(owner.getService());
override.setEnabled(true);
override.setParams("owner=" + owner.getUsername());
overrideService.saveOverride(override);
} else {
for(Override override : overrides){
Map<String, String> params = StringUtils.parseQueryString(override.getParams());
String usernames = params.get("owner");
if (usernames == null || usernames.length() == 0) {
usernames = owner.getUsername();
} else {
usernames = usernames + "," + owner.getUsername();
}
params.put("owner", usernames);
override.setParams(StringUtils.toQueryString(params));
overrideService.updateOverride(override);
}
}
}
public void deleteOwner(Owner owner) {
List<Override> overrides = overrideService.findByServiceAndAddress(owner.getService(), Constants.ANYHOST_VALUE);
if (overrides == null || overrides.size() == 0) {
Override override = new Override();
override.setAddress(Constants.ANYHOST_VALUE);
override.setService(owner.getService());
override.setEnabled(true);
override.setParams("owner=" + owner.getUsername());
overrideService.saveOverride(override);
} else {
for(Override override : overrides){
Map<String, String> params = StringUtils.parseQueryString(override.getParams());
String usernames = params.get("owner");
if (usernames != null && usernames.length() > 0) {
if (usernames.equals(owner.getUsername())) {
params.remove("owner");
} else {
usernames = usernames.replace(owner.getUsername() + ",", "").replace("," + owner.getUsername(), "");
params.put("owner", usernames);
}
if (params.size() > 0) {
override.setParams(StringUtils.toQueryString(params));
overrideService.updateOverride(override);
} else {
overrideService.deleteOverride(override.getId());
}
}
}
}
}
}