You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by mi...@apache.org on 2018/09/13 14:00:21 UTC
[incubator-dubbo-ops] branch develop updated: hide old
routerController
This is an automated email from the ASF dual-hosted git repository.
min pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo-ops.git
The following commit(s) were added to refs/heads/develop by this push:
new 31bf392 hide old routerController
31bf392 is described below
commit 31bf392c995f308a51bdaacbd250d38447668d41
Author: nzomkxia <z8...@gmail.com>
AuthorDate: Thu Sep 13 22:00:03 2018 +0800
hide old routerController
---
.../admin/web/mvc/governance/RoutesController.java | 1110 ++++++++++----------
1 file changed, 555 insertions(+), 555 deletions(-)
diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/web/mvc/governance/RoutesController.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/web/mvc/governance/RoutesController.java
index d29dcf4..9432736 100644
--- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/web/mvc/governance/RoutesController.java
+++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/web/mvc/governance/RoutesController.java
@@ -1,555 +1,555 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.dubbo.admin.web.mvc.governance;
-
-import com.alibaba.dubbo.common.utils.CollectionUtils;
-import com.alibaba.dubbo.common.utils.StringUtils;
-import org.apache.dubbo.admin.governance.service.ConsumerService;
-import org.apache.dubbo.admin.governance.service.OwnerService;
-import org.apache.dubbo.admin.governance.service.ProviderService;
-import org.apache.dubbo.admin.governance.service.RouteService;
-import org.apache.dubbo.admin.registry.common.domain.Route;
-import org.apache.dubbo.admin.registry.common.route.ParseUtils;
-import org.apache.dubbo.admin.registry.common.route.RouteRule;
-import org.apache.dubbo.admin.web.mvc.BaseController;
-import org.apache.dubbo.admin.web.pulltool.Tool;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.validation.support.BindingAwareModelMap;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.text.ParseException;
-import java.util.*;
-
-/**
- * ProvidersController.
- * URI: /services/$service/routes
- *
- */
-@Controller
-@RequestMapping("/routing")
-public class RoutesController extends BaseController {
-
- private static final int MAX_RULE_LENGTH = 1000;
- static String[][] when_names = {
- {"method", "method", "unmethod"},
- {"consumer.application", "consumerApplication", "unconsumerApplication"},
- {"consumer.cluster", "consumerCluster", "unconsumerCluster"},
- {"consumer.host", "consumerHost", "unconsumerHost"},
- {"consumer.version", "consumerVersion", "unconsumerVersion"},
- {"consumer.group", "consumerGroup", "unconsumerGroup"},
- };
- static String[][] then_names = {
- {"provider.application", "providerApplication", "unproviderApplication"},
- {"provider.cluster", "providerCluster", "unproviderCluster"}, // Must check if Cluster exists
- {"provider.host", "providerHost", "unproviderHost"},
- {"provider.protocol", "providerProtocol", "unproviderProtocol"},
- {"provider.port", "providerPort", "unproviderPort"},
- {"provider.version", "providerVersion", "unproviderVersion"},
- {"provider.group", "providerGroup", "unproviderGroup"}
- };
- @Autowired
- private RouteService routeService;
- @Autowired
- private ProviderService providerService;
- @Autowired
- private ConsumerService consumerService;
-
- static void checkService(String service) {
- if (service.contains(",")) throw new IllegalStateException("service(" + service + ") contain illegale ','");
-
- String interfaceName = service;
- int gi = interfaceName.indexOf("/");
- if (gi != -1) interfaceName = interfaceName.substring(gi + 1);
- int vi = interfaceName.indexOf(':');
- if (vi != -1) interfaceName = interfaceName.substring(0, vi);
-
- if (interfaceName.indexOf('*') != -1 && interfaceName.indexOf('*') != interfaceName.length() - 1) {
- throw new IllegalStateException("service(" + service + ") only allow 1 *, and must be last char!");
- }
- }
-
- /**
- * add owners related with service
- *
- * @param usernames the usernames to add
- * @param serviceName no wildcards
- */
- public static void addOwnersOfService(Set<String> usernames, String serviceName,
- OwnerService ownerDAO) {
- List<String> serviceNamePatterns = ownerDAO.findAllServiceNames();
- for (String p : serviceNamePatterns) {
- if (ParseUtils.isMatchGlobPattern(p, serviceName)) {
- List<String> list = ownerDAO.findUsernamesByServiceName(p);
- usernames.addAll(list);
- }
- }
- }
-
- /**
- * add owners related with service pattern
- *
- * @param usernames the usernames to add
- * @param serviceNamePattern service pattern, Glob
- */
- public static void addOwnersOfServicePattern(Set<String> usernames, String serviceNamePattern,
- OwnerService ownerDAO) {
- List<String> serviceNamePatterns = ownerDAO.findAllServiceNames();
- for (String p : serviceNamePatterns) {
- if (ParseUtils.hasIntersection(p, serviceNamePattern)) {
- List<String> list = ownerDAO.findUsernamesByServiceName(p);
- usernames.addAll(list);
- }
- }
- }
-
- /**
- * Routing module home page
- *
- */
- @RequestMapping("")
- public String index(@RequestParam(required = false) String service,
- @RequestParam(required = false) String app,
- HttpServletRequest request, HttpServletResponse response, Model model) {
- model.addAttribute("service", service);
- model.addAttribute("app", app);
- if (service != null) {
- model.addAttribute("methods", CollectionUtils.sort(new ArrayList<String>(providerService.findMethodsByService(service))));
- } else {
- List<String> serviceList = Tool.sortSimpleName(new ArrayList<String>(providerService.findServices()));
- model.addAttribute("serviceList", serviceList);
- }
- return "routingRules";
- }
-
- /**
- * Display routing details
- *
- */
- @RequestMapping("/detail")
- public String show(@RequestParam("id") Long id, HttpServletRequest request, HttpServletResponse response, Model model) {
- try {
- prepare(request, response, model, "show", "routes");
- Route route = routeService.findRoute(id);
-
- if (route == null) {
- throw new IllegalArgumentException("The route is not existed.");
- }
- if (route.getService() != null && !route.getService().isEmpty()) {
- model.addAttribute("service", route.getService());
- }
-
- RouteRule routeRule = RouteRule.parse(route);
-
- @SuppressWarnings("unchecked")
- Map<String, RouteRule.MatchPair>[] paramArray = new Map[]{
- routeRule.getWhenCondition(), routeRule.getThenCondition()};
- String[][][] namesArray = new String[][][]{when_names, then_names};
-
- for (int i = 0; i < paramArray.length; ++i) {
- Map<String, RouteRule.MatchPair> param = paramArray[i];
- String[][] names = namesArray[i];
- for (String[] name : names) {
- RouteRule.MatchPair matchPair = param.get(name[0]);
- if (matchPair == null) {
- continue;
- }
-
- if (!matchPair.getMatches().isEmpty()) {
- String m = RouteRule.join(matchPair.getMatches());
- model.addAttribute(name[1], m);
- }
- if (!matchPair.getUnmatches().isEmpty()) {
- String u = RouteRule.join(matchPair.getUnmatches());
- model.addAttribute(name[2], u);
- }
- }
- }
- model.addAttribute("route", route);
- model.addAttribute("methods", CollectionUtils.sort(new ArrayList<String>(providerService.findMethodsByService(route.getService()))));
- } catch (ParseException e) {
- e.printStackTrace();
- }
- return "governance/screen/routes/show";
- }
-
- /**
- * Load new route page
- *
- */
- @RequestMapping("/add")
- public String add(HttpServletRequest request, HttpServletResponse response, Model model) {
- prepare(request, response, model, "add", "routes");
- BindingAwareModelMap newModel = (BindingAwareModelMap)model;
- String service = (String)newModel.get("service");
- if (service != null && service.length() > 0 && !service.contains("*")) {
- model.addAttribute("service", service);
- model.addAttribute("methods", CollectionUtils.sort(new ArrayList<String>(providerService.findMethodsByService(service))));
- } else {
- List<String> serviceList = Tool.sortSimpleName(new ArrayList<String>(providerService.findServices()));
- model.addAttribute("serviceList", serviceList);
- }
-
- //if (input != null) model.addAttribute("input", input);
- return "governance/screen/routes/add";
- }
-
- /**
- * Load modified routing page
- *
- */
-
- @RequestMapping("/edit")
- public String edit(@RequestParam("id") Long id, @RequestParam(required = false) String service,
- @RequestParam(required = false) String input,
- HttpServletRequest request, HttpServletResponse response, Model model) {
-
- prepare(request, response, model, "edit", "routes");
- if (service != null && service.length() > 0 && !service.contains("*")) {
- model.addAttribute("service", service);
- model.addAttribute("methods", CollectionUtils.sort(new ArrayList<String>(providerService.findMethodsByService(service))));
- } else {
- List<String> serviceList = Tool.sortSimpleName(new ArrayList<String>(providerService.findServices()));
- model.addAttribute("serviceList", serviceList);
- }
-
- if (input != null) model.addAttribute("input", input);
- Route route = routeService.findRoute(id);
-
- if (route == null) {
- throw new IllegalArgumentException("The route is not existed.");
- }
- if (route.getService() != null && !route.getService().isEmpty()) {
- model.addAttribute("service", route.getService());
- }
-
- RouteRule routeRule = null;
- try {
- routeRule = RouteRule.parse(route);
- } catch (ParseException e) {
- e.printStackTrace();
- }
-
- @SuppressWarnings("unchecked")
- Map<String, RouteRule.MatchPair>[] paramArray = new Map[]{
- routeRule.getWhenCondition(), routeRule.getThenCondition()};
- String[][][] namesArray = new String[][][]{when_names, then_names};
-
- for (int i = 0; i < paramArray.length; ++i) {
- Map<String, RouteRule.MatchPair> param = paramArray[i];
- String[][] names = namesArray[i];
- for (String[] name : names) {
- RouteRule.MatchPair matchPair = param.get(name[0]);
- if (matchPair == null) {
- continue;
- }
-
- if (!matchPair.getMatches().isEmpty()) {
- String m = RouteRule.join(matchPair.getMatches());
- model.addAttribute(name[1], m);
- }
- if (!matchPair.getUnmatches().isEmpty()) {
- String u = RouteRule.join(matchPair.getUnmatches());
- model.addAttribute(name[2], u);
- }
- }
- }
- model.addAttribute("route", route);
- model.addAttribute("methods", CollectionUtils.sort(new ArrayList<String>(providerService.findMethodsByService(route.getService()))));
-
- return "governance/screen/routes/edit";
- }
-
- /**
- * Save the routing information to the database
- *
- * @return
- */
-
- @RequestMapping("/create")
- public String create(HttpServletRequest request, HttpServletResponse response, Model model) {
- prepare(request, response, model, "update", "routes");
- boolean success = true;
-
- String name = request.getParameter("name");
- String service = request.getParameter("service");
- if (StringUtils.isNotEmpty(service)
- && StringUtils.isNotEmpty(name)) {
- checkService(service);
-
- Map<String, String> when_name2valueList = new HashMap<String, String>();
- Map<String, String> notWhen_name2valueList = new HashMap<String, String>();
- for (String[] names : when_names) {
- when_name2valueList.put(names[0], request.getParameter(names[1]));
- notWhen_name2valueList.put(names[0], request.getParameter(names[2])); // TODO. We should guarantee value is never null in here, will be supported later
- }
-
- Map<String, String> then_name2valueList = new HashMap<String, String>();
- Map<String, String> notThen_name2valueList = new HashMap<String, String>();
- for (String[] names : then_names) {
- then_name2valueList.put(names[0], request.getParameter(names[1]));
- notThen_name2valueList.put(names[0], request.getParameter(names[2]));
- }
-
- RouteRule routeRule = RouteRule.createFromNameAndValueListString(
- when_name2valueList, notWhen_name2valueList,
- then_name2valueList, notThen_name2valueList);
-
- if (routeRule.getThenCondition().isEmpty()) {
- model.addAttribute("message", getMessage("Add route error! then is empty."));
- model.addAttribute("success", false);
- model.addAttribute("redirect", "../routes");
- return "governance/screen/redirect";
- }
-
- String matchRule = routeRule.getWhenConditionString();
- String filterRule = routeRule.getThenConditionString();
-
- // Limit the length of the expression
- if (matchRule.length() > MAX_RULE_LENGTH) {
- model.addAttribute("message", getMessage("When rule is too long!"));
- model.addAttribute("success", false);
- model.addAttribute("redirect", "../routes");
- return "governance/screen/redirect";
- }
- if (filterRule.length() > MAX_RULE_LENGTH) {
- model.addAttribute("message", getMessage("Then rule is too long!"));
- model.addAttribute("success", false);
- model.addAttribute("redirect", "../routes");
- return "governance/screen/redirect";
- }
-
- Route route = new Route();
- route.setService(service);
- route.setName(name);
- route.setUsername(request.getParameter("operator"));
- route.setOperator(request.getParameter("operatorAddress"));
- route.setRule(routeRule.toString());
- if (StringUtils.isNotEmpty(request.getParameter("priority"))) {
- route.setPriority(Integer.parseInt(request.getParameter("priority")));
- }
- routeService.createRoute(route);
-
- }
- model.addAttribute("success", success);
- model.addAttribute("redirect", "../routes");
- return "governance/screen/redirect";
- }
-
- /**
- * Save the update data to the database
- *
- * @return
- */
- @RequestMapping("/update")
- public String update(@RequestParam("id") Long id, HttpServletRequest request, HttpServletResponse response, Model model) {
- prepare(request, response, model, "update", "routes");
- boolean success = true;
- String idStr = String.valueOf(id);
- if (idStr != null && idStr.length() > 0) {
- String[] blacks = request.getParameterMap().get("black");
- //String[] blacks = (String[]) context.get("black");
- boolean black = false;
- if (blacks != null && blacks.length > 0) {
- success = false;
- model.addAttribute("success", success);
- model.addAttribute("redirect", "../../routes");
- return "governance/screen/redirect";
- }
-
- Route oldRoute = routeService.findRoute(Long.valueOf(idStr));
- if (null == oldRoute) {
- model.addAttribute("message", getMessage("NoSuchRecord"));
- success = false;
- model.addAttribute("success", success);
- model.addAttribute("redirect", "../../routes");
- return "governance/screen/redirect";
- }
- // Check parameters, patchwork rule
- if (StringUtils.isNotEmpty((String) request.getParameter("name"))) {
- String service = oldRoute.getService();
- if (((BindingAwareModelMap)model).get("operator") == null) {
- model.addAttribute("message", getMessage("HaveNoServicePrivilege", service));
- success = false;
- model.addAttribute("success", success);
- model.addAttribute("redirect", "../../routes");
- return "governance/screen/redirect";
- }
-
- Map<String, String> when_name2valueList = new HashMap<String, String>();
- Map<String, String> notWhen_name2valueList = new HashMap<String, String>();
- for (String[] names : when_names) {
- when_name2valueList.put(names[0], (String) request.getParameter(names[1]));
- notWhen_name2valueList.put(names[0], (String) request.getParameter(names[2]));
- }
-
- Map<String, String> then_name2valueList = new HashMap<String, String>();
- Map<String, String> notThen_name2valueList = new HashMap<String, String>();
- for (String[] names : then_names) {
- then_name2valueList.put(names[0], (String) request.getParameter(names[1]));
- notThen_name2valueList.put(names[0], (String) request.getParameter(names[2]));
- }
-
- RouteRule routeRule = RouteRule.createFromNameAndValueListString(
- when_name2valueList, notWhen_name2valueList,
- then_name2valueList, notThen_name2valueList);
-
- RouteRule result = null;
- if (black) {
- RouteRule.MatchPair matchPair = routeRule.getThenCondition().get("black");
- Map<String, RouteRule.MatchPair> then = null;
- if (null == matchPair) {
- matchPair = new RouteRule.MatchPair();
- then = new HashMap<String, RouteRule.MatchPair>();
- then.put("black", matchPair);
- } else {
- matchPair.getMatches().clear();
- }
- matchPair.getMatches().add(String.valueOf(black));
- result = RouteRule.copyWithReplace(routeRule, null, then);
- }
-
- if (result == null) {
- result = routeRule;
- }
-
- if (result.getThenCondition().isEmpty()) {
- model.addAttribute("message", getMessage("Update route error! then is empty."));
- success = false;
- model.addAttribute("success", success);
- model.addAttribute("redirect", "../../routes");
- return "governance/screen/redirect";
- }
-
- String matchRule = result.getWhenConditionString();
- String filterRule = result.getThenConditionString();
-
- // Limit the length of the expression
- if (matchRule.length() > MAX_RULE_LENGTH) {
- model.addAttribute("message", getMessage("When rule is too long!"));
- success = false;
- model.addAttribute("success", success);
- model.addAttribute("redirect", "../../routes");
- return "governance/screen/redirect";
- }
- if (filterRule.length() > MAX_RULE_LENGTH) {
- model.addAttribute("message", getMessage("Then rule is too long!"));
- success = false;
- model.addAttribute("success", success);
- model.addAttribute("redirect", "../../routes");
- return "governance/screen/redirect";
- }
-
- int priority = 0;
- if (StringUtils.isNotEmpty((String) request.getParameter("priority"))) {
- priority = Integer.parseInt((String) request.getParameter("priority"));
- }
-
- Route route = new Route();
- route.setRule(result.toString());
- route.setService(service);
- route.setPriority(priority);
- route.setName((String) request.getParameter("name"));
- route.setUsername((String) request.getParameter("operator"));
- route.setOperator((String) request.getParameter("operatorAddress"));
- route.setId(Long.valueOf(idStr));
- route.setPriority(Integer.parseInt((String) request.getParameter("priority")));
- route.setEnabled(oldRoute.isEnabled());
- routeService.updateRoute(route);
-
- Set<String> usernames = new HashSet<String>();
- usernames.add((String) request.getParameter("operator"));
- usernames.add(route.getUsername());
- //RelateUserUtils.addOwnersOfService(usernames, route.getService(), ownerDAO);
-
- Map<String, Object> params = new HashMap<String, Object>();
- params.put("action", "update");
- params.put("route", route);
-
- } else {
- model.addAttribute("message", getMessage("MissRequestParameters", "name"));
- }
- } else {
- model.addAttribute("message", getMessage("MissRequestParameters", "id"));
- }
-
- model.addAttribute("success", success);
- model.addAttribute("redirect", "../../routes");
- return "governance/screen/redirect";
- }
-
- /**
- * Remove the route rule for the specified ID
- *
- * @param ids
- * @return
- */
- @RequestMapping("/{ids}/delete")
- public String delete(@PathVariable("ids") Long[] ids, HttpServletRequest request, HttpServletResponse response,
- Model model) {
- prepare(request, response, model, "delete", "routes");
- for (Long id : ids) {
- routeService.deleteRoute(id);
- }
- model.addAttribute("success", true);
- model.addAttribute("redirect", "../../routes");
- return "governance/screen/redirect";
-
- }
-
- /**
- * Enable the specified route ID rules (batch processing)
- *
- * @param ids
- * @return
- */
- @RequestMapping("/{ids}/enable")
- public String enable(@PathVariable("ids") Long[] ids, HttpServletRequest request, HttpServletResponse response,
- Model model) {
- prepare(request, response, model, "enable", "routes");
- for (Long id : ids) {
- routeService.enableRoute(id);
- }
- model.addAttribute("success", true);
- model.addAttribute("redirect", "../../routes");
- return "governance/screen/redirect";
- }
-
- /**
- * Disabling route rules for specified IDs (can be batch processed)
- *
- * @param ids
- * @return
- */
- @RequestMapping("/{ids}/disable")
- public String disable(@PathVariable("ids") Long[] ids, HttpServletRequest request, HttpServletResponse response,
- Model model) {
- prepare(request, response, model, "disable", "routes");
- for (Long id : ids) {
- routeService.disableRoute(id);
- }
- model.addAttribute("success", true);
- model.addAttribute("redirect", "../../routes");
- return "governance/screen/redirect";
- }
-
-}
+///*
+// * Licensed to the Apache Software Foundation (ASF) under one or more
+// * contributor license agreements. See the NOTICE file distributed with
+// * this work for additional information regarding copyright ownership.
+// * The ASF licenses this file to You under the Apache License, Version 2.0
+// * (the "License"); you may not use this file except in compliance with
+// * the License. You may obtain a copy of the License at
+// *
+// * http://www.apache.org/licenses/LICENSE-2.0
+// *
+// * Unless required by applicable law or agreed to in writing, software
+// * distributed under the License is distributed on an "AS IS" BASIS,
+// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// * See the License for the specific language governing permissions and
+// * limitations under the License.
+// */
+//package org.apache.dubbo.admin.web.mvc.governance;
+//
+//import com.alibaba.dubbo.common.utils.CollectionUtils;
+//import com.alibaba.dubbo.common.utils.StringUtils;
+//import org.apache.dubbo.admin.governance.service.ConsumerService;
+//import org.apache.dubbo.admin.governance.service.OwnerService;
+//import org.apache.dubbo.admin.governance.service.ProviderService;
+//import org.apache.dubbo.admin.governance.service.RouteService;
+//import org.apache.dubbo.admin.registry.common.domain.Route;
+//import org.apache.dubbo.admin.registry.common.route.ParseUtils;
+//import org.apache.dubbo.admin.registry.common.route.RouteRule;
+//import org.apache.dubbo.admin.web.mvc.BaseController;
+//import org.apache.dubbo.admin.web.pulltool.Tool;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.stereotype.Controller;
+//import org.springframework.ui.Model;
+//import org.springframework.validation.support.BindingAwareModelMap;
+//import org.springframework.web.bind.annotation.PathVariable;
+//import org.springframework.web.bind.annotation.RequestMapping;
+//import org.springframework.web.bind.annotation.RequestParam;
+//
+//import javax.servlet.http.HttpServletRequest;
+//import javax.servlet.http.HttpServletResponse;
+//import java.text.ParseException;
+//import java.util.*;
+//
+///**
+// * ProvidersController.
+// * URI: /services/$service/routes
+// *
+// */
+//@Controller
+//@RequestMapping("/routing")
+//public class RoutesController extends BaseController {
+//
+// private static final int MAX_RULE_LENGTH = 1000;
+// static String[][] when_names = {
+// {"method", "method", "unmethod"},
+// {"consumer.application", "consumerApplication", "unconsumerApplication"},
+// {"consumer.cluster", "consumerCluster", "unconsumerCluster"},
+// {"consumer.host", "consumerHost", "unconsumerHost"},
+// {"consumer.version", "consumerVersion", "unconsumerVersion"},
+// {"consumer.group", "consumerGroup", "unconsumerGroup"},
+// };
+// static String[][] then_names = {
+// {"provider.application", "providerApplication", "unproviderApplication"},
+// {"provider.cluster", "providerCluster", "unproviderCluster"}, // Must check if Cluster exists
+// {"provider.host", "providerHost", "unproviderHost"},
+// {"provider.protocol", "providerProtocol", "unproviderProtocol"},
+// {"provider.port", "providerPort", "unproviderPort"},
+// {"provider.version", "providerVersion", "unproviderVersion"},
+// {"provider.group", "providerGroup", "unproviderGroup"}
+// };
+// @Autowired
+// private RouteService routeService;
+// @Autowired
+// private ProviderService providerService;
+// @Autowired
+// private ConsumerService consumerService;
+//
+// static void checkService(String service) {
+// if (service.contains(",")) throw new IllegalStateException("service(" + service + ") contain illegale ','");
+//
+// String interfaceName = service;
+// int gi = interfaceName.indexOf("/");
+// if (gi != -1) interfaceName = interfaceName.substring(gi + 1);
+// int vi = interfaceName.indexOf(':');
+// if (vi != -1) interfaceName = interfaceName.substring(0, vi);
+//
+// if (interfaceName.indexOf('*') != -1 && interfaceName.indexOf('*') != interfaceName.length() - 1) {
+// throw new IllegalStateException("service(" + service + ") only allow 1 *, and must be last char!");
+// }
+// }
+//
+// /**
+// * add owners related with service
+// *
+// * @param usernames the usernames to add
+// * @param serviceName no wildcards
+// */
+// public static void addOwnersOfService(Set<String> usernames, String serviceName,
+// OwnerService ownerDAO) {
+// List<String> serviceNamePatterns = ownerDAO.findAllServiceNames();
+// for (String p : serviceNamePatterns) {
+// if (ParseUtils.isMatchGlobPattern(p, serviceName)) {
+// List<String> list = ownerDAO.findUsernamesByServiceName(p);
+// usernames.addAll(list);
+// }
+// }
+// }
+//
+// /**
+// * add owners related with service pattern
+// *
+// * @param usernames the usernames to add
+// * @param serviceNamePattern service pattern, Glob
+// */
+// public static void addOwnersOfServicePattern(Set<String> usernames, String serviceNamePattern,
+// OwnerService ownerDAO) {
+// List<String> serviceNamePatterns = ownerDAO.findAllServiceNames();
+// for (String p : serviceNamePatterns) {
+// if (ParseUtils.hasIntersection(p, serviceNamePattern)) {
+// List<String> list = ownerDAO.findUsernamesByServiceName(p);
+// usernames.addAll(list);
+// }
+// }
+// }
+//
+// /**
+// * Routing module home page
+// *
+// */
+// @RequestMapping("")
+// public String index(@RequestParam(required = false) String service,
+// @RequestParam(required = false) String app,
+// HttpServletRequest request, HttpServletResponse response, Model model) {
+// model.addAttribute("service", service);
+// model.addAttribute("app", app);
+// if (service != null) {
+// model.addAttribute("methods", CollectionUtils.sort(new ArrayList<String>(providerService.findMethodsByService(service))));
+// } else {
+// List<String> serviceList = Tool.sortSimpleName(new ArrayList<String>(providerService.findServices()));
+// model.addAttribute("serviceList", serviceList);
+// }
+// return "routingRules";
+// }
+//
+// /**
+// * Display routing details
+// *
+// */
+// @RequestMapping("/detail")
+// public String show(@RequestParam("id") Long id, HttpServletRequest request, HttpServletResponse response, Model model) {
+// try {
+// prepare(request, response, model, "show", "routes");
+// Route route = routeService.findRoute(id);
+//
+// if (route == null) {
+// throw new IllegalArgumentException("The route is not existed.");
+// }
+// if (route.getService() != null && !route.getService().isEmpty()) {
+// model.addAttribute("service", route.getService());
+// }
+//
+// RouteRule routeRule = RouteRule.parse(route);
+//
+// @SuppressWarnings("unchecked")
+// Map<String, RouteRule.MatchPair>[] paramArray = new Map[]{
+// routeRule.getWhenCondition(), routeRule.getThenCondition()};
+// String[][][] namesArray = new String[][][]{when_names, then_names};
+//
+// for (int i = 0; i < paramArray.length; ++i) {
+// Map<String, RouteRule.MatchPair> param = paramArray[i];
+// String[][] names = namesArray[i];
+// for (String[] name : names) {
+// RouteRule.MatchPair matchPair = param.get(name[0]);
+// if (matchPair == null) {
+// continue;
+// }
+//
+// if (!matchPair.getMatches().isEmpty()) {
+// String m = RouteRule.join(matchPair.getMatches());
+// model.addAttribute(name[1], m);
+// }
+// if (!matchPair.getUnmatches().isEmpty()) {
+// String u = RouteRule.join(matchPair.getUnmatches());
+// model.addAttribute(name[2], u);
+// }
+// }
+// }
+// model.addAttribute("route", route);
+// model.addAttribute("methods", CollectionUtils.sort(new ArrayList<String>(providerService.findMethodsByService(route.getService()))));
+// } catch (ParseException e) {
+// e.printStackTrace();
+// }
+// return "governance/screen/routes/show";
+// }
+//
+// /**
+// * Load new route page
+// *
+// */
+// @RequestMapping("/add")
+// public String add(HttpServletRequest request, HttpServletResponse response, Model model) {
+// prepare(request, response, model, "add", "routes");
+// BindingAwareModelMap newModel = (BindingAwareModelMap)model;
+// String service = (String)newModel.get("service");
+// if (service != null && service.length() > 0 && !service.contains("*")) {
+// model.addAttribute("service", service);
+// model.addAttribute("methods", CollectionUtils.sort(new ArrayList<String>(providerService.findMethodsByService(service))));
+// } else {
+// List<String> serviceList = Tool.sortSimpleName(new ArrayList<String>(providerService.findServices()));
+// model.addAttribute("serviceList", serviceList);
+// }
+//
+// //if (input != null) model.addAttribute("input", input);
+// return "governance/screen/routes/add";
+// }
+//
+// /**
+// * Load modified routing page
+// *
+// */
+//
+// @RequestMapping("/edit")
+// public String edit(@RequestParam("id") Long id, @RequestParam(required = false) String service,
+// @RequestParam(required = false) String input,
+// HttpServletRequest request, HttpServletResponse response, Model model) {
+//
+// prepare(request, response, model, "edit", "routes");
+// if (service != null && service.length() > 0 && !service.contains("*")) {
+// model.addAttribute("service", service);
+// model.addAttribute("methods", CollectionUtils.sort(new ArrayList<String>(providerService.findMethodsByService(service))));
+// } else {
+// List<String> serviceList = Tool.sortSimpleName(new ArrayList<String>(providerService.findServices()));
+// model.addAttribute("serviceList", serviceList);
+// }
+//
+// if (input != null) model.addAttribute("input", input);
+// Route route = routeService.findRoute(id);
+//
+// if (route == null) {
+// throw new IllegalArgumentException("The route is not existed.");
+// }
+// if (route.getService() != null && !route.getService().isEmpty()) {
+// model.addAttribute("service", route.getService());
+// }
+//
+// RouteRule routeRule = null;
+// try {
+// routeRule = RouteRule.parse(route);
+// } catch (ParseException e) {
+// e.printStackTrace();
+// }
+//
+// @SuppressWarnings("unchecked")
+// Map<String, RouteRule.MatchPair>[] paramArray = new Map[]{
+// routeRule.getWhenCondition(), routeRule.getThenCondition()};
+// String[][][] namesArray = new String[][][]{when_names, then_names};
+//
+// for (int i = 0; i < paramArray.length; ++i) {
+// Map<String, RouteRule.MatchPair> param = paramArray[i];
+// String[][] names = namesArray[i];
+// for (String[] name : names) {
+// RouteRule.MatchPair matchPair = param.get(name[0]);
+// if (matchPair == null) {
+// continue;
+// }
+//
+// if (!matchPair.getMatches().isEmpty()) {
+// String m = RouteRule.join(matchPair.getMatches());
+// model.addAttribute(name[1], m);
+// }
+// if (!matchPair.getUnmatches().isEmpty()) {
+// String u = RouteRule.join(matchPair.getUnmatches());
+// model.addAttribute(name[2], u);
+// }
+// }
+// }
+// model.addAttribute("route", route);
+// model.addAttribute("methods", CollectionUtils.sort(new ArrayList<String>(providerService.findMethodsByService(route.getService()))));
+//
+// return "governance/screen/routes/edit";
+// }
+//
+// /**
+// * Save the routing information to the database
+// *
+// * @return
+// */
+//
+// @RequestMapping("/create")
+// public String create(HttpServletRequest request, HttpServletResponse response, Model model) {
+// prepare(request, response, model, "update", "routes");
+// boolean success = true;
+//
+// String name = request.getParameter("name");
+// String service = request.getParameter("service");
+// if (StringUtils.isNotEmpty(service)
+// && StringUtils.isNotEmpty(name)) {
+// checkService(service);
+//
+// Map<String, String> when_name2valueList = new HashMap<String, String>();
+// Map<String, String> notWhen_name2valueList = new HashMap<String, String>();
+// for (String[] names : when_names) {
+// when_name2valueList.put(names[0], request.getParameter(names[1]));
+// notWhen_name2valueList.put(names[0], request.getParameter(names[2])); // TODO. We should guarantee value is never null in here, will be supported later
+// }
+//
+// Map<String, String> then_name2valueList = new HashMap<String, String>();
+// Map<String, String> notThen_name2valueList = new HashMap<String, String>();
+// for (String[] names : then_names) {
+// then_name2valueList.put(names[0], request.getParameter(names[1]));
+// notThen_name2valueList.put(names[0], request.getParameter(names[2]));
+// }
+//
+// RouteRule routeRule = RouteRule.createFromNameAndValueListString(
+// when_name2valueList, notWhen_name2valueList,
+// then_name2valueList, notThen_name2valueList);
+//
+// if (routeRule.getThenCondition().isEmpty()) {
+// model.addAttribute("message", getMessage("Add route error! then is empty."));
+// model.addAttribute("success", false);
+// model.addAttribute("redirect", "../routes");
+// return "governance/screen/redirect";
+// }
+//
+// String matchRule = routeRule.getWhenConditionString();
+// String filterRule = routeRule.getThenConditionString();
+//
+// // Limit the length of the expression
+// if (matchRule.length() > MAX_RULE_LENGTH) {
+// model.addAttribute("message", getMessage("When rule is too long!"));
+// model.addAttribute("success", false);
+// model.addAttribute("redirect", "../routes");
+// return "governance/screen/redirect";
+// }
+// if (filterRule.length() > MAX_RULE_LENGTH) {
+// model.addAttribute("message", getMessage("Then rule is too long!"));
+// model.addAttribute("success", false);
+// model.addAttribute("redirect", "../routes");
+// return "governance/screen/redirect";
+// }
+//
+// Route route = new Route();
+// route.setService(service);
+// route.setName(name);
+// route.setUsername(request.getParameter("operator"));
+// route.setOperator(request.getParameter("operatorAddress"));
+// route.setRule(routeRule.toString());
+// if (StringUtils.isNotEmpty(request.getParameter("priority"))) {
+// route.setPriority(Integer.parseInt(request.getParameter("priority")));
+// }
+// routeService.createRoute(route);
+//
+// }
+// model.addAttribute("success", success);
+// model.addAttribute("redirect", "../routes");
+// return "governance/screen/redirect";
+// }
+//
+// /**
+// * Save the update data to the database
+// *
+// * @return
+// */
+// @RequestMapping("/update")
+// public String update(@RequestParam("id") Long id, HttpServletRequest request, HttpServletResponse response, Model model) {
+// prepare(request, response, model, "update", "routes");
+// boolean success = true;
+// String idStr = String.valueOf(id);
+// if (idStr != null && idStr.length() > 0) {
+// String[] blacks = request.getParameterMap().get("black");
+// //String[] blacks = (String[]) context.get("black");
+// boolean black = false;
+// if (blacks != null && blacks.length > 0) {
+// success = false;
+// model.addAttribute("success", success);
+// model.addAttribute("redirect", "../../routes");
+// return "governance/screen/redirect";
+// }
+//
+// Route oldRoute = routeService.findRoute(Long.valueOf(idStr));
+// if (null == oldRoute) {
+// model.addAttribute("message", getMessage("NoSuchRecord"));
+// success = false;
+// model.addAttribute("success", success);
+// model.addAttribute("redirect", "../../routes");
+// return "governance/screen/redirect";
+// }
+// // Check parameters, patchwork rule
+// if (StringUtils.isNotEmpty((String) request.getParameter("name"))) {
+// String service = oldRoute.getService();
+// if (((BindingAwareModelMap)model).get("operator") == null) {
+// model.addAttribute("message", getMessage("HaveNoServicePrivilege", service));
+// success = false;
+// model.addAttribute("success", success);
+// model.addAttribute("redirect", "../../routes");
+// return "governance/screen/redirect";
+// }
+//
+// Map<String, String> when_name2valueList = new HashMap<String, String>();
+// Map<String, String> notWhen_name2valueList = new HashMap<String, String>();
+// for (String[] names : when_names) {
+// when_name2valueList.put(names[0], (String) request.getParameter(names[1]));
+// notWhen_name2valueList.put(names[0], (String) request.getParameter(names[2]));
+// }
+//
+// Map<String, String> then_name2valueList = new HashMap<String, String>();
+// Map<String, String> notThen_name2valueList = new HashMap<String, String>();
+// for (String[] names : then_names) {
+// then_name2valueList.put(names[0], (String) request.getParameter(names[1]));
+// notThen_name2valueList.put(names[0], (String) request.getParameter(names[2]));
+// }
+//
+// RouteRule routeRule = RouteRule.createFromNameAndValueListString(
+// when_name2valueList, notWhen_name2valueList,
+// then_name2valueList, notThen_name2valueList);
+//
+// RouteRule result = null;
+// if (black) {
+// RouteRule.MatchPair matchPair = routeRule.getThenCondition().get("black");
+// Map<String, RouteRule.MatchPair> then = null;
+// if (null == matchPair) {
+// matchPair = new RouteRule.MatchPair();
+// then = new HashMap<String, RouteRule.MatchPair>();
+// then.put("black", matchPair);
+// } else {
+// matchPair.getMatches().clear();
+// }
+// matchPair.getMatches().add(String.valueOf(black));
+// result = RouteRule.copyWithReplace(routeRule, null, then);
+// }
+//
+// if (result == null) {
+// result = routeRule;
+// }
+//
+// if (result.getThenCondition().isEmpty()) {
+// model.addAttribute("message", getMessage("Update route error! then is empty."));
+// success = false;
+// model.addAttribute("success", success);
+// model.addAttribute("redirect", "../../routes");
+// return "governance/screen/redirect";
+// }
+//
+// String matchRule = result.getWhenConditionString();
+// String filterRule = result.getThenConditionString();
+//
+// // Limit the length of the expression
+// if (matchRule.length() > MAX_RULE_LENGTH) {
+// model.addAttribute("message", getMessage("When rule is too long!"));
+// success = false;
+// model.addAttribute("success", success);
+// model.addAttribute("redirect", "../../routes");
+// return "governance/screen/redirect";
+// }
+// if (filterRule.length() > MAX_RULE_LENGTH) {
+// model.addAttribute("message", getMessage("Then rule is too long!"));
+// success = false;
+// model.addAttribute("success", success);
+// model.addAttribute("redirect", "../../routes");
+// return "governance/screen/redirect";
+// }
+//
+// int priority = 0;
+// if (StringUtils.isNotEmpty((String) request.getParameter("priority"))) {
+// priority = Integer.parseInt((String) request.getParameter("priority"));
+// }
+//
+// Route route = new Route();
+// route.setRule(result.toString());
+// route.setService(service);
+// route.setPriority(priority);
+// route.setName((String) request.getParameter("name"));
+// route.setUsername((String) request.getParameter("operator"));
+// route.setOperator((String) request.getParameter("operatorAddress"));
+// route.setId(Long.valueOf(idStr));
+// route.setPriority(Integer.parseInt((String) request.getParameter("priority")));
+// route.setEnabled(oldRoute.isEnabled());
+// routeService.updateRoute(route);
+//
+// Set<String> usernames = new HashSet<String>();
+// usernames.add((String) request.getParameter("operator"));
+// usernames.add(route.getUsername());
+// //RelateUserUtils.addOwnersOfService(usernames, route.getService(), ownerDAO);
+//
+// Map<String, Object> params = new HashMap<String, Object>();
+// params.put("action", "update");
+// params.put("route", route);
+//
+// } else {
+// model.addAttribute("message", getMessage("MissRequestParameters", "name"));
+// }
+// } else {
+// model.addAttribute("message", getMessage("MissRequestParameters", "id"));
+// }
+//
+// model.addAttribute("success", success);
+// model.addAttribute("redirect", "../../routes");
+// return "governance/screen/redirect";
+// }
+//
+// /**
+// * Remove the route rule for the specified ID
+// *
+// * @param ids
+// * @return
+// */
+// @RequestMapping("/{ids}/delete")
+// public String delete(@PathVariable("ids") Long[] ids, HttpServletRequest request, HttpServletResponse response,
+// Model model) {
+// prepare(request, response, model, "delete", "routes");
+// for (Long id : ids) {
+// routeService.deleteRoute(id);
+// }
+// model.addAttribute("success", true);
+// model.addAttribute("redirect", "../../routes");
+// return "governance/screen/redirect";
+//
+// }
+//
+// /**
+// * Enable the specified route ID rules (batch processing)
+// *
+// * @param ids
+// * @return
+// */
+// @RequestMapping("/{ids}/enable")
+// public String enable(@PathVariable("ids") Long[] ids, HttpServletRequest request, HttpServletResponse response,
+// Model model) {
+// prepare(request, response, model, "enable", "routes");
+// for (Long id : ids) {
+// routeService.enableRoute(id);
+// }
+// model.addAttribute("success", true);
+// model.addAttribute("redirect", "../../routes");
+// return "governance/screen/redirect";
+// }
+//
+// /**
+// * Disabling route rules for specified IDs (can be batch processed)
+// *
+// * @param ids
+// * @return
+// */
+// @RequestMapping("/{ids}/disable")
+// public String disable(@PathVariable("ids") Long[] ids, HttpServletRequest request, HttpServletResponse response,
+// Model model) {
+// prepare(request, response, model, "disable", "routes");
+// for (Long id : ids) {
+// routeService.disableRoute(id);
+// }
+// model.addAttribute("success", true);
+// model.addAttribute("redirect", "../../routes");
+// return "governance/screen/redirect";
+// }
+//
+//}