Package com.alibaba.dubbo.governance.web.governance.module.screen

Source Code of com.alibaba.dubbo.governance.web.governance.module.screen.Weights

/*
* Copyright 2011 Alibaba.com All right reserved. This software is the
* confidential and proprietary information of Alibaba.com ("Confidential
* Information"). You shall not disclose such Confidential Information and shall
* use it only in accordance with the terms of the license agreement you entered
* into with Alibaba.com.
*/
package com.alibaba.dubbo.governance.web.governance.module.screen;

import java.io.BufferedReader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.springframework.beans.factory.annotation.Autowired;

import com.alibaba.dubbo.common.utils.CollectionUtils;
import com.alibaba.dubbo.governance.service.OverrideService;
import com.alibaba.dubbo.governance.service.ProviderService;
import com.alibaba.dubbo.governance.web.common.module.screen.Restful;
import com.alibaba.dubbo.registry.common.domain.Provider;
import com.alibaba.dubbo.registry.common.domain.Weight;
import com.alibaba.dubbo.registry.common.util.OverrideUtils;
import com.alibaba.dubbo.registry.common.util.Tool;

/**
* Providers.
* URI: /services/$service/weights
*
* @author william.liangf
*/
public class Weights extends Restful {
   
    @Autowired
    private OverrideService overrideService;
   
    @Autowired
    private ProviderService providerService;
   
    public void index(Map<String, Object> context) {
        final String service = StringUtils.trimToNull((String) context.get("service"));
        String address = (String) context.get("address");
        address = Tool.getIP(address);
        List<Weight> weights;
        if (service != null && service.length() > 0) {
            weights = OverrideUtils.overridesToWeights(overrideService.findByService(service));
        } else if (address != null && address.length() > 0) {
            weights = OverrideUtils.overridesToWeights(overrideService.findByAddress(address));
        } else {
            weights = OverrideUtils.overridesToWeights(overrideService.findAll());
        }
        context.put("weights", weights);
    }
 
   
   
    /**
     * load页面供新增操作
     * @param context
     */
    public void add(Map<String, Object> context) {
        String service = (String)context.get("service");
        if (service != null && service.length() > 0 && !service.contains("*")) {
            List<Provider> providerList = providerService.findByService(service);
            List<String> addressList = new ArrayList<String>();
            for(Provider provider : providerList){
                addressList.add(provider.getUrl().split("://")[1].split("/")[0]);
            }
            context.put("addressList", addressList);
            context.put("service", service);
            context.put("methods", CollectionUtils.sort(providerService.findMethodsByService(service)));
        } else {
            List<String> serviceList = Tool.sortSimpleName(providerService.findServices());
            context.put("serviceList", serviceList);
        }
        if(context.get("input") != null) context.put("input", context.get("input"));
    }
   
    /**
     * load页面供新增操作
     * @param context
     */
    public void multiadd(Map<String, Object> context) {
        List<String> serviceList = Tool.sortSimpleName(providerService.findServices());
        context.put("serviceList", serviceList);
    }
   
    private static final Pattern IP_PATTERN       = Pattern.compile("\\d{1,3}(\\.\\d{1,3}){3}$");

    private static final Pattern LOCAL_IP_PATTERN = Pattern.compile("127(\\.\\d{1,3}){3}$");
    private static final Pattern ALL_IP_PATTERN   = Pattern.compile("0{1,3}(\\.0{1,3}){3}$");
   
    public boolean create(Map<String, Object> context) throws Exception {
        String addr = (String) context.get("address");
        String services = (String) context.get("multiservice");
        if(services == null || services.trim().length() == 0) {
            services = (String) context.get("service");
        }
        String weight = (String) context.get("weight");
       
        int w = Integer.parseInt(weight);
       
        Set<String> addresses = new HashSet<String>();
        BufferedReader reader = new BufferedReader(new StringReader(addr));
        while (true) {
            String line = reader.readLine();
            if (null == line)
                break;
           
            String[] split = line.split("[\\s,;]+");
            for (String s : split) {
                if (s.length() == 0)
                    continue;
               
                String ip = s;
                String port = null;
                if(s.indexOf(":") != -1) {
                    ip = s.substring(0, s.indexOf(":"));
                    port = s.substring(s.indexOf(":") + 1, s.length());
                    if(port.trim().length() == 0) port = null;
                }
                if (!IP_PATTERN.matcher(ip).matches()) {
                    context.put("message", "illegal IP: " + s);
                    return false;
                }
                if (LOCAL_IP_PATTERN.matcher(ip).matches() || ALL_IP_PATTERN.matcher(ip).matches()) {
                    context.put("message", "local IP or any host ip is illegal: " + s);
                    return false;
                }
                if(port != null) {
                    if(!NumberUtils.isDigits(port)) {
                        context.put("message", "illegal port: " + s);
                        return false;
                    }
                }
                addresses.add(s);
            }
        }
       
        Set<String> aimServices  = new HashSet<String>();
        reader = new BufferedReader(new StringReader(services));
        while (true) {
            String line = reader.readLine();
            if (null == line)
                break;
           
            String[] split = line.split("[\\s,;]+");
            for (String s : split) {
                if (s.length() == 0)
                    continue;
                if (!super.currentUser.hasServicePrivilege(s)) {
                    context.put("message", getMessage("HaveNoServicePrivilege", s));
                    return false;
                }
                aimServices.add(s);
            }
        }
       
        for(String aimService : aimServices) {
            for (String a : addresses) {
                Weight wt = new Weight();
                wt.setUsername((String)context.get("operator"));
                wt.setAddress(Tool.getIP(a));
                wt.setService(aimService);
                wt.setWeight(w);
                overrideService.saveOverride(OverrideUtils.weightToOverride(wt));
            }
        }
        return true;
    }

    public void edit(Long id, Map<String, Object> context) {
        add(context);
        show(id, context);
        context.put("service", overrideService.findById(id).getService());
    }
   
    public void sameSeviceEdit(Long id, Map<String, Object> context) {
        add(context);
        show(id, context);
    }
   
    /**
     * load weight对象供编辑操作
     * @param id
     * @param context
     */
    public void show(Long id, Map<String, Object> context) {
      Weight weight = OverrideUtils.overrideToWeight(overrideService.findById(id));
        context.put("weight", weight);
    }
   
    public boolean update(Weight weight, Map<String, Object> context) {
        if (!super.currentUser.hasServicePrivilege(weight.getService())) {
            context.put("message", getMessage("HaveNoServicePrivilege", weight.getService()));
            return false;
        }
        weight.setAddress(Tool.getIP(weight.getAddress()));
      overrideService.updateOverride(OverrideUtils.weightToOverride(weight));
        return true;
    }

    /**
     * 删除动作
     * @param ids
     * @return
     */
    public boolean delete(Long[] ids, Map<String, Object> context) {
        for (Long id : ids) {
            Weight w = OverrideUtils.overrideToWeight(overrideService.findById(id));
            if (!super.currentUser.hasServicePrivilege(w.getService())) {
                context.put("message", getMessage("HaveNoServicePrivilege", w.getService()));
                return false;
            }
        }
       
        for (Long id : ids) {
          overrideService.deleteOverride(id);
        }
        return true;
    }

}
TOP

Related Classes of com.alibaba.dubbo.governance.web.governance.module.screen.Weights

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.