6a67bba6226800df2acced80e4b5da1b87a38355
[msb/apigateway.git] / msb-core / apiroute / apiroute-service / src / main / java / org / openo / msb / wrapper / ServiceAccessWrapper.java
1 /**\r
2  * Copyright 2016 ZTE, Inc. and others.\r
3  *\r
4  * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  *     http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  */\r
16 \r
17 package org.openo.msb.wrapper;\r
18 \r
19 import java.util.ArrayList;\r
20 import java.util.Iterator;\r
21 import java.util.List;\r
22 import java.util.Set;\r
23 import java.util.regex.Matcher;\r
24 import java.util.regex.Pattern;\r
25 \r
26 import org.openo.msb.api.ServiceAccessInfo;\r
27 import org.openo.msb.wrapper.util.JedisUtil;\r
28 import org.openo.msb.wrapper.util.RouteUtil;\r
29 import org.slf4j.Logger;\r
30 import org.slf4j.LoggerFactory;\r
31 \r
32 import redis.clients.jedis.Jedis;\r
33 \r
34 public class ServiceAccessWrapper {\r
35     private static final Logger LOGGER = LoggerFactory.getLogger(ServiceAccessWrapper.class);\r
36 \r
37     private static ServiceAccessWrapper instance = new ServiceAccessWrapper();\r
38 \r
39     private ServiceAccessWrapper() {}\r
40 \r
41     public static ServiceAccessWrapper getInstance() {\r
42         return instance;\r
43     }\r
44 \r
45     public ServiceAccessInfo getApiServiceAccessAddr(String serviceName, String version, String host) {\r
46 \r
47         ServiceAccessInfo apiRouteAccessInfo = null;\r
48 \r
49         Jedis jedis = null;\r
50         try {\r
51             jedis = JedisUtil.borrowJedisInstance();\r
52             if (jedis == null) {\r
53                 throw new Exception("fetch from jedis pool failed,null object!");\r
54             }\r
55 \r
56             if ("null".equals(version)) {\r
57                 version = "";\r
58             }\r
59 \r
60             String routekey =\r
61                     RouteUtil.getPrefixedKey("",RouteUtil.APIROUTE, serviceName, version,\r
62                             RouteUtil.ROUTE_PATH_INFO);\r
63             Boolean isExist = jedis.exists(routekey);\r
64             if (isExist) {\r
65                 apiRouteAccessInfo = new ServiceAccessInfo();\r
66                 apiRouteAccessInfo.setServiceName(serviceName);\r
67                 apiRouteAccessInfo.setVersion(version);\r
68                 String accessAddr = "http://" + host + "/api/" + serviceName + "/" + version;\r
69                 apiRouteAccessInfo.setAccessAddr(accessAddr);\r
70             }\r
71         } catch (Exception e) {\r
72             LOGGER.error("call redis throw exception", e);\r
73         } finally {\r
74             JedisUtil.returnJedisInstance(jedis);\r
75         }\r
76         return apiRouteAccessInfo;\r
77 \r
78     }\r
79 \r
80     public List<ServiceAccessInfo> getApiRouteAccessAddr(String serviceType, String serviceName,\r
81             String version, String host) {\r
82         List<ServiceAccessInfo> serviceList = new ArrayList<ServiceAccessInfo>();\r
83         Jedis jedis = null;\r
84         try {\r
85             jedis = JedisUtil.borrowJedisInstance();\r
86             if (jedis == null) {\r
87                 throw new Exception("fetch from jedis pool failed,null object!");\r
88             }\r
89 \r
90             String keyPattern = this.getRedisSearchPattern(serviceType, serviceName, version);\r
91             Set<String> infoKeys = jedis.keys(keyPattern);\r
92             Pattern pattern = this.getKeyPattern();\r
93             for (Iterator<String> iterator = infoKeys.iterator(); iterator.hasNext();) {\r
94                 String infoKey = (String) iterator.next();\r
95                 Matcher matcher = pattern.matcher(infoKey);\r
96                 if (matcher.matches()) {\r
97                     ServiceAccessInfo serviceAccessInfo = new ServiceAccessInfo();\r
98                     serviceAccessInfo.setServiceType(matcher.group("servicetype"));\r
99                     serviceAccessInfo.setServiceName(matcher.group("servicename"));\r
100                     serviceAccessInfo.setVersion(matcher.group("version"));\r
101                     this.buildServiceAccessAddr(serviceAccessInfo, host, infoKey, jedis);\r
102                     serviceList.add(serviceAccessInfo);\r
103                 }\r
104             }\r
105         } catch (Exception e) {\r
106             LOGGER.error("call redis throw exception", e);\r
107         } finally {\r
108             JedisUtil.returnJedisInstance(jedis);\r
109         }\r
110         return serviceList;\r
111 \r
112     }\r
113 \r
114     private void buildServiceAccessAddr(ServiceAccessInfo serviceAccessInfo, String host,\r
115             String infoKey, Jedis jedis) {\r
116         String serviceType = serviceAccessInfo.getServiceType();\r
117         StringBuffer accessAddr = new StringBuffer();\r
118         switch (serviceType) {\r
119             case RouteUtil.APIROUTE:\r
120                 accessAddr.append("http://").append(host).append(":").append(JedisUtil.serverPort)\r
121                         .append("/").append(serviceAccessInfo.getServiceType()).append("/")\r
122                         .append(serviceAccessInfo.getServiceName()).append("/")\r
123                         .append(serviceAccessInfo.getVersion());\r
124                 serviceAccessInfo.setAccessAddr(accessAddr.toString());\r
125                 break;\r
126             case RouteUtil.IUIROUTE:\r
127                 accessAddr.append("http://").append(host).append(":").append(JedisUtil.serverPort)\r
128                         .append("/").append(serviceAccessInfo.getServiceType()).append("/")\r
129                         .append(serviceAccessInfo.getServiceName());\r
130                 serviceAccessInfo.setAccessAddr(accessAddr.toString());\r
131                 break;\r
132             case RouteUtil.CUSTOMROUTE:\r
133                 accessAddr.append("http://").append(host).append(":").append(JedisUtil.serverPort)\r
134                         .append(serviceAccessInfo.getServiceName());\r
135                 serviceAccessInfo.setAccessAddr(accessAddr.toString());\r
136                 break;\r
137             case RouteUtil.P2PROUTE:\r
138                 accessAddr.append(jedis.hget(infoKey, "url"));\r
139                 serviceAccessInfo.setAccessAddr(accessAddr.toString());\r
140                 break;\r
141             default:\r
142                 serviceAccessInfo.setAccessAddr("not supported now");\r
143                 break;\r
144         }\r
145     }\r
146 \r
147     private String getRedisSearchPattern(String serviceType, String serviceName, String version) {\r
148         StringBuffer sb = new StringBuffer();\r
149         sb.append(RouteUtil.ROUTE_PATH);\r
150         if (null != serviceType && !"".equals(serviceType)) {\r
151             sb.append(":").append(serviceType);\r
152         } else {\r
153             sb.append(":").append("*");\r
154         }\r
155         sb.append(":").append(serviceName);\r
156         if (null != version && !"".equals(version)) {\r
157             sb.append(":");\r
158             sb.append(version);\r
159             sb.append(":");\r
160         } else {\r
161             sb.append(":*");\r
162         }\r
163         sb.append(RouteUtil.ROUTE_PATH_INFO);\r
164         return sb.toString();\r
165     }\r
166 \r
167     private Pattern getKeyPattern() {\r
168         String pStr =\r
169                 "conductor:routing:(?<servicetype>api|iui|custom|p2p):(?<servicename>[^:]+)(:(?<version>[^:]*))?:info";\r
170         return Pattern.compile(pStr);\r
171     }\r
172 }