Initial code import
[msb/apigateway.git] / apiroute / apiroute-service / src / main / java / org / openo / msb / wrapper / serviceListener / MicroServiceChangeListener.java
diff --git a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/serviceListener/MicroServiceChangeListener.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/serviceListener/MicroServiceChangeListener.java
new file mode 100644 (file)
index 0000000..d41a0d0
--- /dev/null
@@ -0,0 +1,306 @@
+/**\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.serviceListener;\r
+\r
+import java.util.Set;\r
+\r
+import org.apache.commons.lang3.StringUtils;\r
+import org.openo.msb.api.ApiRouteInfo;\r
+import org.openo.msb.api.CustomRouteInfo;\r
+import org.openo.msb.api.IuiRouteInfo;\r
+import org.openo.msb.api.Node;\r
+import org.openo.msb.api.RouteServer;\r
+import org.openo.msb.api.Service;\r
+import org.openo.msb.wrapper.ApiRouteServiceWrapper;\r
+import org.openo.msb.wrapper.CustomRouteServiceWrapper;\r
+import org.openo.msb.wrapper.IuiRouteServiceWrapper;\r
+import org.openo.msb.wrapper.util.RegExpTestUtil;\r
+import org.openo.msb.wrapper.util.RouteUtil;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+\r
+\r
+public class MicroServiceChangeListener implements IMicroServiceChangeListener {\r
+    \r
+    private static final Logger LOGGER = LoggerFactory.getLogger(MicroServiceChangeListener.class);\r
+    \r
+    @Override\r
+    public void onSave(Service microServiceInfo,String serverPort) {\r
+        \r
+        if("UI".equals(microServiceInfo.getProtocol())){\r
+            IuiRouteInfo iuiRouteInfo = this.buildIuiRouteInfo(microServiceInfo);\r
+            if(null != iuiRouteInfo){\r
+                IuiRouteServiceWrapper.getInstance().saveIuiRouteInstance(iuiRouteInfo);\r
+            }\r
+        }\r
+        else{        \r
+        \r
+            if(ifApiRouteUrl(microServiceInfo.getUrl())){\r
+                ApiRouteInfo apiRouteInfo = this.buildApiRouteInfo(microServiceInfo);\r
+                if(null != apiRouteInfo){\r
+                    ApiRouteServiceWrapper.getInstance().saveApiRouteInstance(apiRouteInfo,serverPort);\r
+                }\r
+            }\r
+            else{\r
+                CustomRouteInfo customRouteInfo = this.buildCustomRouteInfo(microServiceInfo);\r
+                if(null != customRouteInfo){\r
+                    CustomRouteServiceWrapper.getInstance().saveCustomRouteInstance(customRouteInfo,serverPort);\r
+                }\r
+            }\r
+        }\r
+        \r
+        \r
+    }\r
+    \r
+    @Override\r
+    public void onChange(String serviceName, String version, Service microServiceInfo,String serverPort) {\r
+        \r
+        if("UI".equals(microServiceInfo.getProtocol())){\r
+            if(serviceName.startsWith("iui_")||serviceName.startsWith("IUI_")){\r
+                serviceName=serviceName.substring(4);\r
+            }\r
+            IuiRouteInfo iuiRouteInfo = this.buildIuiRouteInfo(microServiceInfo);\r
+            if(null != iuiRouteInfo){\r
+                IuiRouteServiceWrapper.getInstance().updateIuiRouteInstance(serviceName, iuiRouteInfo);\r
+            }\r
+        }\r
+        else{\r
+        \r
+            if(ifApiRouteUrl(microServiceInfo.getUrl())){\r
+                ApiRouteInfo apiRouteInfo = this.buildApiRouteInfo(microServiceInfo);\r
+                if(null != apiRouteInfo){\r
+                    ApiRouteServiceWrapper.getInstance().updateApiRouteInstance(serviceName, version, apiRouteInfo,serverPort);\r
+                }\r
+            }\r
+            else{\r
+                if(!serviceName.startsWith("/")){\r
+                    serviceName="/"+serviceName;\r
+                }\r
+                CustomRouteInfo customRouteInfo = this.buildCustomRouteInfo(microServiceInfo);\r
+                if(null != customRouteInfo){\r
+                    CustomRouteServiceWrapper.getInstance().updateCustomRouteInstance(serviceName,customRouteInfo,serverPort);\r
+                }\r
+            }\r
+        }\r
+        \r
+    }\r
+    \r
+    @Override\r
+    public void onStatusChange(String serviceName,String url,String version,String protocol,String status) {\r
+        if("UI".equals(protocol)){\r
+\r
+            if(serviceName.startsWith("iui_")||serviceName.startsWith("IUI_")){\r
+                serviceName=serviceName.substring(4);\r
+            } \r
+           IuiRouteServiceWrapper.getInstance().updateIuiRouteStatus(serviceName, status);\r
+            \r
+        }\r
+        else{\r
+            if(ifApiRouteUrl(url)){\r
+                ApiRouteServiceWrapper.getInstance().updateApiRouteStatus(serviceName, version, status);\r
+            }\r
+            else{\r
+                if(!serviceName.startsWith("/")){\r
+                    serviceName="/"+serviceName;\r
+                }\r
+                CustomRouteServiceWrapper.getInstance().updateCustomRouteStatus(serviceName, status); \r
+            }\r
+        }\r
+        \r
+      \r
+\r
+    }\r
+\r
+    @Override\r
+    public void onDelete(String serviceName,String url, String version,String protocol,String serverPort) {\r
+        \r
+        if("UI".equals(protocol)){\r
+            if(serviceName.startsWith("iui_")||serviceName.startsWith("IUI_")){\r
+                serviceName=serviceName.substring(4);\r
+            } \r
+           IuiRouteServiceWrapper.getInstance().deleteIuiRoute(serviceName, "*");\r
+            \r
+        }\r
+        else{\r
+            if(ifApiRouteUrl(url)){\r
+                ApiRouteServiceWrapper.getInstance().deleteApiRoute(serviceName, version, "*",serverPort);\r
+            }\r
+            else{\r
+\r
+              \r
+                if(!serviceName.startsWith("/")){\r
+                    serviceName="/"+serviceName;\r
+                }\r
+                \r
+                CustomRouteServiceWrapper.getInstance().deleteCustomRoute(serviceName, "*",serverPort); \r
+            }\r
+        }\r
+    }\r
+    \r
+    \r
+    /** \r
+    * @Title ifApiRouteUrl \r
+    * @Description TODO(According to judge whether the API registration URL format) \r
+    * @param url\r
+    * @return      \r
+    * @return boolean    \r
+    */\r
+    private boolean ifApiRouteUrl(String url){\r
+        return RegExpTestUtil.apiRouteUrlRegExpTest(url);\r
+    }\r
+    \r
+   \r
+    /**\r
+     * From MicroServiceInfo to ApiRouteInfo\r
+     * @param microServiceInfo\r
+     * @return\r
+     */\r
+    private ApiRouteInfo buildApiRouteInfo(Service microServiceInfo){\r
\r
+        ApiRouteInfo apiRouteInfo = new ApiRouteInfo();\r
+        apiRouteInfo.setUrl(microServiceInfo.getUrl());\r
+        \r
+        Set<Node> nodes=microServiceInfo.getNodes();\r
+        RouteServer[] routeServers=new RouteServer[nodes.size()];\r
+         \r
+        \r
+        int i=0;\r
+        for(Node node:nodes){\r
+            RouteServer routeServer = new RouteServer(node.getIp(),node.getPort()); \r
+            routeServers[i]=routeServer;\r
+            i++;\r
+        }      \r
+        \r
+               \r
+        apiRouteInfo.setServers(routeServers);\r
+        String[] rangs=StringUtils.split(microServiceInfo.getVisualRange(), "|");\r
+        if(RouteUtil.contain(rangs, "0")){\r
+            apiRouteInfo.setVisualRange("0");\r
+        }\r
+        else{\r
+            apiRouteInfo.setVisualRange("1");\r
+        }\r
+       \r
+        \r
+      if("ip_hash".equals(microServiceInfo.getLb_policy())){\r
+          apiRouteInfo.setUseOwnUpstream("1");\r
+    }\r
+       \r
+        \r
+        \r
+        apiRouteInfo.setServiceName(microServiceInfo.getServiceName());\r
+        apiRouteInfo.setVersion(microServiceInfo.getVersion());\r
+        //TODO:set json and metrics defaultValue\r
+        String version="".equals(microServiceInfo.getVersion())?"":"/"+microServiceInfo.getVersion();\r
+        apiRouteInfo.setApiJson(microServiceInfo.getUrl()+"/swagger.json");\r
+        apiRouteInfo.setMetricsUrl("/admin/metrics");\r
+        return apiRouteInfo;\r
+    }\r
+    \r
+    \r
+    /**\r
+     * From MicroServiceInfo to CustomRouteInfo\r
+     * @param microServiceInfo\r
+     * @return\r
+     */\r
+    private CustomRouteInfo buildCustomRouteInfo(Service microServiceInfo){\r
+      \r
+        CustomRouteInfo customRouteInfo = new CustomRouteInfo();\r
+        customRouteInfo.setUrl(microServiceInfo.getUrl());\r
+        \r
+        Set<Node> nodes=microServiceInfo.getNodes();\r
+        RouteServer[] routeServers=new RouteServer[nodes.size()];\r
+         \r
+        \r
+        int i=0;\r
+        for(Node node:nodes){\r
+            RouteServer routeServer = new RouteServer(node.getIp(),node.getPort()); \r
+            routeServers[i]=routeServer;\r
+            i++;\r
+        }      \r
+               \r
+        customRouteInfo.setServers(routeServers);\r
+        String[] rangs=StringUtils.split(microServiceInfo.getVisualRange(), "|");\r
+        if(RouteUtil.contain(rangs, "0")){\r
+            customRouteInfo.setVisualRange("0");\r
+        }\r
+        else{\r
+            customRouteInfo.setVisualRange("1");\r
+        }\r
+        \r
+        if("ip_hash".equals(microServiceInfo.getLb_policy())){\r
+            customRouteInfo.setUseOwnUpstream("1");\r
+        }\r
+        \r
+        String serviceName;\r
+        if(!microServiceInfo.getServiceName().startsWith("/")){\r
+            serviceName="/"+microServiceInfo.getServiceName();\r
+        }\r
+        else{\r
+            serviceName=microServiceInfo.getServiceName();\r
+        }\r
+        customRouteInfo.setServiceName(serviceName);\r
+       \r
+        return customRouteInfo;\r
+    }\r
+    \r
+    \r
+    /**\r
+     * From MicroServiceInfo to IuiRouteInfo\r
+     * @param microServiceInfo\r
+     * @return\r
+     */\r
+    private IuiRouteInfo buildIuiRouteInfo(Service microServiceInfo){\r
+      \r
+        IuiRouteInfo iuiRouteInfo = new IuiRouteInfo();\r
+        iuiRouteInfo.setUrl(microServiceInfo.getUrl());\r
+               \r
+        Set<Node> nodes=microServiceInfo.getNodes();\r
+        RouteServer[] routeServers=new RouteServer[nodes.size()];\r
+         \r
+        \r
+        int i=0;\r
+        for(Node node:nodes){\r
+            RouteServer routeServer = new RouteServer(node.getIp(),node.getPort()); \r
+            routeServers[i]=routeServer;\r
+            i++;\r
+        }      \r
+               \r
+        iuiRouteInfo.setServers(routeServers);\r
+        String[] rangs=StringUtils.split(microServiceInfo.getVisualRange(), "|");\r
+        if(RouteUtil.contain(rangs, "0")){\r
+            iuiRouteInfo.setVisualRange("0");\r
+        }\r
+        else{\r
+            iuiRouteInfo.setVisualRange("1");\r
+        }\r
+        \r
+        if("ip_hash".equals(microServiceInfo.getLb_policy())){\r
+            iuiRouteInfo.setUseOwnUpstream("1");\r
+        }\r
+\r
+        String serviceName=microServiceInfo.getServiceName();\r
+        if(serviceName.startsWith("iui_")||serviceName.startsWith("IUI_")){\r
+            serviceName=serviceName.substring(4);\r
+        }\r
+        \r
+        \r
+        iuiRouteInfo.setServiceName(serviceName);\r
+       \r
+        return iuiRouteInfo;\r
+    }\r
+}\r