--- /dev/null
+/**\r
+* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)\r
+*\r
+* Licensed under the Apache License, Version 2.0 (the "License");\r
+* you may not use this file except in compliance with the License.\r
+* You may obtain a copy of the License at\r
+*\r
+* http://www.apache.org/licenses/LICENSE-2.0\r
+*\r
+* Unless required by applicable law or agreed to in writing, software\r
+* distributed under the License is distributed on an "AS IS" BASIS,\r
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+* See the License for the specific language governing permissions and\r
+* limitations under the License.\r
+*/\r
+\r
+package org.openo.msb.wrapper;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Iterator;\r
+import java.util.List;\r
+import java.util.Set;\r
+import java.util.regex.Matcher;\r
+import java.util.regex.Pattern;\r
+\r
+import org.openo.msb.api.ServiceAccessInfo;\r
+import org.openo.msb.wrapper.util.JedisUtil;\r
+import org.openo.msb.wrapper.util.RouteUtil;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+\r
+import redis.clients.jedis.Jedis;\r
+\r
+public class ServiceAccessWrapper {\r
+ private static final Logger LOGGER = LoggerFactory.getLogger(ServiceAccessWrapper.class);\r
+\r
+ private static ServiceAccessWrapper instance = new ServiceAccessWrapper();\r
+\r
+ private ServiceAccessWrapper() {}\r
+\r
+ public static ServiceAccessWrapper getInstance() {\r
+ return instance;\r
+ }\r
+\r
+ public ServiceAccessInfo getApiServiceAccessAddr(String serviceName, String version, String host) {\r
+\r
+ ServiceAccessInfo apiRouteAccessInfo = null;\r
+\r
+ Jedis jedis = null;\r
+ try {\r
+ jedis = JedisUtil.borrowJedisInstance();\r
+ if (jedis == null) {\r
+ throw new Exception("fetch from jedis pool failed,null object!");\r
+ }\r
+\r
+ if ("null".equals(version)) {\r
+ version = "";\r
+ }\r
+\r
+ String routekey =\r
+ RouteUtil.getPrefixedKey("",RouteUtil.APIROUTE, serviceName, version,\r
+ RouteUtil.ROUTE_PATH_INFO);\r
+ Boolean isExist = jedis.exists(routekey);\r
+ if (isExist) {\r
+ apiRouteAccessInfo = new ServiceAccessInfo();\r
+ apiRouteAccessInfo.setServiceName(serviceName);\r
+ apiRouteAccessInfo.setVersion(version);\r
+ String accessAddr = "http://" + host + "/api/" + serviceName + "/" + version;\r
+ apiRouteAccessInfo.setAccessAddr(accessAddr);\r
+ }\r
+ } catch (Exception e) {\r
+ LOGGER.error("call redis throw exception", e);\r
+ } finally {\r
+ JedisUtil.returnJedisInstance(jedis);\r
+ }\r
+ return apiRouteAccessInfo;\r
+\r
+ }\r
+\r
+ public List<ServiceAccessInfo> getApiRouteAccessAddr(String serviceType, String serviceName,\r
+ String version, String host) {\r
+ List<ServiceAccessInfo> serviceList = new ArrayList<ServiceAccessInfo>();\r
+ Jedis jedis = null;\r
+ try {\r
+ jedis = JedisUtil.borrowJedisInstance();\r
+ if (jedis == null) {\r
+ throw new Exception("fetch from jedis pool failed,null object!");\r
+ }\r
+\r
+ String keyPattern = this.getRedisSearchPattern(serviceType, serviceName, version);\r
+ Set<String> infoKeys = jedis.keys(keyPattern);\r
+ Pattern pattern = this.getKeyPattern();\r
+ for (Iterator<String> iterator = infoKeys.iterator(); iterator.hasNext();) {\r
+ String infoKey = (String) iterator.next();\r
+ Matcher matcher = pattern.matcher(infoKey);\r
+ if (matcher.matches()) {\r
+ ServiceAccessInfo serviceAccessInfo = new ServiceAccessInfo();\r
+ serviceAccessInfo.setServiceType(matcher.group("servicetype"));\r
+ serviceAccessInfo.setServiceName(matcher.group("servicename"));\r
+ serviceAccessInfo.setVersion(matcher.group("version"));\r
+ this.buildServiceAccessAddr(serviceAccessInfo, host, infoKey, jedis);\r
+ serviceList.add(serviceAccessInfo);\r
+ }\r
+ }\r
+ } catch (Exception e) {\r
+ LOGGER.error("call redis throw exception", e);\r
+ } finally {\r
+ JedisUtil.returnJedisInstance(jedis);\r
+ }\r
+ return serviceList;\r
+\r
+ }\r
+\r
+ private void buildServiceAccessAddr(ServiceAccessInfo serviceAccessInfo, String host,\r
+ String infoKey, Jedis jedis) {\r
+ String serviceType = serviceAccessInfo.getServiceType();\r
+ StringBuffer accessAddr = new StringBuffer();\r
+ switch (serviceType) {\r
+ case RouteUtil.APIROUTE:\r
+ accessAddr.append("http://").append(host).append(":").append(JedisUtil.serverPort)\r
+ .append("/").append(serviceAccessInfo.getServiceType()).append("/")\r
+ .append(serviceAccessInfo.getServiceName()).append("/")\r
+ .append(serviceAccessInfo.getVersion());\r
+ serviceAccessInfo.setAccessAddr(accessAddr.toString());\r
+ break;\r
+ case RouteUtil.IUIROUTE:\r
+ accessAddr.append("http://").append(host).append(":").append(JedisUtil.serverPort)\r
+ .append("/").append(serviceAccessInfo.getServiceType()).append("/")\r
+ .append(serviceAccessInfo.getServiceName());\r
+ serviceAccessInfo.setAccessAddr(accessAddr.toString());\r
+ break;\r
+ case RouteUtil.CUSTOMROUTE:\r
+ accessAddr.append("http://").append(host).append(":").append(JedisUtil.serverPort)\r
+ .append(serviceAccessInfo.getServiceName());\r
+ serviceAccessInfo.setAccessAddr(accessAddr.toString());\r
+ break;\r
+ case RouteUtil.P2PROUTE:\r
+ accessAddr.append(jedis.hget(infoKey, "url"));\r
+ serviceAccessInfo.setAccessAddr(accessAddr.toString());\r
+ break;\r
+ default:\r
+ serviceAccessInfo.setAccessAddr("not supported now");\r
+ break;\r
+ }\r
+ }\r
+\r
+ private String getRedisSearchPattern(String serviceType, String serviceName, String version) {\r
+ StringBuffer sb = new StringBuffer();\r
+ sb.append(RouteUtil.ROUTE_PATH);\r
+ if (null != serviceType && !"".equals(serviceType)) {\r
+ sb.append(":").append(serviceType);\r
+ } else {\r
+ sb.append(":").append("*");\r
+ }\r
+ sb.append(":").append(serviceName);\r
+ if (null != version && !"".equals(version)) {\r
+ sb.append(":");\r
+ sb.append(version);\r
+ sb.append(":");\r
+ } else {\r
+ sb.append(":*");\r
+ }\r
+ sb.append(RouteUtil.ROUTE_PATH_INFO);\r
+ return sb.toString();\r
+ }\r
+\r
+ private Pattern getKeyPattern() {\r
+ String pStr =\r
+ "conductor:routing:(?<servicetype>api|iui|custom|p2p):(?<servicename>[^:]+)(:(?<version>[^:]*))?:info";\r
+ return Pattern.compile(pStr);\r
+ }\r
+}
\ No newline at end of file