+++ /dev/null
-Copyright 2016 ZTE, Inc. and others.
-
-Licensed 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.
+++ /dev/null
-mvn com.mycila:license-maven-plugin:format -Dlicense.header=doc/java-license-header.txt
\ No newline at end of file
-<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
+ Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
Licensed 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
+ 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,
See the License for the specific language governing permissions and
limitations under the License.
+ Author: Zhaoxing Meng
+ email: meng.zhaoxing1@zte.com.cn
+
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>swagger-jersey2-jaxrs</artifactId>
<scope>compile</scope>
</dependency>
- <!-- add by wangyg:增加redis的java客户端jedis依赖 -->
+ <!-- add by wangyg:å¢žåŠ redisçš„java客户端jedisä¾\9dèµ– -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<classifier>jdk15</classifier>
</dependency>
<dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <scope>test</scope>
- </dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
</dependencies>
<build>
<plugins>
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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;\r
-\r
-import io.dropwizard.Application;\r
-import io.dropwizard.assets.AssetsBundle;\r
-import io.dropwizard.jetty.HttpConnectorFactory;\r
-import io.dropwizard.server.SimpleServerFactory;\r
-import io.dropwizard.setup.Bootstrap;\r
-import io.dropwizard.setup.Environment;\r
-import io.swagger.jaxrs.config.BeanConfig;\r
-import io.swagger.jaxrs.listing.ApiListingResource;\r
-\r
-import java.io.BufferedWriter;\r
-import java.io.File;\r
-import java.io.FileNotFoundException;\r
-import java.io.FileWriter;\r
-import java.io.IOException;\r
-import java.net.URL;\r
-import java.util.List;\r
-\r
-import net.sf.json.JSONObject;\r
-\r
-import org.apache.commons.lang3.StringUtils;\r
-import org.openo.msb.api.ApiRouteInfo;\r
-import org.openo.msb.api.ConsulInfo;\r
-import org.openo.msb.api.CustomRouteInfo;\r
-import org.openo.msb.api.DiscoverInfo;\r
-import org.openo.msb.api.IuiRouteInfo;\r
-import org.openo.msb.api.RouteServer;\r
-import org.openo.msb.api.exception.ExtendedNotFoundException;\r
-import org.openo.msb.health.ApiRouteHealthCheck;\r
-import org.openo.msb.resources.ApiRouteResource;\r
-import org.openo.msb.resources.CustomRouteResource;\r
-import org.openo.msb.resources.IuiRouteResource;\r
-import org.openo.msb.resources.MetricsResource;\r
-import org.openo.msb.resources.MicroServiceResource;\r
-import org.openo.msb.resources.ServiceAccessResource;\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.serviceListener.MicroServiceChangeListener;\r
-import org.openo.msb.wrapper.util.FileUtil;\r
-import org.openo.msb.wrapper.util.JacksonJsonUtil;\r
-import org.openo.msb.wrapper.util.JedisUtil;\r
-import org.openo.msb.wrapper.util.MetricsUtil;\r
-import org.openo.msb.wrapper.util.MicroServiceDB;\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
-import com.fasterxml.jackson.annotation.JsonInclude;\r
-\r
-public class ApiRouteApp extends Application<ApiRouteAppConfig> {\r
-\r
- private static final Logger LOGGER = LoggerFactory.getLogger(ApiRouteApp.class);\r
-\r
- public static void main(String[] args) throws Exception {\r
- new ApiRouteApp().run(args);\r
-\r
- }\r
-\r
- private ApiRouteAppConfig config;\r
-\r
- @Override\r
- public String getName() {\r
- return " MicroService Bus ";\r
- }\r
-\r
- @Override\r
- public void initialize(Bootstrap<ApiRouteAppConfig> bootstrap) {\r
- \r
- \r
- }\r
-\r
- @Override\r
- public void run(ApiRouteAppConfig configuration, Environment environment) {\r
- \r
- initRootPath();\r
- \r
- \r
- new AssetsBundle("/iui-metrics", "/"+RouteUtil.IUI_ROOT_PATH+"/microservices/metrics",\r
- "index.html", "iui-metrics").run(environment); \r
- \r
- new AssetsBundle("/iui-route", "/"+RouteUtil.IUI_ROOT_PATH+"/microservices", "index.html",\r
- "iui-microservices").run(environment); \r
- \r
- new AssetsBundle("/api-doc", "/"+RouteUtil.IUI_ROOT_PATH+"/microservices/api-doc",\r
- "index.html", "api-doc").run(environment);\r
- \r
- new AssetsBundle("/ext", "/"+RouteUtil.IUI_ROOT_PATH+"/microservices/ext",\r
- "index.html", "ext").run(environment);\r
- \r
- \r
- \r
-\r
- final ApiRouteHealthCheck healthCheck =\r
- new ApiRouteHealthCheck(configuration.getDefaultWorkspace());\r
- environment.healthChecks().register("template", healthCheck);\r
- environment.jersey().register(new ApiRouteResource());\r
- environment.jersey().register(new IuiRouteResource());\r
- environment.jersey().register(new MetricsResource());\r
- environment.jersey().register(new CustomRouteResource());\r
- environment.jersey().register(new ServiceAccessResource());\r
- environment.jersey().register(new MicroServiceResource());\r
-\r
- config = configuration;\r
-\r
- initSwaggerConfig(environment, configuration);\r
- initRedisConfig(configuration);\r
- checkRedisConnect();\r
- initMetricsConfig(configuration);\r
- initVisualRangeMatches();\r
-\r
- registerServiceChangeListener();\r
-\r
-\r
- }\r
-\r
- private void initMetricsConfig(ApiRouteAppConfig configuration) {\r
-\r
- SimpleServerFactory simpleServerFactory =\r
- (SimpleServerFactory) configuration.getServerFactory();\r
- HttpConnectorFactory httpConnectorFactory =\r
- (HttpConnectorFactory) simpleServerFactory.getConnector();\r
- MetricsUtil.adminContextPath =\r
- "http://127.0.0.1:" + httpConnectorFactory.getPort()\r
- + simpleServerFactory.getAdminContextPath() + "/metrics";\r
- }\r
-\r
- private void initSwaggerConfig(Environment environment, ApiRouteAppConfig configuration) {\r
-\r
- environment.jersey().register(new ApiListingResource());\r
- environment.getObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);\r
-\r
- BeanConfig config = new BeanConfig();\r
- config.setTitle("MicroService Bus rest API");\r
- config.setVersion("1.0.0");\r
- config.setResourcePackage("org.openo.msb.resources");\r
- SimpleServerFactory simpleServerFactory =\r
- (SimpleServerFactory) configuration.getServerFactory();\r
- String basePath = simpleServerFactory.getApplicationContextPath();\r
- String rootPath = simpleServerFactory.getJerseyRootPath();\r
-\r
- rootPath = rootPath.substring(0, rootPath.indexOf("/*"));\r
-\r
- basePath =\r
- basePath.equals("/") ? rootPath : (new StringBuilder()).append(basePath)\r
- .append(rootPath).toString();\r
-\r
- LOGGER.info("getApplicationContextPath: " + basePath);\r
- config.setBasePath(basePath);\r
- config.setScan(true);\r
- }\r
- \r
- \r
- private void initRootPath(){\r
- try {\r
- \r
- URL urlRootPath = ApiRouteApp.class.getResource("/ext/initUrlRootPath/initUrlRootPath.json");\r
- if (urlRootPath != null) {\r
- String path = urlRootPath.getPath();\r
- \r
- LOGGER.info("read initUrlRootPath:" + path);\r
- \r
- String fileContent = FileUtil.readFile(path);\r
- JSONObject jsonObj = JSONObject.fromObject(fileContent);\r
- RouteUtil.IUI_ROOT_PATH=jsonObj.get("iuiRootPath").toString();\r
- RouteUtil.API_ROOT_PATH=jsonObj.get("apiRootPath").toString();\r
- }\r
- } catch (Exception e) {\r
- // TODO Auto-generated catch block\r
- LOGGER.error("read initUrlRootPath Files throw exception", e);\r
- }\r
- \r
- }\r
- private void initRedisConfig(ApiRouteAppConfig configuration) {\r
-\r
- String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();\r
- String jarPath = path.substring(0, path.lastIndexOf("/"));\r
-\r
- LOGGER.info("jarpath: " + jarPath);\r
- LOGGER.info("getDefaultWorkspace " + configuration.getDefaultWorkspace());\r
-\r
- String confDir =\r
- jarPath + "/" + configuration.getDefaultWorkspace() + "/"\r
- + configuration.getPropertiesDir();\r
- String propertiesPath = confDir + "/" + configuration.getPropertiesName();\r
-\r
- JedisUtil.propertiesPath = propertiesPath;\r
-\r
- LOGGER.info("propertiesPath: " + propertiesPath);\r
- LOGGER.info("confDir: " + confDir);\r
-\r
- try {\r
- File dirFile = new File(confDir);\r
-\r
- if (!dirFile.exists()) {\r
- dirFile.mkdirs();\r
- }\r
- } catch (Exception e) {\r
- // TODO Auto-generated catch block\r
- LOGGER.info("create RedisConfig confDir error: " + confDir + e.getMessage());\r
- }\r
-\r
-\r
- try {\r
- File propertiesFile = new File(propertiesPath);\r
- if (!propertiesFile.exists()) {\r
-\r
-\r
- propertiesFile.createNewFile();\r
-\r
- BufferedWriter output = new BufferedWriter(new FileWriter(propertiesFile));\r
- StringBuilder contentBuilder = new StringBuilder();\r
- contentBuilder.append("redis.host=127.0.0.1\n").append("redis.port=6379\n")\r
- .append("#connectionTimeout\n").append("redis.connectionTimeout=2000\n")\r
- .append("#redis dbIndex,defaule:0\n")\r
- .append("redis.db_index=0\n\n")\r
- .append("#--------------redis pool config--------------\n")\r
- .append("#maxTotal\n").append("redis.pool.maxTotal=100\n")\r
- .append("#maxIdle\n").append("redis.pool.maxIdle=20\n")\r
- .append("#maxWaitMillis:ms\n")\r
- .append("redis.pool.maxWaitMillis=1000\n")\r
- .append("#testOnBorrow\n")\r
- .append("redis.pool.testOnBorrow=false\n")\r
- .append("#testOnReturn\n")\r
- .append("redis.pool.testOnReturn=true\n")\r
- .append("#nginx Port\n").append("server.port=10080\n");\r
-\r
- output.write(contentBuilder.toString());\r
- output.close();\r
-\r
- }\r
- } catch (IOException e) {\r
- // TODO Auto-generated catch block\r
- LOGGER.info("create RedisConfig File error: " + propertiesPath + e.getMessage());\r
- }\r
- }\r
-\r
-\r
- private void checkRedisConnect() {\r
-\r
- new Thread(new Runnable() {\r
- public void run() {\r
- int n = 0;\r
- while (true) {\r
- if (ApiRouteServiceWrapper.checkRedisConnect() == false) {\r
- n++;\r
- System.out.println(n\r
- + "/10 : Initial Route Configuration——redis connection fail...");\r
-\r
- try {\r
- Thread.sleep(10000);\r
- } catch (InterruptedException e) {\r
- LOGGER.error("Thread.sleep throw except:"+e.getMessage());\r
- }\r
-\r
-\r
- if (n >= 10) {\r
- System.out.println("Initial Route Configuration fail,timeout exit");\r
- LOGGER.error("Initial Route Configuration——redis connection fail,timeout exit...");\r
- break;\r
- }\r
- } else {\r
- System.out.println("starting to initial Route Configuration");\r
- // initRouteInfoFromConfig();\r
- initRouteInfoFromJson();\r
- System.out.println("starting to initial consul Configuration");\r
- runConsulClientApp();\r
-\r
- break;\r
- }\r
- }\r
-\r
- }\r
- }).start();\r
- }\r
-\r
-\r
- \r
-\r
- /**\r
- * @Title: initVisualRangeMatches\r
- * @Description: TODO(According to the environment variable or a JSON file configuration initialization VisualRange filter conditions)\r
- * @return: void\r
- */\r
- private void initVisualRangeMatches(){\r
- try {\r
- if(System.getenv("APIGATEWAY_VISUAL_RANGE")==null)\r
- {\r
- \r
- URL visualRangePath = ApiRouteApp.class.getResource("/ext/initVisualRange/initVisualRangeMatches.json");\r
- if (visualRangePath != null) {\r
- String path = visualRangePath.getPath();\r
- \r
- LOGGER.info("read initVisualRangeMatches:" + path);\r
- \r
- String fileContent = FileUtil.readFile(path);\r
- JSONObject jsonObj = JSONObject.fromObject(fileContent);\r
- String visualRangeArray=jsonObj.get("visualRange").toString();\r
- \r
- \r
- RouteUtil.visualRangeMatches=StringUtils.split(visualRangeArray, ","); \r
- \r
- \r
- \r
- }\r
- }\r
- else{\r
- RouteUtil.visualRangeMatches=StringUtils.split(System.getenv("APIGATEWAY_VISUAL_RANGE"), ",");\r
- }\r
- } catch (Exception e) {\r
- // TODO Auto-generated catch block\r
- LOGGER.error("read initVisualRangeMatches Files or env(APIGATEWAY_VISUAL_RANGE) throw exception", e);\r
- }\r
- }\r
-\r
- /**\r
- * @Title: initRouteInfoFromJson\r
- * @Description: TODO(按照JSON文件配置初始化route数据)\r
- * @return: void\r
- */\r
- private void initRouteInfoFromJson() {\r
-\r
- URL apiDocsPath = ApiRouteApp.class.getResource("/ext/initServices");\r
- if (apiDocsPath != null) {\r
- String path = apiDocsPath.getPath();\r
-\r
- LOGGER.info("read JsonFilefolder:" + path);\r
-\r
- try {\r
- File[] files = FileUtil.readFileFolder(path);\r
- for (int i = 0; i < files.length; i++) {\r
- File file = files[i];\r
- if (file.isFile() && file.getName().endsWith(".json")) {\r
- LOGGER.info("read JsonFile:" + file.getPath());\r
- String fileContent = FileUtil.readFile(file.getPath());\r
- saveInitService2redis(fileContent);\r
- } else {\r
- LOGGER.warn(file.getName() + " is not a right file");\r
- }\r
- }\r
-\r
-\r
-\r
- } catch (FileNotFoundException e) {\r
- // TODO Auto-generated catch block\r
- LOGGER.error("read initServices Files throw FileNotFoundException", e);\r
- } catch (IOException e) {\r
- // TODO Auto-generated catch block\r
- LOGGER.error("read initServices Files throw IOexception", e);\r
- }\r
-\r
- }\r
-\r
-\r
-\r
- }\r
-\r
-\r
-\r
- private void saveInitService2redis(String fileContent) {\r
- try {\r
- List<ApiRouteInfo> routeList =\r
- (List<ApiRouteInfo>) JacksonJsonUtil.jsonToListBean(fileContent);\r
- for (ApiRouteInfo route : routeList) {\r
- String url = route.getUrl();\r
-\r
- if (RegExpTestUtil.urlRegExpTest(route.getServiceName())) {\r
- \r
- try{\r
- CustomRouteInfo dbCustomRoute =\r
- CustomRouteServiceWrapper.getInstance().getCustomRouteInstance(\r
- route.getServiceName());\r
- }\r
- catch(ExtendedNotFoundException e){\r
-\r
- LOGGER.info("initCustomRoute: ServiceName--" + route.getServiceName());\r
-\r
- CustomRouteInfo customRouteInfo = new CustomRouteInfo();\r
- customRouteInfo.setControl(route.getControl());\r
- customRouteInfo.setServers(route.getServers());\r
- customRouteInfo.setServiceName(route.getServiceName());\r
- customRouteInfo.setStatus(route.getStatus());\r
- customRouteInfo.setUrl(route.getUrl());\r
-\r
-\r
- CustomRouteServiceWrapper.getInstance().saveCustomRouteInstance(\r
- customRouteInfo, "");\r
-\r
-\r
- }\r
- } else {\r
-\r
- if (RegExpTestUtil.apiRouteUrlRegExpTest(url) || url.startsWith("/api/microservices/")) {\r
-\r
-\r
- try{\r
- ApiRouteInfo dbApiRoute =\r
- ApiRouteServiceWrapper.getInstance().getApiRouteInstance(\r
- route.getServiceName(), route.getVersion());\r
- }\r
- catch(ExtendedNotFoundException e){\r
- LOGGER.info("initapiRoute: ServiceName--" + route.getServiceName());\r
- ApiRouteServiceWrapper.getInstance().saveApiRouteInstance(route, "");\r
- }\r
-\r
- \r
- } else if (RegExpTestUtil.iuiRouteUrlRegExpTest(url) || url.equals("/iui/microservices")) {\r
- \r
- try{\r
- IuiRouteInfo dbIuiRoute =\r
- IuiRouteServiceWrapper.getInstance().getIuiRouteInstance(\r
- route.getServiceName());\r
- }\r
- catch(ExtendedNotFoundException e){\r
- \r
- LOGGER.info(" initiuiRoute: ServiceName--" + route.getServiceName());\r
- IuiRouteInfo iuiRouteInfo = new IuiRouteInfo();\r
- iuiRouteInfo.setControl(route.getControl());\r
- iuiRouteInfo.setServers(route.getServers());\r
- iuiRouteInfo.setServiceName(route.getServiceName());\r
- iuiRouteInfo.setStatus(route.getStatus());\r
- \r
- if(url.equals("/iui/microservices")){\r
- iuiRouteInfo.setUrl("/"+RouteUtil.IUI_ROOT_PATH+"/microservices");\r
- }\r
- else{\r
- iuiRouteInfo.setUrl(route.getUrl());\r
- }\r
-\r
- IuiRouteServiceWrapper.getInstance().saveIuiRouteInstance(iuiRouteInfo);\r
-\r
- }\r
-\r
- } else {\r
- LOGGER.error("init Service throw exception——serviceName: " + route.getServiceName()+",url:"+url);\r
- }\r
- }\r
-\r
-\r
-\r
- }\r
-\r
- } catch (Exception e) {\r
- // TODO Auto-generated catch block\r
- LOGGER.error("read initServices Files throw exception", e);\r
- }\r
-\r
- }\r
-\r
-\r
-\r
- /**\r
- * The listener registration service changes\r
- */\r
- private void registerServiceChangeListener() {\r
- MicroServiceDB.getInstance().addServiceChangeListener(new MicroServiceChangeListener());\r
- }\r
-\r
- // Open the consul to monitor subscription service\r
- private void runConsulClientApp() {\r
- DiscoverInfo config_discoverInfo = config.getDiscoverInfo();\r
- \r
- ConsulInfo config_consulInfo=config.getConsulInfo();\r
- \r
- RouteUtil.discoverInfo.setEnabled(config_discoverInfo.isEnabled()); \r
- \r
- if (config_discoverInfo.isEnabled()) {\r
- try{\r
- if(System.getenv("SDCLIENT_SVC_PORT")==null)\r
- {\r
- //yml \r
- RouteUtil.discoverInfo.setIp(config_discoverInfo.getIp()); \r
- RouteUtil.discoverInfo.setPort(config_discoverInfo.getPort());\r
- \r
- }\r
- else{\r
- \r
- String discoverAddress=System.getenv("SDCLIENT_SVC_PORT").split("//")[1];\r
- String sdIP=discoverAddress.split(":")[0];\r
- int sdPort=Integer\r
- .parseInt(discoverAddress.split(":")[1]);\r
- \r
- RouteUtil.discoverInfo.setIp(sdIP);\r
- RouteUtil.discoverInfo.setPort(sdPort);\r
- \r
- config_consulInfo.setIp(sdIP);\r
- config_consulInfo.setPort(sdPort);\r
- \r
- \r
- }\r
- \r
- \r
- \r
- //Registration service discovery routing\r
- //api\r
- ApiRouteInfo discoverApiService=new ApiRouteInfo();\r
- discoverApiService.setServiceName("msdiscover");\r
- discoverApiService.setUrl("/api/microservices/v1");\r
- discoverApiService.setVersion("v1");\r
- discoverApiService.setMetricsUrl("/admin/metrics");\r
- discoverApiService.setApiJson("/api/microservices/v1/swagger.json");\r
- \r
- RouteServer[] servers=new RouteServer[1];\r
- servers[0]=new RouteServer(RouteUtil.discoverInfo.getIp(),String.valueOf(RouteUtil.discoverInfo.getPort()));\r
- discoverApiService.setServers(servers);\r
- \r
- ApiRouteServiceWrapper.getInstance().saveApiRouteInstance(discoverApiService, "");\r
- \r
- //iui\r
- IuiRouteInfo discoverIUIService=new IuiRouteInfo();\r
- discoverIUIService.setServiceName("msdiscover");\r
- discoverIUIService.setUrl("/iui/microservices");\r
- discoverIUIService.setServers(servers);\r
- IuiRouteServiceWrapper.getInstance().saveIuiRouteInstance(discoverIUIService);\r
- \r
- \r
-\r
- ConsulClientApp consulClientApp = new ConsulClientApp(config_consulInfo.getIp(), config_consulInfo.getPort());\r
- // Monitor service change\r
- consulClientApp.startServiceListen();\r
- LOGGER.info("start monitor consul service--" +config_consulInfo.getIp() + ":"\r
- + config_consulInfo.getPort());\r
- }\r
- catch(Exception e){\r
- LOGGER.error("start monitor consul service fail:"+e.getMessage()); \r
- }\r
- }\r
- \r
- \r
- }\r
-\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb;
+
+import io.dropwizard.Application;
+import io.dropwizard.assets.AssetsBundle;
+import io.dropwizard.jetty.HttpConnectorFactory;
+import io.dropwizard.server.SimpleServerFactory;
+import io.dropwizard.setup.Bootstrap;
+import io.dropwizard.setup.Environment;
+import io.swagger.jaxrs.config.BeanConfig;
+import io.swagger.jaxrs.listing.ApiListingResource;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.net.URL;
+import java.util.List;
+
+import net.sf.json.JSONObject;
+
+import org.apache.commons.lang3.StringUtils;
+import org.openo.msb.api.ApiRouteInfo;
+import org.openo.msb.api.ConsulInfo;
+import org.openo.msb.api.CustomRouteInfo;
+import org.openo.msb.api.DiscoverInfo;
+import org.openo.msb.api.IuiRouteInfo;
+import org.openo.msb.api.RouteServer;
+import org.openo.msb.api.exception.ExtendedNotFoundException;
+import org.openo.msb.health.ApiRouteHealthCheck;
+import org.openo.msb.resources.ApiRouteResource;
+import org.openo.msb.resources.CustomRouteResource;
+import org.openo.msb.resources.IuiRouteResource;
+import org.openo.msb.resources.MetricsResource;
+import org.openo.msb.resources.MicroServiceResource;
+import org.openo.msb.resources.ServiceAccessResource;
+import org.openo.msb.wrapper.ApiRouteServiceWrapper;
+import org.openo.msb.wrapper.CustomRouteServiceWrapper;
+import org.openo.msb.wrapper.IuiRouteServiceWrapper;
+import org.openo.msb.wrapper.serviceListener.MicroServiceChangeListener;
+import org.openo.msb.wrapper.util.FileUtil;
+import org.openo.msb.wrapper.util.JacksonJsonUtil;
+import org.openo.msb.wrapper.util.JedisUtil;
+import org.openo.msb.wrapper.util.MetricsUtil;
+import org.openo.msb.wrapper.util.MicroServiceDB;
+import org.openo.msb.wrapper.util.RegExpTestUtil;
+import org.openo.msb.wrapper.util.RouteUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+public class ApiRouteApp extends Application<ApiRouteAppConfig> {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ApiRouteApp.class);
+
+ public static void main(String[] args) throws Exception {
+ new ApiRouteApp().run(args);
+
+ }
+
+ private ApiRouteAppConfig config;
+
+ @Override
+ public String getName() {
+ return " MicroService Bus ";
+ }
+
+ @Override
+ public void initialize(Bootstrap<ApiRouteAppConfig> bootstrap) {
+
+
+ }
+
+ @Override
+ public void run(ApiRouteAppConfig configuration, Environment environment) {
+
+ initRootPath();
+
+
+ new AssetsBundle("/iui-metrics", "/"+RouteUtil.IUI_ROOT_PATH+"/microservices/metrics",
+ "index.html", "iui-metrics").run(environment);
+
+ new AssetsBundle("/iui-route", "/"+RouteUtil.IUI_ROOT_PATH+"/microservices", "index.html",
+ "iui-microservices").run(environment);
+
+ new AssetsBundle("/api-doc", "/"+RouteUtil.IUI_ROOT_PATH+"/microservices/api-doc",
+ "index.html", "api-doc").run(environment);
+
+ new AssetsBundle("/ext", "/"+RouteUtil.IUI_ROOT_PATH+"/microservices/ext",
+ "index.html", "ext").run(environment);
+
+
+
+
+ final ApiRouteHealthCheck healthCheck =
+ new ApiRouteHealthCheck(configuration.getDefaultWorkspace());
+ environment.healthChecks().register("template", healthCheck);
+ environment.jersey().register(new ApiRouteResource());
+ environment.jersey().register(new IuiRouteResource());
+ environment.jersey().register(new MetricsResource());
+ environment.jersey().register(new CustomRouteResource());
+ environment.jersey().register(new ServiceAccessResource());
+ environment.jersey().register(new MicroServiceResource());
+
+ config = configuration;
+
+ initSwaggerConfig(environment, configuration);
+ initRedisConfig(configuration);
+ checkRedisConnect();
+ initMetricsConfig(configuration);
+ initVisualRangeMatches();
+
+ registerServiceChangeListener();
+
+
+ }
+
+ private void initMetricsConfig(ApiRouteAppConfig configuration) {
+
+ SimpleServerFactory simpleServerFactory =
+ (SimpleServerFactory) configuration.getServerFactory();
+ HttpConnectorFactory httpConnectorFactory =
+ (HttpConnectorFactory) simpleServerFactory.getConnector();
+ MetricsUtil.adminContextPath =
+ "http://127.0.0.1:" + httpConnectorFactory.getPort()
+ + simpleServerFactory.getAdminContextPath() + "/metrics";
+ }
+
+ private void initSwaggerConfig(Environment environment, ApiRouteAppConfig configuration) {
+
+ environment.jersey().register(new ApiListingResource());
+ environment.getObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);
+
+ BeanConfig config = new BeanConfig();
+ config.setTitle("MicroService Bus rest API");
+ config.setVersion("1.0.0");
+ config.setResourcePackage("org.openo.msb.resources");
+ SimpleServerFactory simpleServerFactory =
+ (SimpleServerFactory) configuration.getServerFactory();
+ String basePath = simpleServerFactory.getApplicationContextPath();
+ String rootPath = simpleServerFactory.getJerseyRootPath();
+
+ rootPath = rootPath.substring(0, rootPath.indexOf("/*"));
+
+ basePath =
+ basePath.equals("/") ? rootPath : (new StringBuilder()).append(basePath)
+ .append(rootPath).toString();
+
+ LOGGER.info("getApplicationContextPath: " + basePath);
+ config.setBasePath(basePath);
+ config.setScan(true);
+ }
+
+
+ private void initRootPath(){
+ try {
+
+ URL urlRootPath = ApiRouteApp.class.getResource("/ext/initUrlRootPath/initUrlRootPath.json");
+ if (urlRootPath != null) {
+ String path = urlRootPath.getPath();
+
+ LOGGER.info("read initUrlRootPath:" + path);
+
+ String fileContent = FileUtil.readFile(path);
+ JSONObject jsonObj = JSONObject.fromObject(fileContent);
+ RouteUtil.IUI_ROOT_PATH=jsonObj.get("iuiRootPath").toString();
+ RouteUtil.API_ROOT_PATH=jsonObj.get("apiRootPath").toString();
+ }
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ LOGGER.error("read initUrlRootPath Files throw exception", e);
+ }
+
+ }
+ private void initRedisConfig(ApiRouteAppConfig configuration) {
+
+ String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
+ String jarPath = path.substring(0, path.lastIndexOf("/"));
+
+ LOGGER.info("jarpath: " + jarPath);
+ LOGGER.info("getDefaultWorkspace " + configuration.getDefaultWorkspace());
+
+ String confDir =
+ jarPath + "/" + configuration.getDefaultWorkspace() + "/"
+ + configuration.getPropertiesDir();
+ String propertiesPath = confDir + "/" + configuration.getPropertiesName();
+
+ JedisUtil.propertiesPath = propertiesPath;
+
+ LOGGER.info("propertiesPath: " + propertiesPath);
+ LOGGER.info("confDir: " + confDir);
+
+ try {
+ File dirFile = new File(confDir);
+
+ if (!dirFile.exists()) {
+ dirFile.mkdirs();
+ }
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ LOGGER.info("create RedisConfig confDir error: " + confDir + e.getMessage());
+ }
+
+
+ try {
+ File propertiesFile = new File(propertiesPath);
+ if (!propertiesFile.exists()) {
+
+
+ propertiesFile.createNewFile();
+
+ BufferedWriter output = new BufferedWriter(new FileWriter(propertiesFile));
+ StringBuilder contentBuilder = new StringBuilder();
+ contentBuilder.append("redis.host=127.0.0.1\n").append("redis.port=6379\n")
+ .append("#connectionTimeout\n").append("redis.connectionTimeout=2000\n")
+ .append("#redis dbIndex,defaule:0\n")
+ .append("redis.db_index=0\n\n")
+ .append("#--------------redis pool config--------------\n")
+ .append("#maxTotal\n").append("redis.pool.maxTotal=100\n")
+ .append("#maxIdle\n").append("redis.pool.maxIdle=20\n")
+ .append("#maxWaitMillis:ms\n")
+ .append("redis.pool.maxWaitMillis=1000\n")
+ .append("#testOnBorrow\n")
+ .append("redis.pool.testOnBorrow=false\n")
+ .append("#testOnReturn\n")
+ .append("redis.pool.testOnReturn=true\n")
+ .append("#nginx Port\n").append("server.port=10080\n");
+
+ output.write(contentBuilder.toString());
+ output.close();
+
+ }
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ LOGGER.info("create RedisConfig File error: " + propertiesPath + e.getMessage());
+ }
+ }
+
+
+ private void checkRedisConnect() {
+
+ new Thread(new Runnable() {
+ public void run() {
+ int n = 0;
+ while (true) {
+ if (ApiRouteServiceWrapper.checkRedisConnect() == false) {
+ n++;
+ System.out.println(n
+ + "/10 : Initial Route Configuration——redis connection fail...");
+
+ try {
+ Thread.sleep(10000);
+ } catch (InterruptedException e) {
+ LOGGER.error("Thread.sleep throw except:"+e.getMessage());
+ }
+
+
+ if (n >= 10) {
+ System.out.println("Initial Route Configuration fail,timeout exit");
+ LOGGER.error("Initial Route Configuration——redis connection fail,timeout exit...");
+ break;
+ }
+ } else {
+ System.out.println("starting to initial Route Configuration");
+ // initRouteInfoFromConfig();
+ initRouteInfoFromJson();
+ System.out.println("starting to initial consul Configuration");
+ runConsulClientApp();
+
+ break;
+ }
+ }
+
+ }
+ }).start();
+ }
+
+
+
+
+ /**
+ * @Title: initVisualRangeMatches
+ * @Description: TODO(According to the environment variable or a JSON file configuration initialization VisualRange filter conditions)
+ * @return: void
+ */
+ private void initVisualRangeMatches(){
+ try {
+ if(System.getenv("APIGATEWAY_VISUAL_RANGE")==null)
+ {
+
+ URL visualRangePath = ApiRouteApp.class.getResource("/ext/initVisualRange/initVisualRangeMatches.json");
+ if (visualRangePath != null) {
+ String path = visualRangePath.getPath();
+
+ LOGGER.info("read initVisualRangeMatches:" + path);
+
+ String fileContent = FileUtil.readFile(path);
+ JSONObject jsonObj = JSONObject.fromObject(fileContent);
+ String visualRangeArray=jsonObj.get("visualRange").toString();
+
+
+ RouteUtil.visualRangeMatches=StringUtils.split(visualRangeArray, ",");
+
+
+
+ }
+ }
+ else{
+ RouteUtil.visualRangeMatches=StringUtils.split(System.getenv("APIGATEWAY_VISUAL_RANGE"), ",");
+ }
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ LOGGER.error("read initVisualRangeMatches Files or env(APIGATEWAY_VISUAL_RANGE) throw exception", e);
+ }
+ }
+
+ /**
+ * @Title: initRouteInfoFromJson
+ * @Description: TODO(按照JSON文件配置初始化route数据)
+ * @return: void
+ */
+ private void initRouteInfoFromJson() {
+
+ URL apiDocsPath = ApiRouteApp.class.getResource("/ext/initServices");
+ if (apiDocsPath != null) {
+ String path = apiDocsPath.getPath();
+
+ LOGGER.info("read JsonFilefolder:" + path);
+
+ try {
+ File[] files = FileUtil.readFileFolder(path);
+ for (int i = 0; i < files.length; i++) {
+ File file = files[i];
+ if (file.isFile() && file.getName().endsWith(".json")) {
+ LOGGER.info("read JsonFile:" + file.getPath());
+ String fileContent = FileUtil.readFile(file.getPath());
+ saveInitService2redis(fileContent);
+ } else {
+ LOGGER.warn(file.getName() + " is not a right file");
+ }
+ }
+
+
+
+ } catch (FileNotFoundException e) {
+ // TODO Auto-generated catch block
+ LOGGER.error("read initServices Files throw FileNotFoundException", e);
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ LOGGER.error("read initServices Files throw IOexception", e);
+ }
+
+ }
+
+
+
+ }
+
+
+
+ private void saveInitService2redis(String fileContent) {
+ try {
+ List<ApiRouteInfo> routeList =
+ (List<ApiRouteInfo>) JacksonJsonUtil.jsonToListBean(fileContent);
+ for (ApiRouteInfo route : routeList) {
+ String url = route.getUrl();
+
+ if (RegExpTestUtil.urlRegExpTest(route.getServiceName())) {
+
+ try{
+ CustomRouteInfo dbCustomRoute =
+ CustomRouteServiceWrapper.getInstance().getCustomRouteInstance(
+ route.getServiceName());
+ }
+ catch(ExtendedNotFoundException e){
+
+ LOGGER.info("initCustomRoute: ServiceName--" + route.getServiceName());
+
+ CustomRouteInfo customRouteInfo = new CustomRouteInfo();
+ customRouteInfo.setControl(route.getControl());
+ customRouteInfo.setServers(route.getServers());
+ customRouteInfo.setServiceName(route.getServiceName());
+ customRouteInfo.setStatus(route.getStatus());
+ customRouteInfo.setUrl(route.getUrl());
+
+
+ CustomRouteServiceWrapper.getInstance().saveCustomRouteInstance(
+ customRouteInfo, "");
+
+
+ }
+ } else {
+
+ if (RegExpTestUtil.apiRouteUrlRegExpTest(url) || url.startsWith("/api/microservices/")) {
+
+
+ try{
+ ApiRouteInfo dbApiRoute =
+ ApiRouteServiceWrapper.getInstance().getApiRouteInstance(
+ route.getServiceName(), route.getVersion());
+ }
+ catch(ExtendedNotFoundException e){
+ LOGGER.info("initapiRoute: ServiceName--" + route.getServiceName());
+ ApiRouteServiceWrapper.getInstance().saveApiRouteInstance(route, "");
+ }
+
+
+ } else if (RegExpTestUtil.iuiRouteUrlRegExpTest(url) || url.equals("/iui/microservices")) {
+
+ try{
+ IuiRouteInfo dbIuiRoute =
+ IuiRouteServiceWrapper.getInstance().getIuiRouteInstance(
+ route.getServiceName());
+ }
+ catch(ExtendedNotFoundException e){
+
+ LOGGER.info(" initiuiRoute: ServiceName--" + route.getServiceName());
+ IuiRouteInfo iuiRouteInfo = new IuiRouteInfo();
+ iuiRouteInfo.setControl(route.getControl());
+ iuiRouteInfo.setServers(route.getServers());
+ iuiRouteInfo.setServiceName(route.getServiceName());
+ iuiRouteInfo.setStatus(route.getStatus());
+
+ if(url.equals("/iui/microservices")){
+ iuiRouteInfo.setUrl("/"+RouteUtil.IUI_ROOT_PATH+"/microservices");
+ }
+ else{
+ iuiRouteInfo.setUrl(route.getUrl());
+ }
+
+ IuiRouteServiceWrapper.getInstance().saveIuiRouteInstance(iuiRouteInfo);
+
+ }
+
+ } else {
+ LOGGER.error("init Service throw exception——serviceName: " + route.getServiceName()+",url:"+url);
+ }
+ }
+
+
+
+ }
+
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ LOGGER.error("read initServices Files throw exception", e);
+ }
+
+ }
+
+
+
+ /**
+ * The listener registration service changes
+ */
+ private void registerServiceChangeListener() {
+ MicroServiceDB.getInstance().addServiceChangeListener(new MicroServiceChangeListener());
+ }
+
+ // Open the consul to monitor subscription service
+ private void runConsulClientApp() {
+ DiscoverInfo config_discoverInfo = config.getDiscoverInfo();
+
+ ConsulInfo config_consulInfo=config.getConsulInfo();
+
+ RouteUtil.discoverInfo.setEnabled(config_discoverInfo.isEnabled());
+
+ if (config_discoverInfo.isEnabled()) {
+ try{
+ if(System.getenv("SDCLIENT_SVC_PORT")==null)
+ {
+ //yml
+ RouteUtil.discoverInfo.setIp(config_discoverInfo.getIp());
+ RouteUtil.discoverInfo.setPort(config_discoverInfo.getPort());
+
+ }
+ else{
+
+ String discoverAddress=System.getenv("SDCLIENT_SVC_PORT").split("//")[1];
+ String sdIP=discoverAddress.split(":")[0];
+ int sdPort=Integer
+ .parseInt(discoverAddress.split(":")[1]);
+
+ RouteUtil.discoverInfo.setIp(sdIP);
+ RouteUtil.discoverInfo.setPort(sdPort);
+
+ config_consulInfo.setIp(sdIP);
+ config_consulInfo.setPort(sdPort);
+
+
+ }
+
+
+
+ //Registration service discovery routing
+ //api
+ ApiRouteInfo discoverApiService=new ApiRouteInfo();
+ discoverApiService.setServiceName("msdiscover");
+ discoverApiService.setUrl("/api/microservices/v1");
+ discoverApiService.setVersion("v1");
+ discoverApiService.setMetricsUrl("/admin/metrics");
+ discoverApiService.setApiJson("/api/microservices/v1/swagger.json");
+
+ RouteServer[] servers=new RouteServer[1];
+ servers[0]=new RouteServer(RouteUtil.discoverInfo.getIp(),String.valueOf(RouteUtil.discoverInfo.getPort()));
+ discoverApiService.setServers(servers);
+
+ ApiRouteServiceWrapper.getInstance().saveApiRouteInstance(discoverApiService, "");
+
+ //iui
+ IuiRouteInfo discoverIUIService=new IuiRouteInfo();
+ discoverIUIService.setServiceName("msdiscover");
+ discoverIUIService.setUrl("/iui/microservices");
+ discoverIUIService.setServers(servers);
+ IuiRouteServiceWrapper.getInstance().saveIuiRouteInstance(discoverIUIService);
+
+
+
+ ConsulClientApp consulClientApp = new ConsulClientApp(config_consulInfo.getIp(), config_consulInfo.getPort());
+ // Monitor service change
+ consulClientApp.startServiceListen();
+ LOGGER.info("start monitor consul service--" +config_consulInfo.getIp() + ":"
+ + config_consulInfo.getPort());
+ }
+ catch(Exception e){
+ LOGGER.error("start monitor consul service fail:"+e.getMessage());
+ }
+ }
+
+
+ }
+
+}
/**
- * Copyright 2016 ZTE, Inc. and others.
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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;\r
-\r
-import java.net.MalformedURLException;\r
-import java.net.URL;\r
-import java.util.ArrayList;\r
-import java.util.HashSet;\r
-import java.util.List;\r
-import java.util.ListIterator;\r
-import java.util.Map;\r
-import java.util.concurrent.atomic.AtomicReference;\r
-\r
-import org.apache.commons.lang3.StringUtils;\r
-import org.openo.msb.api.MicroServiceFullInfo;\r
-import org.openo.msb.api.MicroServiceInfo;\r
-import org.openo.msb.api.Node;\r
-import org.openo.msb.wrapper.MicroServiceWrapper;\r
-import org.openo.msb.wrapper.consul.CatalogClient;\r
-import org.openo.msb.wrapper.consul.Consul;\r
-import org.openo.msb.wrapper.consul.HealthClient;\r
-import org.openo.msb.wrapper.consul.cache.CatalogCache;\r
-import org.openo.msb.wrapper.consul.cache.ConsulCache;\r
-import org.openo.msb.wrapper.consul.cache.ConsulCache4Map;\r
-import org.openo.msb.wrapper.consul.cache.HealthCache;\r
-import org.openo.msb.wrapper.consul.cache.ServiceCache;\r
-import org.openo.msb.wrapper.consul.model.catalog.CatalogService;\r
-import org.openo.msb.wrapper.consul.model.catalog.ServiceInfo;\r
-import org.openo.msb.wrapper.consul.model.health.Service;\r
-import org.openo.msb.wrapper.consul.model.health.ServiceHealth;\r
-import org.slf4j.Logger;\r
-import org.slf4j.LoggerFactory;\r
-\r
-public class ConsulClientApp {\r
-\r
- private final Consul consul;\r
- private final CatalogClient catalogClient;\r
- private final HealthClient healthClient;\r
- private AtomicReference<List<HealthCache>> cacheList = new AtomicReference<List<HealthCache>>(\r
- new ArrayList<HealthCache>());\r
-\r
-\r
- private static final Logger LOGGER = LoggerFactory.getLogger(ConsulClientApp.class);\r
-\r
- public ConsulClientApp(String ip, int port) {\r
- URL url = null;\r
- try {\r
- url = new URL("http", ip, port, "");\r
- } catch (MalformedURLException e1) {\r
- // TODO Auto-generated catch block\r
- LOGGER.error("start ConsulClientApp throw exception", e1);\r
- throw new RuntimeException(e1);\r
- }\r
- this.consul = Consul.builder().withUrl(url).build(); // connect to Consul on localhost\r
- this.catalogClient = consul.catalogClient();\r
- this.healthClient = consul.healthClient();\r
- }\r
-\r
- public Consul getConsul() {\r
- return consul;\r
- }\r
-\r
- public CatalogClient getCatalogClient() {\r
- return catalogClient;\r
- }\r
-\r
- private void stopNodeListen(String serviceName) {\r
- try {\r
-\r
- ListIterator<HealthCache> cacheListLit = cacheList.get().listIterator();\r
- while (cacheListLit.hasNext()) {\r
- HealthCache cache = (HealthCache) cacheListLit.next();\r
- if (cache.getServiceName().equals(serviceName)) {\r
-\r
- cache.stop();\r
- cacheListLit.remove();\r
- LOGGER.info(cache.getServiceName() + " NodeListen stoped");\r
- break;\r
- }\r
- }\r
-\r
- } catch (Exception e) {\r
- // TODO Auto-generated catch block\r
- LOGGER.error("stop Node:[" + serviceName + "] Listen throw exception", e);\r
- }\r
-\r
-\r
- }\r
-\r
- /**\r
- * @Title startServiceListen\r
- * @Description TODO(Open the consul registration services to monitor)\r
- * @return void\r
- */\r
- public void startServiceListen() {\r
- final ServiceCache serviceCache = ServiceCache.newCache(catalogClient, 30);\r
- serviceCache.addListener(new ConsulCache4Map.Listener<String, Map<String, List<String>>>() {\r
- @Override\r
- public void notify(List<ServiceInfo> oldValues, List<ServiceInfo> newValues) {\r
- // do Something with updated server List\r
- LOGGER.info("--new service notify--");\r
-\r
- List<ServiceInfo> deRegisterServiceList = getDiffrent(oldValues, newValues);\r
-\r
-\r
- for (ServiceInfo serviceInfo : deRegisterServiceList) {\r
- try {\r
- \r
- MicroServiceWrapper.getInstance().deleteMicroService(\r
- serviceInfo.getServiceName(), serviceInfo.getVersion());\r
- \r
-\r
- stopNodeListen(serviceInfo.getServiceName());\r
- LOGGER.info("Cancel MicroServiceInfo and stop node listen successs:"\r
- + serviceInfo.getServiceName());\r
- } catch (Exception e) {\r
- LOGGER.error("Cancel MicroServiceInfo and stop node listen FAIL : ", e);\r
-\r
- }\r
-\r
- }\r
-\r
-\r
- List<ServiceInfo> registerServiceList = getDiffrent(newValues, oldValues);\r
- for (ServiceInfo serviceInfo : registerServiceList) {\r
-\r
- // if (deRegisterServiceList.contains(serviceInfo)) continue;\r
-\r
-\r
- LOGGER.info(" new serviceName:" + serviceInfo.getServiceName() + " version:"\r
- + serviceInfo.getVersion());\r
- // Open Node to monitor new registration service\r
- startHealthNodeListen(serviceInfo.getServiceName(), serviceInfo.getVersion());\r
-\r
- }\r
-\r
-\r
- }\r
-\r
- });\r
-\r
- try {\r
- LOGGER.info("start...consul ... service..Listening.");\r
- serviceCache.start();\r
-\r
- } catch (Exception e) {\r
- // TODO Auto-generated catch block\r
- LOGGER.error("start...service..Listen throw exception", e);\r
- }\r
- }\r
-\r
-\r
- /**\r
- * @Title startHealthNodeListen\r
- * @Description TODO(Open a service node changes to monitor, only to return to health service)\r
- * @param serviceName\r
- * @return\r
- * @return HealthCache\r
- */\r
- private HealthCache startHealthNodeListen(final String serviceName, final String version) {\r
- final HealthCache healthCache = HealthCache.newCache(healthClient, serviceName, 30);\r
- healthCache.addListener(new HealthCache.Listener<String, ServiceHealth>() {\r
- @Override\r
- public void notify(Map<String, ServiceHealth> newValues) {\r
- // do Something with updated server map\r
- LOGGER.info(serviceName + "--new node notify--");\r
-\r
- if (newValues.isEmpty()) {\r
- LOGGER.info(serviceName + "--nodeList is Empty--");\r
-\r
- \r
- MicroServiceWrapper.getInstance().deleteMicroService(serviceName, version);\r
- \r
- // try {\r
- // healthCache.stop();\r
- // } catch (Exception e) {\r
- // LOGGER.equals(serviceName+"-- stop Node error:"+e.getMessage());\r
- // }\r
-\r
- } else {\r
-\r
- MicroServiceInfo microServiceInfo = new MicroServiceInfo();\r
- HashSet<Node> nodes = new HashSet<Node>();\r
- String url = "";\r
- String version = "", visualRange = "", protocol = "",lb_policy="";\r
-\r
- for (Map.Entry<String, ServiceHealth> entry : newValues.entrySet()) {\r
- String nodeName = entry.getKey().toString();\r
- ServiceHealth value = (ServiceHealth) entry.getValue();\r
-\r
- Node node = new Node();\r
- Service service = value.getService();\r
- node.setIp(service.getAddress());\r
- node.setPort(String.valueOf(service.getPort()));\r
-\r
-\r
- try {\r
- List<String> tagList = service.getTags();\r
- for (String tag : tagList) {\r
- if (tag.startsWith("url")) {\r
- if (tag.split(":").length == 2) {\r
- url = tag.split(":")[1];\r
- } else {\r
- url = "";\r
- }\r
-\r
-\r
- continue;\r
- }\r
- if (tag.startsWith("version")) {\r
- if (tag.split(":").length == 2) {\r
- version = tag.split(":")[1];\r
- } else {\r
- version = "";\r
- }\r
- continue;\r
- }\r
- if (tag.startsWith("protocol")) {\r
- protocol = tag.split(":")[1];\r
- continue;\r
- }\r
- if (tag.startsWith("visualRange")) {\r
- visualRange = tag.split(":")[1];\r
- continue;\r
- }\r
- \r
- if (tag.startsWith("lb_policy")) {\r
- lb_policy = tag.split(":")[1];\r
- continue;\r
- }\r
-\r
- }\r
-\r
-\r
- } catch (Exception e) {\r
- LOGGER.error(serviceName + " read tag throw exception", e);\r
- System.out.println(serviceName + " read tag throw exception");\r
- }\r
-\r
- nodes.add(node);\r
- }\r
-\r
- microServiceInfo.setNodes(nodes);\r
- microServiceInfo.setProtocol(protocol);\r
- microServiceInfo.setUrl(url);\r
- microServiceInfo.setServiceName(serviceName);\r
- microServiceInfo.setLb_policy(lb_policy);\r
- if (!visualRange.isEmpty()) {\r
- microServiceInfo.setVisualRange(visualRange);\r
- }\r
- microServiceInfo.setVersion(version);\r
-\r
- try {\r
- MicroServiceFullInfo microServiceFullInfo =\r
- MicroServiceWrapper.getInstance().saveMicroServiceInstance(\r
- microServiceInfo, false, "", "");\r
- LOGGER.info("register MicroServiceInfo successs:"\r
- + microServiceFullInfo.getServiceName());\r
- } catch (Exception e) {\r
- LOGGER.error("register MicroServiceInfo FAIL : " + serviceName, e);\r
-\r
- }\r
- }\r
- }\r
- });\r
- try {\r
- LOGGER.info(serviceName + " Node Listen start");\r
- cacheList.get().add(healthCache);\r
- healthCache.start();\r
-\r
- } catch (Exception e) {\r
- // TODO Auto-generated catch block\r
- LOGGER.error(serviceName + " Node Listen start throw exception", e);\r
- }\r
-\r
- return healthCache;\r
- }\r
-\r
- /**\r
- * @Title startNodeListen\r
- * @Description TODO(Open a service node changes to monitor)\r
- * @param serviceName\r
- * @return\r
- * @return CatalogCache\r
- */\r
- @Deprecated\r
- private CatalogCache startNodeListen(final String serviceName) {\r
- final CatalogCache catalogCache = CatalogCache.newCache(catalogClient, serviceName, 30);\r
- catalogCache.addListener(new ConsulCache.Listener<String, CatalogService>() {\r
- @Override\r
- public void notify(Map<String, CatalogService> newValues) {\r
- // do Something with updated server map\r
- System.out.println(serviceName + "--new node notify--");\r
- LOGGER.info(serviceName + "--new node notify--");\r
-\r
- if (newValues.isEmpty()) {\r
- System.out.println(serviceName + "-- nodeList is Empty--");\r
- LOGGER.info(serviceName + "--nodeList is Empty-stop service[" + serviceName\r
- + "] listen-");\r
- try {\r
- catalogCache.stop();\r
- } catch (Exception e) {\r
- LOGGER.equals(serviceName + "-- stop Node error:" + e.getMessage());\r
- }\r
-\r
- } else {\r
-\r
- MicroServiceInfo microServiceInfo = new MicroServiceInfo();\r
- HashSet<Node> nodes = new HashSet<Node>();\r
- String url = "";\r
- String version = "", visualRange = "", protocol = "";\r
-\r
- for (Map.Entry<String, CatalogService> entry : newValues.entrySet()) {\r
- String nodeName = entry.getKey().toString();\r
- CatalogService value = (CatalogService) entry.getValue();\r
-\r
- Node node = new Node();\r
- node.setIp(value.getServiceAddress());\r
- node.setPort(String.valueOf(value.getServicePort()));\r
-\r
-\r
- try {\r
- List<String> tagList = value.getServiceTags();\r
- for (String tag : tagList) {\r
- if (tag.startsWith("url")) {\r
- if (tag.split(":").length == 2) {\r
- url = tag.split(":")[1];\r
- } else {\r
- url = "";\r
- }\r
-\r
-\r
- continue;\r
- }\r
- if (tag.startsWith("version")) {\r
- if (tag.split(":").length == 2) {\r
- version = tag.split(":")[1];\r
- } else {\r
- version = "";\r
- }\r
- continue;\r
- }\r
- if (tag.startsWith("protocol")) {\r
- protocol = tag.split(":")[1];\r
- continue;\r
- }\r
- if (tag.startsWith("visualRange")) {\r
- visualRange = tag.split(":")[1];\r
- continue;\r
- }\r
- if (tag.startsWith("ttl")) {\r
- int ttl = Integer.parseInt(tag.split(":")[1]);\r
- node.setTtl(ttl);\r
- continue;\r
- }\r
- }\r
-\r
-\r
- } catch (Exception e) {\r
- LOGGER.error(serviceName + " read tag throw exception", e);\r
- System.out.println(serviceName + " read tag throw exception");\r
- }\r
-\r
- nodes.add(node);\r
-\r
-\r
- System.out.println(nodeName + ":" + value.getServiceAddress() + " "\r
- + value.getServicePort() + " " + value.getServiceTags());\r
- }\r
-\r
- microServiceInfo.setNodes(nodes);\r
- microServiceInfo.setProtocol(protocol);\r
- microServiceInfo.setUrl(url);\r
- microServiceInfo.setServiceName(serviceName);\r
- if (!visualRange.isEmpty()) {\r
- microServiceInfo.setVisualRange(visualRange);\r
- }\r
- microServiceInfo.setVersion(version);\r
-\r
- try {\r
- MicroServiceFullInfo microServiceFullInfo =\r
- MicroServiceWrapper.getInstance().saveMicroServiceInstance(\r
- microServiceInfo, false, "", "");\r
- LOGGER.info("register MicroServiceInfo successs:" + microServiceFullInfo);\r
- System.out.println("register MicroServiceInfo successs:" + serviceName);\r
- } catch (Exception e) {\r
- LOGGER.error("register MicroServiceInfo FAIL : ", e);\r
-\r
- }\r
- }\r
- }\r
- });\r
- try {\r
- System.out.println(serviceName + " Node Listen start");\r
- LOGGER.info(serviceName + " Node Listen start");\r
- catalogCache.start();\r
-\r
- } catch (Exception e) {\r
- // TODO Auto-generated catch block\r
- LOGGER.error(serviceName + " Node Listen start throw exception", e);\r
- }\r
-\r
- return catalogCache;\r
- }\r
-\r
-\r
- /**\r
- * @Title getDiffrent\r
- * @Description TODO(Extract the list1 and list2 different data sets)\r
- * @param list1\r
- * @param list2\r
- * @return\r
- * @return List<String>\r
- */\r
- private List<ServiceInfo> getDiffrent(List<ServiceInfo> list1, List<ServiceInfo> list2) {\r
-\r
- List<ServiceInfo> diff = new ArrayList<ServiceInfo>();\r
-\r
-\r
-\r
- for (ServiceInfo serviceInfo : list1) {\r
- if (!list2.contains(serviceInfo)) {\r
- diff.add(serviceInfo);\r
- }\r
- }\r
-\r
- return diff;\r
- }\r
-\r
- public static void main(String[] args) {\r
- ConsulClientApp consulTest = new ConsulClientApp("127.0.0.1", 10081);\r
- consulTest.startServiceListen();\r
-\r
-\r
- }\r
-\r
-\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.apache.commons.lang3.StringUtils;
+import org.openo.msb.api.MicroServiceFullInfo;
+import org.openo.msb.api.MicroServiceInfo;
+import org.openo.msb.api.Node;
+import org.openo.msb.wrapper.MicroServiceWrapper;
+import org.openo.msb.wrapper.consul.CatalogClient;
+import org.openo.msb.wrapper.consul.Consul;
+import org.openo.msb.wrapper.consul.HealthClient;
+import org.openo.msb.wrapper.consul.cache.CatalogCache;
+import org.openo.msb.wrapper.consul.cache.ConsulCache;
+import org.openo.msb.wrapper.consul.cache.ConsulCache4Map;
+import org.openo.msb.wrapper.consul.cache.HealthCache;
+import org.openo.msb.wrapper.consul.cache.ServiceCache;
+import org.openo.msb.wrapper.consul.model.catalog.CatalogService;
+import org.openo.msb.wrapper.consul.model.catalog.ServiceInfo;
+import org.openo.msb.wrapper.consul.model.health.Service;
+import org.openo.msb.wrapper.consul.model.health.ServiceHealth;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ConsulClientApp {
+
+ private final Consul consul;
+ private final CatalogClient catalogClient;
+ private final HealthClient healthClient;
+ private AtomicReference<List<HealthCache>> cacheList = new AtomicReference<List<HealthCache>>(
+ new ArrayList<HealthCache>());
+
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ConsulClientApp.class);
+
+ public ConsulClientApp(String ip, int port) {
+ URL url = null;
+ try {
+ url = new URL("http", ip, port, "");
+ } catch (MalformedURLException e1) {
+ // TODO Auto-generated catch block
+ LOGGER.error("start ConsulClientApp throw exception", e1);
+ throw new RuntimeException(e1);
+ }
+ this.consul = Consul.builder().withUrl(url).build(); // connect to Consul on localhost
+ this.catalogClient = consul.catalogClient();
+ this.healthClient = consul.healthClient();
+ }
+
+ public Consul getConsul() {
+ return consul;
+ }
+
+ public CatalogClient getCatalogClient() {
+ return catalogClient;
+ }
+
+ private void stopNodeListen(String serviceName) {
+ try {
+
+ ListIterator<HealthCache> cacheListLit = cacheList.get().listIterator();
+ while (cacheListLit.hasNext()) {
+ HealthCache cache = (HealthCache) cacheListLit.next();
+ if (cache.getServiceName().equals(serviceName)) {
+
+ cache.stop();
+ cacheListLit.remove();
+ LOGGER.info(cache.getServiceName() + " NodeListen stoped");
+ break;
+ }
+ }
+
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ LOGGER.error("stop Node:[" + serviceName + "] Listen throw exception", e);
+ }
+
+
+ }
+
+ /**
+ * @Title startServiceListen
+ * @Description TODO(Open the consul registration services to monitor)
+ * @return void
+ */
+ public void startServiceListen() {
+ final ServiceCache serviceCache = ServiceCache.newCache(catalogClient, 30);
+ serviceCache.addListener(new ConsulCache4Map.Listener<String, Map<String, List<String>>>() {
+ @Override
+ public void notify(List<ServiceInfo> oldValues, List<ServiceInfo> newValues) {
+ // do Something with updated server List
+ LOGGER.info("--new service notify--");
+
+ List<ServiceInfo> deRegisterServiceList = getDiffrent(oldValues, newValues);
+
+
+ for (ServiceInfo serviceInfo : deRegisterServiceList) {
+ try {
+
+ MicroServiceWrapper.getInstance().deleteMicroService(
+ serviceInfo.getServiceName(), serviceInfo.getVersion());
+
+
+ stopNodeListen(serviceInfo.getServiceName());
+ LOGGER.info("Cancel MicroServiceInfo and stop node listen successs:"
+ + serviceInfo.getServiceName());
+ } catch (Exception e) {
+ LOGGER.error("Cancel MicroServiceInfo and stop node listen FAIL : ", e);
+
+ }
+
+ }
+
+
+ List<ServiceInfo> registerServiceList = getDiffrent(newValues, oldValues);
+ for (ServiceInfo serviceInfo : registerServiceList) {
+
+ // if (deRegisterServiceList.contains(serviceInfo)) continue;
+
+
+ LOGGER.info(" new serviceName:" + serviceInfo.getServiceName() + " version:"
+ + serviceInfo.getVersion());
+ // Open Node to monitor new registration service
+ startHealthNodeListen(serviceInfo.getServiceName(), serviceInfo.getVersion());
+
+ }
+
+
+ }
+
+ });
+
+ try {
+ LOGGER.info("start...consul ... service..Listening.");
+ serviceCache.start();
+
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ LOGGER.error("start...service..Listen throw exception", e);
+ }
+ }
+
+
+ /**
+ * @Title startHealthNodeListen
+ * @Description TODO(Open a service node changes to monitor, only to return to health service)
+ * @param serviceName
+ * @return
+ * @return HealthCache
+ */
+ private HealthCache startHealthNodeListen(final String serviceName, final String version) {
+ final HealthCache healthCache = HealthCache.newCache(healthClient, serviceName, 30);
+ healthCache.addListener(new HealthCache.Listener<String, ServiceHealth>() {
+ @Override
+ public void notify(Map<String, ServiceHealth> newValues) {
+ // do Something with updated server map
+ LOGGER.info(serviceName + "--new node notify--");
+
+ if (newValues.isEmpty()) {
+ LOGGER.info(serviceName + "--nodeList is Empty--");
+
+
+ MicroServiceWrapper.getInstance().deleteMicroService(serviceName, version);
+
+ // try {
+ // healthCache.stop();
+ // } catch (Exception e) {
+ // LOGGER.equals(serviceName+"-- stop Node error:"+e.getMessage());
+ // }
+
+ } else {
+
+ MicroServiceInfo microServiceInfo = new MicroServiceInfo();
+ HashSet<Node> nodes = new HashSet<Node>();
+ String url = "";
+ String version = "", visualRange = "", protocol = "",lb_policy="";
+
+ for (Map.Entry<String, ServiceHealth> entry : newValues.entrySet()) {
+ String nodeName = entry.getKey().toString();
+ ServiceHealth value = (ServiceHealth) entry.getValue();
+
+ Node node = new Node();
+ Service service = value.getService();
+ node.setIp(service.getAddress());
+ node.setPort(String.valueOf(service.getPort()));
+
+
+ try {
+ List<String> tagList = service.getTags();
+ for (String tag : tagList) {
+ if (tag.startsWith("url")) {
+ if (tag.split(":").length == 2) {
+ url = tag.split(":")[1];
+ } else {
+ url = "";
+ }
+
+
+ continue;
+ }
+ if (tag.startsWith("version")) {
+ if (tag.split(":").length == 2) {
+ version = tag.split(":")[1];
+ } else {
+ version = "";
+ }
+ continue;
+ }
+ if (tag.startsWith("protocol")) {
+ protocol = tag.split(":")[1];
+ continue;
+ }
+ if (tag.startsWith("visualRange")) {
+ visualRange = tag.split(":")[1];
+ continue;
+ }
+
+ if (tag.startsWith("lb_policy")) {
+ lb_policy = tag.split(":")[1];
+ continue;
+ }
+
+ }
+
+
+ } catch (Exception e) {
+ LOGGER.error(serviceName + " read tag throw exception", e);
+ System.out.println(serviceName + " read tag throw exception");
+ }
+
+ nodes.add(node);
+ }
+
+ microServiceInfo.setNodes(nodes);
+ microServiceInfo.setProtocol(protocol);
+ microServiceInfo.setUrl(url);
+ microServiceInfo.setServiceName(serviceName);
+ microServiceInfo.setLb_policy(lb_policy);
+ if (!visualRange.isEmpty()) {
+ microServiceInfo.setVisualRange(visualRange);
+ }
+ microServiceInfo.setVersion(version);
+
+ try {
+ MicroServiceFullInfo microServiceFullInfo =
+ MicroServiceWrapper.getInstance().saveMicroServiceInstance(
+ microServiceInfo, false, "", "");
+ LOGGER.info("register MicroServiceInfo successs:"
+ + microServiceFullInfo.getServiceName());
+ } catch (Exception e) {
+ LOGGER.error("register MicroServiceInfo FAIL : " + serviceName, e);
+
+ }
+ }
+ }
+ });
+ try {
+ LOGGER.info(serviceName + " Node Listen start");
+ cacheList.get().add(healthCache);
+ healthCache.start();
+
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ LOGGER.error(serviceName + " Node Listen start throw exception", e);
+ }
+
+ return healthCache;
+ }
+
+ /**
+ * @Title startNodeListen
+ * @Description TODO(Open a service node changes to monitor)
+ * @param serviceName
+ * @return
+ * @return CatalogCache
+ */
+ @Deprecated
+ private CatalogCache startNodeListen(final String serviceName) {
+ final CatalogCache catalogCache = CatalogCache.newCache(catalogClient, serviceName, 30);
+ catalogCache.addListener(new ConsulCache.Listener<String, CatalogService>() {
+ @Override
+ public void notify(Map<String, CatalogService> newValues) {
+ // do Something with updated server map
+ System.out.println(serviceName + "--new node notify--");
+ LOGGER.info(serviceName + "--new node notify--");
+
+ if (newValues.isEmpty()) {
+ System.out.println(serviceName + "-- nodeList is Empty--");
+ LOGGER.info(serviceName + "--nodeList is Empty-stop service[" + serviceName
+ + "] listen-");
+ try {
+ catalogCache.stop();
+ } catch (Exception e) {
+ LOGGER.equals(serviceName + "-- stop Node error:" + e.getMessage());
+ }
+
+ } else {
+
+ MicroServiceInfo microServiceInfo = new MicroServiceInfo();
+ HashSet<Node> nodes = new HashSet<Node>();
+ String url = "";
+ String version = "", visualRange = "", protocol = "";
+
+ for (Map.Entry<String, CatalogService> entry : newValues.entrySet()) {
+ String nodeName = entry.getKey().toString();
+ CatalogService value = (CatalogService) entry.getValue();
+
+ Node node = new Node();
+ node.setIp(value.getServiceAddress());
+ node.setPort(String.valueOf(value.getServicePort()));
+
+
+ try {
+ List<String> tagList = value.getServiceTags();
+ for (String tag : tagList) {
+ if (tag.startsWith("url")) {
+ if (tag.split(":").length == 2) {
+ url = tag.split(":")[1];
+ } else {
+ url = "";
+ }
+
+
+ continue;
+ }
+ if (tag.startsWith("version")) {
+ if (tag.split(":").length == 2) {
+ version = tag.split(":")[1];
+ } else {
+ version = "";
+ }
+ continue;
+ }
+ if (tag.startsWith("protocol")) {
+ protocol = tag.split(":")[1];
+ continue;
+ }
+ if (tag.startsWith("visualRange")) {
+ visualRange = tag.split(":")[1];
+ continue;
+ }
+ if (tag.startsWith("ttl")) {
+ int ttl = Integer.parseInt(tag.split(":")[1]);
+ node.setTtl(ttl);
+ continue;
+ }
+ }
+
+
+ } catch (Exception e) {
+ LOGGER.error(serviceName + " read tag throw exception", e);
+ System.out.println(serviceName + " read tag throw exception");
+ }
+
+ nodes.add(node);
+
+
+ System.out.println(nodeName + ":" + value.getServiceAddress() + " "
+ + value.getServicePort() + " " + value.getServiceTags());
+ }
+
+ microServiceInfo.setNodes(nodes);
+ microServiceInfo.setProtocol(protocol);
+ microServiceInfo.setUrl(url);
+ microServiceInfo.setServiceName(serviceName);
+ if (!visualRange.isEmpty()) {
+ microServiceInfo.setVisualRange(visualRange);
+ }
+ microServiceInfo.setVersion(version);
+
+ try {
+ MicroServiceFullInfo microServiceFullInfo =
+ MicroServiceWrapper.getInstance().saveMicroServiceInstance(
+ microServiceInfo, false, "", "");
+ LOGGER.info("register MicroServiceInfo successs:" + microServiceFullInfo);
+ System.out.println("register MicroServiceInfo successs:" + serviceName);
+ } catch (Exception e) {
+ LOGGER.error("register MicroServiceInfo FAIL : ", e);
+
+ }
+ }
+ }
+ });
+ try {
+ System.out.println(serviceName + " Node Listen start");
+ LOGGER.info(serviceName + " Node Listen start");
+ catalogCache.start();
+
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ LOGGER.error(serviceName + " Node Listen start throw exception", e);
+ }
+
+ return catalogCache;
+ }
+
+
+ /**
+ * @Title getDiffrent
+ * @Description TODO(Extract the list1 and list2 different data sets)
+ * @param list1
+ * @param list2
+ * @return
+ * @return List<String>
+ */
+ private List<ServiceInfo> getDiffrent(List<ServiceInfo> list1, List<ServiceInfo> list2) {
+
+ List<ServiceInfo> diff = new ArrayList<ServiceInfo>();
+
+
+
+ for (ServiceInfo serviceInfo : list1) {
+ if (!list2.contains(serviceInfo)) {
+ diff.add(serviceInfo);
+ }
+ }
+
+ return diff;
+ }
+
+ public static void main(String[] args) {
+ ConsulClientApp consulTest = new ConsulClientApp("127.0.0.1", 10081);
+ consulTest.startServiceListen();
+
+
+ }
+
+
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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
-package org.openo.msb.api;\r
-\r
-import io.swagger.annotations.ApiModelProperty;\r
-\r
-import java.io.Serializable;\r
-\r
-import com.fasterxml.jackson.annotation.JsonInclude;\r
-import com.fasterxml.jackson.annotation.JsonInclude.Include;\r
-\r
-\r
-public class ApiRouteInfo implements Serializable{\r
- private static final long serialVersionUID = 1L;\r
- @ApiModelProperty(required = true)\r
- private String serviceName; \r
- \r
- @ApiModelProperty(example = "v1", required = true)\r
- private String version; \r
- \r
- @ApiModelProperty(value = "Target Service URL,start with /",example = "/test", required = true)\r
- private String url; \r
- \r
- private String apiJson=""; //swagger json Path\r
- \r
- @ApiModelProperty(value = "[apiJson Type] 0:local file 1: remote file", allowableValues = "0,1", example = "1")\r
- private String apiJsonType="1"; \r
- private String metricsUrl=""; \r
- \r
- @ApiModelProperty(value = "[control Range] 0:default 1:readonly 2:hidden ", allowableValues = "0,1,2", example = "0")\r
- private String control="0"; \r
- \r
- @ApiModelProperty(value = "[status] 1:abled 0:disabled ", allowableValues = "0,1", example = "1")\r
- private String status="1"; \r
- \r
- @ApiModelProperty(value = "[visual Range]interSystem:0,inSystem:1", allowableValues = "0,1", example = "1")\r
- private String visualRange = "1"; \r
- \r
- @ApiModelProperty(value = "[LB Policy]non_ip_hash:0,ip_hash:1", allowableValues = "0,1", example = "0")\r
- private String useOwnUpstream="0"; //负载均衡策略 \r
- \r
- @ApiModelProperty(required = true)\r
- private RouteServer servers[]; \r
- \r
- \r
- \r
- public String getServiceName() {\r
- return serviceName;\r
- }\r
- public void setServiceName(String serviceName) {\r
- this.serviceName = serviceName;\r
- }\r
- public String getVersion() {\r
- return version;\r
- }\r
- public void setVersion(String version) {\r
- this.version = version;\r
- }\r
- \r
- public String getApiJson() {\r
- return apiJson;\r
- }\r
- public void setApiJson(String apiJson) {\r
- this.apiJson = apiJson;\r
- }\r
- \r
- public String getUrl() {\r
- return url;\r
- }\r
- public void setUrl(String url) {\r
- this.url = url;\r
- }\r
- public RouteServer[] getServers() {\r
- return servers;\r
- }\r
- public void setServers(RouteServer[] servers) {\r
- this.servers = servers;\r
- }\r
- \r
-\r
- public String getApiJsonType() {\r
- return apiJsonType;\r
- }\r
- public void setApiJsonType(String apiJsonType) {\r
- this.apiJsonType = apiJsonType;\r
- }\r
- public String getMetricsUrl() {\r
- return metricsUrl;\r
- }\r
- public void setMetricsUrl(String metricsUrl) {\r
- this.metricsUrl = metricsUrl;\r
- }\r
- public String getControl() {\r
- return control;\r
- }\r
- public void setControl(String control) {\r
- this.control = control;\r
- }\r
- public String getStatus() {\r
- return status;\r
- }\r
- public void setStatus(String status) {\r
- this.status = status;\r
- }\r
- public String getVisualRange() {\r
- return visualRange;\r
- }\r
- public void setVisualRange(String visualRange) {\r
- this.visualRange = visualRange;\r
- }\r
- public String getUseOwnUpstream() {\r
- return useOwnUpstream;\r
- }\r
-\r
- public void setUseOwnUpstream(String useOwnUpstream) {\r
- this.useOwnUpstream = useOwnUpstream;\r
- }\r
-\r
-\r
- \r
- \r
-\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.api;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+
+
+public class ApiRouteInfo implements Serializable{
+ private static final long serialVersionUID = 1L;
+ @ApiModelProperty(required = true)
+ private String serviceName;
+
+ @ApiModelProperty(example = "v1", required = true)
+ private String version;
+
+ @ApiModelProperty(value = "Target Service URL,start with /",example = "/test", required = true)
+ private String url;
+
+ private String apiJson=""; //swagger json Path
+
+ @ApiModelProperty(value = "[apiJson Type] 0:local file 1: remote file", allowableValues = "0,1", example = "1")
+ private String apiJsonType="1";
+ private String metricsUrl="";
+
+ @ApiModelProperty(value = "[control Range] 0:default 1:readonly 2:hidden ", allowableValues = "0,1,2", example = "0")
+ private String control="0";
+
+ @ApiModelProperty(value = "[status] 1:abled 0:disabled ", allowableValues = "0,1", example = "1")
+ private String status="1";
+
+ @ApiModelProperty(value = "[visual Range]interSystem:0,inSystem:1", allowableValues = "0,1", example = "1")
+ private String visualRange = "1";
+
+ @ApiModelProperty(value = "[LB Policy]non_ip_hash:0,ip_hash:1", allowableValues = "0,1", example = "0")
+ private String useOwnUpstream="0"; //负载均衡策略
+
+ @ApiModelProperty(required = true)
+ private RouteServer servers[];
+
+
+
+ public String getServiceName() {
+ return serviceName;
+ }
+ public void setServiceName(String serviceName) {
+ this.serviceName = serviceName;
+ }
+ public String getVersion() {
+ return version;
+ }
+ public void setVersion(String version) {
+ this.version = version;
+ }
+
+ public String getApiJson() {
+ return apiJson;
+ }
+ public void setApiJson(String apiJson) {
+ this.apiJson = apiJson;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+ public void setUrl(String url) {
+ this.url = url;
+ }
+ public RouteServer[] getServers() {
+ return servers;
+ }
+ public void setServers(RouteServer[] servers) {
+ this.servers = servers;
+ }
+
+
+ public String getApiJsonType() {
+ return apiJsonType;
+ }
+ public void setApiJsonType(String apiJsonType) {
+ this.apiJsonType = apiJsonType;
+ }
+ public String getMetricsUrl() {
+ return metricsUrl;
+ }
+ public void setMetricsUrl(String metricsUrl) {
+ this.metricsUrl = metricsUrl;
+ }
+ public String getControl() {
+ return control;
+ }
+ public void setControl(String control) {
+ this.control = control;
+ }
+ public String getStatus() {
+ return status;
+ }
+ public void setStatus(String status) {
+ this.status = status;
+ }
+ public String getVisualRange() {
+ return visualRange;
+ }
+ public void setVisualRange(String visualRange) {
+ this.visualRange = visualRange;
+ }
+ public String getUseOwnUpstream() {
+ return useOwnUpstream;
+ }
+
+ public void setUseOwnUpstream(String useOwnUpstream) {
+ this.useOwnUpstream = useOwnUpstream;
+ }
+
+
+
+
+
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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
-package org.openo.msb.api;\r
-\r
-import java.io.Serializable;\r
-\r
-public class ConsulInfo implements Serializable{\r
- private static final long serialVersionUID = 1L;\r
- private String ip; \r
- private int port;\r
- \r
- public String getIp() {\r
- return ip;\r
- }\r
- public void setIp(String ip) {\r
- this.ip = ip;\r
- }\r
- public int getPort() {\r
- return port;\r
- }\r
- public void setPort(int port) {\r
- this.port = port;\r
- }\r
-\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.api;
+
+import java.io.Serializable;
+
+public class ConsulInfo implements Serializable{
+ private static final long serialVersionUID = 1L;
+ private String ip;
+ private int port;
+
+ public String getIp() {
+ return ip;
+ }
+ public void setIp(String ip) {
+ this.ip = ip;
+ }
+ public int getPort() {
+ return port;
+ }
+ public void setPort(int port) {
+ this.port = port;
+ }
+
}
\ No newline at end of file
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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
-package org.openo.msb.api;\r
-\r
-import java.io.IOException;\r
-import java.text.SimpleDateFormat;\r
-import java.util.Date;\r
-\r
-import com.fasterxml.jackson.core.JsonGenerator;\r
-import com.fasterxml.jackson.core.JsonProcessingException;\r
-import com.fasterxml.jackson.databind.JsonSerializer;\r
-import com.fasterxml.jackson.databind.SerializerProvider;\r
-\r
-public class CustomDateSerializer extends JsonSerializer<Date> { \r
- \r
- @Override \r
- public void serialize(Date value, \r
- JsonGenerator jsonGenerator, \r
- SerializerProvider provider) \r
- throws IOException, JsonProcessingException { \r
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX"); \r
- jsonGenerator.writeString(sdf.format(value)); \r
- } \r
- \r
- \r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.api;
+
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+
+public class CustomDateSerializer extends JsonSerializer<Date> {
+
+ @Override
+ public void serialize(Date value,
+ JsonGenerator jsonGenerator,
+ SerializerProvider provider)
+ throws IOException, JsonProcessingException {
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
+ jsonGenerator.writeString(sdf.format(value));
+ }
+
+
}
\ No newline at end of file
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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
-package org.openo.msb.api;\r
-\r
-import io.swagger.annotations.ApiModelProperty;\r
-\r
-import java.io.Serializable;\r
-\r
-public class CustomRouteInfo implements Serializable{\r
- \r
- private static final long serialVersionUID = 1L; \r
- @ApiModelProperty(required = true)\r
- private String serviceName; \r
- \r
- @ApiModelProperty(value = "Target Service URL,start with /",example = "/test", required = true)\r
- private String url; \r
- \r
- @ApiModelProperty(value = "[control Range] 0:default 1:readonly 2:hidden ", allowableValues = "0,1,2", example = "0")\r
- private String control="0"; \r
- \r
- @ApiModelProperty(value = "[status] 1:abled 0:disabled ", allowableValues = "0,1", example = "1")\r
- private String status="1"; \r
- \r
- @ApiModelProperty(value = "[visual Range]interSystem:0,inSystem:1", allowableValues = "0,1", example = "1")\r
- private String visualRange = "1"; \r
- \r
- @ApiModelProperty(value = "[LB Policy]non_ip_hash:0,ip_hash:1", allowableValues = "0,1", example = "0")\r
- private String useOwnUpstream="0"; //负载均衡策略 \r
-\r
- @ApiModelProperty(required = true)\r
- private RouteServer servers[]; \r
-\r
- public String getServiceName() {\r
- return serviceName;\r
- }\r
-\r
- public void setServiceName(String serviceName) {\r
- this.serviceName = serviceName;\r
- }\r
-\r
- public String getUrl() {\r
- return url;\r
- }\r
-\r
- public void setUrl(String url) {\r
- this.url = url;\r
- }\r
-\r
- public RouteServer[] getServers() {\r
- return servers;\r
- }\r
-\r
- public void setServers(RouteServer[] servers) {\r
- this.servers = servers;\r
- }\r
-\r
- public String getControl() {\r
- return control;\r
- }\r
-\r
- public void setControl(String control) {\r
- this.control = control;\r
- }\r
-\r
- public String getStatus() {\r
- return status;\r
- }\r
-\r
- public void setStatus(String status) {\r
- this.status = status;\r
- }\r
-\r
- public String getVisualRange() {\r
- return visualRange;\r
- }\r
-\r
- public void setVisualRange(String visualRange) {\r
- this.visualRange = visualRange;\r
- }\r
-\r
- public String getUseOwnUpstream() {\r
- return useOwnUpstream;\r
- }\r
-\r
- public void setUseOwnUpstream(String useOwnUpstream) {\r
- this.useOwnUpstream = useOwnUpstream;\r
- }\r
-\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.api;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+public class CustomRouteInfo implements Serializable{
+
+ private static final long serialVersionUID = 1L;
+ @ApiModelProperty(required = true)
+ private String serviceName;
+
+ @ApiModelProperty(value = "Target Service URL,start with /",example = "/test", required = true)
+ private String url;
+
+ @ApiModelProperty(value = "[control Range] 0:default 1:readonly 2:hidden ", allowableValues = "0,1,2", example = "0")
+ private String control="0";
+
+ @ApiModelProperty(value = "[status] 1:abled 0:disabled ", allowableValues = "0,1", example = "1")
+ private String status="1";
+
+ @ApiModelProperty(value = "[visual Range]interSystem:0,inSystem:1", allowableValues = "0,1", example = "1")
+ private String visualRange = "1";
+
+ @ApiModelProperty(value = "[LB Policy]non_ip_hash:0,ip_hash:1", allowableValues = "0,1", example = "0")
+ private String useOwnUpstream="0"; //负载均衡策略
+
+ @ApiModelProperty(required = true)
+ private RouteServer servers[];
+
+ public String getServiceName() {
+ return serviceName;
+ }
+
+ public void setServiceName(String serviceName) {
+ this.serviceName = serviceName;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public RouteServer[] getServers() {
+ return servers;
+ }
+
+ public void setServers(RouteServer[] servers) {
+ this.servers = servers;
+ }
+
+ public String getControl() {
+ return control;
+ }
+
+ public void setControl(String control) {
+ this.control = control;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public String getVisualRange() {
+ return visualRange;
+ }
+
+ public void setVisualRange(String visualRange) {
+ this.visualRange = visualRange;
+ }
+
+ public String getUseOwnUpstream() {
+ return useOwnUpstream;
+ }
+
+ public void setUseOwnUpstream(String useOwnUpstream) {
+ this.useOwnUpstream = useOwnUpstream;
+ }
+
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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
-package org.openo.msb.api;\r
-\r
-import java.io.Serializable;\r
-\r
-public class DiscoverInfo implements Serializable{\r
- private static final long serialVersionUID = 1L;\r
- private String ip; \r
- private int port;\r
- private boolean enabled;\r
-\r
- \r
- public String getIp() {\r
- return ip;\r
- }\r
- public void setIp(String ip) {\r
- this.ip = ip;\r
- }\r
- public int getPort() {\r
- return port;\r
- }\r
- public void setPort(int port) {\r
- this.port = port;\r
- }\r
- public boolean isEnabled() {\r
- return enabled;\r
- }\r
- public void setEnabled(boolean enabled) {\r
- this.enabled = enabled;\r
- }\r
- \r
- \r
- \r
-\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.api;
+
+import java.io.Serializable;
+
+public class DiscoverInfo implements Serializable{
+ private static final long serialVersionUID = 1L;
+ private String ip;
+ private int port;
+ private boolean enabled;
+
+
+ public String getIp() {
+ return ip;
+ }
+ public void setIp(String ip) {
+ this.ip = ip;
+ }
+ public int getPort() {
+ return port;
+ }
+ public void setPort(int port) {
+ this.port = port;
+ }
+ public boolean isEnabled() {
+ return enabled;
+ }
+ public void setEnabled(boolean enabled) {
+ this.enabled = enabled;
+ }
+
+
+
+
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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
-package org.openo.msb.api;\r
-\r
-import io.swagger.annotations.ApiModelProperty;\r
-\r
-import java.io.Serializable;\r
-\r
-\r
-public class IuiRouteInfo implements Serializable{\r
- private static final long serialVersionUID = 1L;\r
- @ApiModelProperty(required = true)\r
- private String serviceName; \r
- \r
- @ApiModelProperty(value = "Target Service URL,start with /",example = "/test", required = true)\r
- private String url; \r
- \r
- @ApiModelProperty(value = "[control Range] 0:default 1:readonly 2:hidden ", allowableValues = "0,1,2", example = "0")\r
- private String control="0"; \r
- \r
- @ApiModelProperty(value = "[status] 1:abled 0:disabled ", allowableValues = "0,1", example = "1")\r
- private String status="1"; \r
- \r
- @ApiModelProperty(value = "[visual Range]interSystem:0,inSystem:1", allowableValues = "0,1", example = "1")\r
- private String visualRange = "1"; \r
- \r
- @ApiModelProperty(value = "[LB Policy]non_ip_hash:0,ip_hash:1", allowableValues = "0,1", example = "0")\r
- private String useOwnUpstream="0"; //负载均衡策略 \r
-\r
- @ApiModelProperty(required = true)\r
- private RouteServer servers[]; \r
-\r
- public String getServiceName() {\r
- return serviceName;\r
- }\r
-\r
- public void setServiceName(String serviceName) {\r
- this.serviceName = serviceName;\r
- }\r
-\r
- public String getUrl() {\r
- return url;\r
- }\r
-\r
- public void setUrl(String url) {\r
- this.url = url;\r
- }\r
-\r
- public RouteServer[] getServers() {\r
- return servers;\r
- }\r
-\r
- public void setServers(RouteServer[] servers) {\r
- this.servers = servers;\r
- }\r
-\r
- public String getControl() {\r
- return control;\r
- }\r
-\r
- public void setControl(String control) {\r
- this.control = control;\r
- }\r
-\r
- public String getStatus() {\r
- return status;\r
- }\r
-\r
- public void setStatus(String status) {\r
- this.status = status;\r
- }\r
-\r
- public String getVisualRange() {\r
- return visualRange;\r
- }\r
-\r
- public void setVisualRange(String visualRange) {\r
- this.visualRange = visualRange;\r
- }\r
-\r
- public String getUseOwnUpstream() {\r
- return useOwnUpstream;\r
- }\r
-\r
- public void setUseOwnUpstream(String useOwnUpstream) {\r
- this.useOwnUpstream = useOwnUpstream;\r
- }\r
-\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.api;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+
+public class IuiRouteInfo implements Serializable{
+ private static final long serialVersionUID = 1L;
+ @ApiModelProperty(required = true)
+ private String serviceName;
+
+ @ApiModelProperty(value = "Target Service URL,start with /",example = "/test", required = true)
+ private String url;
+
+ @ApiModelProperty(value = "[control Range] 0:default 1:readonly 2:hidden ", allowableValues = "0,1,2", example = "0")
+ private String control="0";
+
+ @ApiModelProperty(value = "[status] 1:abled 0:disabled ", allowableValues = "0,1", example = "1")
+ private String status="1";
+
+ @ApiModelProperty(value = "[visual Range]interSystem:0,inSystem:1", allowableValues = "0,1", example = "1")
+ private String visualRange = "1";
+
+ @ApiModelProperty(value = "[LB Policy]non_ip_hash:0,ip_hash:1", allowableValues = "0,1", example = "0")
+ private String useOwnUpstream="0"; //负载均衡策略
+
+ @ApiModelProperty(required = true)
+ private RouteServer servers[];
+
+ public String getServiceName() {
+ return serviceName;
+ }
+
+ public void setServiceName(String serviceName) {
+ this.serviceName = serviceName;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public RouteServer[] getServers() {
+ return servers;
+ }
+
+ public void setServers(RouteServer[] servers) {
+ this.servers = servers;
+ }
+
+ public String getControl() {
+ return control;
+ }
+
+ public void setControl(String control) {
+ this.control = control;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public String getVisualRange() {
+ return visualRange;
+ }
+
+ public void setVisualRange(String visualRange) {
+ this.visualRange = visualRange;
+ }
+
+ public String getUseOwnUpstream() {
+ return useOwnUpstream;
+ }
+
+ public void setUseOwnUpstream(String useOwnUpstream) {
+ this.useOwnUpstream = useOwnUpstream;
+ }
+
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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
-package org.openo.msb.api;\r
-\r
-\r
-\r
-import lombok.AllArgsConstructor;\r
-import lombok.Data;\r
-import lombok.NoArgsConstructor;\r
-\r
-import com.fasterxml.jackson.annotation.JsonProperty;\r
-\r
-@Data\r
-@NoArgsConstructor\r
-@AllArgsConstructor\r
-public class MetricsInfo{\r
- private Gauges gauges;\r
- private Timers timers;\r
-}\r
-\r
-@Data\r
-@NoArgsConstructor\r
-@AllArgsConstructor\r
-class Gauges {\r
- \r
- @JsonProperty("jvm.attribute.uptime") \r
- private JVMMetrics jvm_attribute_uptime;\r
- \r
- @JsonProperty("jvm.memory.pools.Eden-Space.usage") \r
- private JVMMetrics jvm_memory_pools_Eden_Space_usage;\r
- \r
- @JsonProperty("jvm.memory.pools.PS-Eden-Space.usage") \r
- private JVMMetrics jvm_memory_pools_PS_Eden_Space_usage;\r
- \r
- @JsonProperty("jvm.memory.pools.Perm-Gen.usage") \r
- private JVMMetrics jvm_memory_pools_Perm_Gen_usage;\r
- \r
- @JsonProperty("jvm.memory.pools.PS-Perm-Gen.usage")\r
- private JVMMetrics jvm_memory_pools_PS_Perm_Gen_usage;\r
- \r
- @JsonProperty("jvm.memory.pools.Survivor-Space.usage")\r
- private JVMMetrics jvm_memory_pools_Survivor_Space_usage;\r
- \r
- @JsonProperty("jvm.memory.pools.PS-Survivor-Space.usage")\r
- private JVMMetrics jvm_memory_pools_PS_Survivor_Space_usage;\r
- \r
- @JsonProperty("jvm.memory.pools.Tenured-Gen.usage")\r
- private JVMMetrics jvm_memory_pools_Tenured_Gen_usage;\r
- \r
- @JsonProperty("jvm.memory.pools.PS-Old-Gen.usage")\r
- private JVMMetrics jvm_memory_pools_PS_Old_Gen_usage;\r
- \r
- @JsonProperty("jvm.memory.pools.Code-Cache.usage")\r
- private JVMMetrics jvm_memory_pools_Code_Cache_usage;\r
- \r
- @JsonProperty("jvm.memory.heap.init")\r
- private JVMMetrics jvm_memory_heap_init;\r
- \r
- @JsonProperty("jvm.memory.non-heap.init")\r
- private JVMMetrics jvm_memory_non_heap_init;\r
- \r
- @JsonProperty("jvm.memory.heap.used")\r
- private JVMMetrics jvm_memory_heap_used;\r
- \r
- @JsonProperty("jvm.memory.non-heap.used")\r
- private JVMMetrics jvm_memory_non_heap_used;\r
- \r
- @JsonProperty("jvm.memory.heap.max")\r
- private JVMMetrics jvm_memory_heap_max;\r
- \r
- @JsonProperty("jvm.threads.runnable.count")\r
- private JVMMetrics jvm_threads_runnable_count; \r
- \r
- @JsonProperty("jvm.threads.timed_waiting.count")\r
- private JVMMetrics jvm_threads_timed_waiting_count;\r
- \r
- @JsonProperty("jvm.threads.waiting.count")\r
- private JVMMetrics jvm_threads_waiting_count;\r
- \r
- @JsonProperty("jvm.threads.blocked.count")\r
- private JVMMetrics jvm_threads_blocked_count;\r
- \r
- @JsonProperty("jvm.threads.count")\r
- private JVMMetrics jvm_threads_count;\r
- \r
- \r
- \r
-}\r
-\r
-@Data\r
-@NoArgsConstructor\r
-@AllArgsConstructor\r
-class Timers{\r
- \r
- @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.ApiRouteResource.addApiRoute")\r
- private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_ApiRouteResource_addApiRoute;\r
- \r
- @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.ApiRouteResource.deleteApiRoute")\r
- private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_ApiRouteResource_deleteApiRoute;\r
- \r
- @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.ApiRouteResource.getApiDocs")\r
- private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_ApiRouteResource_getApiDocs;\r
- \r
- @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.ApiRouteResource.getApiRoute")\r
- private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_ApiRouteResource_getApiRoute;\r
- \r
- @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.ApiRouteResource.getApiRoutes")\r
- private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_ApiRouteResource_getApiRoutes;\r
- \r
- @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.ApiRouteResource.getServerIP")\r
- private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_ApiRouteResource_getServerIP;\r
- \r
- @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.ApiRouteResource.updateApiRoute")\r
- private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_ApiRouteResource_updateApiRoute;\r
- \r
- @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.IuiRouteResource.addIuiRoute")\r
- private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_IuiRouteResource_addIuiRoute;\r
- \r
- @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.IuiRouteResource.deleteIuiRoute")\r
- private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_IuiRouteResource_deleteIuiRoute;\r
- \r
- @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.IuiRouteResource.getIuiRoute")\r
- private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_IuiRouteResource_getIuiRoute;\r
- \r
- @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.IuiRouteResource.getIuiRoutes")\r
- private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_IuiRouteResource_getIuiRoutes;\r
- \r
- @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.IuiRouteResource.updateIuiRoute")\r
- private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_IuiRouteResource_updateIuiRoute;\r
- \r
- @JsonProperty("io.dropwizard.jetty.MutableServletContextHandler.get-requests")\r
- private HttpMetrics io_dropwizard_jetty_MutableServletContextHandler_get_requests;\r
- \r
- @JsonProperty("io.dropwizard.jetty.MutableServletContextHandler.post-requests")\r
- private HttpMetrics io_dropwizard_jetty_MutableServletContextHandler_post_requests;\r
- \r
- @JsonProperty("io.dropwizard.jetty.MutableServletContextHandler.put-requests")\r
- private HttpMetrics io_dropwizard_jetty_MutableServletContextHandler_put_requests;\r
- \r
- @JsonProperty("io.dropwizard.jetty.MutableServletContextHandler.delete-requests")\r
- private HttpMetrics io_dropwizard_jetty_MutableServletContextHandler_delete_requests;\r
- \r
- @JsonProperty("io.dropwizard.jetty.MutableServletContextHandler.other-requests")\r
- private HttpMetrics io_dropwizard_jetty_MutableServletContextHandler_other_requests;\r
- \r
-}\r
-\r
-@Data\r
-@NoArgsConstructor\r
-@AllArgsConstructor\r
-class JVMMetrics{\r
- private double value;\r
-}\r
-\r
-@Data\r
-@NoArgsConstructor\r
-@AllArgsConstructor\r
-class HttpMetrics{\r
- private int count;\r
- private double max;\r
- private double mean;\r
- private double min;\r
- private double p50;\r
- private double p75;\r
- private double p95;\r
- private double p98;\r
- private double p99;\r
- private double p999;\r
- private double stddev;\r
- private double m15_rate;\r
- private double m1_rate;\r
- private double m5_rate;\r
- private double mean_rate;\r
- private String duration_units;\r
- private String rate_units;\r
-}\r
-\r
-\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.api;
+
+
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class MetricsInfo{
+ private Gauges gauges;
+ private Timers timers;
+}
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+class Gauges {
+
+ @JsonProperty("jvm.attribute.uptime")
+ private JVMMetrics jvm_attribute_uptime;
+
+ @JsonProperty("jvm.memory.pools.Eden-Space.usage")
+ private JVMMetrics jvm_memory_pools_Eden_Space_usage;
+
+ @JsonProperty("jvm.memory.pools.PS-Eden-Space.usage")
+ private JVMMetrics jvm_memory_pools_PS_Eden_Space_usage;
+
+ @JsonProperty("jvm.memory.pools.Perm-Gen.usage")
+ private JVMMetrics jvm_memory_pools_Perm_Gen_usage;
+
+ @JsonProperty("jvm.memory.pools.PS-Perm-Gen.usage")
+ private JVMMetrics jvm_memory_pools_PS_Perm_Gen_usage;
+
+ @JsonProperty("jvm.memory.pools.Survivor-Space.usage")
+ private JVMMetrics jvm_memory_pools_Survivor_Space_usage;
+
+ @JsonProperty("jvm.memory.pools.PS-Survivor-Space.usage")
+ private JVMMetrics jvm_memory_pools_PS_Survivor_Space_usage;
+
+ @JsonProperty("jvm.memory.pools.Tenured-Gen.usage")
+ private JVMMetrics jvm_memory_pools_Tenured_Gen_usage;
+
+ @JsonProperty("jvm.memory.pools.PS-Old-Gen.usage")
+ private JVMMetrics jvm_memory_pools_PS_Old_Gen_usage;
+
+ @JsonProperty("jvm.memory.pools.Code-Cache.usage")
+ private JVMMetrics jvm_memory_pools_Code_Cache_usage;
+
+ @JsonProperty("jvm.memory.heap.init")
+ private JVMMetrics jvm_memory_heap_init;
+
+ @JsonProperty("jvm.memory.non-heap.init")
+ private JVMMetrics jvm_memory_non_heap_init;
+
+ @JsonProperty("jvm.memory.heap.used")
+ private JVMMetrics jvm_memory_heap_used;
+
+ @JsonProperty("jvm.memory.non-heap.used")
+ private JVMMetrics jvm_memory_non_heap_used;
+
+ @JsonProperty("jvm.memory.heap.max")
+ private JVMMetrics jvm_memory_heap_max;
+
+ @JsonProperty("jvm.threads.runnable.count")
+ private JVMMetrics jvm_threads_runnable_count;
+
+ @JsonProperty("jvm.threads.timed_waiting.count")
+ private JVMMetrics jvm_threads_timed_waiting_count;
+
+ @JsonProperty("jvm.threads.waiting.count")
+ private JVMMetrics jvm_threads_waiting_count;
+
+ @JsonProperty("jvm.threads.blocked.count")
+ private JVMMetrics jvm_threads_blocked_count;
+
+ @JsonProperty("jvm.threads.count")
+ private JVMMetrics jvm_threads_count;
+
+
+
+}
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+class Timers{
+
+ @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.ApiRouteResource.addApiRoute")
+ private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_ApiRouteResource_addApiRoute;
+
+ @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.ApiRouteResource.deleteApiRoute")
+ private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_ApiRouteResource_deleteApiRoute;
+
+ @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.ApiRouteResource.getApiDocs")
+ private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_ApiRouteResource_getApiDocs;
+
+ @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.ApiRouteResource.getApiRoute")
+ private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_ApiRouteResource_getApiRoute;
+
+ @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.ApiRouteResource.getApiRoutes")
+ private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_ApiRouteResource_getApiRoutes;
+
+ @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.ApiRouteResource.getServerIP")
+ private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_ApiRouteResource_getServerIP;
+
+ @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.ApiRouteResource.updateApiRoute")
+ private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_ApiRouteResource_updateApiRoute;
+
+ @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.IuiRouteResource.addIuiRoute")
+ private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_IuiRouteResource_addIuiRoute;
+
+ @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.IuiRouteResource.deleteIuiRoute")
+ private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_IuiRouteResource_deleteIuiRoute;
+
+ @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.IuiRouteResource.getIuiRoute")
+ private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_IuiRouteResource_getIuiRoute;
+
+ @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.IuiRouteResource.getIuiRoutes")
+ private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_IuiRouteResource_getIuiRoutes;
+
+ @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.IuiRouteResource.updateIuiRoute")
+ private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_IuiRouteResource_updateIuiRoute;
+
+ @JsonProperty("io.dropwizard.jetty.MutableServletContextHandler.get-requests")
+ private HttpMetrics io_dropwizard_jetty_MutableServletContextHandler_get_requests;
+
+ @JsonProperty("io.dropwizard.jetty.MutableServletContextHandler.post-requests")
+ private HttpMetrics io_dropwizard_jetty_MutableServletContextHandler_post_requests;
+
+ @JsonProperty("io.dropwizard.jetty.MutableServletContextHandler.put-requests")
+ private HttpMetrics io_dropwizard_jetty_MutableServletContextHandler_put_requests;
+
+ @JsonProperty("io.dropwizard.jetty.MutableServletContextHandler.delete-requests")
+ private HttpMetrics io_dropwizard_jetty_MutableServletContextHandler_delete_requests;
+
+ @JsonProperty("io.dropwizard.jetty.MutableServletContextHandler.other-requests")
+ private HttpMetrics io_dropwizard_jetty_MutableServletContextHandler_other_requests;
+
+}
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+class JVMMetrics{
+ private double value;
+}
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+class HttpMetrics{
+ private int count;
+ private double max;
+ private double mean;
+ private double min;
+ private double p50;
+ private double p75;
+ private double p95;
+ private double p98;
+ private double p99;
+ private double p999;
+ private double stddev;
+ private double m15_rate;
+ private double m1_rate;
+ private double m5_rate;
+ private double mean_rate;
+ private String duration_units;
+ private String rate_units;
+}
+
+
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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
-package org.openo.msb.api;\r
-\r
-import java.io.Serializable;\r
-import java.util.Set;\r
-\r
-public class MicroServiceFullInfo extends Service<NodeInfo> implements Serializable {\r
- private static final long serialVersionUID = 1L;\r
- \r
- private Set<NodeInfo> nodes;\r
- \r
- private String status = "1"; //0:disable 1:enable\r
-\r
- public Set<NodeInfo> getNodes() {\r
- return nodes;\r
- }\r
-\r
- public void setNodes(Set<NodeInfo> nodes) {\r
- this.nodes = nodes;\r
- }\r
- \r
- public String getStatus() {\r
- return status;\r
- }\r
- public void setStatus(String status) {\r
- this.status = status;\r
- }\r
- \r
- \r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.api;
+
+import java.io.Serializable;
+import java.util.Set;
+
+public class MicroServiceFullInfo extends Service<NodeInfo> implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ private Set<NodeInfo> nodes;
+
+ private String status = "1"; //0:disable 1:enable
+
+ public Set<NodeInfo> getNodes() {
+ return nodes;
+ }
+
+ public void setNodes(Set<NodeInfo> nodes) {
+ this.nodes = nodes;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+
}
\ No newline at end of file
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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
-package org.openo.msb.api;\r
-\r
-import java.io.Serializable;\r
-import java.util.Set;\r
-\r
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;\r
-\r
-@JsonIgnoreProperties(ignoreUnknown = true)\r
-public class MicroServiceInfo extends Service<Node> implements Serializable {\r
- private static final long serialVersionUID = 1L;\r
- \r
- private Set<Node> nodes;\r
-\r
- public Set<Node> getNodes() {\r
- return nodes;\r
- }\r
-\r
- public void setNodes(Set<Node> nodes) {\r
- this.nodes = nodes;\r
- }\r
- \r
- \r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.api;
+
+import java.io.Serializable;
+import java.util.Set;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class MicroServiceInfo extends Service<Node> implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ private Set<Node> nodes;
+
+ public Set<Node> getNodes() {
+ return nodes;
+ }
+
+ public void setNodes(Set<Node> nodes) {
+ this.nodes = nodes;
+ }
+
+
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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
-package org.openo.msb.api;\r
-\r
-import io.swagger.annotations.ApiModelProperty;\r
-\r
-import java.io.Serializable;\r
-import java.util.Date;\r
-\r
-import com.fasterxml.jackson.annotation.JsonIgnore;\r
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;\r
-\r
-public class Node implements Serializable {\r
- private static final long serialVersionUID = 1L;\r
-\r
- @ApiModelProperty(required = true)\r
- private String ip;\r
- \r
- @ApiModelProperty(required = true)\r
- private String port;\r
- \r
- private int ttl=-1;\r
- \r
-\r
- \r
-\r
- public String getIp() {\r
- return ip;\r
- }\r
-\r
- public void setIp(String ip) {\r
- this.ip = ip;\r
- }\r
-\r
- public String getPort() {\r
- return port;\r
- }\r
-\r
- public void setPort(String port) {\r
- this.port = port;\r
- }\r
-\r
- public int getTtl() {\r
- return ttl;\r
- }\r
-\r
- public void setTtl(int ttl) {\r
- this.ttl = ttl;\r
- }\r
-\r
- public Node(){\r
- \r
- }\r
- \r
- public Node(String ip,String port,int ttl){\r
- this.ip = ip;\r
- this.port = port;\r
- this.ttl = ttl;\r
- }\r
- \r
- \r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.api;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+
+public class Node implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(required = true)
+ private String ip;
+
+ @ApiModelProperty(required = true)
+ private String port;
+
+ private int ttl=-1;
+
+
+
+
+ public String getIp() {
+ return ip;
+ }
+
+ public void setIp(String ip) {
+ this.ip = ip;
+ }
+
+ public String getPort() {
+ return port;
+ }
+
+ public void setPort(String port) {
+ this.port = port;
+ }
+
+ public int getTtl() {
+ return ttl;
+ }
+
+ public void setTtl(int ttl) {
+ this.ttl = ttl;
+ }
+
+ public Node(){
+
+ }
+
+ public Node(String ip,String port,int ttl){
+ this.ip = ip;
+ this.port = port;
+ this.ttl = ttl;
+ }
+
+
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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
-package org.openo.msb.api;\r
-\r
-import java.util.Date;\r
-\r
-import com.fasterxml.jackson.annotation.JsonInclude;\r
-import com.fasterxml.jackson.annotation.JsonInclude.Include;\r
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;\r
-\r
-public class NodeInfo extends Node {\r
-\r
- private static final long serialVersionUID = 8955786461351557306L;\r
- \r
- private String nodeId;\r
- \r
- \r
-\r
- @JsonSerialize(using = CustomDateSerializer.class)\r
- private Date expiration;\r
- \r
- @JsonSerialize(using = CustomDateSerializer.class)\r
- private Date created_at;\r
- \r
- @JsonSerialize(using = CustomDateSerializer.class)\r
- private Date updated_at;\r
-\r
- public Date getExpiration() {\r
- return expiration;\r
- }\r
-\r
- public void setExpiration(Date expiration) {\r
- this.expiration = expiration;\r
- }\r
-\r
- public Date getCreated_at() {\r
- return created_at;\r
- }\r
-\r
- public void setCreated_at(Date created_at) {\r
- this.created_at = created_at;\r
- }\r
-\r
- public Date getUpdated_at() {\r
- return updated_at;\r
- }\r
-\r
- public void setUpdated_at(Date updated_at) {\r
- this.updated_at = updated_at;\r
- }\r
-\r
- public String getNodeId() {\r
- return nodeId;\r
- }\r
-\r
- public void setNodeId(String nodeId) {\r
- this.nodeId = nodeId;\r
- }\r
- \r
- \r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.api;
+
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+
+public class NodeInfo extends Node {
+
+ private static final long serialVersionUID = 8955786461351557306L;
+
+ private String nodeId;
+
+
+
+ @JsonSerialize(using = CustomDateSerializer.class)
+ private Date expiration;
+
+ @JsonSerialize(using = CustomDateSerializer.class)
+ private Date created_at;
+
+ @JsonSerialize(using = CustomDateSerializer.class)
+ private Date updated_at;
+
+ public Date getExpiration() {
+ return expiration;
+ }
+
+ public void setExpiration(Date expiration) {
+ this.expiration = expiration;
+ }
+
+ public Date getCreated_at() {
+ return created_at;
+ }
+
+ public void setCreated_at(Date created_at) {
+ this.created_at = created_at;
+ }
+
+ public Date getUpdated_at() {
+ return updated_at;
+ }
+
+ public void setUpdated_at(Date updated_at) {
+ this.updated_at = updated_at;
+ }
+
+ public String getNodeId() {
+ return nodeId;
+ }
+
+ public void setNodeId(String nodeId) {
+ this.nodeId = nodeId;
+ }
+
+
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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
-package org.openo.msb.api;\r
-\r
-import io.swagger.annotations.ApiModelProperty;\r
-\r
-import java.io.Serializable;\r
-\r
-\r
-public class RouteServer implements Serializable{\r
- private static final long serialVersionUID = 1L;\r
- @ApiModelProperty(required = true)\r
- private String ip;\r
- \r
- @ApiModelProperty(required = true) \r
- private String port;\r
- private int weight=0;\r
-\r
- public String getIp() {\r
- return ip;\r
- }\r
-\r
- public void setIp(String ip) {\r
- this.ip = ip;\r
- }\r
-\r
- \r
-\r
- public int getWeight() {\r
- return weight;\r
- }\r
-\r
- public void setWeight(int weight) {\r
- this.weight = weight;\r
- }\r
- \r
- public RouteServer(){\r
- \r
- }\r
- \r
- public RouteServer(String ip,String port){\r
- this.ip=ip;\r
- this.port=port;\r
- this.weight=0;\r
- }\r
-\r
- public String getPort() {\r
- return port;\r
- }\r
-\r
- public void setPort(String port) {\r
- this.port = port;\r
- }\r
-\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.api;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+
+public class RouteServer implements Serializable{
+ private static final long serialVersionUID = 1L;
+ @ApiModelProperty(required = true)
+ private String ip;
+
+ @ApiModelProperty(required = true)
+ private String port;
+ private int weight=0;
+
+ public String getIp() {
+ return ip;
+ }
+
+ public void setIp(String ip) {
+ this.ip = ip;
+ }
+
+
+
+ public int getWeight() {
+ return weight;
+ }
+
+ public void setWeight(int weight) {
+ this.weight = weight;
+ }
+
+ public RouteServer(){
+
+ }
+
+ public RouteServer(String ip,String port){
+ this.ip=ip;
+ this.port=port;
+ this.weight=0;
+ }
+
+ public String getPort() {
+ return port;
+ }
+
+ public void setPort(String port) {
+ this.port = port;
+ }
+
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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
-package org.openo.msb.api;\r
-\r
-import io.swagger.annotations.ApiModelProperty;\r
-\r
-import java.io.Serializable;\r
-import java.util.Set;\r
-\r
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;\r
-\r
-@JsonIgnoreProperties(ignoreUnknown = true)\r
-public class Service<T> implements Serializable {\r
- private static final long serialVersionUID = 1L;\r
- // 服务名\r
- @ApiModelProperty(required = true)\r
- private String serviceName;\r
- // 版本号\r
- @ApiModelProperty(example = "v1")\r
- private String version="";\r
- // 服务url\r
- @ApiModelProperty(value = "Target Service URL,start with /",example = "/api/serviceName/v1", required = true)\r
- private String url="";\r
- // 服务对应协议,比如REST、UI、MQ、FTP、SNMP、TCP、UDP\r
- @ApiModelProperty(value = "Service Protocol", allowableValues = "REST,UI, MQ, FTP,SNMP,TCP,UDP", example = "REST",required = true)\r
- private String protocol = "";\r
- \r
- //服务的可见范围 系统间:0 系统内:1 \r
- @ApiModelProperty(value = "[visual Range]interSystem:0,inSystem:1", allowableValues = "0,1", example = "1")\r
- private String visualRange = "1";\r
- \r
- //负载均衡策略类型\r
- @ApiModelProperty(value = "lb policy", allowableValues = "round-robin,hash,least_conn", example = "hash")\r
- private String lb_policy="";\r
- \r
- @ApiModelProperty(required = true)\r
- private Set<T> nodes;\r
-\r
- public Set<T> getNodes() {\r
- return nodes;\r
- }\r
-\r
- public void setNodes(Set<T> nodes) {\r
- this.nodes = nodes;\r
- }\r
- \r
- public String getServiceName() {\r
- return serviceName;\r
- }\r
- public void setServiceName(String serviceName) {\r
- this.serviceName = serviceName;\r
- }\r
- public String getVersion() {\r
- return version;\r
- }\r
- public void setVersion(String version) {\r
- this.version = version;\r
- }\r
- public String getUrl() {\r
- return url;\r
- }\r
- public void setUrl(String url) {\r
- this.url = url;\r
- }\r
- public String getProtocol() {\r
- return protocol;\r
- }\r
- public void setProtocol(String protocol) {\r
- this.protocol = protocol;\r
- }\r
- \r
- public String getVisualRange() {\r
- return visualRange;\r
- }\r
-\r
- public void setVisualRange(String visualRange) {\r
- this.visualRange = visualRange;\r
- }\r
- \r
-\r
- public String getLb_policy() {\r
- return lb_policy;\r
- }\r
-\r
- public void setLb_policy(String lb_policy) {\r
- this.lb_policy = lb_policy;\r
- }\r
-\r
- \r
- \r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.api;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Set;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class Service<T> implements Serializable {
+ private static final long serialVersionUID = 1L;
+ // 服务名
+ @ApiModelProperty(required = true)
+ private String serviceName;
+ // 版本号
+ @ApiModelProperty(example = "v1")
+ private String version="";
+ // 服务url
+ @ApiModelProperty(value = "Target Service URL,start with /",example = "/api/serviceName/v1", required = true)
+ private String url="";
+ // 服务对应协议,比如REST、UI、MQ、FTP、SNMP、TCP、UDP
+ @ApiModelProperty(value = "Service Protocol", allowableValues = "REST,UI, MQ, FTP,SNMP,TCP,UDP", example = "REST",required = true)
+ private String protocol = "";
+
+ //服务的可见范围 系统间:0 系统内:1
+ @ApiModelProperty(value = "[visual Range]interSystem:0,inSystem:1", allowableValues = "0,1", example = "1")
+ private String visualRange = "1";
+
+ //负载均衡策略类型
+ @ApiModelProperty(value = "lb policy", allowableValues = "round-robin,hash,least_conn", example = "hash")
+ private String lb_policy="";
+
+ @ApiModelProperty(required = true)
+ private Set<T> nodes;
+
+ public Set<T> getNodes() {
+ return nodes;
+ }
+
+ public void setNodes(Set<T> nodes) {
+ this.nodes = nodes;
+ }
+
+ public String getServiceName() {
+ return serviceName;
+ }
+ public void setServiceName(String serviceName) {
+ this.serviceName = serviceName;
+ }
+ public String getVersion() {
+ return version;
+ }
+ public void setVersion(String version) {
+ this.version = version;
+ }
+ public String getUrl() {
+ return url;
+ }
+ public void setUrl(String url) {
+ this.url = url;
+ }
+ public String getProtocol() {
+ return protocol;
+ }
+ public void setProtocol(String protocol) {
+ this.protocol = protocol;
+ }
+
+ public String getVisualRange() {
+ return visualRange;
+ }
+
+ public void setVisualRange(String visualRange) {
+ this.visualRange = visualRange;
+ }
+
+
+ public String getLb_policy() {
+ return lb_policy;
+ }
+
+ public void setLb_policy(String lb_policy) {
+ this.lb_policy = lb_policy;
+ }
+
+
+
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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
-package org.openo.msb.api;\r
-\r
-import java.io.Serializable;\r
-\r
-import com.fasterxml.jackson.annotation.JsonInclude;\r
-\r
-public class ServiceAccessInfo implements Serializable {\r
- private static final long serialVersionUID = 1L;\r
- // (api|iui|custom|p2p)\r
- private String serviceType;\r
-\r
- private String serviceName;\r
- @JsonInclude(JsonInclude.Include.NON_NULL)\r
- private String version;\r
-\r
- private String accessAddr;\r
-\r
- /**\r
- * @return the serviceType\r
- */\r
- public String getServiceType() {\r
- return serviceType;\r
- }\r
-\r
- /**\r
- * @param serviceType the serviceType to set\r
- */\r
- public void setServiceType(String serviceType) {\r
- this.serviceType = serviceType;\r
- }\r
-\r
- /**\r
- * @return the serviceName\r
- */\r
- public String getServiceName() {\r
- return serviceName;\r
- }\r
-\r
- /**\r
- * @param serviceName the serviceName to set\r
- */\r
- public void setServiceName(String serviceName) {\r
- this.serviceName = serviceName;\r
- }\r
-\r
- /**\r
- * @return the version\r
- */\r
- public String getVersion() {\r
- return version;\r
- }\r
-\r
- /**\r
- * @param version the version to set\r
- */\r
- public void setVersion(String version) {\r
- this.version = version;\r
- }\r
-\r
- /**\r
- * @return the accessAddr\r
- */\r
- public String getAccessAddr() {\r
- return accessAddr;\r
- }\r
-\r
- /**\r
- * @param accessAddr the accessAddr to set\r
- */\r
- public void setAccessAddr(String accessAddr) {\r
- this.accessAddr = accessAddr;\r
- }\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.api;
+
+import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+public class ServiceAccessInfo implements Serializable {
+ private static final long serialVersionUID = 1L;
+ // (api|iui|custom|p2p)
+ private String serviceType;
+
+ private String serviceName;
+ @JsonInclude(JsonInclude.Include.NON_NULL)
+ private String version;
+
+ private String accessAddr;
+
+ /**
+ * @return the serviceType
+ */
+ public String getServiceType() {
+ return serviceType;
+ }
+
+ /**
+ * @param serviceType the serviceType to set
+ */
+ public void setServiceType(String serviceType) {
+ this.serviceType = serviceType;
+ }
+
+ /**
+ * @return the serviceName
+ */
+ public String getServiceName() {
+ return serviceName;
+ }
+
+ /**
+ * @param serviceName the serviceName to set
+ */
+ public void setServiceName(String serviceName) {
+ this.serviceName = serviceName;
+ }
+
+ /**
+ * @return the version
+ */
+ public String getVersion() {
+ return version;
+ }
+
+ /**
+ * @param version the version to set
+ */
+ public void setVersion(String version) {
+ this.version = version;
+ }
+
+ /**
+ * @return the accessAddr
+ */
+ public String getAccessAddr() {
+ return accessAddr;
+ }
+
+ /**
+ * @param accessAddr the accessAddr to set
+ */
+ public void setAccessAddr(String accessAddr) {
+ this.accessAddr = accessAddr;
+ }
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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
-package org.openo.msb.api.exception;\r
-\r
-import javax.ws.rs.InternalServerErrorException;\r
-import javax.ws.rs.core.MediaType;\r
-import javax.ws.rs.core.Response;\r
-\r
-public class ExtendedInternalServerErrorException extends InternalServerErrorException {\r
- \r
- public ExtendedInternalServerErrorException(final String message) {\r
- super(Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type(MediaType.TEXT_PLAIN).build());\r
- }\r
-\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.api.exception;
+
+import javax.ws.rs.InternalServerErrorException;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+public class ExtendedInternalServerErrorException extends InternalServerErrorException {
+
+ public ExtendedInternalServerErrorException(final String message) {
+ super(Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(message).type(MediaType.TEXT_PLAIN).build());
+ }
+
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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
-package org.openo.msb.api.exception;\r
-\r
-import javax.ws.rs.NotFoundException;\r
-import javax.ws.rs.core.MediaType;\r
-import javax.ws.rs.core.Response;\r
-\r
-public class ExtendedNotFoundException extends NotFoundException {\r
-\r
- public ExtendedNotFoundException(final String message) {\r
- super(Response.status(Response.Status.NOT_FOUND).entity(message).type(MediaType.TEXT_PLAIN).build());\r
- }\r
-}\r
-\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.api.exception;
+
+import javax.ws.rs.NotFoundException;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+public class ExtendedNotFoundException extends NotFoundException {
+
+ public ExtendedNotFoundException(final String message) {
+ super(Response.status(Response.Status.NOT_FOUND).entity(message).type(MediaType.TEXT_PLAIN).build());
+ }
+}
+
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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
-package org.openo.msb.api.exception;\r
-\r
-import javax.ws.rs.NotSupportedException;\r
-import javax.ws.rs.core.MediaType;\r
-import javax.ws.rs.core.Response;\r
-\r
-public class ExtendedNotSupportedException extends NotSupportedException {\r
-\r
- public ExtendedNotSupportedException(final String message) {\r
- super(Response.status(Response.Status.UNSUPPORTED_MEDIA_TYPE).entity(message).type(MediaType.TEXT_PLAIN).build());\r
- }\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.api.exception;
+
+import javax.ws.rs.NotSupportedException;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+public class ExtendedNotSupportedException extends NotSupportedException {
+
+ public ExtendedNotSupportedException(final String message) {
+ super(Response.status(Response.Status.UNSUPPORTED_MEDIA_TYPE).entity(message).type(MediaType.TEXT_PLAIN).build());
+ }
+}
/**
- * Copyright 2016 ZTE, Inc. and others.
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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
-package org.openo.msb.resources;\r
-\r
-import io.swagger.annotations.Api;\r
-import io.swagger.annotations.ApiOperation;\r
-import io.swagger.annotations.ApiParam;\r
-import io.swagger.annotations.ApiResponse;\r
-import io.swagger.annotations.ApiResponses;\r
-\r
-import java.net.URI;\r
-\r
-import javax.ws.rs.DELETE;\r
-import javax.ws.rs.DefaultValue;\r
-import javax.ws.rs.GET;\r
-import javax.ws.rs.POST;\r
-import javax.ws.rs.PUT;\r
-import javax.ws.rs.Path;\r
-import javax.ws.rs.PathParam;\r
-import javax.ws.rs.Produces;\r
-import javax.ws.rs.core.Context;\r
-import javax.ws.rs.core.MediaType;\r
-import javax.ws.rs.core.Response;\r
-import javax.ws.rs.core.Response.ResponseBuilder;\r
-import javax.ws.rs.core.UriInfo;\r
-\r
-import org.apache.http.HttpStatus;\r
-import org.openo.msb.api.ApiRouteInfo;\r
-import org.openo.msb.api.DiscoverInfo;\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.JacksonJsonUtil;\r
-import org.openo.msb.wrapper.util.RouteUtil;\r
-\r
-import com.codahale.metrics.annotation.Timed;\r
-\r
-@Path("/apiRoute")\r
-@Api(tags = { "ApiRoute" })\r
-@Produces(MediaType.APPLICATION_JSON)\r
-public class ApiRouteResource {\r
-\r
- @Context\r
- UriInfo uriInfo; // actual uri info\r
-\r
- @GET\r
- @Path("/")\r
- @ApiOperation(value = "get all ApiRoute ", code = HttpStatus.SC_OK,response = ApiRouteInfo.class, responseContainer = "List")\r
- @ApiResponses(value = {@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "get ApiRouteInfo List fail", response = String.class)})\r
- @Produces(MediaType.APPLICATION_JSON)\r
- @Timed\r
- public ApiRouteInfo[] getApiRoutes() {\r
- return ApiRouteServiceWrapper.getInstance().getAllApiRouteInstances();\r
- }\r
-\r
- @POST\r
- @Path("/")\r
- @ApiOperation(value = "add one ApiRoute ", code = HttpStatus.SC_CREATED,response = ApiRouteInfo.class)\r
- @ApiResponses(value = {\r
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable ApiRouteInfo Entity ", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "add ApiRouteInfo fail", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_BAD_REQUEST, message = "Unprocessable ApiRouteInfo JSON REQUEST", response = String.class)})\r
- @Produces(MediaType.APPLICATION_JSON)\r
- @Timed\r
- public Response addApiRoute(\r
- @ApiParam(value = "ApiRoute Instance Info", required = true) ApiRouteInfo apiRouteInfo) {\r
- ApiRouteInfo new_apiRouteInfo = ApiRouteServiceWrapper.getInstance().saveApiRouteInstance(apiRouteInfo,"");\r
- URI returnURI =\r
- uriInfo.getAbsolutePathBuilder()\r
- .path("/" + new_apiRouteInfo.getServiceName()+"/version/"+new_apiRouteInfo.getVersion()).build();\r
- return Response.created(returnURI).entity(new_apiRouteInfo).build();\r
-\r
- }\r
- \r
- @GET\r
- @Path("/{serviceName}/version/{version}")\r
- @ApiOperation(value = "get one ApiRoute ",code = HttpStatus.SC_OK, response = ApiRouteInfo.class)\r
- @ApiResponses(value = {\r
- @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "ApiRouteInfo not found", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable ApiRouteInfo Entity ", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "get ApiRouteInfo fail", response = String.class)})\r
- @Produces(MediaType.APPLICATION_JSON)\r
- @Timed\r
- public ApiRouteInfo getApiRoute(\r
- @ApiParam(value = "ApiRoute serviceName", required = true) @PathParam("serviceName") String serviceName,\r
- @ApiParam(value = "ApiRoute version,if the version is empty, please enter \"null\"", required = false) @PathParam("version") @DefaultValue("") String version) {\r
-\r
- return ApiRouteServiceWrapper.getInstance().getApiRouteInstance(serviceName,version);\r
-\r
- }\r
-\r
- @PUT\r
- @Path("/{serviceName}/version/{version}")\r
- @ApiOperation(value = "update one ApiRoute by serviceName and version", code = HttpStatus.SC_CREATED,response = ApiRouteInfo.class)\r
- @ApiResponses(value = {\r
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable ApiRouteInfo Entity ", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "update ApiRouteInfo fail", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_BAD_REQUEST, message = "Unprocessable ApiRouteInfo JSON REQUEST", response = String.class)})\r
- @Produces(MediaType.APPLICATION_JSON)\r
- @Timed\r
- public Response updateApiRoute(\r
- @ApiParam(value = "ApiRoute serviceName", required = true) @PathParam("serviceName") String serviceName,\r
- @ApiParam(value = "ApiRoute version,if the version is empty, please enter \"null\"", required = false) @PathParam("version") @DefaultValue("") String version,\r
- @ApiParam(value = "ApiRoute Instance Info", required = true) ApiRouteInfo apiRouteInfo) {\r
-\r
- ApiRouteInfo new_apiRouteInfo = ApiRouteServiceWrapper.getInstance().updateApiRouteInstance(serviceName,version,apiRouteInfo,"");\r
- URI returnURI =\r
- uriInfo.getAbsolutePathBuilder()\r
- .path("/" + new_apiRouteInfo.getServiceName()+"/version/"+new_apiRouteInfo.getVersion()).build();\r
- return Response.created(returnURI).entity(new_apiRouteInfo).build();\r
-\r
- }\r
- \r
- \r
-\r
- @DELETE\r
- @Path("/{serviceName}/version/{version}")\r
- @ApiOperation(value = "delete one ApiRoute by serviceName and version", code = HttpStatus.SC_NO_CONTENT)\r
- @ApiResponses(value = {\r
- @ApiResponse(code = HttpStatus.SC_NO_CONTENT, message = "delete ApiRouteInfo succeed "),\r
- @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "ApiRouteInfo not found", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "delete ApiRouteInfo fail", response = String.class)})\r
- @Produces(MediaType.APPLICATION_JSON)\r
- @Timed\r
- public void deleteApiRoute(\r
- @ApiParam(value = "ApiRoute serviceName", required = true) @PathParam("serviceName") String serviceName,\r
- @ApiParam(value = "ApiRoute version,if the version is empty, please enter \"null\"", required = false) @PathParam("version") @DefaultValue("") String version) {\r
-\r
- \r
- ApiRouteServiceWrapper.getInstance().deleteApiRoute(serviceName, version,"*","");\r
-\r
- }\r
- \r
-\r
- @GET\r
- @Path("/apiDocs")\r
- @ApiOperation(value = "get all Local apiDoc ", code = HttpStatus.SC_OK, response = String.class, responseContainer = "List")\r
- @ApiResponses(value = {@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "get apiDoc List fail", response = String.class)})\r
- @Produces(MediaType.APPLICATION_JSON)\r
- @Timed\r
- public String[] getApiDocs() {\r
-\r
- String[] apiDocs = ApiRouteServiceWrapper.getInstance().getAllApiDocs();\r
- return apiDocs;\r
-\r
- }\r
- \r
- @GET\r
- @Path("/apiGatewayPort")\r
- @ApiOperation(value = "get apiGateway Port ", code = HttpStatus.SC_OK, response = String.class)\r
- @ApiResponses(value = {@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "get apiGateway Port fail", response = String.class)})\r
- @Produces(MediaType.TEXT_PLAIN)\r
- @Timed\r
- public String getApiGatewayPort() {\r
-\r
- return ApiRouteServiceWrapper.getInstance().getApiGatewayPort();\r
-\r
- }\r
- \r
- @GET\r
- @Path("/discoverInfo")\r
- @ApiOperation(value = "get discover Info ", code = HttpStatus.SC_OK,response = DiscoverInfo.class)\r
- @ApiResponses(value = {@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "get discover Info fail", response = String.class)})\r
- @Produces(MediaType.APPLICATION_JSON)\r
- @Timed\r
- public DiscoverInfo getServiceDiscoverInfo() {\r
-\r
- return ApiRouteServiceWrapper.getInstance().getServiceDiscoverInfo();\r
- }\r
- \r
- @PUT\r
- @Path("/{serviceName}/version/{version}/status/{status}")\r
- @ApiOperation(value = "update one ApiRoute status by serviceName and version", code = HttpStatus.SC_CREATED,response = ApiRouteInfo.class)\r
- @ApiResponses(value = {\r
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable ApiRouteInfo Entity ", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "ApiRouteInfo not found", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "update status fail", response = String.class)})\r
- @Produces(MediaType.APPLICATION_JSON)\r
- @Timed\r
- public Response updateApiRouteStatus(\r
- @ApiParam(value = "ApiRoute serviceName", required = true) @PathParam("serviceName") String serviceName,\r
- @ApiParam(value = "ApiRoute version,if the version is empty, please enter \"null\"", required = false) @PathParam("version") @DefaultValue("") String version,\r
- @ApiParam(value = "ApiRoute status,1:abled 0:disabled", required = true) @PathParam("status") String status) {\r
-\r
- ApiRouteInfo new_apiRouteInfo = ApiRouteServiceWrapper.getInstance().updateApiRouteStatus(serviceName,version,status);\r
- return Response.created(uriInfo.getAbsolutePathBuilder().build()).entity(new_apiRouteInfo).build();\r
-\r
- }\r
- \r
- @GET\r
- @Path("/export")\r
- @ApiOperation(value = "export all route service Info by json-file", code = HttpStatus.SC_OK,response = String.class)\r
- @ApiResponses(value = {\r
- @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "export fail", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_NOT_ACCEPTABLE, message = " not Acceptable client-side", response = String.class)})\r
- @Produces(MediaType.TEXT_PLAIN) \r
- public Response exportService() throws Exception {\r
- \r
- \r
- Object[] apirouteArray= ApiRouteServiceWrapper.getInstance().getAllApiRouteInstances();\r
- Object[] iuirouteArray= IuiRouteServiceWrapper.getInstance().getAllIuiRouteInstances();\r
- Object[] customrouteArray= CustomRouteServiceWrapper.getInstance().getAllCustomRouteInstances();\r
- \r
- Object[] temprouteArray =RouteUtil.concat(apirouteArray, iuirouteArray);\r
- Object[] allrouteArray=RouteUtil.concat(temprouteArray, customrouteArray);\r
- \r
- \r
- String allrouteJson=JacksonJsonUtil.beanToJson(allrouteArray);\r
- \r
- ResponseBuilder response = Response.ok(allrouteJson); \r
- response.header("Content-Disposition", \r
- "attachment; filename=\"RouteService.json\""); \r
- return response.build(); \r
- \r
-\r
- }\r
-\r
- \r
-\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.resources;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+
+import java.net.URI;
+
+import javax.ws.rs.DELETE;
+import javax.ws.rs.DefaultValue;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.ResponseBuilder;
+import javax.ws.rs.core.UriInfo;
+
+import org.apache.http.HttpStatus;
+import org.openo.msb.api.ApiRouteInfo;
+import org.openo.msb.api.DiscoverInfo;
+import org.openo.msb.wrapper.ApiRouteServiceWrapper;
+import org.openo.msb.wrapper.CustomRouteServiceWrapper;
+import org.openo.msb.wrapper.IuiRouteServiceWrapper;
+import org.openo.msb.wrapper.util.JacksonJsonUtil;
+import org.openo.msb.wrapper.util.RouteUtil;
+
+import com.codahale.metrics.annotation.Timed;
+
+@Path("/apiRoute")
+@Api(tags = { "ApiRoute" })
+@Produces(MediaType.APPLICATION_JSON)
+public class ApiRouteResource {
+
+ @Context
+ UriInfo uriInfo; // actual uri info
+
+ @GET
+ @Path("/")
+ @ApiOperation(value = "get all ApiRoute ", code = HttpStatus.SC_OK,response = ApiRouteInfo.class, responseContainer = "List")
+ @ApiResponses(value = {@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "get ApiRouteInfo List fail", response = String.class)})
+ @Produces(MediaType.APPLICATION_JSON)
+ @Timed
+ public ApiRouteInfo[] getApiRoutes() {
+ return ApiRouteServiceWrapper.getInstance().getAllApiRouteInstances();
+ }
+
+ @POST
+ @Path("/")
+ @ApiOperation(value = "add one ApiRoute ", code = HttpStatus.SC_CREATED,response = ApiRouteInfo.class)
+ @ApiResponses(value = {
+ @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable ApiRouteInfo Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "add ApiRouteInfo fail", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_BAD_REQUEST, message = "Unprocessable ApiRouteInfo JSON REQUEST", response = String.class)})
+ @Produces(MediaType.APPLICATION_JSON)
+ @Timed
+ public Response addApiRoute(
+ @ApiParam(value = "ApiRoute Instance Info", required = true) ApiRouteInfo apiRouteInfo) {
+ ApiRouteInfo new_apiRouteInfo = ApiRouteServiceWrapper.getInstance().saveApiRouteInstance(apiRouteInfo,"");
+ URI returnURI =
+ uriInfo.getAbsolutePathBuilder()
+ .path("/" + new_apiRouteInfo.getServiceName()+"/version/"+new_apiRouteInfo.getVersion()).build();
+ return Response.created(returnURI).entity(new_apiRouteInfo).build();
+
+ }
+
+ @GET
+ @Path("/{serviceName}/version/{version}")
+ @ApiOperation(value = "get one ApiRoute ",code = HttpStatus.SC_OK, response = ApiRouteInfo.class)
+ @ApiResponses(value = {
+ @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "ApiRouteInfo not found", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable ApiRouteInfo Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "get ApiRouteInfo fail", response = String.class)})
+ @Produces(MediaType.APPLICATION_JSON)
+ @Timed
+ public ApiRouteInfo getApiRoute(
+ @ApiParam(value = "ApiRoute serviceName", required = true) @PathParam("serviceName") String serviceName,
+ @ApiParam(value = "ApiRoute version,if the version is empty, please enter \"null\"", required = false) @PathParam("version") @DefaultValue("") String version) {
+
+ return ApiRouteServiceWrapper.getInstance().getApiRouteInstance(serviceName,version);
+
+ }
+
+ @PUT
+ @Path("/{serviceName}/version/{version}")
+ @ApiOperation(value = "update one ApiRoute by serviceName and version", code = HttpStatus.SC_CREATED,response = ApiRouteInfo.class)
+ @ApiResponses(value = {
+ @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable ApiRouteInfo Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "update ApiRouteInfo fail", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_BAD_REQUEST, message = "Unprocessable ApiRouteInfo JSON REQUEST", response = String.class)})
+ @Produces(MediaType.APPLICATION_JSON)
+ @Timed
+ public Response updateApiRoute(
+ @ApiParam(value = "ApiRoute serviceName", required = true) @PathParam("serviceName") String serviceName,
+ @ApiParam(value = "ApiRoute version,if the version is empty, please enter \"null\"", required = false) @PathParam("version") @DefaultValue("") String version,
+ @ApiParam(value = "ApiRoute Instance Info", required = true) ApiRouteInfo apiRouteInfo) {
+
+ ApiRouteInfo new_apiRouteInfo = ApiRouteServiceWrapper.getInstance().updateApiRouteInstance(serviceName,version,apiRouteInfo,"");
+ URI returnURI =
+ uriInfo.getAbsolutePathBuilder()
+ .path("/" + new_apiRouteInfo.getServiceName()+"/version/"+new_apiRouteInfo.getVersion()).build();
+ return Response.created(returnURI).entity(new_apiRouteInfo).build();
+
+ }
+
+
+
+ @DELETE
+ @Path("/{serviceName}/version/{version}")
+ @ApiOperation(value = "delete one ApiRoute by serviceName and version", code = HttpStatus.SC_NO_CONTENT)
+ @ApiResponses(value = {
+ @ApiResponse(code = HttpStatus.SC_NO_CONTENT, message = "delete ApiRouteInfo succeed "),
+ @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "ApiRouteInfo not found", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "delete ApiRouteInfo fail", response = String.class)})
+ @Produces(MediaType.APPLICATION_JSON)
+ @Timed
+ public void deleteApiRoute(
+ @ApiParam(value = "ApiRoute serviceName", required = true) @PathParam("serviceName") String serviceName,
+ @ApiParam(value = "ApiRoute version,if the version is empty, please enter \"null\"", required = false) @PathParam("version") @DefaultValue("") String version) {
+
+
+ ApiRouteServiceWrapper.getInstance().deleteApiRoute(serviceName, version,"*","");
+
+ }
+
+
+ @GET
+ @Path("/apiDocs")
+ @ApiOperation(value = "get all Local apiDoc ", code = HttpStatus.SC_OK, response = String.class, responseContainer = "List")
+ @ApiResponses(value = {@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "get apiDoc List fail", response = String.class)})
+ @Produces(MediaType.APPLICATION_JSON)
+ @Timed
+ public String[] getApiDocs() {
+
+ String[] apiDocs = ApiRouteServiceWrapper.getInstance().getAllApiDocs();
+ return apiDocs;
+
+ }
+
+ @GET
+ @Path("/apiGatewayPort")
+ @ApiOperation(value = "get apiGateway Port ", code = HttpStatus.SC_OK, response = String.class)
+ @ApiResponses(value = {@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "get apiGateway Port fail", response = String.class)})
+ @Produces(MediaType.TEXT_PLAIN)
+ @Timed
+ public String getApiGatewayPort() {
+
+ return ApiRouteServiceWrapper.getInstance().getApiGatewayPort();
+
+ }
+
+ @GET
+ @Path("/discoverInfo")
+ @ApiOperation(value = "get discover Info ", code = HttpStatus.SC_OK,response = DiscoverInfo.class)
+ @ApiResponses(value = {@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "get discover Info fail", response = String.class)})
+ @Produces(MediaType.APPLICATION_JSON)
+ @Timed
+ public DiscoverInfo getServiceDiscoverInfo() {
+
+ return ApiRouteServiceWrapper.getInstance().getServiceDiscoverInfo();
+ }
+
+ @PUT
+ @Path("/{serviceName}/version/{version}/status/{status}")
+ @ApiOperation(value = "update one ApiRoute status by serviceName and version", code = HttpStatus.SC_CREATED,response = ApiRouteInfo.class)
+ @ApiResponses(value = {
+ @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable ApiRouteInfo Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "ApiRouteInfo not found", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "update status fail", response = String.class)})
+ @Produces(MediaType.APPLICATION_JSON)
+ @Timed
+ public Response updateApiRouteStatus(
+ @ApiParam(value = "ApiRoute serviceName", required = true) @PathParam("serviceName") String serviceName,
+ @ApiParam(value = "ApiRoute version,if the version is empty, please enter \"null\"", required = false) @PathParam("version") @DefaultValue("") String version,
+ @ApiParam(value = "ApiRoute status,1:abled 0:disabled", required = true) @PathParam("status") String status) {
+
+ ApiRouteInfo new_apiRouteInfo = ApiRouteServiceWrapper.getInstance().updateApiRouteStatus(serviceName,version,status);
+ return Response.created(uriInfo.getAbsolutePathBuilder().build()).entity(new_apiRouteInfo).build();
+
+ }
+
+ @GET
+ @Path("/export")
+ @ApiOperation(value = "export all route service Info by json-file", code = HttpStatus.SC_OK,response = String.class)
+ @ApiResponses(value = {
+ @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "export fail", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_NOT_ACCEPTABLE, message = " not Acceptable client-side", response = String.class)})
+ @Produces(MediaType.TEXT_PLAIN)
+ public Response exportService() throws Exception {
+
+
+ Object[] apirouteArray= ApiRouteServiceWrapper.getInstance().getAllApiRouteInstances();
+ Object[] iuirouteArray= IuiRouteServiceWrapper.getInstance().getAllIuiRouteInstances();
+ Object[] customrouteArray= CustomRouteServiceWrapper.getInstance().getAllCustomRouteInstances();
+
+ Object[] temprouteArray =RouteUtil.concat(apirouteArray, iuirouteArray);
+ Object[] allrouteArray=RouteUtil.concat(temprouteArray, customrouteArray);
+
+
+ String allrouteJson=JacksonJsonUtil.beanToJson(allrouteArray);
+
+ ResponseBuilder response = Response.ok(allrouteJson);
+ response.header("Content-Disposition",
+ "attachment; filename=\"RouteService.json\"");
+ return response.build();
+
+
+ }
+
+
+
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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
-package org.openo.msb.resources;\r
-\r
-import io.swagger.annotations.Api;\r
-import io.swagger.annotations.ApiOperation;\r
-import io.swagger.annotations.ApiParam;\r
-import io.swagger.annotations.ApiResponse;\r
-import io.swagger.annotations.ApiResponses;\r
-\r
-import java.net.URI;\r
-\r
-import javax.ws.rs.DELETE;\r
-import javax.ws.rs.GET;\r
-import javax.ws.rs.POST;\r
-import javax.ws.rs.PUT;\r
-import javax.ws.rs.Path;\r
-import javax.ws.rs.Produces;\r
-import javax.ws.rs.QueryParam;\r
-import javax.ws.rs.core.Context;\r
-import javax.ws.rs.core.MediaType;\r
-import javax.ws.rs.core.Response;\r
-import javax.ws.rs.core.UriInfo;\r
-\r
-import org.apache.http.HttpStatus;\r
-import org.openo.msb.api.CustomRouteInfo;\r
-import org.openo.msb.wrapper.CustomRouteServiceWrapper;\r
-\r
-import com.codahale.metrics.annotation.Timed;\r
-\r
-@Path("/customRoute")\r
-@Api(tags = { "CustomRoute" })\r
-@Produces(MediaType.APPLICATION_JSON)\r
-public class CustomRouteResource {\r
- \r
- @Context\r
- UriInfo uriInfo; // actual uri info\r
- \r
- @GET\r
- @Path("/all")\r
- @ApiOperation(value = "get all CustomRoute ", code = HttpStatus.SC_OK,response = CustomRouteInfo.class, responseContainer = "List")\r
- @ApiResponses(value = {@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "get CustomRouteInfo List fail", response = String.class)})\r
- @Produces(MediaType.APPLICATION_JSON)\r
- @Timed\r
- public CustomRouteInfo[] getCustomRoutes() {\r
- return CustomRouteServiceWrapper.getInstance().getAllCustomRouteInstances();\r
- }\r
- \r
- @POST\r
- @Path("/instance")\r
- @ApiOperation(value = "add one CustomRoute ", code = HttpStatus.SC_CREATED,response = CustomRouteInfo.class)\r
- @ApiResponses(value = {\r
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable CustomRouteInfo Entity ", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "add CustomRouteInfo fail", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_BAD_REQUEST, message = "Unprocessable CustomRouteInfo JSON REQUEST", response = String.class)})\r
- @Produces(MediaType.APPLICATION_JSON)\r
- @Timed\r
- public Response addCustomRoute(\r
- @ApiParam(value = "CustomRoute Instance Info", required = true) CustomRouteInfo customRouteInfo) {\r
- CustomRouteInfo new_customRouteInfo = CustomRouteServiceWrapper.getInstance().saveCustomRouteInstance(customRouteInfo,"");\r
- URI returnURI =\r
- uriInfo.getAbsolutePathBuilder()\r
- .path("/instance?serviceName=" + new_customRouteInfo.getServiceName()).build();\r
- return Response.created(returnURI).entity(new_customRouteInfo).build();\r
-\r
- }\r
- \r
- @GET\r
- @Path("/instance")\r
- @ApiOperation(value = "get one CustomRoute ",code = HttpStatus.SC_OK, response = CustomRouteInfo.class)\r
- @ApiResponses(value = {\r
- @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "CustomRoute not found", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable CustomRoute Entity ", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "get CustomRoute fail", response = String.class)})\r
- @Produces(MediaType.APPLICATION_JSON)\r
- @Timed\r
- public CustomRouteInfo getCustomRoute(\r
- @ApiParam(value = "CustomRoute serviceName", required = false) @QueryParam("serviceName") String serviceName) {\r
- \r
- \r
- return CustomRouteServiceWrapper.getInstance().getCustomRouteInstance(serviceName);\r
-\r
- }\r
- \r
- @PUT\r
- @Path("/instance")\r
- @ApiOperation(value = "update one CustomRoute by serviceName", code = HttpStatus.SC_CREATED,response = CustomRouteInfo.class)\r
- @ApiResponses(value = {\r
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable CustomRoute Entity ", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "update CustomRoute fail", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_BAD_REQUEST, message = "Unprocessable CustomRoute JSON REQUEST", response = String.class)})\r
- @Produces(MediaType.APPLICATION_JSON)\r
- @Timed\r
- public Response updateCustomRoute(\r
- @ApiParam(value = "CustomRoute serviceName", required = true) @QueryParam("serviceName") String serviceName,\r
- @ApiParam(value = "CustomRoute Instance Info", required = true) CustomRouteInfo customRoute) {\r
-\r
- CustomRouteInfo new_customRouteInfo= CustomRouteServiceWrapper.getInstance().updateCustomRouteInstance(serviceName,customRoute,"");\r
-\r
- return Response.created(uriInfo.getAbsolutePathBuilder().build()).entity(new_customRouteInfo).build();\r
-\r
- }\r
-\r
- @DELETE\r
- @Path("/instance")\r
- @ApiOperation(value = "delete one CustomRoute by serviceName", code = HttpStatus.SC_NO_CONTENT)\r
- @ApiResponses(value = {\r
- @ApiResponse(code = HttpStatus.SC_NO_CONTENT, message = "delete customRoute succeed "),\r
- @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "customRoute not found", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "delete customRoute fail", response = String.class)})\r
- @Produces(MediaType.APPLICATION_JSON)\r
- @Timed\r
- public void deleteCustomRoute(\r
- @ApiParam(value = "CustomRoute serviceName", required = true) @QueryParam("serviceName") String serviceName) {\r
-\r
- CustomRouteServiceWrapper.getInstance().deleteCustomRoute(serviceName,"*","");\r
-\r
- }\r
- \r
- @PUT\r
- @Path("/status")\r
- @ApiOperation(value = "update one CustomRoute status by serviceName ",code = HttpStatus.SC_CREATED, response = CustomRouteInfo.class)\r
- @ApiResponses(value = {\r
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable customRoute Entity ", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "customRoute not found", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "update status fail", response = String.class)})\r
- @Produces(MediaType.APPLICATION_JSON)\r
- @Timed\r
- public Response updateCustomRouteStatus(\r
- @ApiParam(value = "CustomRoute serviceName", required = true) @QueryParam("serviceName") String serviceName,\r
- @ApiParam(value = "CustomRoute status,1:abled 0:disabled", required = true) @QueryParam("status") String status) {\r
-\r
- CustomRouteInfo new_customRouteInfo = CustomRouteServiceWrapper.getInstance().updateCustomRouteStatus(serviceName,status);\r
- return Response.created(uriInfo.getAbsolutePathBuilder().build()).entity(new_customRouteInfo).build();\r
-\r
-\r
- }\r
-\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.resources;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+
+import java.net.URI;
+
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+
+import org.apache.http.HttpStatus;
+import org.openo.msb.api.CustomRouteInfo;
+import org.openo.msb.wrapper.CustomRouteServiceWrapper;
+
+import com.codahale.metrics.annotation.Timed;
+
+@Path("/customRoute")
+@Api(tags = { "CustomRoute" })
+@Produces(MediaType.APPLICATION_JSON)
+public class CustomRouteResource {
+
+ @Context
+ UriInfo uriInfo; // actual uri info
+
+ @GET
+ @Path("/all")
+ @ApiOperation(value = "get all CustomRoute ", code = HttpStatus.SC_OK,response = CustomRouteInfo.class, responseContainer = "List")
+ @ApiResponses(value = {@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "get CustomRouteInfo List fail", response = String.class)})
+ @Produces(MediaType.APPLICATION_JSON)
+ @Timed
+ public CustomRouteInfo[] getCustomRoutes() {
+ return CustomRouteServiceWrapper.getInstance().getAllCustomRouteInstances();
+ }
+
+ @POST
+ @Path("/instance")
+ @ApiOperation(value = "add one CustomRoute ", code = HttpStatus.SC_CREATED,response = CustomRouteInfo.class)
+ @ApiResponses(value = {
+ @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable CustomRouteInfo Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "add CustomRouteInfo fail", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_BAD_REQUEST, message = "Unprocessable CustomRouteInfo JSON REQUEST", response = String.class)})
+ @Produces(MediaType.APPLICATION_JSON)
+ @Timed
+ public Response addCustomRoute(
+ @ApiParam(value = "CustomRoute Instance Info", required = true) CustomRouteInfo customRouteInfo) {
+ CustomRouteInfo new_customRouteInfo = CustomRouteServiceWrapper.getInstance().saveCustomRouteInstance(customRouteInfo,"");
+ URI returnURI =
+ uriInfo.getAbsolutePathBuilder()
+ .path("/instance?serviceName=" + new_customRouteInfo.getServiceName()).build();
+ return Response.created(returnURI).entity(new_customRouteInfo).build();
+
+ }
+
+ @GET
+ @Path("/instance")
+ @ApiOperation(value = "get one CustomRoute ",code = HttpStatus.SC_OK, response = CustomRouteInfo.class)
+ @ApiResponses(value = {
+ @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "CustomRoute not found", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable CustomRoute Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "get CustomRoute fail", response = String.class)})
+ @Produces(MediaType.APPLICATION_JSON)
+ @Timed
+ public CustomRouteInfo getCustomRoute(
+ @ApiParam(value = "CustomRoute serviceName", required = false) @QueryParam("serviceName") String serviceName) {
+
+
+ return CustomRouteServiceWrapper.getInstance().getCustomRouteInstance(serviceName);
+
+ }
+
+ @PUT
+ @Path("/instance")
+ @ApiOperation(value = "update one CustomRoute by serviceName", code = HttpStatus.SC_CREATED,response = CustomRouteInfo.class)
+ @ApiResponses(value = {
+ @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable CustomRoute Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "update CustomRoute fail", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_BAD_REQUEST, message = "Unprocessable CustomRoute JSON REQUEST", response = String.class)})
+ @Produces(MediaType.APPLICATION_JSON)
+ @Timed
+ public Response updateCustomRoute(
+ @ApiParam(value = "CustomRoute serviceName", required = true) @QueryParam("serviceName") String serviceName,
+ @ApiParam(value = "CustomRoute Instance Info", required = true) CustomRouteInfo customRoute) {
+
+ CustomRouteInfo new_customRouteInfo= CustomRouteServiceWrapper.getInstance().updateCustomRouteInstance(serviceName,customRoute,"");
+
+ return Response.created(uriInfo.getAbsolutePathBuilder().build()).entity(new_customRouteInfo).build();
+
+ }
+
+ @DELETE
+ @Path("/instance")
+ @ApiOperation(value = "delete one CustomRoute by serviceName", code = HttpStatus.SC_NO_CONTENT)
+ @ApiResponses(value = {
+ @ApiResponse(code = HttpStatus.SC_NO_CONTENT, message = "delete customRoute succeed "),
+ @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "customRoute not found", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "delete customRoute fail", response = String.class)})
+ @Produces(MediaType.APPLICATION_JSON)
+ @Timed
+ public void deleteCustomRoute(
+ @ApiParam(value = "CustomRoute serviceName", required = true) @QueryParam("serviceName") String serviceName) {
+
+ CustomRouteServiceWrapper.getInstance().deleteCustomRoute(serviceName,"*","");
+
+ }
+
+ @PUT
+ @Path("/status")
+ @ApiOperation(value = "update one CustomRoute status by serviceName ",code = HttpStatus.SC_CREATED, response = CustomRouteInfo.class)
+ @ApiResponses(value = {
+ @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable customRoute Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "customRoute not found", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "update status fail", response = String.class)})
+ @Produces(MediaType.APPLICATION_JSON)
+ @Timed
+ public Response updateCustomRouteStatus(
+ @ApiParam(value = "CustomRoute serviceName", required = true) @QueryParam("serviceName") String serviceName,
+ @ApiParam(value = "CustomRoute status,1:abled 0:disabled", required = true) @QueryParam("status") String status) {
+
+ CustomRouteInfo new_customRouteInfo = CustomRouteServiceWrapper.getInstance().updateCustomRouteStatus(serviceName,status);
+ return Response.created(uriInfo.getAbsolutePathBuilder().build()).entity(new_customRouteInfo).build();
+
+
+ }
+
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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.resources;\r
-\r
-import io.swagger.annotations.Api;\r
-import io.swagger.annotations.ApiOperation;\r
-import io.swagger.annotations.ApiParam;\r
-import io.swagger.annotations.ApiResponse;\r
-import io.swagger.annotations.ApiResponses;\r
-\r
-import java.net.URI;\r
-\r
-import javax.ws.rs.DELETE;\r
-import javax.ws.rs.GET;\r
-import javax.ws.rs.POST;\r
-import javax.ws.rs.PUT;\r
-import javax.ws.rs.Path;\r
-import javax.ws.rs.PathParam;\r
-import javax.ws.rs.Produces;\r
-import javax.ws.rs.core.Context;\r
-import javax.ws.rs.core.MediaType;\r
-import javax.ws.rs.core.Response;\r
-import javax.ws.rs.core.UriInfo;\r
-\r
-import org.apache.http.HttpStatus;\r
-import org.openo.msb.api.IuiRouteInfo;\r
-import org.openo.msb.wrapper.IuiRouteServiceWrapper;\r
-\r
-import com.codahale.metrics.annotation.Timed;\r
-\r
-@Path("/iuiRoute")\r
-@Api(tags = { "iuiRoute" })\r
-@Produces(MediaType.APPLICATION_JSON)\r
-public class IuiRouteResource {\r
-\r
- @Context\r
- UriInfo uriInfo; // actual uri info\r
-\r
- @GET\r
- @Path("/")\r
- @ApiOperation(value = "get all iuiRoute ", code = HttpStatus.SC_OK,response = IuiRouteInfo.class, responseContainer = "List")\r
- @ApiResponses(value = {@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "get iuiRouteInfo List fail", response = String.class)})\r
- @Produces(MediaType.APPLICATION_JSON)\r
- @Timed\r
- public IuiRouteInfo[] getIuiRoutes() {\r
- return IuiRouteServiceWrapper.getInstance().getAllIuiRouteInstances();\r
- }\r
-\r
- @POST\r
- @Path("/")\r
- @ApiOperation(value = "add one iuiRoute ", code = HttpStatus.SC_CREATED,response = IuiRouteInfo.class)\r
- @ApiResponses(value = {\r
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable iuiRouteInfo Entity ", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "add iuiRouteInfo fail", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_BAD_REQUEST, message = "Unprocessable iuiRouteInfo JSON REQUEST", response = String.class)})\r
- @Produces(MediaType.APPLICATION_JSON)\r
- @Timed\r
- public Response addIuiRoute(\r
- @ApiParam(value = "iuiRoute Instance Info", required = true) IuiRouteInfo iuiRouteInfo) {\r
- IuiRouteInfo new_iuiRouteInfo = IuiRouteServiceWrapper.getInstance().saveIuiRouteInstance(iuiRouteInfo);\r
- URI returnURI =\r
- uriInfo.getAbsolutePathBuilder()\r
- .path("/" + new_iuiRouteInfo.getServiceName()).build();\r
- return Response.created(returnURI).entity(new_iuiRouteInfo).build();\r
-\r
- }\r
- \r
- @GET\r
- @Path("/{serviceName}")\r
- @ApiOperation(value = "get one iuiRoute ",code = HttpStatus.SC_OK, response = IuiRouteInfo.class)\r
- @ApiResponses(value = {\r
- @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "IuiRouteInfo not found", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable IuiRouteInfo Entity ", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "get IuiRouteInfo fail", response = String.class)})\r
- @Produces(MediaType.APPLICATION_JSON)\r
- @Timed\r
- public IuiRouteInfo getIuiRoute(\r
- @ApiParam(value = "iuiRoute serviceName", required = true) @PathParam("serviceName") String serviceName) {\r
-\r
- return IuiRouteServiceWrapper.getInstance().getIuiRouteInstance(serviceName);\r
-\r
- }\r
-\r
- @PUT\r
- @Path("/{serviceName}")\r
- @ApiOperation(value = "update one iuiRoute by serviceName", code = HttpStatus.SC_CREATED,response = IuiRouteInfo.class)\r
- @ApiResponses(value = {\r
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable IuiRouteInfo Entity ", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "update IuiRouteInfo fail", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_BAD_REQUEST, message = "Unprocessable IuiRouteInfo JSON REQUEST", response = String.class)})\r
- @Produces(MediaType.APPLICATION_JSON)\r
- @Timed\r
- public Response updateIuiRoute(\r
- @ApiParam(value = "iuiRoute serviceName", required = true) @PathParam("serviceName") String serviceName,\r
- @ApiParam(value = "iuiRoute Instance Info", required = true) IuiRouteInfo iuiRouteInfo) {\r
-\r
- IuiRouteInfo new_iuiRouteInfo = IuiRouteServiceWrapper.getInstance().updateIuiRouteInstance(serviceName,iuiRouteInfo);\r
- URI returnURI =\r
- uriInfo.getAbsolutePathBuilder()\r
- .path("/" + serviceName).build();\r
- return Response.created(returnURI).entity(new_iuiRouteInfo).build();\r
- }\r
-\r
- @DELETE\r
- @Path("/{serviceName}")\r
- @ApiOperation(value = "delete one iuiRoute by serviceName", code = HttpStatus.SC_NO_CONTENT)\r
- @ApiResponses(value = {\r
- @ApiResponse(code = HttpStatus.SC_NO_CONTENT, message = "delete IuiRouteInfo succeed "),\r
- @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "IuiRouteInfo not found", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "delete IuiRouteInfo fail", response = String.class)})\r
- @Produces(MediaType.APPLICATION_JSON)\r
- @Timed\r
- public void deleteIuiRoute(\r
- @ApiParam(value = "iuiRoute serviceName", required = true) @PathParam("serviceName") String serviceName) {\r
-\r
- IuiRouteServiceWrapper.getInstance().deleteIuiRoute(serviceName,"*");\r
-\r
- }\r
- \r
- @PUT\r
- @Path("/{serviceName}/status/{status}")\r
- @ApiOperation(value = "update one iuiRoute status by serviceName ",code = HttpStatus.SC_CREATED, response = IuiRouteInfo.class)\r
- @ApiResponses(value = {\r
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable IuiRouteInfo Entity ", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "IuiRouteInfo not found", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "update IuiRouteInfo status fail", response = String.class)})\r
- @Produces(MediaType.APPLICATION_JSON)\r
- @Timed\r
- public Response updateIuiRouteStatus(\r
- @ApiParam(value = "iuiRoute serviceName", required = true) @PathParam("serviceName") String serviceName,\r
- @ApiParam(value = "iuiRoute status,1:abled 0:disabled", required = true) @PathParam("status") String status) {\r
-\r
- IuiRouteInfo new_iuiRouteInfo = IuiRouteServiceWrapper.getInstance().updateIuiRouteStatus(serviceName,status);\r
- URI returnURI =\r
- uriInfo.getAbsolutePathBuilder()\r
- .path("/" + serviceName).build();\r
- return Response.created(returnURI).entity(new_iuiRouteInfo).build();\r
-\r
- }\r
- \r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.resources;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+
+import java.net.URI;
+
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+
+import org.apache.http.HttpStatus;
+import org.openo.msb.api.IuiRouteInfo;
+import org.openo.msb.wrapper.IuiRouteServiceWrapper;
+
+import com.codahale.metrics.annotation.Timed;
+
+@Path("/iuiRoute")
+@Api(tags = { "iuiRoute" })
+@Produces(MediaType.APPLICATION_JSON)
+public class IuiRouteResource {
+
+ @Context
+ UriInfo uriInfo; // actual uri info
+
+ @GET
+ @Path("/")
+ @ApiOperation(value = "get all iuiRoute ", code = HttpStatus.SC_OK,response = IuiRouteInfo.class, responseContainer = "List")
+ @ApiResponses(value = {@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "get iuiRouteInfo List fail", response = String.class)})
+ @Produces(MediaType.APPLICATION_JSON)
+ @Timed
+ public IuiRouteInfo[] getIuiRoutes() {
+ return IuiRouteServiceWrapper.getInstance().getAllIuiRouteInstances();
+ }
+
+ @POST
+ @Path("/")
+ @ApiOperation(value = "add one iuiRoute ", code = HttpStatus.SC_CREATED,response = IuiRouteInfo.class)
+ @ApiResponses(value = {
+ @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable iuiRouteInfo Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "add iuiRouteInfo fail", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_BAD_REQUEST, message = "Unprocessable iuiRouteInfo JSON REQUEST", response = String.class)})
+ @Produces(MediaType.APPLICATION_JSON)
+ @Timed
+ public Response addIuiRoute(
+ @ApiParam(value = "iuiRoute Instance Info", required = true) IuiRouteInfo iuiRouteInfo) {
+ IuiRouteInfo new_iuiRouteInfo = IuiRouteServiceWrapper.getInstance().saveIuiRouteInstance(iuiRouteInfo);
+ URI returnURI =
+ uriInfo.getAbsolutePathBuilder()
+ .path("/" + new_iuiRouteInfo.getServiceName()).build();
+ return Response.created(returnURI).entity(new_iuiRouteInfo).build();
+
+ }
+
+ @GET
+ @Path("/{serviceName}")
+ @ApiOperation(value = "get one iuiRoute ",code = HttpStatus.SC_OK, response = IuiRouteInfo.class)
+ @ApiResponses(value = {
+ @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "IuiRouteInfo not found", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable IuiRouteInfo Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "get IuiRouteInfo fail", response = String.class)})
+ @Produces(MediaType.APPLICATION_JSON)
+ @Timed
+ public IuiRouteInfo getIuiRoute(
+ @ApiParam(value = "iuiRoute serviceName", required = true) @PathParam("serviceName") String serviceName) {
+
+ return IuiRouteServiceWrapper.getInstance().getIuiRouteInstance(serviceName);
+
+ }
+
+ @PUT
+ @Path("/{serviceName}")
+ @ApiOperation(value = "update one iuiRoute by serviceName", code = HttpStatus.SC_CREATED,response = IuiRouteInfo.class)
+ @ApiResponses(value = {
+ @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable IuiRouteInfo Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "update IuiRouteInfo fail", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_BAD_REQUEST, message = "Unprocessable IuiRouteInfo JSON REQUEST", response = String.class)})
+ @Produces(MediaType.APPLICATION_JSON)
+ @Timed
+ public Response updateIuiRoute(
+ @ApiParam(value = "iuiRoute serviceName", required = true) @PathParam("serviceName") String serviceName,
+ @ApiParam(value = "iuiRoute Instance Info", required = true) IuiRouteInfo iuiRouteInfo) {
+
+ IuiRouteInfo new_iuiRouteInfo = IuiRouteServiceWrapper.getInstance().updateIuiRouteInstance(serviceName,iuiRouteInfo);
+ URI returnURI =
+ uriInfo.getAbsolutePathBuilder()
+ .path("/" + serviceName).build();
+ return Response.created(returnURI).entity(new_iuiRouteInfo).build();
+ }
+
+ @DELETE
+ @Path("/{serviceName}")
+ @ApiOperation(value = "delete one iuiRoute by serviceName", code = HttpStatus.SC_NO_CONTENT)
+ @ApiResponses(value = {
+ @ApiResponse(code = HttpStatus.SC_NO_CONTENT, message = "delete IuiRouteInfo succeed "),
+ @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "IuiRouteInfo not found", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "delete IuiRouteInfo fail", response = String.class)})
+ @Produces(MediaType.APPLICATION_JSON)
+ @Timed
+ public void deleteIuiRoute(
+ @ApiParam(value = "iuiRoute serviceName", required = true) @PathParam("serviceName") String serviceName) {
+
+ IuiRouteServiceWrapper.getInstance().deleteIuiRoute(serviceName,"*");
+
+ }
+
+ @PUT
+ @Path("/{serviceName}/status/{status}")
+ @ApiOperation(value = "update one iuiRoute status by serviceName ",code = HttpStatus.SC_CREATED, response = IuiRouteInfo.class)
+ @ApiResponses(value = {
+ @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable IuiRouteInfo Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "IuiRouteInfo not found", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "update IuiRouteInfo status fail", response = String.class)})
+ @Produces(MediaType.APPLICATION_JSON)
+ @Timed
+ public Response updateIuiRouteStatus(
+ @ApiParam(value = "iuiRoute serviceName", required = true) @PathParam("serviceName") String serviceName,
+ @ApiParam(value = "iuiRoute status,1:abled 0:disabled", required = true) @PathParam("status") String status) {
+
+ IuiRouteInfo new_iuiRouteInfo = IuiRouteServiceWrapper.getInstance().updateIuiRouteStatus(serviceName,status);
+ URI returnURI =
+ uriInfo.getAbsolutePathBuilder()
+ .path("/" + serviceName).build();
+ return Response.created(returnURI).entity(new_iuiRouteInfo).build();
+
+ }
+
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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.resources;\r
-\r
-import io.swagger.annotations.Api;\r
-import io.swagger.annotations.ApiOperation;\r
-\r
-import javax.ws.rs.GET;\r
-import javax.ws.rs.Path;\r
-import javax.ws.rs.Produces;\r
-import javax.ws.rs.core.MediaType;\r
-\r
-import org.apache.http.impl.client.CloseableHttpClient;\r
-import org.openo.msb.api.MetricsInfo;\r
-import org.openo.msb.wrapper.MetricsServiceWrapper;\r
-\r
-import com.codahale.metrics.annotation.Timed;\r
-\r
-@Path("/metrics")\r
-@Api(tags = { "metrics" })\r
-@Produces(MediaType.APPLICATION_JSON)\r
-public class MetricsResource {\r
- \r
-\r
- @GET\r
- @Path("/")\r
- @ApiOperation(value = "get Metrics Info ", response = MetricsInfo.class)\r
- @Produces(MediaType.APPLICATION_JSON)\r
- @Timed\r
- public MetricsInfo getMetricsInfo() {\r
- return MetricsServiceWrapper.getMetricsInfo();\r
- }\r
- \r
- \r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.resources;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.openo.msb.api.MetricsInfo;
+import org.openo.msb.wrapper.MetricsServiceWrapper;
+
+import com.codahale.metrics.annotation.Timed;
+
+@Path("/metrics")
+@Api(tags = { "metrics" })
+@Produces(MediaType.APPLICATION_JSON)
+public class MetricsResource {
+
+
+ @GET
+ @Path("/")
+ @ApiOperation(value = "get Metrics Info ", response = MetricsInfo.class)
+ @Produces(MediaType.APPLICATION_JSON)
+ @Timed
+ public MetricsInfo getMetricsInfo() {
+ return MetricsServiceWrapper.getMetricsInfo();
+ }
+
+
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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.resources;\r
-\r
-import io.swagger.annotations.Api;\r
-import io.swagger.annotations.ApiOperation;\r
-import io.swagger.annotations.ApiParam;\r
-import io.swagger.annotations.ApiResponse;\r
-import io.swagger.annotations.ApiResponses;\r
-\r
-import java.net.URI;\r
-\r
-import javax.servlet.http.HttpServletRequest;\r
-import javax.ws.rs.DELETE;\r
-import javax.ws.rs.DefaultValue;\r
-import javax.ws.rs.GET;\r
-import javax.ws.rs.POST;\r
-import javax.ws.rs.PUT;\r
-import javax.ws.rs.Path;\r
-import javax.ws.rs.PathParam;\r
-import javax.ws.rs.Produces;\r
-import javax.ws.rs.QueryParam;\r
-import javax.ws.rs.core.Context;\r
-import javax.ws.rs.core.MediaType;\r
-import javax.ws.rs.core.Response;\r
-import javax.ws.rs.core.UriInfo;\r
-\r
-import org.apache.commons.lang3.StringUtils;\r
-import org.apache.http.HttpStatus;\r
-import org.openo.msb.api.MicroServiceFullInfo;\r
-import org.openo.msb.api.MicroServiceInfo;\r
-import org.openo.msb.wrapper.MicroServiceWrapper;\r
-import org.openo.msb.wrapper.util.MicroServiceUtil;\r
-import org.slf4j.Logger;\r
-import org.slf4j.LoggerFactory;\r
-\r
-import com.codahale.metrics.annotation.Timed;\r
-\r
-@Path("/services")\r
-@Api(tags = {"MSB-Service Resource"})\r
-@Produces(MediaType.APPLICATION_JSON)\r
-public class MicroServiceResource {\r
-\r
- @Context\r
- UriInfo uriInfo; // actual uri info\r
-\r
-\r
- private static final Logger LOGGER = LoggerFactory.getLogger(MicroServiceResource.class);\r
-\r
- @GET\r
- @Path("/")\r
- @ApiOperation(value = "get all microservices ", code = HttpStatus.SC_OK, response = MicroServiceFullInfo.class, responseContainer = "List")\r
- @ApiResponses(value = {@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "get microservice List fail", response = String.class)})\r
- @Produces(MediaType.APPLICATION_JSON)\r
- @Timed\r
- public MicroServiceFullInfo[] getMicroService() {\r
- return MicroServiceWrapper.getInstance().getAllMicroServiceInstances();\r
- }\r
-\r
- @POST\r
- @Path("/")\r
- @ApiOperation(value = "add one microservice ", code = HttpStatus.SC_CREATED, response = MicroServiceFullInfo.class)\r
- @ApiResponses(value = {\r
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable MicroServiceInfo Entity ", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "add microservice fail", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_BAD_REQUEST, message = "Unprocessable MicroServiceInfo JSON REQUEST", response = String.class)})\r
- @Produces(MediaType.APPLICATION_JSON)\r
- @Timed\r
- public Response addMicroService(\r
- @ApiParam(value = "MicroServiceInfo Instance Info", required = true) MicroServiceInfo microServiceInfo,\r
- @Context HttpServletRequest request,\r
- @ApiParam(value = "createOrUpdate", required = false) @QueryParam("createOrUpdate") @DefaultValue("true") boolean createOrUpdate,\r
- @ApiParam(value = "port", required = false) @QueryParam("port") @DefaultValue("") String port) {\r
- \r
- String ip=MicroServiceUtil.getRealIp(request);\r
- \r
- MicroServiceFullInfo microServiceFullInfo =\r
- MicroServiceWrapper.getInstance().saveMicroServiceInstance(microServiceInfo,\r
- createOrUpdate,ip,port);\r
- URI returnURI =\r
- uriInfo.getAbsolutePathBuilder()\r
- .path("/" + microServiceInfo.getServiceName() + "/version/"\r
- + microServiceInfo.getVersion()).build();\r
- return Response.created(returnURI).entity(microServiceFullInfo).build();\r
- }\r
-\r
-\r
-\r
- @GET\r
- @Path("/{serviceName}/version/{version}")\r
- @ApiOperation(value = "get one microservice ", code = HttpStatus.SC_OK, response = MicroServiceFullInfo.class)\r
- @ApiResponses(value = {\r
- @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "microservice not found", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable MicroServiceInfo Entity ", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "get microservice fail", response = String.class)})\r
- @Produces(MediaType.APPLICATION_JSON)\r
- @Timed\r
- public MicroServiceFullInfo getMicroService(\r
- @ApiParam(value = "microservice serviceName") @PathParam("serviceName") String serviceName,\r
- @ApiParam(value = "microservice version,if the version is empty, please enter \"null\"") @PathParam("version") @DefaultValue("") String version,\r
- @ApiParam(value = "port", required = false) @QueryParam("port") @DefaultValue("") String port) {\r
-\r
-\r
- return MicroServiceWrapper.getInstance().getMicroServiceInstance(serviceName, version,port);\r
-\r
-\r
- }\r
-\r
- @PUT\r
- @Path("/{serviceName}/version/{version}")\r
- @ApiOperation(value = "update one microservice by serviceName and version", code = HttpStatus.SC_CREATED, response = MicroServiceFullInfo.class)\r
- @ApiResponses(value = {\r
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable MicroServiceInfo Entity ", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "update microservice fail", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_BAD_REQUEST, message = "Unprocessable MicroServiceInfo JSON REQUEST", response = String.class)})\r
- @Produces(MediaType.APPLICATION_JSON)\r
- @Timed\r
- public Response updateMicroService(\r
- @ApiParam(value = "microservice serviceName") @PathParam("serviceName") String serviceName,\r
- @ApiParam(value = "microservice version,if the version is empty, please enter \"null\"") @PathParam("version") @DefaultValue("") String version,\r
- @ApiParam(value = "microservice Instance Info", required = true) MicroServiceInfo microServiceInfo) {\r
-\r
- MicroServiceFullInfo microServiceFullInfo = MicroServiceWrapper.getInstance().updateMicroServiceInstance(serviceName, version,\r
- microServiceInfo);\r
- return Response.created(uriInfo.getAbsolutePathBuilder().build()).entity(microServiceFullInfo).build();\r
-\r
- }\r
-\r
- @PUT\r
- @Path("/{serviceName}/version/{version}/nodes/{ip}/{port}")\r
- @ApiOperation(value = "update single node by serviceName and version and node", code = HttpStatus.SC_CREATED, response = MicroServiceFullInfo.class)\r
- @ApiResponses(value = {\r
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable MicroServiceInfo Entity ", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "microservice not found", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "update node fail", response = String.class)})\r
- @Produces(MediaType.APPLICATION_JSON)\r
- @Timed\r
- public Response updateNode(\r
- @ApiParam(value = "microservice serviceName", required = true) @PathParam("serviceName") String serviceName,\r
- @ApiParam(value = "microservice version,if the version is empty, please enter \"null\"", required = false) @PathParam("version") @DefaultValue("") String version,\r
- @ApiParam(value = "ip") @PathParam("ip") String ip,\r
- @ApiParam(value = "port") @PathParam("port") String port,\r
- @ApiParam(value = "ttl") @QueryParam("ttl") int ttl) {\r
-\r
- MicroServiceFullInfo microServiceFullInfo = MicroServiceWrapper.getInstance().updateMicroServiceNode(serviceName, version, ip,port, ttl);\r
-\r
- return Response.created(uriInfo.getAbsolutePathBuilder().build()).entity(microServiceFullInfo).build();\r
-\r
- }\r
-\r
-\r
-\r
- @DELETE\r
- @Path("/{serviceName}/version/{version}/nodes/{ip}/{port}")\r
- @ApiOperation(value = "delete single node by serviceName and version and node", code = HttpStatus.SC_NO_CONTENT)\r
- @ApiResponses(value = {\r
- @ApiResponse(code = HttpStatus.SC_NO_CONTENT, message = "delete node succeed "),\r
- @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "node not found", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable MicroServiceInfo Entity ", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "delete node fail", response = String.class)})\r
- @Produces(MediaType.APPLICATION_JSON)\r
- @Timed\r
- public void deleteNode(\r
- @ApiParam(value = "microservice serviceName", required = true) @PathParam("serviceName") String serviceName,\r
- @ApiParam(value = "microservice version,if the version is empty, please enter \"null\"", required = false) @PathParam("version") @DefaultValue("") String version,\r
- @ApiParam(value = "ip") @PathParam("ip") String ip,\r
- @ApiParam(value = "port") @PathParam("port") String port) {\r
-\r
- MicroServiceWrapper.getInstance().deleteMicroServiceInstance(serviceName, version, ip,port);\r
-\r
- }\r
-\r
-\r
- @DELETE\r
- @Path("/{serviceName}/version/{version}")\r
- @ApiOperation(value = "delete one full microservice by serviceName and version", code = HttpStatus.SC_NO_CONTENT)\r
- @ApiResponses(value = {\r
- @ApiResponse(code = HttpStatus.SC_NO_CONTENT, message = "delete microservice succeed "),\r
- @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "microservice not found", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable MicroServiceInfo Entity ", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "delete microservice fail", response = String.class)})\r
- @Produces(MediaType.APPLICATION_JSON)\r
- @Timed\r
- public void deleteMicroService(\r
- @ApiParam(value = "microservice serviceName", required = true) @PathParam("serviceName") String serviceName,\r
- @ApiParam(value = "microservice version,if the version is empty, please enter \"null\"", required = false) @PathParam("version") @DefaultValue("") String version,\r
- @ApiParam(value = "port", required = false) @QueryParam("port") @DefaultValue("") String port) {\r
-\r
-\r
- MicroServiceWrapper.getInstance().deleteMicroService(serviceName, version,port);\r
-\r
- }\r
-\r
- @PUT\r
- @Path("/{serviceName}/version/{version}/status/{status}")\r
- @ApiOperation(value = "update microservice status by serviceName and version", code = HttpStatus.SC_CREATED, response = MicroServiceFullInfo.class)\r
- @ApiResponses(value = {\r
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable MicroServiceInfo Entity ", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "microservice not found", response = String.class),\r
- @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "update status fail", response = String.class)})\r
- @Produces(MediaType.APPLICATION_JSON)\r
- @Timed\r
- public Response updateServiceStatus(\r
- @ApiParam(value = "microservice serviceName", required = true) @PathParam("serviceName") String serviceName,\r
- @ApiParam(value = "microservice version,if the version is empty, please enter \"null\"", required = false) @PathParam("version") @DefaultValue("") String version,\r
- @ApiParam(value = "status,1:abled 0:disabled") @PathParam("status") String status) {\r
-\r
- MicroServiceFullInfo microServiceFullInfo = MicroServiceWrapper.getInstance().updateMicroServiceStatus(serviceName, version,status);\r
-\r
- return Response.created(uriInfo.getAbsolutePathBuilder().build()).entity(microServiceFullInfo).build();\r
-\r
- }\r
-\r
-// @PUT\r
-// @Path("/ttl")\r
-// @ApiOperation(value = "test json date iso8601 ", code = 200, response = String.class)\r
-// @Produces(MediaType.APPLICATION_JSON)\r
-// @Timed\r
-// public String testIso8601(\r
-// @ApiParam(value = "microservice Instance Info", required = true) MicroServiceFullInfo microServiceInfo) {\r
-// Set<NodeInfo> nodes=microServiceInfo.getNodes();\r
-// String rtn="rtn:";\r
-// for(NodeInfo node:nodes){\r
-// Date date=node.getExpiration();\r
-// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");\r
-// String datettl=sdf.format(date);\r
-// rtn+=datettl;\r
-// }\r
-// \r
-// \r
-// return rtn;\r
-// }\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.resources;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+
+import java.net.URI;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.DefaultValue;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpStatus;
+import org.openo.msb.api.MicroServiceFullInfo;
+import org.openo.msb.api.MicroServiceInfo;
+import org.openo.msb.wrapper.MicroServiceWrapper;
+import org.openo.msb.wrapper.util.MicroServiceUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.codahale.metrics.annotation.Timed;
+
+@Path("/services")
+@Api(tags = {"MSB-Service Resource"})
+@Produces(MediaType.APPLICATION_JSON)
+public class MicroServiceResource {
+
+ @Context
+ UriInfo uriInfo; // actual uri info
+
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(MicroServiceResource.class);
+
+ @GET
+ @Path("/")
+ @ApiOperation(value = "get all microservices ", code = HttpStatus.SC_OK, response = MicroServiceFullInfo.class, responseContainer = "List")
+ @ApiResponses(value = {@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "get microservice List fail", response = String.class)})
+ @Produces(MediaType.APPLICATION_JSON)
+ @Timed
+ public MicroServiceFullInfo[] getMicroService() {
+ return MicroServiceWrapper.getInstance().getAllMicroServiceInstances();
+ }
+
+ @POST
+ @Path("/")
+ @ApiOperation(value = "add one microservice ", code = HttpStatus.SC_CREATED, response = MicroServiceFullInfo.class)
+ @ApiResponses(value = {
+ @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable MicroServiceInfo Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "add microservice fail", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_BAD_REQUEST, message = "Unprocessable MicroServiceInfo JSON REQUEST", response = String.class)})
+ @Produces(MediaType.APPLICATION_JSON)
+ @Timed
+ public Response addMicroService(
+ @ApiParam(value = "MicroServiceInfo Instance Info", required = true) MicroServiceInfo microServiceInfo,
+ @Context HttpServletRequest request,
+ @ApiParam(value = "createOrUpdate", required = false) @QueryParam("createOrUpdate") @DefaultValue("true") boolean createOrUpdate,
+ @ApiParam(value = "port", required = false) @QueryParam("port") @DefaultValue("") String port) {
+
+ String ip=MicroServiceUtil.getRealIp(request);
+
+ MicroServiceFullInfo microServiceFullInfo =
+ MicroServiceWrapper.getInstance().saveMicroServiceInstance(microServiceInfo,
+ createOrUpdate,ip,port);
+ URI returnURI =
+ uriInfo.getAbsolutePathBuilder()
+ .path("/" + microServiceInfo.getServiceName() + "/version/"
+ + microServiceInfo.getVersion()).build();
+ return Response.created(returnURI).entity(microServiceFullInfo).build();
+ }
+
+
+
+ @GET
+ @Path("/{serviceName}/version/{version}")
+ @ApiOperation(value = "get one microservice ", code = HttpStatus.SC_OK, response = MicroServiceFullInfo.class)
+ @ApiResponses(value = {
+ @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "microservice not found", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable MicroServiceInfo Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "get microservice fail", response = String.class)})
+ @Produces(MediaType.APPLICATION_JSON)
+ @Timed
+ public MicroServiceFullInfo getMicroService(
+ @ApiParam(value = "microservice serviceName") @PathParam("serviceName") String serviceName,
+ @ApiParam(value = "microservice version,if the version is empty, please enter \"null\"") @PathParam("version") @DefaultValue("") String version,
+ @ApiParam(value = "port", required = false) @QueryParam("port") @DefaultValue("") String port) {
+
+
+ return MicroServiceWrapper.getInstance().getMicroServiceInstance(serviceName, version,port);
+
+
+ }
+
+ @PUT
+ @Path("/{serviceName}/version/{version}")
+ @ApiOperation(value = "update one microservice by serviceName and version", code = HttpStatus.SC_CREATED, response = MicroServiceFullInfo.class)
+ @ApiResponses(value = {
+ @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable MicroServiceInfo Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "update microservice fail", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_BAD_REQUEST, message = "Unprocessable MicroServiceInfo JSON REQUEST", response = String.class)})
+ @Produces(MediaType.APPLICATION_JSON)
+ @Timed
+ public Response updateMicroService(
+ @ApiParam(value = "microservice serviceName") @PathParam("serviceName") String serviceName,
+ @ApiParam(value = "microservice version,if the version is empty, please enter \"null\"") @PathParam("version") @DefaultValue("") String version,
+ @ApiParam(value = "microservice Instance Info", required = true) MicroServiceInfo microServiceInfo) {
+
+ MicroServiceFullInfo microServiceFullInfo = MicroServiceWrapper.getInstance().updateMicroServiceInstance(serviceName, version,
+ microServiceInfo);
+ return Response.created(uriInfo.getAbsolutePathBuilder().build()).entity(microServiceFullInfo).build();
+
+ }
+
+ @PUT
+ @Path("/{serviceName}/version/{version}/nodes/{ip}/{port}")
+ @ApiOperation(value = "update single node by serviceName and version and node", code = HttpStatus.SC_CREATED, response = MicroServiceFullInfo.class)
+ @ApiResponses(value = {
+ @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable MicroServiceInfo Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "microservice not found", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "update node fail", response = String.class)})
+ @Produces(MediaType.APPLICATION_JSON)
+ @Timed
+ public Response updateNode(
+ @ApiParam(value = "microservice serviceName", required = true) @PathParam("serviceName") String serviceName,
+ @ApiParam(value = "microservice version,if the version is empty, please enter \"null\"", required = false) @PathParam("version") @DefaultValue("") String version,
+ @ApiParam(value = "ip") @PathParam("ip") String ip,
+ @ApiParam(value = "port") @PathParam("port") String port,
+ @ApiParam(value = "ttl") @QueryParam("ttl") int ttl) {
+
+ MicroServiceFullInfo microServiceFullInfo = MicroServiceWrapper.getInstance().updateMicroServiceNode(serviceName, version, ip,port, ttl);
+
+ return Response.created(uriInfo.getAbsolutePathBuilder().build()).entity(microServiceFullInfo).build();
+
+ }
+
+
+
+ @DELETE
+ @Path("/{serviceName}/version/{version}/nodes/{ip}/{port}")
+ @ApiOperation(value = "delete single node by serviceName and version and node", code = HttpStatus.SC_NO_CONTENT)
+ @ApiResponses(value = {
+ @ApiResponse(code = HttpStatus.SC_NO_CONTENT, message = "delete node succeed "),
+ @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "node not found", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable MicroServiceInfo Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "delete node fail", response = String.class)})
+ @Produces(MediaType.APPLICATION_JSON)
+ @Timed
+ public void deleteNode(
+ @ApiParam(value = "microservice serviceName", required = true) @PathParam("serviceName") String serviceName,
+ @ApiParam(value = "microservice version,if the version is empty, please enter \"null\"", required = false) @PathParam("version") @DefaultValue("") String version,
+ @ApiParam(value = "ip") @PathParam("ip") String ip,
+ @ApiParam(value = "port") @PathParam("port") String port) {
+
+ MicroServiceWrapper.getInstance().deleteMicroServiceInstance(serviceName, version, ip,port);
+
+ }
+
+
+ @DELETE
+ @Path("/{serviceName}/version/{version}")
+ @ApiOperation(value = "delete one full microservice by serviceName and version", code = HttpStatus.SC_NO_CONTENT)
+ @ApiResponses(value = {
+ @ApiResponse(code = HttpStatus.SC_NO_CONTENT, message = "delete microservice succeed "),
+ @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "microservice not found", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable MicroServiceInfo Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "delete microservice fail", response = String.class)})
+ @Produces(MediaType.APPLICATION_JSON)
+ @Timed
+ public void deleteMicroService(
+ @ApiParam(value = "microservice serviceName", required = true) @PathParam("serviceName") String serviceName,
+ @ApiParam(value = "microservice version,if the version is empty, please enter \"null\"", required = false) @PathParam("version") @DefaultValue("") String version,
+ @ApiParam(value = "port", required = false) @QueryParam("port") @DefaultValue("") String port) {
+
+
+ MicroServiceWrapper.getInstance().deleteMicroService(serviceName, version,port);
+
+ }
+
+ @PUT
+ @Path("/{serviceName}/version/{version}/status/{status}")
+ @ApiOperation(value = "update microservice status by serviceName and version", code = HttpStatus.SC_CREATED, response = MicroServiceFullInfo.class)
+ @ApiResponses(value = {
+ @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable MicroServiceInfo Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "microservice not found", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "update status fail", response = String.class)})
+ @Produces(MediaType.APPLICATION_JSON)
+ @Timed
+ public Response updateServiceStatus(
+ @ApiParam(value = "microservice serviceName", required = true) @PathParam("serviceName") String serviceName,
+ @ApiParam(value = "microservice version,if the version is empty, please enter \"null\"", required = false) @PathParam("version") @DefaultValue("") String version,
+ @ApiParam(value = "status,1:abled 0:disabled") @PathParam("status") String status) {
+
+ MicroServiceFullInfo microServiceFullInfo = MicroServiceWrapper.getInstance().updateMicroServiceStatus(serviceName, version,status);
+
+ return Response.created(uriInfo.getAbsolutePathBuilder().build()).entity(microServiceFullInfo).build();
+
+ }
+
+// @PUT
+// @Path("/ttl")
+// @ApiOperation(value = "test json date iso8601 ", code = 200, response = String.class)
+// @Produces(MediaType.APPLICATION_JSON)
+// @Timed
+// public String testIso8601(
+// @ApiParam(value = "microservice Instance Info", required = true) MicroServiceFullInfo microServiceInfo) {
+// Set<NodeInfo> nodes=microServiceInfo.getNodes();
+// String rtn="rtn:";
+// for(NodeInfo node:nodes){
+// Date date=node.getExpiration();
+// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
+// String datettl=sdf.format(date);
+// rtn+=datettl;
+// }
+//
+//
+// return rtn;
+// }
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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.resources;\r
-\r
-import io.swagger.annotations.Api;\r
-import io.swagger.annotations.ApiOperation;\r
-import io.swagger.annotations.ApiParam;\r
-import io.swagger.annotations.ApiResponse;\r
-import io.swagger.annotations.ApiResponses;\r
-\r
-import java.util.List;\r
-\r
-import javax.ws.rs.DefaultValue;\r
-import javax.ws.rs.GET;\r
-import javax.ws.rs.HeaderParam;\r
-import javax.ws.rs.Path;\r
-import javax.ws.rs.PathParam;\r
-import javax.ws.rs.Produces;\r
-import javax.ws.rs.QueryParam;\r
-import javax.ws.rs.core.MediaType;\r
-\r
-import org.openo.msb.api.ServiceAccessInfo;\r
-import org.openo.msb.wrapper.ServiceAccessWrapper;\r
-\r
-import com.codahale.metrics.annotation.Timed;\r
-\r
-\r
-@Path("/serviceaccess")\r
-@Api(tags = {"ServiceAccess"})\r
-@Produces(MediaType.APPLICATION_JSON)\r
-public class ServiceAccessResource {\r
-\r
- @GET\r
- @Path("/{serviceName}")\r
- @ApiOperation(value = "get the msb access address of the service ", response = ServiceAccessInfo.class)\r
- @ApiResponses(value = {@ApiResponse(code = 500, message = "get access address error ")})\r
- @Produces(MediaType.APPLICATION_JSON)\r
- @Timed\r
- public List<ServiceAccessInfo> getApiRoute(\r
- @ApiParam(value = "serviceName") @PathParam("serviceName") String serviceName,\r
- @ApiParam(value = "service type", allowableValues = "api,iui,custom,p2p") @QueryParam("type") String serviceType,\r
- @ApiParam(value = "version") @QueryParam("version") @DefaultValue("") String version,\r
- @ApiParam(hidden = true) @HeaderParam("Host") String host) {\r
- \r
- host=host.split(":")[0];\r
-\r
- return ServiceAccessWrapper.getInstance().getApiRouteAccessAddr(serviceType, serviceName,\r
- version, host);\r
-\r
- }\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.resources;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+
+import java.util.List;
+
+import javax.ws.rs.DefaultValue;
+import javax.ws.rs.GET;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+
+import org.openo.msb.api.ServiceAccessInfo;
+import org.openo.msb.wrapper.ServiceAccessWrapper;
+
+import com.codahale.metrics.annotation.Timed;
+
+
+@Path("/serviceaccess")
+@Api(tags = {"ServiceAccess"})
+@Produces(MediaType.APPLICATION_JSON)
+public class ServiceAccessResource {
+
+ @GET
+ @Path("/{serviceName}")
+ @ApiOperation(value = "get the msb access address of the service ", response = ServiceAccessInfo.class)
+ @ApiResponses(value = {@ApiResponse(code = 500, message = "get access address error ")})
+ @Produces(MediaType.APPLICATION_JSON)
+ @Timed
+ public List<ServiceAccessInfo> getApiRoute(
+ @ApiParam(value = "serviceName") @PathParam("serviceName") String serviceName,
+ @ApiParam(value = "service type", allowableValues = "api,iui,custom,p2p") @QueryParam("type") String serviceType,
+ @ApiParam(value = "version") @QueryParam("version") @DefaultValue("") String version,
+ @ApiParam(hidden = true) @HeaderParam("Host") String host) {
+
+ host=host.split(":")[0];
+
+ return ServiceAccessWrapper.getInstance().getApiRouteAccessAddr(serviceType, serviceName,
+ version, host);
+
+ }
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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
-package org.openo.msb.wrapper;\r
-\r
-import java.io.File;\r
-import java.io.FileNotFoundException;\r
-import java.io.IOException;\r
-import java.net.URL;\r
-import java.util.HashMap;\r
-import java.util.Map;\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.DiscoverInfo;\r
-import org.openo.msb.api.RouteServer;\r
-import org.openo.msb.api.exception.ExtendedInternalServerErrorException;\r
-import org.openo.msb.api.exception.ExtendedNotFoundException;\r
-import org.openo.msb.api.exception.ExtendedNotSupportedException;\r
-import org.openo.msb.wrapper.util.JedisUtil;\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
-import redis.clients.jedis.Jedis;\r
-\r
-\r
-\r
-/**\r
- * @ClassName: ApiRouteServiceWrapper\r
- * @Description: TODO(ApiRoute服务类)\r
- * @author tanghua10186366\r
- * @date 2015年9月25日 上午9:44:04\r
- * \r
- */\r
-public class ApiRouteServiceWrapper {\r
-\r
- private static final Logger LOGGER = LoggerFactory.getLogger(ApiRouteServiceWrapper.class);\r
-\r
-\r
- private static ApiRouteServiceWrapper instance = new ApiRouteServiceWrapper();\r
-\r
- private ApiRouteServiceWrapper() {}\r
-\r
- public static ApiRouteServiceWrapper getInstance() {\r
- return instance;\r
- }\r
-\r
- /**\r
- * @Title: getAllApiRouteInstances\r
- * @Description: TODO(获取全部服务列表)\r
- * @param: @return\r
- * @return: ApiRouteInfoBean[]\r
- */\r
- public ApiRouteInfo[] getAllApiRouteInstances() {\r
-\r
-\r
- Jedis jedis = null;\r
- ApiRouteInfo[] apiRouteList = null;\r
- try {\r
- jedis = JedisUtil.borrowJedisInstance();\r
- if (jedis == null) {\r
- throw new ExtendedInternalServerErrorException(\r
- "fetch from jedis pool failed,null object!");\r
- }\r
-\r
- // 获取全部服务列表\r
- String routekey =\r
- RouteUtil\r
- .getPrefixedKey("", RouteUtil.APIROUTE, "*", RouteUtil.ROUTE_PATH_INFO);\r
- Set<String> routeSet = jedis.keys(routekey);\r
- apiRouteList = new ApiRouteInfo[routeSet.size()];\r
-\r
- int i = 0;\r
- for (String routePath : routeSet) {\r
- String[] routePathArray = routePath.split(":");\r
- ApiRouteInfo apiRoute =\r
- getApiRouteInstance(routePathArray[3], routePathArray[4], jedis);\r
- apiRouteList[i] = apiRoute;\r
- i++;\r
- }\r
-\r
-\r
- } catch (Exception e) {\r
- LOGGER.error("call redis throw exception", e);\r
- throw new ExtendedInternalServerErrorException("call redis throw exception:"\r
- + e.getMessage());\r
-\r
- } finally {\r
- JedisUtil.returnJedisInstance(jedis);\r
- }\r
-\r
- return apiRouteList;\r
- }\r
-\r
-\r
-\r
- public static boolean checkRedisConnect() {\r
-\r
- Jedis jedis = null;\r
- try {\r
- jedis = JedisUtil.borrowJedisInstance();\r
- if (jedis != null) {\r
- return true;\r
- }\r
- } catch (Exception e) {\r
- LOGGER.error("call redis throw exception", e);\r
- } finally {\r
- JedisUtil.returnJedisInstance(jedis);\r
- }\r
-\r
- return false;\r
- }\r
-\r
- /**\r
- * @Title: getApiRouteInstance\r
- * @Description: TODO(通过服务名+版本号获取单个服务对象信息)\r
- * @param: @param serviceName\r
- * @param: @param version\r
- * @param: @return\r
- * @return: ApiRouteInfo\r
- */\r
- public ApiRouteInfo getApiRouteInstance(String serviceName, String version) {\r
-\r
- if (StringUtils.isBlank(serviceName)) {\r
- throw new ExtendedNotSupportedException("serviceName can't be empty");\r
- }\r
-\r
- if (StringUtils.isNotBlank(version)) {\r
- if (!RegExpTestUtil.versionRegExpTest(version)) {\r
- throw new ExtendedNotSupportedException("version (" + version\r
- + ") is not a valid format");\r
- }\r
- }\r
-\r
-\r
- ApiRouteInfo apiRouteInfo = null;\r
-\r
- Jedis jedis = null;\r
- try {\r
- jedis = JedisUtil.borrowJedisInstance();\r
- if (jedis == null) {\r
- throw new ExtendedInternalServerErrorException(\r
- "fetch from jedis pool failed,null object!");\r
- }\r
-\r
- apiRouteInfo = getApiRouteInstance(serviceName, version, jedis);\r
-\r
-\r
- } catch (Exception e) {\r
- LOGGER.error("call redis throw exception", e);\r
- throw new ExtendedInternalServerErrorException("call redis throw exception:"\r
- + e.getMessage());\r
-\r
- } finally {\r
- JedisUtil.returnJedisInstance(jedis);\r
- }\r
-\r
- if (null == apiRouteInfo) {\r
- String errInfo =\r
- "ApiRouteInfo not found: serviceName-" + serviceName + " ,version-" + version;\r
- LOGGER.warn(errInfo);\r
- throw new ExtendedNotFoundException(errInfo);\r
-\r
- }\r
-\r
- return apiRouteInfo;\r
-\r
- }\r
-\r
- public ApiRouteInfo getApiRouteInstance(String serviceName, String version, Jedis jedis)\r
- throws Exception {\r
- if ("null".equals(version)) {\r
- version = "";\r
- }\r
-\r
- ApiRouteInfo apiRouteInfo = null;\r
-\r
-\r
- // 获取info信息\r
- String routekey =\r
- RouteUtil.getPrefixedKey("", RouteUtil.APIROUTE, serviceName, version,\r
- RouteUtil.ROUTE_PATH_INFO);\r
- Map<String, String> infomap = jedis.hgetAll(routekey);\r
- if (!infomap.isEmpty()) {\r
- apiRouteInfo = new ApiRouteInfo();\r
- apiRouteInfo.setServiceName(serviceName);\r
- apiRouteInfo.setVersion(version);\r
- apiRouteInfo.setUrl(infomap.get("url"));\r
- apiRouteInfo.setMetricsUrl(infomap.get("metricsUrl"));\r
- apiRouteInfo.setApiJson(infomap.get("apijson"));\r
- apiRouteInfo.setApiJsonType(infomap.get("apiJsonType"));\r
- apiRouteInfo.setControl(infomap.get("control"));\r
- apiRouteInfo.setStatus(infomap.get("status"));\r
- apiRouteInfo.setVisualRange(infomap.get("visualRange"));\r
- apiRouteInfo.setUseOwnUpstream(infomap.get("useOwnUpstream"));\r
-\r
-\r
- // 获取负载均衡信息\r
- String serviceLBkey =\r
- RouteUtil.getPrefixedKey("", RouteUtil.APIROUTE, serviceName, version,\r
- RouteUtil.ROUTE_PATH_LOADBALANCE);\r
- Set<String> serviceLBset = jedis.keys(serviceLBkey + ":*");\r
- int serverNum = serviceLBset.size();\r
- RouteServer[] apiRouteServerList = new RouteServer[serverNum];\r
- int i = 0;\r
- for (String serviceInfo : serviceLBset) {\r
- Map<String, String> serviceLBmap = jedis.hgetAll(serviceInfo);\r
- RouteServer server = new RouteServer();\r
- server.setIp(serviceLBmap.get("ip"));\r
- server.setPort(serviceLBmap.get("port"));\r
- server.setWeight(Integer.parseInt(serviceLBmap.get("weight")));\r
- apiRouteServerList[i] = server;\r
- i++;\r
- }\r
-\r
- apiRouteInfo.setServers(apiRouteServerList);\r
-\r
- // 获取生命周期信息\r
-\r
-// ApiRouteLifeCycle lifeCycle = new ApiRouteLifeCycle();\r
-// String serviceLifekey =\r
-// RouteUtil.getPrefixedKey("", RouteUtil.APIROUTE, serviceName, version,\r
-// RouteUtil.APIROUTE_PATH_LIFE);\r
-// Map<String, String> serviceLifeMap = jedis.hgetAll(serviceLifekey);\r
-//\r
-// lifeCycle.setInstallPath(serviceLifeMap.get("path"));\r
-// lifeCycle.setStartScript(serviceLifeMap.get("start"));\r
-// lifeCycle.setStopScript(serviceLifeMap.get("stop"));\r
-//\r
-// apiRouteInfo.setLifeCycle(lifeCycle);\r
- }\r
-\r
-\r
- return apiRouteInfo;\r
- }\r
-\r
- /**\r
- * @Title: updateApiRouteInstance\r
- * @Description: TODO(更新单个服务信息)\r
- * @param: @param serviceName\r
- * @param: @param version\r
- * @param: @param apiRouteInfo\r
- * @param: @return\r
- * @return: ApiRouteInfo\r
- */\r
- public synchronized ApiRouteInfo updateApiRouteInstance(String serviceName, String version,\r
- ApiRouteInfo apiRouteInfo, String serverPort) {\r
-\r
- if ("null".equals(version)) {\r
- version = "";\r
- }\r
- \r
- if (StringUtils.isBlank(serviceName)) {\r
- throw new ExtendedNotSupportedException("serviceName can't be empty");\r
- }\r
-\r
- if (StringUtils.isNotBlank(version)) {\r
- if (!RegExpTestUtil.versionRegExpTest(version)) {\r
- throw new ExtendedNotSupportedException("version (" + version\r
- + ") is not a valid format");\r
- }\r
- }\r
-\r
- \r
-\r
-\r
- try {\r
-\r
-\r
- if (serviceName.equals(apiRouteInfo.getServiceName())\r
- && version.equals(apiRouteInfo.getVersion())) {\r
- // 删除已存在负载均衡服务器信息\r
- deleteApiRoute(serviceName, version, RouteUtil.ROUTE_PATH_LOADBALANCE + "*",\r
- serverPort);\r
-\r
- } else {\r
- // 如果已修改服务名或者版本号,先删除此服务全部已有信息\r
- deleteApiRoute(serviceName, version, "*", serverPort);\r
- }\r
-\r
-\r
- saveApiRouteInstance(apiRouteInfo, serverPort);\r
-\r
-\r
- } catch (ExtendedNotSupportedException e) {\r
- throw e;\r
- } catch (Exception e) {\r
- LOGGER.error("update ApiRoute throw exception", e);\r
- throw new ExtendedInternalServerErrorException("update apiRouteInfo throw exception"\r
- + e.getMessage());\r
-\r
- }\r
-\r
- return apiRouteInfo;\r
-\r
- }\r
-\r
- /**\r
- * @Title updateApiRouteStatus\r
- * @Description TODO(更新单个服务状态)\r
- * @param serviceName\r
- * @param version\r
- * @param status\r
- * @return\r
- * @return RouteResult\r
- */\r
- public synchronized ApiRouteInfo updateApiRouteStatus(String serviceName, String version,\r
- String status) {\r
-\r
- if ("null".equals(version)) {\r
- version = "";\r
- }\r
- \r
- if (StringUtils.isBlank(serviceName)) {\r
- throw new ExtendedNotSupportedException("serviceName can't be empty");\r
- }\r
-\r
- if (StringUtils.isNotBlank(version)) {\r
- if (!RegExpTestUtil.versionRegExpTest(version)) {\r
- throw new ExtendedNotSupportedException("version (" + version\r
- + ") is not a valid format");\r
- }\r
- }\r
-\r
- if (!RouteUtil.contain(RouteUtil.statusRangeMatches, status)) {\r
- throw new ExtendedNotSupportedException(\r
- "save ApiRouteInfo Status FAIL:status is wrong,value range:("\r
- + RouteUtil.show(RouteUtil.statusRangeMatches) + ")");\r
- }\r
-\r
- ApiRouteInfo new_apiRouteInfo = getApiRouteInstance(serviceName, version);\r
-\r
-\r
- // 准备info信息\r
- String serviceInfokey =\r
- RouteUtil.getPrefixedKey("", RouteUtil.APIROUTE, serviceName, version,\r
- RouteUtil.ROUTE_PATH_INFO);\r
- Map<String, String> serviceInfoMap = new HashMap<String, String>();\r
- serviceInfoMap.put("status", status);\r
-\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
- // 保存info信息\r
- jedis.hmset(serviceInfokey, serviceInfoMap);\r
- new_apiRouteInfo.setStatus(status);\r
-\r
-\r
- } catch (Exception e) {\r
- LOGGER.error("update ApiRoute status throw exception", e);\r
- throw new ExtendedInternalServerErrorException("update ApiRoute status throw exception"\r
- + e.getMessage());\r
-\r
- } finally {\r
- JedisUtil.returnJedisInstance(jedis);\r
- }\r
-\r
- return new_apiRouteInfo;\r
- }\r
-\r
-\r
- /**\r
- * @Title: saveApiRouteInstance\r
- * @Description: TODO(存储单个服务信息)\r
- * @param: @param apiRouteInfo\r
- * @param: @return\r
- * @return: ApiRouteInfo\r
- */\r
- public synchronized ApiRouteInfo saveApiRouteInstance(ApiRouteInfo apiRouteInfo,\r
- String serverPort) {\r
-\r
- \r
- \r
- if (StringUtils.isBlank(apiRouteInfo.getServiceName())\r
- || apiRouteInfo.getServers().length == 0) {\r
- throw new ExtendedNotSupportedException(\r
- "save apiRouteInfo FAIL: Some required fields are empty");\r
- }\r
-\r
- if (StringUtils.isNotBlank(apiRouteInfo.getVersion())) {\r
- if (!RegExpTestUtil.versionRegExpTest(apiRouteInfo.getVersion())) {\r
- throw new ExtendedNotSupportedException("version (" + apiRouteInfo.getVersion()\r
- + ") is not a valid format");\r
- }\r
- }\r
-\r
- if (StringUtils.isNotBlank(apiRouteInfo.getUrl())) {\r
- if (!RegExpTestUtil.urlRegExpTest(apiRouteInfo.getUrl())) {\r
- throw new ExtendedNotSupportedException(\r
- "save apiRouteInfo FAIL:url is not a valid format(url must be begin with /)");\r
- \r
- }\r
- }\r
-\r
- if (!RouteUtil.contain(RouteUtil.visualRangeRange, apiRouteInfo.getVisualRange())) {\r
- throw new ExtendedNotSupportedException(\r
- "save apiRouteInfo FAIL:VisualRange is wrong,value range:("\r
- + RouteUtil.show(RouteUtil.visualRangeMatches) + ")");\r
- }\r
-\r
- if (!RouteUtil.contain(RouteUtil.controlRangeMatches, apiRouteInfo.getControl())) {\r
- throw new ExtendedNotSupportedException(\r
- "save apiRouteInfo FAIL:control is wrong,value range:("\r
- + RouteUtil.show(RouteUtil.controlRangeMatches) + ")");\r
- }\r
-\r
- if (!RouteUtil.contain(RouteUtil.statusRangeMatches, apiRouteInfo.getStatus())) {\r
- throw new ExtendedNotSupportedException(\r
- "save apiRouteInfo FAIL:status is wrong,value range:("\r
- + RouteUtil.show(RouteUtil.statusRangeMatches) + ")");\r
- }\r
-\r
- if (!RouteUtil.contain(RouteUtil.useOwnUpstreamRangeMatches, apiRouteInfo.getUseOwnUpstream())) {\r
- throw new ExtendedNotSupportedException(\r
- "save apiRouteInfo FAIL:useOwnUpstream is wrong,value range:("\r
- + RouteUtil.show(RouteUtil.useOwnUpstreamRangeMatches) + ")");\r
- }\r
-\r
- // 检查服务实例格式\r
- RouteServer[] serverList = apiRouteInfo.getServers();\r
- for (int i = 0; i < serverList.length; i++) {\r
- RouteServer server = serverList[i];\r
- if (!RegExpTestUtil.ipRegExpTest(server.getIp())) {\r
- throw new ExtendedNotSupportedException("save apiRouteInfo FAIL:IP("\r
- + server.getIp() + ")is not a valid ip address");\r
- }\r
-\r
- if (!RegExpTestUtil.portRegExpTest(server.getPort())) {\r
- throw new ExtendedNotSupportedException("save apiRouteInfo FAIL:Port("\r
- + server.getPort() + ")is not a valid Port address");\r
- }\r
- }\r
-\r
- // 准备info信息\r
- String serviceInfokey =\r
- RouteUtil.getPrefixedKey(serverPort, RouteUtil.APIROUTE,\r
- apiRouteInfo.getServiceName().trim(), apiRouteInfo.getVersion().trim(),\r
- RouteUtil.ROUTE_PATH_INFO);\r
- Map<String, String> serviceInfoMap = new HashMap<String, String>();\r
- serviceInfoMap.put("url", "/".equals(apiRouteInfo.getUrl().trim()) ? "" : apiRouteInfo\r
- .getUrl().trim());\r
- serviceInfoMap.put("apijson", apiRouteInfo.getApiJson());\r
- serviceInfoMap.put("apiJsonType", apiRouteInfo.getApiJsonType());\r
- serviceInfoMap.put("metricsUrl", apiRouteInfo.getMetricsUrl());\r
- serviceInfoMap.put("control", apiRouteInfo.getControl());\r
- serviceInfoMap.put("status", apiRouteInfo.getStatus());\r
- serviceInfoMap.put("visualRange", apiRouteInfo.getVisualRange());\r
- serviceInfoMap.put("useOwnUpstream", apiRouteInfo.getUseOwnUpstream());\r
-\r
- // 准备负载均衡信息\r
- String serviceLBkey =\r
- RouteUtil.getPrefixedKey(serverPort, RouteUtil.APIROUTE,\r
- apiRouteInfo.getServiceName(), apiRouteInfo.getVersion(),\r
- RouteUtil.ROUTE_PATH_LOADBALANCE);\r
-\r
-\r
- Jedis jedis = null;\r
- try {\r
- jedis = JedisUtil.borrowJedisInstance();\r
- if (jedis == null) {\r
- throw new ExtendedInternalServerErrorException(\r
- "fetch from jedis pool failed,null object!");\r
- }\r
- // 保存info信息\r
- jedis.hmset(serviceInfokey, serviceInfoMap);\r
-\r
- // 保存负载均衡信息\r
- for (int i = 0; i < serverList.length; i++) {\r
- Map<String, String> servermap = new HashMap<String, String>();\r
- RouteServer server = serverList[i];\r
-\r
- servermap.put("ip", server.getIp());\r
- servermap.put("port", server.getPort());\r
- servermap.put("weight", Integer.toString(server.getWeight()));\r
-\r
- jedis.hmset(serviceLBkey + ":server" + (i + 1), servermap);\r
- }\r
- // 保存生命周期信息\r
-\r
-// ApiRouteLifeCycle lifeCycle = apiRouteInfo.getLifeCycle();\r
-// if (lifeCycle != null) {\r
-// String serviceLifekey =\r
-// RouteUtil.getPrefixedKey(serverPort, RouteUtil.APIROUTE,\r
-// apiRouteInfo.getServiceName(), apiRouteInfo.getVersion(),\r
-// RouteUtil.APIROUTE_PATH_LIFE);\r
-// Map<String, String> serviceLifeMap = new HashMap<String, String>();\r
-// serviceLifeMap.put("path", lifeCycle.getInstallPath());\r
-// serviceLifeMap.put("start", lifeCycle.getStartScript());\r
-// serviceLifeMap.put("stop", lifeCycle.getStopScript());\r
-// jedis.hmset(serviceLifekey, serviceLifeMap);\r
-// }\r
-\r
-\r
-\r
- } catch (Exception e) {\r
- LOGGER.error("call redis throw exception", e);\r
- throw new ExtendedInternalServerErrorException("call redis throw exception:"\r
- + e.getMessage());\r
-\r
- } finally {\r
- JedisUtil.returnJedisInstance(jedis);\r
- }\r
-\r
- return apiRouteInfo;\r
- }\r
-\r
-\r
-\r
- /**\r
- * @Title: deleteApiRoute\r
- * @Description: TODO(删除单个服务信息)\r
- * @param: @param type\r
- * @param: @param serviceName\r
- * @param: @param version\r
- * @param: @param delKey\r
- * @param: @return\r
- * @return: void\r
- */\r
- public synchronized void deleteApiRoute(String serviceName, String version, String delKey,\r
- String serverPort) {\r
-\r
- if ("null".equals(version)) {\r
- version = "";\r
- }\r
- \r
- if (StringUtils.isBlank(serviceName)) {\r
- throw new ExtendedNotSupportedException("serviceName can't be empty");\r
- }\r
-\r
- if (StringUtils.isNotBlank(version)) {\r
- if (!RegExpTestUtil.versionRegExpTest(version)) {\r
- throw new ExtendedNotSupportedException("version (" + version\r
- + ") is not a valid format");\r
- }\r
- }\r
-\r
- \r
- Jedis jedis = null;\r
- try {\r
- jedis = JedisUtil.borrowJedisInstance();\r
- if (jedis == null) {\r
- throw new ExtendedInternalServerErrorException(\r
- "fetch from jedis pool failed,null object!");\r
- }\r
-\r
- // 获取info信息\r
- String routekey =\r
- RouteUtil.getPrefixedKey(serverPort, RouteUtil.APIROUTE, serviceName, version,\r
- delKey);\r
- Set<String> infoSet = jedis.keys(routekey);\r
-\r
- if (infoSet.isEmpty()) {\r
- throw new ExtendedNotFoundException("delete ApiRoute FAIL:serviceName-"\r
- + serviceName + ",version:" + version + " not fond ");\r
- }\r
-\r
- String[] paths = new String[infoSet.size()];\r
-\r
- // Set-->数组\r
- infoSet.toArray(paths);\r
-\r
- jedis.del(paths);\r
-\r
-\r
- } catch (ExtendedNotFoundException e) {\r
- throw e;\r
- } catch (Exception e) {\r
- LOGGER.error("delete ApiRoute throw exception", e);\r
- throw new ExtendedInternalServerErrorException("delete ApiRoute throw exception:"\r
- + e.getMessage());\r
- } finally {\r
- JedisUtil.returnJedisInstance(jedis);\r
- }\r
-\r
-\r
- }\r
-\r
- /**\r
- * @Title: getAllApiDocs\r
- * @Description: TODO(获取本地ext\initSwaggerJson目录的全部json文件目录)\r
- * @param: @return\r
- * @return: String[]\r
- */\r
- public String[] getAllApiDocs() {\r
- URL apiDocsPath = ApiRouteServiceWrapper.class.getResource("/ext/initSwaggerJson");\r
- if (apiDocsPath != null) {\r
- String path = apiDocsPath.getPath();\r
-\r
- try {\r
- return readfile(path);\r
- } catch (FileNotFoundException e) {\r
- // TODO Auto-generated catch block\r
- LOGGER.error("read ApiDocs Files throw FileNotFoundException", e);\r
- throw new ExtendedInternalServerErrorException("read ApiDocs Files throw FileNotFoundException:"\r
- + e.getMessage());\r
- } catch (IOException e) {\r
- // TODO Auto-generated catch block\r
- LOGGER.error("read ApiDocs Files throw IOexception", e);\r
- throw new ExtendedInternalServerErrorException("read ApiDocs Files throw IOexception:"\r
- + e.getMessage());\r
- }\r
-\r
- }\r
-\r
-\r
- return null;\r
- }\r
-\r
- /**\r
- * 读取某个文件夹下的所有文件\r
- */\r
- public String[] readfile(String filepath) throws FileNotFoundException, IOException {\r
- File file = new File(filepath);\r
- if (file.isDirectory()) {\r
- String[] filelist = file.list();\r
- return filelist;\r
- }\r
- return null;\r
- }\r
-\r
- public String getApiGatewayPort() {\r
- // return JedisUtil.serverIp+":"+JedisUtil.serverPort;\r
- return System.getenv("APIGATEWAY_EXPOSE_PORT") == null ? String\r
- .valueOf(JedisUtil.serverPort) : System.getenv("APIGATEWAY_EXPOSE_PORT");\r
-\r
- }\r
-\r
- public DiscoverInfo getServiceDiscoverInfo() {\r
- return RouteUtil.discoverInfo;\r
-\r
- }\r
-\r
-\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.wrapper;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.lang3.StringUtils;
+import org.openo.msb.api.ApiRouteInfo;
+import org.openo.msb.api.DiscoverInfo;
+import org.openo.msb.api.RouteServer;
+import org.openo.msb.api.exception.ExtendedInternalServerErrorException;
+import org.openo.msb.api.exception.ExtendedNotFoundException;
+import org.openo.msb.api.exception.ExtendedNotSupportedException;
+import org.openo.msb.wrapper.util.JedisUtil;
+import org.openo.msb.wrapper.util.RegExpTestUtil;
+import org.openo.msb.wrapper.util.RouteUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import redis.clients.jedis.Jedis;
+
+
+
+/**
+ * @ClassName: ApiRouteServiceWrapper
+ * @Description: TODO(ApiRoute服务类)
+ * @author tanghua10186366
+ * @date 2015年9月25日 上午9:44:04
+ *
+ */
+public class ApiRouteServiceWrapper {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ApiRouteServiceWrapper.class);
+
+
+ private static ApiRouteServiceWrapper instance = new ApiRouteServiceWrapper();
+
+ private ApiRouteServiceWrapper() {}
+
+ public static ApiRouteServiceWrapper getInstance() {
+ return instance;
+ }
+
+ /**
+ * @Title: getAllApiRouteInstances
+ * @Description: TODO(获取全部服务列表)
+ * @param: @return
+ * @return: ApiRouteInfoBean[]
+ */
+ public ApiRouteInfo[] getAllApiRouteInstances() {
+
+
+ Jedis jedis = null;
+ ApiRouteInfo[] apiRouteList = null;
+ try {
+ jedis = JedisUtil.borrowJedisInstance();
+ if (jedis == null) {
+ throw new ExtendedInternalServerErrorException(
+ "fetch from jedis pool failed,null object!");
+ }
+
+ // 获取全部服务列表
+ String routekey =
+ RouteUtil
+ .getPrefixedKey("", RouteUtil.APIROUTE, "*", RouteUtil.ROUTE_PATH_INFO);
+ Set<String> routeSet = jedis.keys(routekey);
+ apiRouteList = new ApiRouteInfo[routeSet.size()];
+
+ int i = 0;
+ for (String routePath : routeSet) {
+ String[] routePathArray = routePath.split(":");
+ ApiRouteInfo apiRoute =
+ getApiRouteInstance(routePathArray[3], routePathArray[4], jedis);
+ apiRouteList[i] = apiRoute;
+ i++;
+ }
+
+
+ } catch (Exception e) {
+ LOGGER.error("call redis throw exception", e);
+ throw new ExtendedInternalServerErrorException("call redis throw exception:"
+ + e.getMessage());
+
+ } finally {
+ JedisUtil.returnJedisInstance(jedis);
+ }
+
+ return apiRouteList;
+ }
+
+
+
+ public static boolean checkRedisConnect() {
+
+ Jedis jedis = null;
+ try {
+ jedis = JedisUtil.borrowJedisInstance();
+ if (jedis != null) {
+ return true;
+ }
+ } catch (Exception e) {
+ LOGGER.error("call redis throw exception", e);
+ } finally {
+ JedisUtil.returnJedisInstance(jedis);
+ }
+
+ return false;
+ }
+
+ /**
+ * @Title: getApiRouteInstance
+ * @Description: TODO(通过服务名+版本号获取单个服务对象信息)
+ * @param: @param serviceName
+ * @param: @param version
+ * @param: @return
+ * @return: ApiRouteInfo
+ */
+ public ApiRouteInfo getApiRouteInstance(String serviceName, String version) {
+
+ if (StringUtils.isBlank(serviceName)) {
+ throw new ExtendedNotSupportedException("serviceName can't be empty");
+ }
+
+ if (StringUtils.isNotBlank(version)) {
+ if (!RegExpTestUtil.versionRegExpTest(version)) {
+ throw new ExtendedNotSupportedException("version (" + version
+ + ") is not a valid format");
+ }
+ }
+
+
+ ApiRouteInfo apiRouteInfo = null;
+
+ Jedis jedis = null;
+ try {
+ jedis = JedisUtil.borrowJedisInstance();
+ if (jedis == null) {
+ throw new ExtendedInternalServerErrorException(
+ "fetch from jedis pool failed,null object!");
+ }
+
+ apiRouteInfo = getApiRouteInstance(serviceName, version, jedis);
+
+
+ } catch (Exception e) {
+ LOGGER.error("call redis throw exception", e);
+ throw new ExtendedInternalServerErrorException("call redis throw exception:"
+ + e.getMessage());
+
+ } finally {
+ JedisUtil.returnJedisInstance(jedis);
+ }
+
+ if (null == apiRouteInfo) {
+ String errInfo =
+ "ApiRouteInfo not found: serviceName-" + serviceName + " ,version-" + version;
+ LOGGER.warn(errInfo);
+ throw new ExtendedNotFoundException(errInfo);
+
+ }
+
+ return apiRouteInfo;
+
+ }
+
+ public ApiRouteInfo getApiRouteInstance(String serviceName, String version, Jedis jedis)
+ throws Exception {
+ if ("null".equals(version)) {
+ version = "";
+ }
+
+ ApiRouteInfo apiRouteInfo = null;
+
+
+ // 获取info信息
+ String routekey =
+ RouteUtil.getPrefixedKey("", RouteUtil.APIROUTE, serviceName, version,
+ RouteUtil.ROUTE_PATH_INFO);
+ Map<String, String> infomap = jedis.hgetAll(routekey);
+ if (!infomap.isEmpty()) {
+ apiRouteInfo = new ApiRouteInfo();
+ apiRouteInfo.setServiceName(serviceName);
+ apiRouteInfo.setVersion(version);
+ apiRouteInfo.setUrl(infomap.get("url"));
+ apiRouteInfo.setMetricsUrl(infomap.get("metricsUrl"));
+ apiRouteInfo.setApiJson(infomap.get("apijson"));
+ apiRouteInfo.setApiJsonType(infomap.get("apiJsonType"));
+ apiRouteInfo.setControl(infomap.get("control"));
+ apiRouteInfo.setStatus(infomap.get("status"));
+ apiRouteInfo.setVisualRange(infomap.get("visualRange"));
+ apiRouteInfo.setUseOwnUpstream(infomap.get("useOwnUpstream"));
+
+
+ // 获取负载均衡信息
+ String serviceLBkey =
+ RouteUtil.getPrefixedKey("", RouteUtil.APIROUTE, serviceName, version,
+ RouteUtil.ROUTE_PATH_LOADBALANCE);
+ Set<String> serviceLBset = jedis.keys(serviceLBkey + ":*");
+ int serverNum = serviceLBset.size();
+ RouteServer[] apiRouteServerList = new RouteServer[serverNum];
+ int i = 0;
+ for (String serviceInfo : serviceLBset) {
+ Map<String, String> serviceLBmap = jedis.hgetAll(serviceInfo);
+ RouteServer server = new RouteServer();
+ server.setIp(serviceLBmap.get("ip"));
+ server.setPort(serviceLBmap.get("port"));
+ server.setWeight(Integer.parseInt(serviceLBmap.get("weight")));
+ apiRouteServerList[i] = server;
+ i++;
+ }
+
+ apiRouteInfo.setServers(apiRouteServerList);
+
+ // 获取生命周期信息
+
+// ApiRouteLifeCycle lifeCycle = new ApiRouteLifeCycle();
+// String serviceLifekey =
+// RouteUtil.getPrefixedKey("", RouteUtil.APIROUTE, serviceName, version,
+// RouteUtil.APIROUTE_PATH_LIFE);
+// Map<String, String> serviceLifeMap = jedis.hgetAll(serviceLifekey);
+//
+// lifeCycle.setInstallPath(serviceLifeMap.get("path"));
+// lifeCycle.setStartScript(serviceLifeMap.get("start"));
+// lifeCycle.setStopScript(serviceLifeMap.get("stop"));
+//
+// apiRouteInfo.setLifeCycle(lifeCycle);
+ }
+
+
+ return apiRouteInfo;
+ }
+
+ /**
+ * @Title: updateApiRouteInstance
+ * @Description: TODO(更新单个服务信息)
+ * @param: @param serviceName
+ * @param: @param version
+ * @param: @param apiRouteInfo
+ * @param: @return
+ * @return: ApiRouteInfo
+ */
+ public synchronized ApiRouteInfo updateApiRouteInstance(String serviceName, String version,
+ ApiRouteInfo apiRouteInfo, String serverPort) {
+
+ if ("null".equals(version)) {
+ version = "";
+ }
+
+ if (StringUtils.isBlank(serviceName)) {
+ throw new ExtendedNotSupportedException("serviceName can't be empty");
+ }
+
+ if (StringUtils.isNotBlank(version)) {
+ if (!RegExpTestUtil.versionRegExpTest(version)) {
+ throw new ExtendedNotSupportedException("version (" + version
+ + ") is not a valid format");
+ }
+ }
+
+
+
+
+ try {
+
+
+ if (serviceName.equals(apiRouteInfo.getServiceName())
+ && version.equals(apiRouteInfo.getVersion())) {
+ // 删除已存在负载均衡服务器信息
+ deleteApiRoute(serviceName, version, RouteUtil.ROUTE_PATH_LOADBALANCE + "*",
+ serverPort);
+
+ } else {
+ // 如果已修改服务名或者版本号,先删除此服务全部已有信息
+ deleteApiRoute(serviceName, version, "*", serverPort);
+ }
+
+
+ saveApiRouteInstance(apiRouteInfo, serverPort);
+
+
+ } catch (ExtendedNotSupportedException e) {
+ throw e;
+ } catch (Exception e) {
+ LOGGER.error("update ApiRoute throw exception", e);
+ throw new ExtendedInternalServerErrorException("update apiRouteInfo throw exception"
+ + e.getMessage());
+
+ }
+
+ return apiRouteInfo;
+
+ }
+
+ /**
+ * @Title updateApiRouteStatus
+ * @Description TODO(更新单个服务状态)
+ * @param serviceName
+ * @param version
+ * @param status
+ * @return
+ * @return RouteResult
+ */
+ public synchronized ApiRouteInfo updateApiRouteStatus(String serviceName, String version,
+ String status) {
+
+ if ("null".equals(version)) {
+ version = "";
+ }
+
+ if (StringUtils.isBlank(serviceName)) {
+ throw new ExtendedNotSupportedException("serviceName can't be empty");
+ }
+
+ if (StringUtils.isNotBlank(version)) {
+ if (!RegExpTestUtil.versionRegExpTest(version)) {
+ throw new ExtendedNotSupportedException("version (" + version
+ + ") is not a valid format");
+ }
+ }
+
+ if (!RouteUtil.contain(RouteUtil.statusRangeMatches, status)) {
+ throw new ExtendedNotSupportedException(
+ "save ApiRouteInfo Status FAIL:status is wrong,value range:("
+ + RouteUtil.show(RouteUtil.statusRangeMatches) + ")");
+ }
+
+ ApiRouteInfo new_apiRouteInfo = getApiRouteInstance(serviceName, version);
+
+
+ // 准备info信息
+ String serviceInfokey =
+ RouteUtil.getPrefixedKey("", RouteUtil.APIROUTE, serviceName, version,
+ RouteUtil.ROUTE_PATH_INFO);
+ Map<String, String> serviceInfoMap = new HashMap<String, String>();
+ serviceInfoMap.put("status", status);
+
+
+ Jedis jedis = null;
+ try {
+ jedis = JedisUtil.borrowJedisInstance();
+ if (jedis == null) {
+ throw new Exception("fetch from jedis pool failed,null object!");
+ }
+ // 保存info信息
+ jedis.hmset(serviceInfokey, serviceInfoMap);
+ new_apiRouteInfo.setStatus(status);
+
+
+ } catch (Exception e) {
+ LOGGER.error("update ApiRoute status throw exception", e);
+ throw new ExtendedInternalServerErrorException("update ApiRoute status throw exception"
+ + e.getMessage());
+
+ } finally {
+ JedisUtil.returnJedisInstance(jedis);
+ }
+
+ return new_apiRouteInfo;
+ }
+
+
+ /**
+ * @Title: saveApiRouteInstance
+ * @Description: TODO(存储单个服务信息)
+ * @param: @param apiRouteInfo
+ * @param: @return
+ * @return: ApiRouteInfo
+ */
+ public synchronized ApiRouteInfo saveApiRouteInstance(ApiRouteInfo apiRouteInfo,
+ String serverPort) {
+
+
+
+ if (StringUtils.isBlank(apiRouteInfo.getServiceName())
+ || apiRouteInfo.getServers().length == 0) {
+ throw new ExtendedNotSupportedException(
+ "save apiRouteInfo FAIL: Some required fields are empty");
+ }
+
+ if (StringUtils.isNotBlank(apiRouteInfo.getVersion())) {
+ if (!RegExpTestUtil.versionRegExpTest(apiRouteInfo.getVersion())) {
+ throw new ExtendedNotSupportedException("version (" + apiRouteInfo.getVersion()
+ + ") is not a valid format");
+ }
+ }
+
+ if (StringUtils.isNotBlank(apiRouteInfo.getUrl())) {
+ if (!RegExpTestUtil.urlRegExpTest(apiRouteInfo.getUrl())) {
+ throw new ExtendedNotSupportedException(
+ "save apiRouteInfo FAIL:url is not a valid format(url must be begin with /)");
+
+ }
+ }
+
+ if (!RouteUtil.contain(RouteUtil.visualRangeRange, apiRouteInfo.getVisualRange())) {
+ throw new ExtendedNotSupportedException(
+ "save apiRouteInfo FAIL:VisualRange is wrong,value range:("
+ + RouteUtil.show(RouteUtil.visualRangeMatches) + ")");
+ }
+
+ if (!RouteUtil.contain(RouteUtil.controlRangeMatches, apiRouteInfo.getControl())) {
+ throw new ExtendedNotSupportedException(
+ "save apiRouteInfo FAIL:control is wrong,value range:("
+ + RouteUtil.show(RouteUtil.controlRangeMatches) + ")");
+ }
+
+ if (!RouteUtil.contain(RouteUtil.statusRangeMatches, apiRouteInfo.getStatus())) {
+ throw new ExtendedNotSupportedException(
+ "save apiRouteInfo FAIL:status is wrong,value range:("
+ + RouteUtil.show(RouteUtil.statusRangeMatches) + ")");
+ }
+
+ if (!RouteUtil.contain(RouteUtil.useOwnUpstreamRangeMatches, apiRouteInfo.getUseOwnUpstream())) {
+ throw new ExtendedNotSupportedException(
+ "save apiRouteInfo FAIL:useOwnUpstream is wrong,value range:("
+ + RouteUtil.show(RouteUtil.useOwnUpstreamRangeMatches) + ")");
+ }
+
+ // 检查服务实例格式
+ RouteServer[] serverList = apiRouteInfo.getServers();
+ for (int i = 0; i < serverList.length; i++) {
+ RouteServer server = serverList[i];
+ if (!RegExpTestUtil.ipRegExpTest(server.getIp())) {
+ throw new ExtendedNotSupportedException("save apiRouteInfo FAIL:IP("
+ + server.getIp() + ")is not a valid ip address");
+ }
+
+ if (!RegExpTestUtil.portRegExpTest(server.getPort())) {
+ throw new ExtendedNotSupportedException("save apiRouteInfo FAIL:Port("
+ + server.getPort() + ")is not a valid Port address");
+ }
+ }
+
+ // 准备info信息
+ String serviceInfokey =
+ RouteUtil.getPrefixedKey(serverPort, RouteUtil.APIROUTE,
+ apiRouteInfo.getServiceName().trim(), apiRouteInfo.getVersion().trim(),
+ RouteUtil.ROUTE_PATH_INFO);
+ Map<String, String> serviceInfoMap = new HashMap<String, String>();
+ serviceInfoMap.put("url", "/".equals(apiRouteInfo.getUrl().trim()) ? "" : apiRouteInfo
+ .getUrl().trim());
+ serviceInfoMap.put("apijson", apiRouteInfo.getApiJson());
+ serviceInfoMap.put("apiJsonType", apiRouteInfo.getApiJsonType());
+ serviceInfoMap.put("metricsUrl", apiRouteInfo.getMetricsUrl());
+ serviceInfoMap.put("control", apiRouteInfo.getControl());
+ serviceInfoMap.put("status", apiRouteInfo.getStatus());
+ serviceInfoMap.put("visualRange", apiRouteInfo.getVisualRange());
+ serviceInfoMap.put("useOwnUpstream", apiRouteInfo.getUseOwnUpstream());
+
+ // 准备负载均衡信息
+ String serviceLBkey =
+ RouteUtil.getPrefixedKey(serverPort, RouteUtil.APIROUTE,
+ apiRouteInfo.getServiceName(), apiRouteInfo.getVersion(),
+ RouteUtil.ROUTE_PATH_LOADBALANCE);
+
+
+ Jedis jedis = null;
+ try {
+ jedis = JedisUtil.borrowJedisInstance();
+ if (jedis == null) {
+ throw new ExtendedInternalServerErrorException(
+ "fetch from jedis pool failed,null object!");
+ }
+ // 保存info信息
+ jedis.hmset(serviceInfokey, serviceInfoMap);
+
+ // 保存负载均衡信息
+ for (int i = 0; i < serverList.length; i++) {
+ Map<String, String> servermap = new HashMap<String, String>();
+ RouteServer server = serverList[i];
+
+ servermap.put("ip", server.getIp());
+ servermap.put("port", server.getPort());
+ servermap.put("weight", Integer.toString(server.getWeight()));
+
+ jedis.hmset(serviceLBkey + ":server" + (i + 1), servermap);
+ }
+ // 保存生命周期信息
+
+// ApiRouteLifeCycle lifeCycle = apiRouteInfo.getLifeCycle();
+// if (lifeCycle != null) {
+// String serviceLifekey =
+// RouteUtil.getPrefixedKey(serverPort, RouteUtil.APIROUTE,
+// apiRouteInfo.getServiceName(), apiRouteInfo.getVersion(),
+// RouteUtil.APIROUTE_PATH_LIFE);
+// Map<String, String> serviceLifeMap = new HashMap<String, String>();
+// serviceLifeMap.put("path", lifeCycle.getInstallPath());
+// serviceLifeMap.put("start", lifeCycle.getStartScript());
+// serviceLifeMap.put("stop", lifeCycle.getStopScript());
+// jedis.hmset(serviceLifekey, serviceLifeMap);
+// }
+
+
+
+ } catch (Exception e) {
+ LOGGER.error("call redis throw exception", e);
+ throw new ExtendedInternalServerErrorException("call redis throw exception:"
+ + e.getMessage());
+
+ } finally {
+ JedisUtil.returnJedisInstance(jedis);
+ }
+
+ return apiRouteInfo;
+ }
+
+
+
+ /**
+ * @Title: deleteApiRoute
+ * @Description: TODO(删除单个服务信息)
+ * @param: @param type
+ * @param: @param serviceName
+ * @param: @param version
+ * @param: @param delKey
+ * @param: @return
+ * @return: void
+ */
+ public synchronized void deleteApiRoute(String serviceName, String version, String delKey,
+ String serverPort) {
+
+ if ("null".equals(version)) {
+ version = "";
+ }
+
+ if (StringUtils.isBlank(serviceName)) {
+ throw new ExtendedNotSupportedException("serviceName can't be empty");
+ }
+
+ if (StringUtils.isNotBlank(version)) {
+ if (!RegExpTestUtil.versionRegExpTest(version)) {
+ throw new ExtendedNotSupportedException("version (" + version
+ + ") is not a valid format");
+ }
+ }
+
+
+ Jedis jedis = null;
+ try {
+ jedis = JedisUtil.borrowJedisInstance();
+ if (jedis == null) {
+ throw new ExtendedInternalServerErrorException(
+ "fetch from jedis pool failed,null object!");
+ }
+
+ // 获取info信息
+ String routekey =
+ RouteUtil.getPrefixedKey(serverPort, RouteUtil.APIROUTE, serviceName, version,
+ delKey);
+ Set<String> infoSet = jedis.keys(routekey);
+
+ if (infoSet.isEmpty()) {
+ throw new ExtendedNotFoundException("delete ApiRoute FAIL:serviceName-"
+ + serviceName + ",version:" + version + " not fond ");
+ }
+
+ String[] paths = new String[infoSet.size()];
+
+ // Set-->数组
+ infoSet.toArray(paths);
+
+ jedis.del(paths);
+
+
+ } catch (ExtendedNotFoundException e) {
+ throw e;
+ } catch (Exception e) {
+ LOGGER.error("delete ApiRoute throw exception", e);
+ throw new ExtendedInternalServerErrorException("delete ApiRoute throw exception:"
+ + e.getMessage());
+ } finally {
+ JedisUtil.returnJedisInstance(jedis);
+ }
+
+
+ }
+
+ /**
+ * @Title: getAllApiDocs
+ * @Description: TODO(获取本地ext\initSwaggerJson目录的全部json文件目录)
+ * @param: @return
+ * @return: String[]
+ */
+ public String[] getAllApiDocs() {
+ URL apiDocsPath = ApiRouteServiceWrapper.class.getResource("/ext/initSwaggerJson");
+ if (apiDocsPath != null) {
+ String path = apiDocsPath.getPath();
+
+ try {
+ return readfile(path);
+ } catch (FileNotFoundException e) {
+ // TODO Auto-generated catch block
+ LOGGER.error("read ApiDocs Files throw FileNotFoundException", e);
+ throw new ExtendedInternalServerErrorException("read ApiDocs Files throw FileNotFoundException:"
+ + e.getMessage());
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ LOGGER.error("read ApiDocs Files throw IOexception", e);
+ throw new ExtendedInternalServerErrorException("read ApiDocs Files throw IOexception:"
+ + e.getMessage());
+ }
+
+ }
+
+
+ return null;
+ }
+
+ /**
+ * 读取某个文件夹下的所有文件
+ */
+ public String[] readfile(String filepath) throws FileNotFoundException, IOException {
+ File file = new File(filepath);
+ if (file.isDirectory()) {
+ String[] filelist = file.list();
+ return filelist;
+ }
+ return null;
+ }
+
+ public String getApiGatewayPort() {
+ // return JedisUtil.serverIp+":"+JedisUtil.serverPort;
+ return System.getenv("APIGATEWAY_EXPOSE_PORT") == null ? String
+ .valueOf(JedisUtil.serverPort) : System.getenv("APIGATEWAY_EXPOSE_PORT");
+
+ }
+
+ public DiscoverInfo getServiceDiscoverInfo() {
+ return RouteUtil.discoverInfo;
+
+ }
+
+
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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
-package org.openo.msb.wrapper;\r
-\r
-import java.util.HashMap;\r
-import java.util.Map;\r
-import java.util.Set;\r
-\r
-import org.apache.commons.lang3.StringUtils;\r
-import org.openo.msb.api.CustomRouteInfo;\r
-import org.openo.msb.api.RouteServer;\r
-import org.openo.msb.api.exception.ExtendedInternalServerErrorException;\r
-import org.openo.msb.api.exception.ExtendedNotFoundException;\r
-import org.openo.msb.api.exception.ExtendedNotSupportedException;\r
-import org.openo.msb.wrapper.util.JedisUtil;\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
-import redis.clients.jedis.Jedis;\r
-\r
-public class CustomRouteServiceWrapper {\r
-\r
-\r
- private static final Logger LOGGER = LoggerFactory.getLogger(CustomRouteServiceWrapper.class);\r
-\r
- private static CustomRouteServiceWrapper instance = new CustomRouteServiceWrapper();\r
-\r
- private CustomRouteServiceWrapper() {}\r
-\r
- public static CustomRouteServiceWrapper getInstance() {\r
- return instance;\r
- }\r
-\r
-\r
- /**\r
- * @Title: getAllCustomRouteService\r
- * @Description: TODO(获取全部内容服务列表)\r
- * @param: @return\r
- * @return: CustomRouteInfo[]\r
- */\r
- public CustomRouteInfo[] getAllCustomRouteInstances() {\r
-\r
-\r
- Jedis jedis = null;\r
- CustomRouteInfo[] customRouteList = null;\r
- try {\r
- jedis = JedisUtil.borrowJedisInstance();\r
- if (jedis == null) {\r
- throw new ExtendedInternalServerErrorException(\r
- "fetch from jedis pool failed,null object!");\r
- }\r
-\r
- // 获取全部服务列表\r
- String routekey =\r
- RouteUtil.getPrefixedKey("", RouteUtil.CUSTOMROUTE, "*",\r
- RouteUtil.ROUTE_PATH_INFO);\r
- Set<String> routeSet = jedis.keys(routekey);\r
- customRouteList = new CustomRouteInfo[routeSet.size()];\r
-\r
- int i = 0;\r
- for (String routePath : routeSet) {\r
- String[] routePathArray = routePath.split(":");\r
- CustomRouteInfo customRoute = getCustomRouteInstance(routePathArray[3], jedis);\r
- customRouteList[i] = customRoute;\r
- i++;\r
- }\r
-\r
-\r
- } catch (Exception e) {\r
- LOGGER.error("call redis throw exception", e);\r
- throw new ExtendedInternalServerErrorException("call redis throw exception:"\r
- + e.getMessage());\r
-\r
- } finally {\r
- JedisUtil.returnJedisInstance(jedis);\r
- }\r
-\r
- return customRouteList;\r
- }\r
-\r
-\r
-\r
- /**\r
- * @Title: getCustomRouteInstance\r
- * @Description: TODO(通过服务名获取单个内容服务对象信息)\r
- * @param: @param serviceName\r
- * @param: @return\r
- * @return: CustomRouteInfo\r
- */\r
- public CustomRouteInfo getCustomRouteInstance(String serviceName) {\r
-\r
- if (StringUtils.isBlank(serviceName)) {\r
- throw new ExtendedNotSupportedException("serviceName can't be empty");\r
- }\r
-\r
- CustomRouteInfo customRouteInfo;\r
-\r
- Jedis jedis = null;\r
- try {\r
- jedis = JedisUtil.borrowJedisInstance();\r
- if (jedis == null) {\r
- throw new ExtendedInternalServerErrorException(\r
- "fetch from jedis pool failed,null object!");\r
- }\r
-\r
- customRouteInfo = getCustomRouteInstance(serviceName, jedis);\r
-\r
-\r
- } catch (Exception e) {\r
- LOGGER.error("call redis throw exception", e);\r
- throw new ExtendedInternalServerErrorException("call redis throw exception:"\r
- + e.getMessage());\r
- } finally {\r
- JedisUtil.returnJedisInstance(jedis);\r
- }\r
-\r
- if (null == customRouteInfo) {\r
- String errInfo = "customRouteInfo not found: serviceName-" + serviceName;\r
- LOGGER.warn(errInfo);\r
- throw new ExtendedNotFoundException(errInfo);\r
-\r
- }\r
-\r
- return customRouteInfo;\r
-\r
- }\r
-\r
- public CustomRouteInfo getCustomRouteInstance(String serviceName, Jedis jedis) throws Exception {\r
-\r
-\r
- CustomRouteInfo customRouteInfo = null;\r
-\r
-\r
- // 获取info信息\r
- String routekey =\r
- RouteUtil.getPrefixedKey("", RouteUtil.CUSTOMROUTE, serviceName,\r
- RouteUtil.ROUTE_PATH_INFO);\r
- Map<String, String> infomap = jedis.hgetAll(routekey);\r
- if (!infomap.isEmpty()) {\r
- customRouteInfo = new CustomRouteInfo();\r
- customRouteInfo.setServiceName(serviceName);\r
- customRouteInfo.setUrl(infomap.get("url"));\r
- customRouteInfo.setControl(infomap.get("control"));\r
- customRouteInfo.setStatus(infomap.get("status"));\r
- customRouteInfo.setVisualRange(infomap.get("visualRange"));\r
- customRouteInfo.setUseOwnUpstream(infomap.get("useOwnUpstream"));\r
-\r
-\r
- // 获取负载均衡信息\r
- String serviceLBkey =\r
- RouteUtil.getPrefixedKey("", RouteUtil.CUSTOMROUTE, serviceName,\r
- RouteUtil.ROUTE_PATH_LOADBALANCE);\r
- Set<String> serviceLBset = jedis.keys(serviceLBkey + ":*");\r
- int serverNum = serviceLBset.size();\r
- RouteServer[] CustomRouteServerList = new RouteServer[serverNum];\r
- int i = 0;\r
- for (String serviceInfo : serviceLBset) {\r
- Map<String, String> serviceLBmap = jedis.hgetAll(serviceInfo);\r
- RouteServer server = new RouteServer();\r
- server.setIp(serviceLBmap.get("ip"));\r
- server.setPort(serviceLBmap.get("port"));\r
- server.setWeight(Integer.parseInt(serviceLBmap.get("weight")));\r
- CustomRouteServerList[i] = server;\r
- i++;\r
- }\r
-\r
- customRouteInfo.setServers(CustomRouteServerList);\r
- }\r
-\r
-\r
- return customRouteInfo;\r
- }\r
-\r
- /**\r
- * @Title: updateCustomRouteInstance\r
- * @Description: TODO(更新单个服务信息)\r
- * @param: @param serviceName\r
- * @param: @param CustomRouteInfo\r
- * @param: @return\r
- * @return: CustomRouteInfo\r
- */\r
- public synchronized CustomRouteInfo updateCustomRouteInstance(String serviceName,\r
- CustomRouteInfo customRouteInfo, String serverPort) {\r
- if (StringUtils.isBlank(serviceName)) {\r
- throw new ExtendedNotSupportedException("serviceName can't be empty");\r
- }\r
-\r
- try {\r
-\r
- if (serviceName.equals(customRouteInfo.getServiceName())) {\r
- // 删除已存在负载均衡服务器信息\r
- deleteCustomRoute(serviceName, RouteUtil.ROUTE_PATH_LOADBALANCE + "*", serverPort);\r
- } else {\r
- // 如果已修改服务名,先删除此服务全部已有信息\r
- deleteCustomRoute(serviceName, "*", serverPort);\r
- }\r
-\r
-\r
- saveCustomRouteInstance(customRouteInfo, serverPort);\r
-\r
-\r
-\r
- } catch (ExtendedNotSupportedException e) {\r
- throw e;\r
- } catch (Exception e) {\r
- LOGGER.error("updateCustomRoute throw exception", e);\r
- throw new ExtendedInternalServerErrorException("update CustomRoute throw exception"\r
- + e.getMessage());\r
-\r
- }\r
-\r
- return customRouteInfo;\r
-\r
- }\r
-\r
- /**\r
- * @Title updateCustomRouteStatus\r
- * @Description TODO(更新单个服务状态)\r
- * @param serviceName\r
- * @param status\r
- * @return\r
- * @return RouteResult\r
- */\r
- public synchronized CustomRouteInfo updateCustomRouteStatus(String serviceName, String status) {\r
-\r
- if (StringUtils.isBlank(serviceName)) {\r
- throw new ExtendedNotSupportedException("serviceName can't be empty");\r
- }\r
-\r
- if (!RouteUtil.contain(RouteUtil.statusRangeMatches, status)) {\r
- throw new ExtendedNotSupportedException(\r
- "save CustomRouteInfo Status FAIL:status is wrong,value range:("\r
- + RouteUtil.show(RouteUtil.statusRangeMatches) + ")");\r
- }\r
-\r
- CustomRouteInfo new_customRouteInfo = getCustomRouteInstance(serviceName);\r
-\r
-\r
-\r
- // 准备info信息\r
- String serviceInfokey =\r
- RouteUtil.getPrefixedKey("", RouteUtil.CUSTOMROUTE, serviceName,\r
- RouteUtil.ROUTE_PATH_INFO);\r
- Map<String, String> serviceInfoMap = new HashMap<String, String>();\r
- serviceInfoMap.put("status", status);\r
-\r
-\r
- Jedis jedis = null;\r
- try {\r
- jedis = JedisUtil.borrowJedisInstance();\r
- if (jedis == null) {\r
- throw new ExtendedInternalServerErrorException(\r
- "fetch from jedis pool failed,null object!");\r
- }\r
- // 保存info信息\r
- jedis.hmset(serviceInfokey, serviceInfoMap);\r
- new_customRouteInfo.setStatus(status);\r
-\r
- } catch (Exception e) {\r
-\r
- LOGGER.error("update CustomRoute status throw exception", e);\r
- throw new ExtendedInternalServerErrorException(\r
- "update CustomRoute status throw exception" + e.getMessage());\r
-\r
- } finally {\r
- JedisUtil.returnJedisInstance(jedis);\r
- }\r
-\r
- return new_customRouteInfo;\r
- }\r
-\r
- /**\r
- * @Title: saveCustomRouteInstance\r
- * @Description: TODO(存储单个服务信息)\r
- * @param: @param CustomRouteInfo\r
- * @param: @return\r
- * @return: CustomRouteInfo\r
- */\r
- public synchronized CustomRouteInfo saveCustomRouteInstance(CustomRouteInfo customRouteInfo,\r
- String serverPort) {\r
-\r
- if (StringUtils.isBlank(customRouteInfo.getServiceName())\r
- || customRouteInfo.getServers().length == 0) {\r
- throw new ExtendedNotSupportedException(\r
- "save CustomRouteInfo FAIL: Some required fields are empty");\r
- }\r
-\r
- \r
- if (!RegExpTestUtil.urlRegExpTest(customRouteInfo.getServiceName())) {\r
- throw new ExtendedNotSupportedException(\r
- "save CustomRouteInfo FAIL: ServiceName is not a valid format(ServiceName must be begin with /)");\r
- \r
- }\r
- \r
- if (StringUtils.isNotBlank(customRouteInfo.getUrl())){\r
- if (!RegExpTestUtil.urlRegExpTest(customRouteInfo.getUrl())) {\r
- throw new ExtendedNotSupportedException(\r
- "save CustomRouteInfo FAIL:url is not a valid format(url must be begin with /)");\r
- \r
- }\r
- }\r
-\r
- if (!RouteUtil.contain(RouteUtil.visualRangeRange, customRouteInfo.getVisualRange())) {\r
- throw new ExtendedNotSupportedException(\r
- "save CustomRouteInfo FAIL:VisualRange is wrong,value range:("\r
- + RouteUtil.show(RouteUtil.visualRangeMatches) + ")");\r
- }\r
-\r
- if (!RouteUtil.contain(RouteUtil.controlRangeMatches, customRouteInfo.getControl())) {\r
- throw new ExtendedNotSupportedException(\r
- "save CustomRouteInfo FAIL:control is wrong,value range:("\r
- + RouteUtil.show(RouteUtil.controlRangeMatches) + ")");\r
- }\r
-\r
- if (!RouteUtil.contain(RouteUtil.statusRangeMatches, customRouteInfo.getStatus())) {\r
- throw new ExtendedNotSupportedException(\r
- "save CustomRouteInfo FAIL:status is wrong,value range:("\r
- + RouteUtil.show(RouteUtil.statusRangeMatches) + ")");\r
- }\r
-\r
- if (!RouteUtil.contain(RouteUtil.useOwnUpstreamRangeMatches, customRouteInfo.getUseOwnUpstream())) {\r
- throw new ExtendedNotSupportedException(\r
- "save apiRouteInfo FAIL:useOwnUpstream is wrong,value range:("\r
- + RouteUtil.show(RouteUtil.useOwnUpstreamRangeMatches) + ")");\r
- }\r
-\r
- // 检查服务实例格式\r
- RouteServer[] serverList = customRouteInfo.getServers();\r
- for (int i = 0; i < serverList.length; i++) {\r
- RouteServer server = serverList[i];\r
- if (!RegExpTestUtil.ipRegExpTest(server.getIp())) {\r
- throw new ExtendedNotSupportedException("save CustomRouteInfo FAIL:IP("\r
- + server.getIp() + ")is not a valid ip address");\r
- }\r
-\r
- if (!RegExpTestUtil.portRegExpTest(server.getPort())) {\r
- throw new ExtendedNotSupportedException("save CustomRouteInfo FAIL:Port("\r
- + server.getPort() + ")is not a valid Port address");\r
- }\r
- }\r
-\r
-\r
- // 准备info信息\r
- String serviceInfokey =\r
- RouteUtil.getPrefixedKey(serverPort, RouteUtil.CUSTOMROUTE,\r
- customRouteInfo.getServiceName().trim(), RouteUtil.ROUTE_PATH_INFO);\r
- Map<String, String> serviceInfoMap = new HashMap<String, String>();\r
- serviceInfoMap.put("url", "/".equals(customRouteInfo.getUrl().trim())\r
- ? ""\r
- : customRouteInfo.getUrl().trim());\r
- serviceInfoMap.put("control", customRouteInfo.getControl());\r
- serviceInfoMap.put("status", customRouteInfo.getStatus());\r
- serviceInfoMap.put("visualRange", customRouteInfo.getVisualRange());\r
- serviceInfoMap.put("useOwnUpstream", customRouteInfo.getUseOwnUpstream());\r
-\r
-\r
-\r
- // 准备负载均衡信息\r
- String serviceLBkey =\r
- RouteUtil.getPrefixedKey(serverPort, RouteUtil.CUSTOMROUTE,\r
- customRouteInfo.getServiceName(), RouteUtil.ROUTE_PATH_LOADBALANCE);\r
-\r
-\r
- Jedis jedis = null;\r
- try {\r
- jedis = JedisUtil.borrowJedisInstance();\r
- if (jedis == null) {\r
- throw new ExtendedInternalServerErrorException(\r
- "fetch from jedis pool failed,null object!");\r
- }\r
- // 保存info信息\r
- jedis.hmset(serviceInfokey, serviceInfoMap);\r
-\r
- // 保存负载均衡信息\r
-\r
- for (int i = 0; i < serverList.length; i++) {\r
- Map<String, String> servermap = new HashMap<String, String>();\r
- RouteServer server = serverList[i];\r
-\r
- servermap.put("ip", server.getIp());\r
- servermap.put("port", server.getPort());\r
- servermap.put("weight", Integer.toString(server.getWeight()));\r
-\r
- jedis.hmset(serviceLBkey + ":server" + (i + 1), servermap);\r
- }\r
-\r
-\r
- } catch (Exception e) {\r
- LOGGER.error("call redis throw exception", e);\r
- throw new ExtendedInternalServerErrorException("call redis throw exception:"\r
- + e.getMessage());\r
-\r
- } finally {\r
- JedisUtil.returnJedisInstance(jedis);;\r
- }\r
-\r
- return customRouteInfo;\r
- }\r
-\r
-\r
-\r
- /**\r
- * @Title: deleteCustomRoute\r
- * @Description: TODO(删除单个服务信息)\r
- * @param: @param type\r
- * @param: @param serviceName\r
- * @param: @param delKey\r
- * @param: @return\r
- * @return: void\r
- */\r
- public synchronized void deleteCustomRoute(String serviceName, String delKey, String serverPort) {\r
-\r
- if (StringUtils.isBlank(serviceName)) {\r
- throw new ExtendedNotSupportedException("serviceName can't be empty");\r
- }\r
-\r
- Jedis jedis = null;\r
-\r
- try {\r
- jedis = JedisUtil.borrowJedisInstance();\r
- if (jedis == null) {\r
- throw new ExtendedInternalServerErrorException(\r
- "fetch from jedis pool failed,null object!");\r
- }\r
-\r
- // 获取info信息\r
- String routekey =\r
- RouteUtil\r
- .getPrefixedKey(serverPort, RouteUtil.CUSTOMROUTE, serviceName, delKey);\r
- Set<String> infoSet = jedis.keys(routekey);\r
-\r
- if (infoSet.isEmpty()) {\r
- throw new ExtendedNotFoundException("delete CustomRoute FAIL:serviceName-"\r
- + serviceName + " not fond ");\r
- }\r
-\r
-\r
- String[] paths = new String[infoSet.size()];\r
-\r
- // Set-->数组\r
- infoSet.toArray(paths);\r
-\r
- jedis.del(paths);\r
-\r
- } catch (ExtendedNotFoundException e) {\r
- throw e;\r
- } catch (Exception e) {\r
-\r
- LOGGER.error("delete CustomRoute throw exception", e);\r
- throw new ExtendedInternalServerErrorException("delete CustomRoute throw exception:"\r
- + e.getMessage());\r
-\r
- } finally {\r
- JedisUtil.returnJedisInstance(jedis);\r
- }\r
-\r
-\r
- }\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.wrapper;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.lang3.StringUtils;
+import org.openo.msb.api.CustomRouteInfo;
+import org.openo.msb.api.RouteServer;
+import org.openo.msb.api.exception.ExtendedInternalServerErrorException;
+import org.openo.msb.api.exception.ExtendedNotFoundException;
+import org.openo.msb.api.exception.ExtendedNotSupportedException;
+import org.openo.msb.wrapper.util.JedisUtil;
+import org.openo.msb.wrapper.util.RegExpTestUtil;
+import org.openo.msb.wrapper.util.RouteUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import redis.clients.jedis.Jedis;
+
+public class CustomRouteServiceWrapper {
+
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(CustomRouteServiceWrapper.class);
+
+ private static CustomRouteServiceWrapper instance = new CustomRouteServiceWrapper();
+
+ private CustomRouteServiceWrapper() {}
+
+ public static CustomRouteServiceWrapper getInstance() {
+ return instance;
+ }
+
+
+ /**
+ * @Title: getAllCustomRouteService
+ * @Description: TODO(获取全部内容服务列表)
+ * @param: @return
+ * @return: CustomRouteInfo[]
+ */
+ public CustomRouteInfo[] getAllCustomRouteInstances() {
+
+
+ Jedis jedis = null;
+ CustomRouteInfo[] customRouteList = null;
+ try {
+ jedis = JedisUtil.borrowJedisInstance();
+ if (jedis == null) {
+ throw new ExtendedInternalServerErrorException(
+ "fetch from jedis pool failed,null object!");
+ }
+
+ // 获取全部服务列表
+ String routekey =
+ RouteUtil.getPrefixedKey("", RouteUtil.CUSTOMROUTE, "*",
+ RouteUtil.ROUTE_PATH_INFO);
+ Set<String> routeSet = jedis.keys(routekey);
+ customRouteList = new CustomRouteInfo[routeSet.size()];
+
+ int i = 0;
+ for (String routePath : routeSet) {
+ String[] routePathArray = routePath.split(":");
+ CustomRouteInfo customRoute = getCustomRouteInstance(routePathArray[3], jedis);
+ customRouteList[i] = customRoute;
+ i++;
+ }
+
+
+ } catch (Exception e) {
+ LOGGER.error("call redis throw exception", e);
+ throw new ExtendedInternalServerErrorException("call redis throw exception:"
+ + e.getMessage());
+
+ } finally {
+ JedisUtil.returnJedisInstance(jedis);
+ }
+
+ return customRouteList;
+ }
+
+
+
+ /**
+ * @Title: getCustomRouteInstance
+ * @Description: TODO(通过服务名获取单个内容服务对象信息)
+ * @param: @param serviceName
+ * @param: @return
+ * @return: CustomRouteInfo
+ */
+ public CustomRouteInfo getCustomRouteInstance(String serviceName) {
+
+ if (StringUtils.isBlank(serviceName)) {
+ throw new ExtendedNotSupportedException("serviceName can't be empty");
+ }
+
+ CustomRouteInfo customRouteInfo;
+
+ Jedis jedis = null;
+ try {
+ jedis = JedisUtil.borrowJedisInstance();
+ if (jedis == null) {
+ throw new ExtendedInternalServerErrorException(
+ "fetch from jedis pool failed,null object!");
+ }
+
+ customRouteInfo = getCustomRouteInstance(serviceName, jedis);
+
+
+ } catch (Exception e) {
+ LOGGER.error("call redis throw exception", e);
+ throw new ExtendedInternalServerErrorException("call redis throw exception:"
+ + e.getMessage());
+ } finally {
+ JedisUtil.returnJedisInstance(jedis);
+ }
+
+ if (null == customRouteInfo) {
+ String errInfo = "customRouteInfo not found: serviceName-" + serviceName;
+ LOGGER.warn(errInfo);
+ throw new ExtendedNotFoundException(errInfo);
+
+ }
+
+ return customRouteInfo;
+
+ }
+
+ public CustomRouteInfo getCustomRouteInstance(String serviceName, Jedis jedis) throws Exception {
+
+
+ CustomRouteInfo customRouteInfo = null;
+
+
+ // 获取info信息
+ String routekey =
+ RouteUtil.getPrefixedKey("", RouteUtil.CUSTOMROUTE, serviceName,
+ RouteUtil.ROUTE_PATH_INFO);
+ Map<String, String> infomap = jedis.hgetAll(routekey);
+ if (!infomap.isEmpty()) {
+ customRouteInfo = new CustomRouteInfo();
+ customRouteInfo.setServiceName(serviceName);
+ customRouteInfo.setUrl(infomap.get("url"));
+ customRouteInfo.setControl(infomap.get("control"));
+ customRouteInfo.setStatus(infomap.get("status"));
+ customRouteInfo.setVisualRange(infomap.get("visualRange"));
+ customRouteInfo.setUseOwnUpstream(infomap.get("useOwnUpstream"));
+
+
+ // 获取负载均衡信息
+ String serviceLBkey =
+ RouteUtil.getPrefixedKey("", RouteUtil.CUSTOMROUTE, serviceName,
+ RouteUtil.ROUTE_PATH_LOADBALANCE);
+ Set<String> serviceLBset = jedis.keys(serviceLBkey + ":*");
+ int serverNum = serviceLBset.size();
+ RouteServer[] CustomRouteServerList = new RouteServer[serverNum];
+ int i = 0;
+ for (String serviceInfo : serviceLBset) {
+ Map<String, String> serviceLBmap = jedis.hgetAll(serviceInfo);
+ RouteServer server = new RouteServer();
+ server.setIp(serviceLBmap.get("ip"));
+ server.setPort(serviceLBmap.get("port"));
+ server.setWeight(Integer.parseInt(serviceLBmap.get("weight")));
+ CustomRouteServerList[i] = server;
+ i++;
+ }
+
+ customRouteInfo.setServers(CustomRouteServerList);
+ }
+
+
+ return customRouteInfo;
+ }
+
+ /**
+ * @Title: updateCustomRouteInstance
+ * @Description: TODO(更新单个服务信息)
+ * @param: @param serviceName
+ * @param: @param CustomRouteInfo
+ * @param: @return
+ * @return: CustomRouteInfo
+ */
+ public synchronized CustomRouteInfo updateCustomRouteInstance(String serviceName,
+ CustomRouteInfo customRouteInfo, String serverPort) {
+ if (StringUtils.isBlank(serviceName)) {
+ throw new ExtendedNotSupportedException("serviceName can't be empty");
+ }
+
+ try {
+
+ if (serviceName.equals(customRouteInfo.getServiceName())) {
+ // 删除已存在负载均衡服务器信息
+ deleteCustomRoute(serviceName, RouteUtil.ROUTE_PATH_LOADBALANCE + "*", serverPort);
+ } else {
+ // 如果已修改服务名,先删除此服务全部已有信息
+ deleteCustomRoute(serviceName, "*", serverPort);
+ }
+
+
+ saveCustomRouteInstance(customRouteInfo, serverPort);
+
+
+
+ } catch (ExtendedNotSupportedException e) {
+ throw e;
+ } catch (Exception e) {
+ LOGGER.error("updateCustomRoute throw exception", e);
+ throw new ExtendedInternalServerErrorException("update CustomRoute throw exception"
+ + e.getMessage());
+
+ }
+
+ return customRouteInfo;
+
+ }
+
+ /**
+ * @Title updateCustomRouteStatus
+ * @Description TODO(更新单个服务状态)
+ * @param serviceName
+ * @param status
+ * @return
+ * @return RouteResult
+ */
+ public synchronized CustomRouteInfo updateCustomRouteStatus(String serviceName, String status) {
+
+ if (StringUtils.isBlank(serviceName)) {
+ throw new ExtendedNotSupportedException("serviceName can't be empty");
+ }
+
+ if (!RouteUtil.contain(RouteUtil.statusRangeMatches, status)) {
+ throw new ExtendedNotSupportedException(
+ "save CustomRouteInfo Status FAIL:status is wrong,value range:("
+ + RouteUtil.show(RouteUtil.statusRangeMatches) + ")");
+ }
+
+ CustomRouteInfo new_customRouteInfo = getCustomRouteInstance(serviceName);
+
+
+
+ // 准备info信息
+ String serviceInfokey =
+ RouteUtil.getPrefixedKey("", RouteUtil.CUSTOMROUTE, serviceName,
+ RouteUtil.ROUTE_PATH_INFO);
+ Map<String, String> serviceInfoMap = new HashMap<String, String>();
+ serviceInfoMap.put("status", status);
+
+
+ Jedis jedis = null;
+ try {
+ jedis = JedisUtil.borrowJedisInstance();
+ if (jedis == null) {
+ throw new ExtendedInternalServerErrorException(
+ "fetch from jedis pool failed,null object!");
+ }
+ // 保存info信息
+ jedis.hmset(serviceInfokey, serviceInfoMap);
+ new_customRouteInfo.setStatus(status);
+
+ } catch (Exception e) {
+
+ LOGGER.error("update CustomRoute status throw exception", e);
+ throw new ExtendedInternalServerErrorException(
+ "update CustomRoute status throw exception" + e.getMessage());
+
+ } finally {
+ JedisUtil.returnJedisInstance(jedis);
+ }
+
+ return new_customRouteInfo;
+ }
+
+ /**
+ * @Title: saveCustomRouteInstance
+ * @Description: TODO(存储单个服务信息)
+ * @param: @param CustomRouteInfo
+ * @param: @return
+ * @return: CustomRouteInfo
+ */
+ public synchronized CustomRouteInfo saveCustomRouteInstance(CustomRouteInfo customRouteInfo,
+ String serverPort) {
+
+ if (StringUtils.isBlank(customRouteInfo.getServiceName())
+ || customRouteInfo.getServers().length == 0) {
+ throw new ExtendedNotSupportedException(
+ "save CustomRouteInfo FAIL: Some required fields are empty");
+ }
+
+
+ if (!RegExpTestUtil.urlRegExpTest(customRouteInfo.getServiceName())) {
+ throw new ExtendedNotSupportedException(
+ "save CustomRouteInfo FAIL: ServiceName is not a valid format(ServiceName must be begin with /)");
+
+ }
+
+ if (StringUtils.isNotBlank(customRouteInfo.getUrl())){
+ if (!RegExpTestUtil.urlRegExpTest(customRouteInfo.getUrl())) {
+ throw new ExtendedNotSupportedException(
+ "save CustomRouteInfo FAIL:url is not a valid format(url must be begin with /)");
+
+ }
+ }
+
+ if (!RouteUtil.contain(RouteUtil.visualRangeRange, customRouteInfo.getVisualRange())) {
+ throw new ExtendedNotSupportedException(
+ "save CustomRouteInfo FAIL:VisualRange is wrong,value range:("
+ + RouteUtil.show(RouteUtil.visualRangeMatches) + ")");
+ }
+
+ if (!RouteUtil.contain(RouteUtil.controlRangeMatches, customRouteInfo.getControl())) {
+ throw new ExtendedNotSupportedException(
+ "save CustomRouteInfo FAIL:control is wrong,value range:("
+ + RouteUtil.show(RouteUtil.controlRangeMatches) + ")");
+ }
+
+ if (!RouteUtil.contain(RouteUtil.statusRangeMatches, customRouteInfo.getStatus())) {
+ throw new ExtendedNotSupportedException(
+ "save CustomRouteInfo FAIL:status is wrong,value range:("
+ + RouteUtil.show(RouteUtil.statusRangeMatches) + ")");
+ }
+
+ if (!RouteUtil.contain(RouteUtil.useOwnUpstreamRangeMatches, customRouteInfo.getUseOwnUpstream())) {
+ throw new ExtendedNotSupportedException(
+ "save apiRouteInfo FAIL:useOwnUpstream is wrong,value range:("
+ + RouteUtil.show(RouteUtil.useOwnUpstreamRangeMatches) + ")");
+ }
+
+ // 检查服务实例格式
+ RouteServer[] serverList = customRouteInfo.getServers();
+ for (int i = 0; i < serverList.length; i++) {
+ RouteServer server = serverList[i];
+ if (!RegExpTestUtil.ipRegExpTest(server.getIp())) {
+ throw new ExtendedNotSupportedException("save CustomRouteInfo FAIL:IP("
+ + server.getIp() + ")is not a valid ip address");
+ }
+
+ if (!RegExpTestUtil.portRegExpTest(server.getPort())) {
+ throw new ExtendedNotSupportedException("save CustomRouteInfo FAIL:Port("
+ + server.getPort() + ")is not a valid Port address");
+ }
+ }
+
+
+ // 准备info信息
+ String serviceInfokey =
+ RouteUtil.getPrefixedKey(serverPort, RouteUtil.CUSTOMROUTE,
+ customRouteInfo.getServiceName().trim(), RouteUtil.ROUTE_PATH_INFO);
+ Map<String, String> serviceInfoMap = new HashMap<String, String>();
+ serviceInfoMap.put("url", "/".equals(customRouteInfo.getUrl().trim())
+ ? ""
+ : customRouteInfo.getUrl().trim());
+ serviceInfoMap.put("control", customRouteInfo.getControl());
+ serviceInfoMap.put("status", customRouteInfo.getStatus());
+ serviceInfoMap.put("visualRange", customRouteInfo.getVisualRange());
+ serviceInfoMap.put("useOwnUpstream", customRouteInfo.getUseOwnUpstream());
+
+
+
+ // 准备负载均衡信息
+ String serviceLBkey =
+ RouteUtil.getPrefixedKey(serverPort, RouteUtil.CUSTOMROUTE,
+ customRouteInfo.getServiceName(), RouteUtil.ROUTE_PATH_LOADBALANCE);
+
+
+ Jedis jedis = null;
+ try {
+ jedis = JedisUtil.borrowJedisInstance();
+ if (jedis == null) {
+ throw new ExtendedInternalServerErrorException(
+ "fetch from jedis pool failed,null object!");
+ }
+ // 保存info信息
+ jedis.hmset(serviceInfokey, serviceInfoMap);
+
+ // 保存负载均衡信息
+
+ for (int i = 0; i < serverList.length; i++) {
+ Map<String, String> servermap = new HashMap<String, String>();
+ RouteServer server = serverList[i];
+
+ servermap.put("ip", server.getIp());
+ servermap.put("port", server.getPort());
+ servermap.put("weight", Integer.toString(server.getWeight()));
+
+ jedis.hmset(serviceLBkey + ":server" + (i + 1), servermap);
+ }
+
+
+ } catch (Exception e) {
+ LOGGER.error("call redis throw exception", e);
+ throw new ExtendedInternalServerErrorException("call redis throw exception:"
+ + e.getMessage());
+
+ } finally {
+ JedisUtil.returnJedisInstance(jedis);;
+ }
+
+ return customRouteInfo;
+ }
+
+
+
+ /**
+ * @Title: deleteCustomRoute
+ * @Description: TODO(删除单个服务信息)
+ * @param: @param type
+ * @param: @param serviceName
+ * @param: @param delKey
+ * @param: @return
+ * @return: void
+ */
+ public synchronized void deleteCustomRoute(String serviceName, String delKey, String serverPort) {
+
+ if (StringUtils.isBlank(serviceName)) {
+ throw new ExtendedNotSupportedException("serviceName can't be empty");
+ }
+
+ Jedis jedis = null;
+
+ try {
+ jedis = JedisUtil.borrowJedisInstance();
+ if (jedis == null) {
+ throw new ExtendedInternalServerErrorException(
+ "fetch from jedis pool failed,null object!");
+ }
+
+ // 获取info信息
+ String routekey =
+ RouteUtil
+ .getPrefixedKey(serverPort, RouteUtil.CUSTOMROUTE, serviceName, delKey);
+ Set<String> infoSet = jedis.keys(routekey);
+
+ if (infoSet.isEmpty()) {
+ throw new ExtendedNotFoundException("delete CustomRoute FAIL:serviceName-"
+ + serviceName + " not fond ");
+ }
+
+
+ String[] paths = new String[infoSet.size()];
+
+ // Set-->数组
+ infoSet.toArray(paths);
+
+ jedis.del(paths);
+
+ } catch (ExtendedNotFoundException e) {
+ throw e;
+ } catch (Exception e) {
+
+ LOGGER.error("delete CustomRoute throw exception", e);
+ throw new ExtendedInternalServerErrorException("delete CustomRoute throw exception:"
+ + e.getMessage());
+
+ } finally {
+ JedisUtil.returnJedisInstance(jedis);
+ }
+
+
+ }
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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
-package org.openo.msb.wrapper;\r
-\r
-import java.util.HashMap;\r
-import java.util.Map;\r
-import java.util.Set;\r
-\r
-import org.apache.commons.lang3.StringUtils;\r
-import org.openo.msb.api.IuiRouteInfo;\r
-import org.openo.msb.api.RouteServer;\r
-import org.openo.msb.api.exception.ExtendedInternalServerErrorException;\r
-import org.openo.msb.api.exception.ExtendedNotFoundException;\r
-import org.openo.msb.api.exception.ExtendedNotSupportedException;\r
-import org.openo.msb.wrapper.util.JedisUtil;\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
-import redis.clients.jedis.Jedis;\r
-\r
-public class IuiRouteServiceWrapper {\r
-\r
-\r
- private static final Logger LOGGER = LoggerFactory.getLogger(IuiRouteServiceWrapper.class);\r
-\r
- private static IuiRouteServiceWrapper instance = new IuiRouteServiceWrapper();\r
-\r
- private IuiRouteServiceWrapper() {}\r
-\r
- public static IuiRouteServiceWrapper getInstance() {\r
- return instance;\r
- }\r
-\r
-\r
- /**\r
- * @Title: getAllIuiRouteService\r
- * @Description: TODO(获取全部内容服务列表)\r
- * @param: @return\r
- * @return: IuiRouteInfo[]\r
- */\r
- public IuiRouteInfo[] getAllIuiRouteInstances() {\r
-\r
-\r
- Jedis jedis = null;\r
- IuiRouteInfo[] iuiRouteList = null;\r
- try {\r
- jedis = JedisUtil.borrowJedisInstance();\r
- if (jedis == null) {\r
- throw new ExtendedInternalServerErrorException(\r
- "fetch from jedis pool failed,null object!");\r
- }\r
-\r
- // 获取全部服务列表\r
- String routekey =\r
- RouteUtil\r
- .getPrefixedKey("", RouteUtil.IUIROUTE, "*", RouteUtil.ROUTE_PATH_INFO);\r
- Set<String> routeSet = jedis.keys(routekey);\r
- iuiRouteList = new IuiRouteInfo[routeSet.size()];\r
-\r
- int i = 0;\r
- for (String routePath : routeSet) {\r
- String[] routePathArray = routePath.split(":");\r
- IuiRouteInfo iuiRoute = getIuiRouteInstance(routePathArray[3], jedis);\r
- iuiRouteList[i] = iuiRoute;\r
- i++;\r
- }\r
-\r
-\r
- } catch (Exception e) {\r
- LOGGER.error("call redis throw exception", e);\r
- throw new ExtendedInternalServerErrorException("call redis throw exception:"\r
- + e.getMessage());\r
- } finally {\r
- JedisUtil.returnJedisInstance(jedis);\r
- }\r
-\r
- return iuiRouteList;\r
- }\r
-\r
-\r
-\r
- /**\r
- * @Title: getIuiRouteInstance\r
- * @Description: TODO(通过服务名获取单个内容服务对象信息)\r
- * @param: @param serviceName\r
- * @param: @return\r
- * @return: IuiRouteInfo\r
- */\r
- public IuiRouteInfo getIuiRouteInstance(String serviceName) {\r
-\r
- if (StringUtils.isBlank(serviceName)) {\r
- throw new ExtendedNotSupportedException("serviceName can't be empty");\r
- }\r
-\r
- IuiRouteInfo iuiRouteInfo = null;\r
-\r
- Jedis jedis = null;\r
- try {\r
- jedis = JedisUtil.borrowJedisInstance();\r
- if (jedis == null) {\r
- throw new ExtendedInternalServerErrorException(\r
- "fetch from jedis pool failed,null object!");\r
- }\r
-\r
- iuiRouteInfo = getIuiRouteInstance(serviceName, jedis);\r
-\r
-\r
- } catch (Exception e) {\r
- LOGGER.error("call redis throw exception", e);\r
- throw new ExtendedInternalServerErrorException("call redis throw exception:"\r
- + e.getMessage());\r
- } finally {\r
- JedisUtil.returnJedisInstance(jedis);\r
- }\r
-\r
- if (null == iuiRouteInfo) {\r
- String errInfo = "iuiRouteInfo not found: serviceName-" + serviceName;\r
- LOGGER.warn(errInfo);\r
- throw new ExtendedNotFoundException(errInfo);\r
-\r
- }\r
-\r
- return iuiRouteInfo;\r
-\r
- }\r
-\r
- public IuiRouteInfo getIuiRouteInstance(String serviceName, Jedis jedis) throws Exception {\r
-\r
-\r
- IuiRouteInfo iuiRouteInfo = null;\r
-\r
-\r
- // 获取info信息\r
- String routekey =\r
- RouteUtil.getPrefixedKey("", RouteUtil.IUIROUTE, serviceName,\r
- RouteUtil.ROUTE_PATH_INFO);\r
- Map<String, String> infomap = jedis.hgetAll(routekey);\r
- if (!infomap.isEmpty()) {\r
- iuiRouteInfo = new IuiRouteInfo();\r
- iuiRouteInfo.setServiceName(serviceName);\r
- iuiRouteInfo.setUrl(infomap.get("url"));\r
- iuiRouteInfo.setControl(infomap.get("control"));\r
- iuiRouteInfo.setStatus(infomap.get("status"));\r
- iuiRouteInfo.setVisualRange(infomap.get("visualRange"));\r
- iuiRouteInfo.setUseOwnUpstream(infomap.get("useOwnUpstream"));\r
-\r
-\r
- // 获取负载均衡信息\r
- String serviceLBkey =\r
- RouteUtil.getPrefixedKey("", RouteUtil.IUIROUTE, serviceName,\r
- RouteUtil.ROUTE_PATH_LOADBALANCE);\r
- Set<String> serviceLBset = jedis.keys(serviceLBkey + ":*");\r
- int serverNum = serviceLBset.size();\r
- RouteServer[] iuiRouteServerList = new RouteServer[serverNum];\r
- int i = 0;\r
- for (String serviceInfo : serviceLBset) {\r
- Map<String, String> serviceLBmap = jedis.hgetAll(serviceInfo);\r
- RouteServer server = new RouteServer();\r
- server.setIp(serviceLBmap.get("ip"));\r
- server.setPort(serviceLBmap.get("port"));\r
- server.setWeight(Integer.parseInt(serviceLBmap.get("weight")));\r
- iuiRouteServerList[i] = server;\r
- i++;\r
- }\r
-\r
- iuiRouteInfo.setServers(iuiRouteServerList);\r
- }\r
-\r
-\r
- return iuiRouteInfo;\r
- }\r
-\r
- /**\r
- * @Title: updateIuiRouteInstance\r
- * @Description: TODO(更新单个服务信息)\r
- * @param: @param serviceName\r
- * @param: @param IuiRouteInfo\r
- * @param: @return\r
- * @return: IuiRouteInfo\r
- */\r
- public synchronized IuiRouteInfo updateIuiRouteInstance(String serviceName,\r
- IuiRouteInfo iuiRouteInfo) {\r
-\r
- if (StringUtils.isBlank(serviceName)) {\r
- throw new ExtendedNotSupportedException("serviceName can't be empty");\r
- }\r
-\r
- try {\r
- if (serviceName.equals(iuiRouteInfo.getServiceName())) {\r
- // 删除已存在负载均衡服务器信息\r
- deleteIuiRoute(serviceName, RouteUtil.ROUTE_PATH_LOADBALANCE + "*");\r
-\r
- } else {\r
- // 如果已修改服务名,先删除此服务全部已有信息\r
- deleteIuiRoute(serviceName, "*");\r
- }\r
- saveIuiRouteInstance(iuiRouteInfo);\r
-\r
- } catch (ExtendedNotSupportedException e) {\r
- throw e;\r
- } catch (Exception e) {\r
- LOGGER.error("updateIuiRoute throw exception", e);\r
- throw new ExtendedInternalServerErrorException("update IuiRouteInfo throw exception"\r
- + e.getMessage());\r
- }\r
-\r
- return iuiRouteInfo;\r
-\r
- }\r
-\r
- /**\r
- * @Title updateIuiRouteStatus\r
- * @Description TODO(更新单个服务状态)\r
- * @param serviceName\r
- * @param status\r
- * @return\r
- * @return RouteResult\r
- */\r
- public synchronized IuiRouteInfo updateIuiRouteStatus(String serviceName, String status) {\r
-\r
-\r
- if (StringUtils.isBlank(serviceName)) {\r
- throw new ExtendedNotSupportedException("serviceName can't be empty");\r
- }\r
-\r
- if (!RouteUtil.contain(RouteUtil.statusRangeMatches, status)) {\r
- throw new ExtendedNotSupportedException(\r
- "save IuiRouteInfo Status FAIL:status is wrong,value range:("\r
- + RouteUtil.show(RouteUtil.statusRangeMatches) + ")");\r
- }\r
-\r
- IuiRouteInfo new_iuiRouteInfo = getIuiRouteInstance(serviceName);\r
-\r
- // 准备info信息\r
- String serviceInfokey =\r
- RouteUtil.getPrefixedKey("", RouteUtil.IUIROUTE, serviceName,\r
- RouteUtil.ROUTE_PATH_INFO);\r
- Map<String, String> serviceInfoMap = new HashMap<String, String>();\r
- serviceInfoMap.put("status", status);\r
-\r
-\r
- Jedis jedis = null;\r
- try {\r
- jedis = JedisUtil.borrowJedisInstance();\r
- if (jedis == null) {\r
- throw new ExtendedInternalServerErrorException(\r
- "fetch from jedis pool failed,null object!");\r
- }\r
- // 保存info信息\r
- jedis.hmset(serviceInfokey, serviceInfoMap);\r
- new_iuiRouteInfo.setStatus(status);\r
-\r
- } catch (Exception e) {\r
- LOGGER.error("update IuiRoute status throw exception", e);\r
- throw new ExtendedInternalServerErrorException(\r
- "update IuiRouteInfo status throw exception" + e.getMessage());\r
-\r
- } finally {\r
- JedisUtil.returnJedisInstance(jedis);\r
- }\r
-\r
- return new_iuiRouteInfo;\r
- }\r
-\r
- /**\r
- * @Title: saveIuiRouteInstance\r
- * @Description: TODO(存储单个服务信息)\r
- * @param: @param IuiRouteInfo\r
- * @param: @return\r
- * @return: IuiRouteInfo\r
- */\r
- public synchronized IuiRouteInfo saveIuiRouteInstance(IuiRouteInfo iuiRouteInfo) {\r
-\r
- if (StringUtils.isBlank(iuiRouteInfo.getServiceName())\r
- || iuiRouteInfo.getServers().length == 0) {\r
- throw new ExtendedNotSupportedException(\r
- "save iuiRouteInfo FAIL: Some required fields are empty");\r
- }\r
-\r
- if (StringUtils.isNotBlank(iuiRouteInfo.getUrl())){\r
- if (!RegExpTestUtil.urlRegExpTest(iuiRouteInfo.getUrl())) {\r
- throw new ExtendedNotSupportedException(\r
- "save iuiRouteInfo FAIL:url is not a valid format(url must be begin with /)");\r
- \r
- }\r
- }\r
-\r
- if (!RouteUtil.contain(RouteUtil.visualRangeRange, iuiRouteInfo.getVisualRange())) {\r
- throw new ExtendedNotSupportedException(\r
- "save iuiRouteInfo FAIL:VisualRange is wrong,value range:("\r
- + RouteUtil.show(RouteUtil.visualRangeMatches) + ")");\r
- }\r
-\r
- if (!RouteUtil.contain(RouteUtil.controlRangeMatches, iuiRouteInfo.getControl())) {\r
- throw new ExtendedNotSupportedException(\r
- "save iuiRouteInfo FAIL:control is wrong,value range:("\r
- + RouteUtil.show(RouteUtil.controlRangeMatches) + ")");\r
- }\r
-\r
- if (!RouteUtil.contain(RouteUtil.statusRangeMatches, iuiRouteInfo.getStatus())) {\r
- throw new ExtendedNotSupportedException(\r
- "save iuiRouteInfo FAIL:status is wrong,value range:("\r
- + RouteUtil.show(RouteUtil.statusRangeMatches) + ")");\r
- }\r
-\r
- if (!RouteUtil.contain(RouteUtil.useOwnUpstreamRangeMatches, iuiRouteInfo.getUseOwnUpstream())) {\r
- throw new ExtendedNotSupportedException(\r
- "save apiRouteInfo FAIL:useOwnUpstream is wrong,value range:("\r
- + RouteUtil.show(RouteUtil.useOwnUpstreamRangeMatches) + ")");\r
- }\r
-\r
- // 检查服务实例格式\r
- RouteServer[] serverList = iuiRouteInfo.getServers();\r
- for (int i = 0; i < serverList.length; i++) {\r
- RouteServer server = serverList[i];\r
- if (!RegExpTestUtil.ipRegExpTest(server.getIp())) {\r
- throw new ExtendedNotSupportedException("save iuiRouteInfo FAIL:IP("\r
- + server.getIp() + ")is not a valid ip address");\r
- }\r
-\r
- if (!RegExpTestUtil.portRegExpTest(server.getPort())) {\r
- throw new ExtendedNotSupportedException("save iuiRouteInfo FAIL:Port("\r
- + server.getPort() + ")is not a valid Port address");\r
- }\r
- }\r
-\r
-\r
- // 准备info信息\r
- String serviceInfokey =\r
- RouteUtil.getPrefixedKey("", RouteUtil.IUIROUTE, iuiRouteInfo.getServiceName().trim(),\r
- RouteUtil.ROUTE_PATH_INFO);\r
- Map<String, String> serviceInfoMap = new HashMap<String, String>();\r
- serviceInfoMap.put("url", "/".equals(iuiRouteInfo.getUrl().trim()) ? "" : iuiRouteInfo\r
- .getUrl().trim());\r
- serviceInfoMap.put("control", iuiRouteInfo.getControl());\r
- serviceInfoMap.put("status", iuiRouteInfo.getStatus());\r
- serviceInfoMap.put("visualRange", iuiRouteInfo.getVisualRange());\r
- serviceInfoMap.put("useOwnUpstream", iuiRouteInfo.getUseOwnUpstream());\r
-\r
-\r
- // 准备负载均衡信息\r
- String serviceLBkey =\r
- RouteUtil.getPrefixedKey("", RouteUtil.IUIROUTE, iuiRouteInfo.getServiceName(),\r
- RouteUtil.ROUTE_PATH_LOADBALANCE);\r
-\r
-\r
- Jedis jedis = null;\r
- try {\r
- jedis = JedisUtil.borrowJedisInstance();\r
- if (jedis == null) {\r
- throw new ExtendedInternalServerErrorException(\r
- "fetch from jedis pool failed,null object!");\r
- }\r
- // 保存info信息\r
- jedis.hmset(serviceInfokey, serviceInfoMap);\r
-\r
- // 保存负载均衡信息\r
- for (int i = 0; i < serverList.length; i++) {\r
- Map<String, String> servermap = new HashMap<String, String>();\r
- RouteServer server = serverList[i];\r
-\r
- servermap.put("ip", server.getIp());\r
- servermap.put("port", server.getPort());\r
- servermap.put("weight", Integer.toString(server.getWeight()));\r
-\r
- jedis.hmset(serviceLBkey + ":server" + (i + 1), servermap);\r
- }\r
-\r
-\r
- } catch (Exception e) {\r
- LOGGER.error("call redis throw exception", e);\r
- throw new ExtendedInternalServerErrorException("call redis throw exception:"\r
- + e.getMessage());\r
- } finally {\r
- JedisUtil.returnJedisInstance(jedis);;\r
- }\r
-\r
- return iuiRouteInfo;\r
- }\r
-\r
-\r
-\r
- /**\r
- * @Title: deleteIuiRoute\r
- * @Description: TODO(删除单个服务信息)\r
- * @param: @param type\r
- * @param: @param serviceName\r
- * @param: @param delKey\r
- * @param: @return\r
- * @return: void\r
- */\r
- public synchronized void deleteIuiRoute(String serviceName, String delKey) {\r
-\r
- if (StringUtils.isBlank(serviceName)) {\r
- throw new ExtendedNotSupportedException("serviceName can't be empty");\r
- }\r
-\r
- Jedis jedis = null;\r
- try {\r
- jedis = JedisUtil.borrowJedisInstance();\r
- if (jedis == null) {\r
- throw new ExtendedInternalServerErrorException(\r
- "fetch from jedis pool failed,null object!");\r
- }\r
-\r
- // 获取info信息\r
- String routekey = RouteUtil.getPrefixedKey("", RouteUtil.IUIROUTE, serviceName, delKey);\r
- Set<String> infoSet = jedis.keys(routekey);\r
-\r
- if (infoSet.isEmpty()) {\r
- throw new ExtendedNotFoundException("delete IuiRoute FAIL:serviceName-"\r
- + serviceName + " not fond ");\r
- }\r
-\r
- String[] paths = new String[infoSet.size()];\r
-\r
- // Set-->数组\r
- infoSet.toArray(paths);\r
-\r
- jedis.del(paths);\r
-\r
-\r
- } catch (ExtendedNotFoundException e) {\r
- throw e;\r
- } catch (Exception e) {\r
- LOGGER.error("delete IuiRoute throw exception", e);\r
- throw new ExtendedInternalServerErrorException("delete IuiRoute throw exception:"\r
- + e.getMessage());\r
- } finally {\r
- JedisUtil.returnJedisInstance(jedis);\r
- }\r
-\r
-\r
- }\r
-\r
-\r
-\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.wrapper;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.lang3.StringUtils;
+import org.openo.msb.api.IuiRouteInfo;
+import org.openo.msb.api.RouteServer;
+import org.openo.msb.api.exception.ExtendedInternalServerErrorException;
+import org.openo.msb.api.exception.ExtendedNotFoundException;
+import org.openo.msb.api.exception.ExtendedNotSupportedException;
+import org.openo.msb.wrapper.util.JedisUtil;
+import org.openo.msb.wrapper.util.RegExpTestUtil;
+import org.openo.msb.wrapper.util.RouteUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import redis.clients.jedis.Jedis;
+
+public class IuiRouteServiceWrapper {
+
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(IuiRouteServiceWrapper.class);
+
+ private static IuiRouteServiceWrapper instance = new IuiRouteServiceWrapper();
+
+ private IuiRouteServiceWrapper() {}
+
+ public static IuiRouteServiceWrapper getInstance() {
+ return instance;
+ }
+
+
+ /**
+ * @Title: getAllIuiRouteService
+ * @Description: TODO(获取全部内容服务列表)
+ * @param: @return
+ * @return: IuiRouteInfo[]
+ */
+ public IuiRouteInfo[] getAllIuiRouteInstances() {
+
+
+ Jedis jedis = null;
+ IuiRouteInfo[] iuiRouteList = null;
+ try {
+ jedis = JedisUtil.borrowJedisInstance();
+ if (jedis == null) {
+ throw new ExtendedInternalServerErrorException(
+ "fetch from jedis pool failed,null object!");
+ }
+
+ // 获取全部服务列表
+ String routekey =
+ RouteUtil
+ .getPrefixedKey("", RouteUtil.IUIROUTE, "*", RouteUtil.ROUTE_PATH_INFO);
+ Set<String> routeSet = jedis.keys(routekey);
+ iuiRouteList = new IuiRouteInfo[routeSet.size()];
+
+ int i = 0;
+ for (String routePath : routeSet) {
+ String[] routePathArray = routePath.split(":");
+ IuiRouteInfo iuiRoute = getIuiRouteInstance(routePathArray[3], jedis);
+ iuiRouteList[i] = iuiRoute;
+ i++;
+ }
+
+
+ } catch (Exception e) {
+ LOGGER.error("call redis throw exception", e);
+ throw new ExtendedInternalServerErrorException("call redis throw exception:"
+ + e.getMessage());
+ } finally {
+ JedisUtil.returnJedisInstance(jedis);
+ }
+
+ return iuiRouteList;
+ }
+
+
+
+ /**
+ * @Title: getIuiRouteInstance
+ * @Description: TODO(通过服务名获取单个内容服务对象信息)
+ * @param: @param serviceName
+ * @param: @return
+ * @return: IuiRouteInfo
+ */
+ public IuiRouteInfo getIuiRouteInstance(String serviceName) {
+
+ if (StringUtils.isBlank(serviceName)) {
+ throw new ExtendedNotSupportedException("serviceName can't be empty");
+ }
+
+ IuiRouteInfo iuiRouteInfo = null;
+
+ Jedis jedis = null;
+ try {
+ jedis = JedisUtil.borrowJedisInstance();
+ if (jedis == null) {
+ throw new ExtendedInternalServerErrorException(
+ "fetch from jedis pool failed,null object!");
+ }
+
+ iuiRouteInfo = getIuiRouteInstance(serviceName, jedis);
+
+
+ } catch (Exception e) {
+ LOGGER.error("call redis throw exception", e);
+ throw new ExtendedInternalServerErrorException("call redis throw exception:"
+ + e.getMessage());
+ } finally {
+ JedisUtil.returnJedisInstance(jedis);
+ }
+
+ if (null == iuiRouteInfo) {
+ String errInfo = "iuiRouteInfo not found: serviceName-" + serviceName;
+ LOGGER.warn(errInfo);
+ throw new ExtendedNotFoundException(errInfo);
+
+ }
+
+ return iuiRouteInfo;
+
+ }
+
+ public IuiRouteInfo getIuiRouteInstance(String serviceName, Jedis jedis) throws Exception {
+
+
+ IuiRouteInfo iuiRouteInfo = null;
+
+
+ // 获取info信息
+ String routekey =
+ RouteUtil.getPrefixedKey("", RouteUtil.IUIROUTE, serviceName,
+ RouteUtil.ROUTE_PATH_INFO);
+ Map<String, String> infomap = jedis.hgetAll(routekey);
+ if (!infomap.isEmpty()) {
+ iuiRouteInfo = new IuiRouteInfo();
+ iuiRouteInfo.setServiceName(serviceName);
+ iuiRouteInfo.setUrl(infomap.get("url"));
+ iuiRouteInfo.setControl(infomap.get("control"));
+ iuiRouteInfo.setStatus(infomap.get("status"));
+ iuiRouteInfo.setVisualRange(infomap.get("visualRange"));
+ iuiRouteInfo.setUseOwnUpstream(infomap.get("useOwnUpstream"));
+
+
+ // 获取负载均衡信息
+ String serviceLBkey =
+ RouteUtil.getPrefixedKey("", RouteUtil.IUIROUTE, serviceName,
+ RouteUtil.ROUTE_PATH_LOADBALANCE);
+ Set<String> serviceLBset = jedis.keys(serviceLBkey + ":*");
+ int serverNum = serviceLBset.size();
+ RouteServer[] iuiRouteServerList = new RouteServer[serverNum];
+ int i = 0;
+ for (String serviceInfo : serviceLBset) {
+ Map<String, String> serviceLBmap = jedis.hgetAll(serviceInfo);
+ RouteServer server = new RouteServer();
+ server.setIp(serviceLBmap.get("ip"));
+ server.setPort(serviceLBmap.get("port"));
+ server.setWeight(Integer.parseInt(serviceLBmap.get("weight")));
+ iuiRouteServerList[i] = server;
+ i++;
+ }
+
+ iuiRouteInfo.setServers(iuiRouteServerList);
+ }
+
+
+ return iuiRouteInfo;
+ }
+
+ /**
+ * @Title: updateIuiRouteInstance
+ * @Description: TODO(更新单个服务信息)
+ * @param: @param serviceName
+ * @param: @param IuiRouteInfo
+ * @param: @return
+ * @return: IuiRouteInfo
+ */
+ public synchronized IuiRouteInfo updateIuiRouteInstance(String serviceName,
+ IuiRouteInfo iuiRouteInfo) {
+
+ if (StringUtils.isBlank(serviceName)) {
+ throw new ExtendedNotSupportedException("serviceName can't be empty");
+ }
+
+ try {
+ if (serviceName.equals(iuiRouteInfo.getServiceName())) {
+ // 删除已存在负载均衡服务器信息
+ deleteIuiRoute(serviceName, RouteUtil.ROUTE_PATH_LOADBALANCE + "*");
+
+ } else {
+ // 如果已修改服务名,先删除此服务全部已有信息
+ deleteIuiRoute(serviceName, "*");
+ }
+ saveIuiRouteInstance(iuiRouteInfo);
+
+ } catch (ExtendedNotSupportedException e) {
+ throw e;
+ } catch (Exception e) {
+ LOGGER.error("updateIuiRoute throw exception", e);
+ throw new ExtendedInternalServerErrorException("update IuiRouteInfo throw exception"
+ + e.getMessage());
+ }
+
+ return iuiRouteInfo;
+
+ }
+
+ /**
+ * @Title updateIuiRouteStatus
+ * @Description TODO(更新单个服务状态)
+ * @param serviceName
+ * @param status
+ * @return
+ * @return RouteResult
+ */
+ public synchronized IuiRouteInfo updateIuiRouteStatus(String serviceName, String status) {
+
+
+ if (StringUtils.isBlank(serviceName)) {
+ throw new ExtendedNotSupportedException("serviceName can't be empty");
+ }
+
+ if (!RouteUtil.contain(RouteUtil.statusRangeMatches, status)) {
+ throw new ExtendedNotSupportedException(
+ "save IuiRouteInfo Status FAIL:status is wrong,value range:("
+ + RouteUtil.show(RouteUtil.statusRangeMatches) + ")");
+ }
+
+ IuiRouteInfo new_iuiRouteInfo = getIuiRouteInstance(serviceName);
+
+ // 准备info信息
+ String serviceInfokey =
+ RouteUtil.getPrefixedKey("", RouteUtil.IUIROUTE, serviceName,
+ RouteUtil.ROUTE_PATH_INFO);
+ Map<String, String> serviceInfoMap = new HashMap<String, String>();
+ serviceInfoMap.put("status", status);
+
+
+ Jedis jedis = null;
+ try {
+ jedis = JedisUtil.borrowJedisInstance();
+ if (jedis == null) {
+ throw new ExtendedInternalServerErrorException(
+ "fetch from jedis pool failed,null object!");
+ }
+ // 保存info信息
+ jedis.hmset(serviceInfokey, serviceInfoMap);
+ new_iuiRouteInfo.setStatus(status);
+
+ } catch (Exception e) {
+ LOGGER.error("update IuiRoute status throw exception", e);
+ throw new ExtendedInternalServerErrorException(
+ "update IuiRouteInfo status throw exception" + e.getMessage());
+
+ } finally {
+ JedisUtil.returnJedisInstance(jedis);
+ }
+
+ return new_iuiRouteInfo;
+ }
+
+ /**
+ * @Title: saveIuiRouteInstance
+ * @Description: TODO(存储单个服务信息)
+ * @param: @param IuiRouteInfo
+ * @param: @return
+ * @return: IuiRouteInfo
+ */
+ public synchronized IuiRouteInfo saveIuiRouteInstance(IuiRouteInfo iuiRouteInfo) {
+
+ if (StringUtils.isBlank(iuiRouteInfo.getServiceName())
+ || iuiRouteInfo.getServers().length == 0) {
+ throw new ExtendedNotSupportedException(
+ "save iuiRouteInfo FAIL: Some required fields are empty");
+ }
+
+ if (StringUtils.isNotBlank(iuiRouteInfo.getUrl())){
+ if (!RegExpTestUtil.urlRegExpTest(iuiRouteInfo.getUrl())) {
+ throw new ExtendedNotSupportedException(
+ "save iuiRouteInfo FAIL:url is not a valid format(url must be begin with /)");
+
+ }
+ }
+
+ if (!RouteUtil.contain(RouteUtil.visualRangeRange, iuiRouteInfo.getVisualRange())) {
+ throw new ExtendedNotSupportedException(
+ "save iuiRouteInfo FAIL:VisualRange is wrong,value range:("
+ + RouteUtil.show(RouteUtil.visualRangeMatches) + ")");
+ }
+
+ if (!RouteUtil.contain(RouteUtil.controlRangeMatches, iuiRouteInfo.getControl())) {
+ throw new ExtendedNotSupportedException(
+ "save iuiRouteInfo FAIL:control is wrong,value range:("
+ + RouteUtil.show(RouteUtil.controlRangeMatches) + ")");
+ }
+
+ if (!RouteUtil.contain(RouteUtil.statusRangeMatches, iuiRouteInfo.getStatus())) {
+ throw new ExtendedNotSupportedException(
+ "save iuiRouteInfo FAIL:status is wrong,value range:("
+ + RouteUtil.show(RouteUtil.statusRangeMatches) + ")");
+ }
+
+ if (!RouteUtil.contain(RouteUtil.useOwnUpstreamRangeMatches, iuiRouteInfo.getUseOwnUpstream())) {
+ throw new ExtendedNotSupportedException(
+ "save apiRouteInfo FAIL:useOwnUpstream is wrong,value range:("
+ + RouteUtil.show(RouteUtil.useOwnUpstreamRangeMatches) + ")");
+ }
+
+ // 检查服务实例格式
+ RouteServer[] serverList = iuiRouteInfo.getServers();
+ for (int i = 0; i < serverList.length; i++) {
+ RouteServer server = serverList[i];
+ if (!RegExpTestUtil.ipRegExpTest(server.getIp())) {
+ throw new ExtendedNotSupportedException("save iuiRouteInfo FAIL:IP("
+ + server.getIp() + ")is not a valid ip address");
+ }
+
+ if (!RegExpTestUtil.portRegExpTest(server.getPort())) {
+ throw new ExtendedNotSupportedException("save iuiRouteInfo FAIL:Port("
+ + server.getPort() + ")is not a valid Port address");
+ }
+ }
+
+
+ // 准备info信息
+ String serviceInfokey =
+ RouteUtil.getPrefixedKey("", RouteUtil.IUIROUTE, iuiRouteInfo.getServiceName().trim(),
+ RouteUtil.ROUTE_PATH_INFO);
+ Map<String, String> serviceInfoMap = new HashMap<String, String>();
+ serviceInfoMap.put("url", "/".equals(iuiRouteInfo.getUrl().trim()) ? "" : iuiRouteInfo
+ .getUrl().trim());
+ serviceInfoMap.put("control", iuiRouteInfo.getControl());
+ serviceInfoMap.put("status", iuiRouteInfo.getStatus());
+ serviceInfoMap.put("visualRange", iuiRouteInfo.getVisualRange());
+ serviceInfoMap.put("useOwnUpstream", iuiRouteInfo.getUseOwnUpstream());
+
+
+ // 准备负载均衡信息
+ String serviceLBkey =
+ RouteUtil.getPrefixedKey("", RouteUtil.IUIROUTE, iuiRouteInfo.getServiceName(),
+ RouteUtil.ROUTE_PATH_LOADBALANCE);
+
+
+ Jedis jedis = null;
+ try {
+ jedis = JedisUtil.borrowJedisInstance();
+ if (jedis == null) {
+ throw new ExtendedInternalServerErrorException(
+ "fetch from jedis pool failed,null object!");
+ }
+ // 保存info信息
+ jedis.hmset(serviceInfokey, serviceInfoMap);
+
+ // 保存负载均衡信息
+ for (int i = 0; i < serverList.length; i++) {
+ Map<String, String> servermap = new HashMap<String, String>();
+ RouteServer server = serverList[i];
+
+ servermap.put("ip", server.getIp());
+ servermap.put("port", server.getPort());
+ servermap.put("weight", Integer.toString(server.getWeight()));
+
+ jedis.hmset(serviceLBkey + ":server" + (i + 1), servermap);
+ }
+
+
+ } catch (Exception e) {
+ LOGGER.error("call redis throw exception", e);
+ throw new ExtendedInternalServerErrorException("call redis throw exception:"
+ + e.getMessage());
+ } finally {
+ JedisUtil.returnJedisInstance(jedis);;
+ }
+
+ return iuiRouteInfo;
+ }
+
+
+
+ /**
+ * @Title: deleteIuiRoute
+ * @Description: TODO(删除单个服务信息)
+ * @param: @param type
+ * @param: @param serviceName
+ * @param: @param delKey
+ * @param: @return
+ * @return: void
+ */
+ public synchronized void deleteIuiRoute(String serviceName, String delKey) {
+
+ if (StringUtils.isBlank(serviceName)) {
+ throw new ExtendedNotSupportedException("serviceName can't be empty");
+ }
+
+ Jedis jedis = null;
+ try {
+ jedis = JedisUtil.borrowJedisInstance();
+ if (jedis == null) {
+ throw new ExtendedInternalServerErrorException(
+ "fetch from jedis pool failed,null object!");
+ }
+
+ // 获取info信息
+ String routekey = RouteUtil.getPrefixedKey("", RouteUtil.IUIROUTE, serviceName, delKey);
+ Set<String> infoSet = jedis.keys(routekey);
+
+ if (infoSet.isEmpty()) {
+ throw new ExtendedNotFoundException("delete IuiRoute FAIL:serviceName-"
+ + serviceName + " not fond ");
+ }
+
+ String[] paths = new String[infoSet.size()];
+
+ // Set-->数组
+ infoSet.toArray(paths);
+
+ jedis.del(paths);
+
+
+ } catch (ExtendedNotFoundException e) {
+ throw e;
+ } catch (Exception e) {
+ LOGGER.error("delete IuiRoute throw exception", e);
+ throw new ExtendedInternalServerErrorException("delete IuiRoute throw exception:"
+ + e.getMessage());
+ } finally {
+ JedisUtil.returnJedisInstance(jedis);
+ }
+
+
+ }
+
+
+
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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.io.IOException;\r
-\r
-import org.apache.http.ParseException;\r
-import org.apache.http.client.methods.CloseableHttpResponse;\r
-import org.apache.http.client.methods.HttpGet;\r
-import org.apache.http.impl.client.CloseableHttpClient;\r
-import org.apache.http.impl.client.HttpClients;\r
-import org.apache.http.util.EntityUtils;\r
-import org.openo.msb.api.MetricsInfo;\r
-import org.openo.msb.wrapper.util.MetricsUtil;\r
-import org.slf4j.Logger;\r
-import org.slf4j.LoggerFactory;\r
-\r
-import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;\r
-import com.fasterxml.jackson.annotation.PropertyAccessor;\r
-import com.fasterxml.jackson.databind.DeserializationFeature;\r
-import com.fasterxml.jackson.databind.ObjectMapper;\r
-\r
-public class MetricsServiceWrapper {\r
-\r
- private static final Logger LOGGER = LoggerFactory\r
- .getLogger(MetricsServiceWrapper.class);\r
-\r
- public static MetricsInfo getMetricsInfo() {\r
-\r
- String metricsUrl = MetricsUtil.adminContextPath;\r
- String metricsJson = sendGetRequest(metricsUrl);\r
-\r
- metricsJson = metricsJson.replace("E_", "");//.replaceAll("(?![0-9])(\\.)(?![0-9])", "_").replace("-", "_")\r
- ObjectMapper mapper = new ObjectMapper();\r
- mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);\r
- mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,\r
- false);\r
- MetricsInfo metricsInfo = new MetricsInfo();\r
- try {\r
- metricsInfo = mapper.readValue(metricsJson, MetricsInfo.class);\r
- } catch (Exception e) {\r
- // TODO Auto-generated catch block\r
- LOGGER.error("Jackson readValue to metricsInfo throw exception", e);\r
- }\r
-\r
- return metricsInfo;\r
- }\r
-\r
- public static String sendGetRequest(String url) {\r
- CloseableHttpClient httpClient = HttpClients.createDefault(); \r
- HttpGet httpGet = new HttpGet(url);\r
-\r
- try {\r
- CloseableHttpResponse res = httpClient.execute(httpGet);\r
- try {\r
- if (res.getStatusLine().getStatusCode() == MetricsUtil.SC_OK) {\r
- return EntityUtils.toString(res.getEntity());\r
- }\r
- } finally {\r
- res.close();\r
- }\r
- } catch (ParseException e) {\r
- LOGGER.error("HttpClient throw ParseException:" + url, e);\r
- } catch (IOException e) {\r
- LOGGER.error("HttpClient throw IOException:" + url, e);\r
- }\r
- finally{\r
- try {\r
- httpClient.close();\r
- } catch (IOException e) {\r
- // TODO Auto-generated catch block\r
- LOGGER.error("HttpClient Close throw IOException", e);\r
- }\r
- }\r
-\r
- return null;\r
- }\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.wrapper;
+
+import java.io.IOException;
+
+import org.apache.http.ParseException;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.openo.msb.api.MetricsInfo;
+import org.openo.msb.wrapper.util.MetricsUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class MetricsServiceWrapper {
+
+ private static final Logger LOGGER = LoggerFactory
+ .getLogger(MetricsServiceWrapper.class);
+
+ public static MetricsInfo getMetricsInfo() {
+
+ String metricsUrl = MetricsUtil.adminContextPath;
+ String metricsJson = sendGetRequest(metricsUrl);
+
+ metricsJson = metricsJson.replace("E_", "");//.replaceAll("(?![0-9])(\\.)(?![0-9])", "_").replace("-", "_")
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
+ mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,
+ false);
+ MetricsInfo metricsInfo = new MetricsInfo();
+ try {
+ metricsInfo = mapper.readValue(metricsJson, MetricsInfo.class);
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ LOGGER.error("Jackson readValue to metricsInfo throw exception", e);
+ }
+
+ return metricsInfo;
+ }
+
+ public static String sendGetRequest(String url) {
+ CloseableHttpClient httpClient = HttpClients.createDefault();
+ HttpGet httpGet = new HttpGet(url);
+
+ try {
+ CloseableHttpResponse res = httpClient.execute(httpGet);
+ try {
+ if (res.getStatusLine().getStatusCode() == MetricsUtil.SC_OK) {
+ return EntityUtils.toString(res.getEntity());
+ }
+ } finally {
+ res.close();
+ }
+ } catch (ParseException e) {
+ LOGGER.error("HttpClient throw ParseException:" + url, e);
+ } catch (IOException e) {
+ LOGGER.error("HttpClient throw IOException:" + url, e);
+ }
+ finally{
+ try {
+ httpClient.close();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ LOGGER.error("HttpClient Close throw IOException", e);
+ }
+ }
+
+ return null;
+ }
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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.Set;\r
-\r
-import org.apache.commons.lang3.StringUtils;\r
-import org.openo.msb.api.MicroServiceFullInfo;\r
-import org.openo.msb.api.MicroServiceInfo;\r
-import org.openo.msb.api.Node;\r
-import org.openo.msb.api.NodeInfo;\r
-import org.openo.msb.api.exception.ExtendedInternalServerErrorException;\r
-import org.openo.msb.api.exception.ExtendedNotFoundException;\r
-import org.openo.msb.api.exception.ExtendedNotSupportedException;\r
-import org.openo.msb.wrapper.util.MicroServiceDB;\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
-public class MicroServiceWrapper {\r
-\r
- private static final Logger LOGGER = LoggerFactory.getLogger(MicroServiceWrapper.class);\r
-\r
- private static MicroServiceWrapper instance = new MicroServiceWrapper();\r
-\r
-\r
- private MicroServiceWrapper() {}\r
-\r
- public static MicroServiceWrapper getInstance() {\r
- return instance;\r
- }\r
-\r
-\r
- /**\r
- * @Title: getAllMicroServiceInstances\r
- * @Description: getAllMicroServiceInstances\r
- * @param: @return\r
- * @return: Response\r
- * @throws Exception\r
- */\r
- public MicroServiceFullInfo[] getAllMicroServiceInstances(){\r
-\r
- try {\r
- return MicroServiceDB.getInstance().getAllMicroServiceInstances();\r
-\r
- } catch (Exception e) {\r
- throw new ExtendedInternalServerErrorException(e.getMessage());\r
- }\r
-\r
- }\r
-\r
- /**\r
- * @Title: getMicroServiceInstance\r
- * @Description: (getMicroServiceInstance)\r
- * @param: @param serviceName\r
- * @param: @param version\r
- * @param: @return\r
- * @return: ApiRouteInfo\r
- */\r
- public MicroServiceFullInfo getMicroServiceInstance(String serviceName, String version,String serverPort) {\r
- if("null".equals(version)) {\r
- version="";\r
- }\r
- serviceName=serviceName.replace("*", "/");\r
- \r
- if (StringUtils.isBlank(serviceName)) {\r
- throw new ExtendedNotSupportedException("serviceName can't be empty");\r
- }\r
-\r
- if (StringUtils.isNotBlank(version)) {\r
- if (!RegExpTestUtil.versionRegExpTest(version)) {\r
- throw new ExtendedNotSupportedException("version (" + version\r
- + ") is not a valid format");\r
- }\r
- }\r
-\r
- MicroServiceFullInfo microServiceInfo;\r
- try {\r
- microServiceInfo =\r
- MicroServiceDB.getInstance().getMicroServiceInstance(serviceName, version,serverPort);\r
-\r
- } catch (Exception e) {\r
- throw new ExtendedInternalServerErrorException(e.getMessage());\r
- }\r
-\r
- if (null == microServiceInfo) {\r
- String errInfo =\r
- "microservice not found: serviceName-" + serviceName + ",version-" + version;\r
- LOGGER.warn(errInfo);\r
- throw new ExtendedNotFoundException(errInfo);\r
-\r
- }\r
-\r
- return microServiceInfo;\r
- }\r
-\r
-\r
-\r
- /**\r
- * @Title: updateMicroServiceInstance\r
- * @Description: updateMicroServiceInstance\r
- * @param: serviceName\r
- * @param: version\r
- * @param: microServiceInfo\r
- * @return: RouteResult\r
- */\r
- public synchronized MicroServiceFullInfo updateMicroServiceInstance(String serviceName,\r
- String version, MicroServiceInfo microServiceInfo) {\r
- if("null".equals(version)) {\r
- version="";\r
- }\r
- serviceName=serviceName.replace("*", "/");\r
-\r
- try {\r
- \r
- \r
- MicroServiceFullInfo oldService= getMicroServiceInstance(serviceName,version,"");\r
-\r
- // Delete the original record\r
- MicroServiceDB.getInstance().deleteMicroService(serviceName, version,"");\r
- // Notify the listeners\r
- MicroServiceDB.getInstance().noticeApiListener(oldService, "DELETE","");\r
- // Save the new record\r
- MicroServiceDB.getInstance().saveMicroServiceInfo2Redis(microServiceInfo,"");\r
- \r
- MicroServiceDB.getInstance().noticeApiListener(microServiceInfo, "ADD","");\r
- MicroServiceFullInfo newMicroServiceInfo =\r
- MicroServiceDB.getInstance().getMicroServiceInstance(\r
- microServiceInfo.getServiceName(), microServiceInfo.getVersion(),"");\r
- return newMicroServiceInfo;\r
- } catch (Exception e) {\r
- LOGGER.error("update MicroService throw exception", e);\r
- throw new ExtendedInternalServerErrorException(e.getMessage());\r
- }\r
-\r
-\r
- }\r
-\r
- public synchronized MicroServiceFullInfo updateMicroServiceNode(String serviceName,\r
- String version, String ip,String port, int ttl) {\r
- if("null".equals(version)) {\r
- version="";\r
- }\r
- serviceName=serviceName.replace("*", "/");\r
- \r
- if (StringUtils.isBlank(serviceName)) {\r
- throw new ExtendedNotSupportedException(\r
- "update MicroService Node FAIL:serviceName can't be empty");\r
- }\r
-\r
- if (StringUtils.isNotBlank(version)) {\r
- if (!RegExpTestUtil.versionRegExpTest(version)) {\r
- throw new ExtendedNotSupportedException(\r
- "update MicroService Node FAIL:version is not a valid format");\r
- }\r
- }\r
-\r
- if (!RegExpTestUtil.ipRegExpTest(ip)) {\r
- throw new ExtendedNotSupportedException("update MicroService Node FAIL:ip(" + ip\r
- + ")is not a valid IP address");\r
- }\r
- \r
- if (!RegExpTestUtil.portRegExpTest(port)) {\r
- throw new ExtendedNotSupportedException("update MicroService Node FAIL:port(" + port\r
- + ")is not a valid Port address");\r
- }\r
- \r
- try {\r
-\r
- MicroServiceDB.getInstance().updateMicroServiceNode2Redis(serviceName, version, ip,port,ttl);\r
-\r
- MicroServiceFullInfo newMicroServiceInfo =\r
- MicroServiceDB.getInstance().getMicroServiceInstance(serviceName, version,"");\r
-\r
- return newMicroServiceInfo;\r
- } catch (NullPointerException e) {\r
- throw new ExtendedNotFoundException(e.getMessage());\r
- } catch (Exception e) {\r
- LOGGER.error("update MicroServiceNode throw exception", e);\r
- throw new ExtendedInternalServerErrorException(e.getMessage());\r
- }\r
- }\r
-\r
- /**\r
- * @Title updateMicroServiceStatus\r
- * @Description updateMicroServiceStatus\r
- * @param serviceName\r
- * @param version\r
- * @param status\r
- * @return\r
- * @return RouteResult\r
- */\r
- \r
- public synchronized MicroServiceFullInfo updateMicroServiceStatus(String serviceName, String version,\r
- String status) {\r
-\r
- if ("null".equals(version)) {\r
- version = "";\r
- }\r
- serviceName=serviceName.replace("*", "/");\r
-\r
- if (StringUtils.isBlank(serviceName)) {\r
- throw new ExtendedNotSupportedException(\r
- "update MicroService status FAIL:serviceName can't be empty");\r
- }\r
-\r
- if (StringUtils.isNotBlank(version)) {\r
- if (!RegExpTestUtil.versionRegExpTest(version)) {\r
- throw new ExtendedNotSupportedException(\r
- "update MicroService status FAIL:version is not a valid format");\r
- }\r
- }\r
- \r
- if(!"0".equals(status) && !"2".equals(status) && !"1".equals(status)){\r
-\r
- throw new ExtendedNotSupportedException("update MicroService status FAIL:status is wrong");\r
- }\r
- \r
- \r
- try {\r
-\r
- MicroServiceDB.getInstance().updateMicroServiceStatus(serviceName, version, status);\r
-\r
- MicroServiceFullInfo newMicroServiceInfo =\r
- MicroServiceDB.getInstance().getMicroServiceInstance(serviceName, version,"");\r
- \r
- // Notify the listeners\r
- MicroServiceDB.getInstance().noticeUpdateStatusListener(newMicroServiceInfo, status);\r
-\r
-\r
- return newMicroServiceInfo;\r
- } catch (NullPointerException e) {\r
- throw new ExtendedNotFoundException(e.getMessage());\r
- } catch (Exception e) {\r
- LOGGER.error("update MicroServiceNode throw exception", e);\r
- throw new ExtendedInternalServerErrorException(e.getMessage());\r
- }\r
- \r
-\r
- }\r
-\r
-\r
- public synchronized MicroServiceFullInfo saveMicroServiceInstance(\r
- MicroServiceInfo microServiceInfo, boolean createOrUpdate,String requestIP,String serverPort) {\r
- // 保存数据格式判断\r
-\r
- if (StringUtils.isBlank(microServiceInfo.getServiceName())\r
- || StringUtils.isBlank(microServiceInfo.getProtocol())\r
- || microServiceInfo.getNodes().size() == 0) {\r
- throw new ExtendedNotSupportedException(\r
- "register MicroServiceInfo FAIL: Some required fields are empty");\r
- }\r
-\r
- for (Node node : microServiceInfo.getNodes()) {\r
- \r
- if(node.getIp()==null || node.getIp().isEmpty()){\r
- node.setIp(requestIP);\r
- }\r
- else if (!RegExpTestUtil.ipRegExpTest(node.getIp())) {\r
- throw new ExtendedNotSupportedException("register MicroServiceInfo FAIL:IP("\r
- + node.getIp() + ")is not a valid ip address");\r
- }\r
- \r
- if (!RegExpTestUtil.portRegExpTest(node.getPort())) {\r
- throw new ExtendedNotSupportedException("register MicroServiceInfo FAIL:Port("\r
- + node.getPort() + ")is not a valid Port address");\r
- }\r
- }\r
-\r
- if (StringUtils.isNotBlank(microServiceInfo.getVersion())) {\r
- if (!RegExpTestUtil.versionRegExpTest(microServiceInfo.getVersion())) {\r
- throw new ExtendedNotSupportedException(\r
- "register MicroServiceInfo FAIL:version is not a valid format");\r
-\r
- }\r
- }\r
-\r
- if (StringUtils.isNotBlank(microServiceInfo.getUrl().trim())) {\r
- if (!RegExpTestUtil.urlRegExpTest(microServiceInfo.getUrl())) {\r
- throw new ExtendedNotSupportedException(\r
- "register MicroServiceInfo FAIL:url is not a valid format(url must be begin with /)");\r
-\r
- }\r
- }\r
-\r
-\r
- if (RouteUtil.PROTOCOL_LIST.indexOf(microServiceInfo.getProtocol().trim()) == -1) {\r
- throw new ExtendedNotSupportedException(\r
- "register MicroServiceInfo FAIL:Protocol is wrong,value range:("\r
- + RouteUtil.PROTOCOL_LIST + ")");\r
- }\r
-\r
- MicroServiceFullInfo existingMicroServiceInfo;\r
- try {\r
- //To determine whether a service already exists\r
- existingMicroServiceInfo =\r
- MicroServiceDB.getInstance().getMicroServiceInstance(\r
- microServiceInfo.getServiceName().trim(), microServiceInfo.getVersion().trim(),serverPort);\r
-\r
- MicroServiceFullInfo newMicroServiceInfo ;\r
- if (existingMicroServiceInfo != null) {\r
- //a service already exists\r
-\r
- if (!existingMicroServiceInfo.getProtocol().equals(microServiceInfo.getProtocol())) {\r
- throw new ExtendedNotSupportedException(\r
- "MicroServiceInfo with different protocols and same serviceName is already existing");\r
- }\r
-\r
- if (createOrUpdate == false) {\r
- //After the first remove added\r
- MicroServiceDB.getInstance().deleteMicroService(\r
- microServiceInfo.getServiceName(), microServiceInfo.getVersion(),serverPort);\r
-\r
- MicroServiceDB.getInstance().saveMicroServiceInfo2Redis(microServiceInfo,serverPort);\r
- \r
- } else {\r
- //Add the original record and save directly\r
- MicroServiceDB.getInstance().saveMicroServiceInfo2Redis(microServiceInfo,serverPort);\r
- }\r
- \r
- newMicroServiceInfo =\r
- MicroServiceDB.getInstance().getMicroServiceInstance(\r
- microServiceInfo.getServiceName(), microServiceInfo.getVersion(),serverPort);\r
-\r
- //Notify the listeners\r
- MicroServiceDB.getInstance().noticeUpdateApiListener(microServiceInfo.getServiceName(),microServiceInfo.getVersion(),newMicroServiceInfo,serverPort);\r
-\r
- } else {\r
- //Save the new record\r
- MicroServiceDB.getInstance().saveMicroServiceInfo2Redis(microServiceInfo,serverPort);\r
- //Notify the listeners\r
- MicroServiceDB.getInstance().noticeApiListener(microServiceInfo, "ADD",serverPort);\r
- newMicroServiceInfo =\r
- MicroServiceDB.getInstance().getMicroServiceInstance(\r
- microServiceInfo.getServiceName(), microServiceInfo.getVersion(),serverPort);\r
- }\r
-\r
- \r
-\r
- return newMicroServiceInfo;\r
-\r
- } catch (ExtendedNotSupportedException e) {\r
- throw e;\r
- } catch (Exception e) {\r
- throw new ExtendedInternalServerErrorException(e.getMessage());\r
- }\r
-\r
- }\r
- \r
- \r
- public synchronized void deleteMicroService(String serviceName, String version) {\r
- if("null".equals(version)) {\r
- version="";\r
- }\r
- serviceName=serviceName.replace("*", "/");\r
- \r
- if (StringUtils.isBlank(serviceName)) {\r
- throw new ExtendedNotSupportedException(\r
- "delete MicroServiceInfo FAIL:serviceName can't be empty");\r
- }\r
-\r
- if (StringUtils.isNotBlank(version)) {\r
- if (!RegExpTestUtil.versionRegExpTest(version)) {\r
- throw new ExtendedNotSupportedException(\r
- "delete MicroServiceInfo FAIL:version is not a valid format");\r
-\r
- }\r
- }\r
-\r
- try {\r
-\r
- MicroServiceFullInfo microServiceInfo =\r
- MicroServiceDB.getInstance().getMicroServiceInstance(serviceName, version,"");\r
-\r
- if (microServiceInfo == null) {\r
- LOGGER.warn("serviceName-"+ serviceName + ",version-" + version + " not fond ");\r
- return;\r
- }\r
-\r
- MicroServiceDB.getInstance().deleteMicroService(serviceName, version,"");\r
- //Notify the listeners\r
- MicroServiceDB.getInstance().noticeApiListener(microServiceInfo, "DELETE","");\r
- \r
- } catch (Exception e) {\r
- LOGGER.error("delete MicroServiceInfo throw exception", e);\r
- throw new ExtendedInternalServerErrorException(e.getMessage());\r
-\r
- }\r
- \r
- LOGGER.info("delete MicroServiceInfo success:serviceName-"\r
- + serviceName + ",version-" + version );\r
-\r
- }\r
-\r
-\r
- public synchronized void deleteMicroService(String serviceName, String version,String serverPort) {\r
- if("null".equals(version)) {\r
- version="";\r
- }\r
- serviceName=serviceName.replace("*", "/");\r
- \r
- if (StringUtils.isBlank(serviceName)) {\r
- throw new ExtendedNotSupportedException(\r
- "delete MicroServiceInfo FAIL:serviceName can't be empty");\r
- }\r
-\r
- if (StringUtils.isNotBlank(version)) {\r
- if (!RegExpTestUtil.versionRegExpTest(version)) {\r
- throw new ExtendedNotSupportedException(\r
- "delete MicroServiceInfo FAIL:version is not a valid format");\r
-\r
- }\r
- }\r
-\r
- try {\r
-\r
- MicroServiceFullInfo microServiceInfo =\r
- MicroServiceDB.getInstance().getMicroServiceInstance(serviceName, version,serverPort);\r
-\r
- if (microServiceInfo == null) {\r
- throw new ExtendedNotFoundException("delete MicroServiceInfo FAIL:serviceName-"\r
- + serviceName + ",version-" + version + " not fond ");\r
- }\r
-\r
- MicroServiceDB.getInstance().deleteMicroService(serviceName, version,serverPort);\r
- //Notify the listeners\r
- MicroServiceDB.getInstance().noticeApiListener(microServiceInfo, "DELETE",serverPort);\r
- } catch (ExtendedNotFoundException e) {\r
- throw e;\r
- } catch (Exception e) {\r
- LOGGER.error("delete MicroServiceInfo throw exception", e);\r
- throw new ExtendedInternalServerErrorException(e.getMessage());\r
-\r
- }\r
- \r
- LOGGER.info("delete MicroServiceInfo success:serviceName-"\r
- + serviceName + ",version-" + version );\r
-\r
- }\r
-\r
- public synchronized void deleteMicroServiceInstance(String serviceName, String version,\r
- String ip,String port) {\r
- if("null".equals(version)) {\r
- version="";\r
- }\r
- serviceName=serviceName.replace("*", "/");\r
- \r
- if (StringUtils.isBlank(serviceName)) {\r
- throw new ExtendedNotSupportedException(\r
- "delete MicroServiceInfo FAIL:serviceName can't be empty");\r
- }\r
-\r
- if (StringUtils.isNotBlank(version)) {\r
- if (!RegExpTestUtil.versionRegExpTest(version)) {\r
- throw new ExtendedNotSupportedException(\r
- "delete MicroServiceInfo FAIL:version is not a valid format");\r
- }\r
- }\r
-\r
- if (!RegExpTestUtil.ipRegExpTest(ip)) {\r
- throw new ExtendedNotSupportedException("delete MicroServiceInfo FAIL:IP(" + ip\r
- + ")is not a valid IP address");\r
- }\r
- \r
- if (!RegExpTestUtil.portRegExpTest(port)) {\r
- throw new ExtendedNotSupportedException("delete MicroServiceInfo FAIL:Port(" + port\r
- + ")is not a valid Port address");\r
- }\r
-\r
-\r
- try {\r
- MicroServiceFullInfo microServiceInfo =\r
- MicroServiceDB.getInstance().getMicroServiceInstance(serviceName, version,"");\r
-\r
- if (microServiceInfo == null) {\r
- throw new ExtendedNotFoundException("delete MicroServiceInfo FAIL:serviceName-"\r
- + serviceName + ",version-" + version + " not fond ");\r
- }\r
-\r
- Set<NodeInfo> nodes = microServiceInfo.getNodes();\r
-\r
- boolean ifFindBNode = false;\r
-\r
- for (Node node : nodes) {\r
- if (node.getIp().equals(ip) && node.getPort().equals(port)) {\r
- ifFindBNode = true;\r
- nodes.remove(node);\r
-\r
- if (nodes.isEmpty()) {\r
- //delete MicroService\r
- MicroServiceDB.getInstance().deleteMicroService(serviceName, version,"");\r
- //Notify the listeners\r
- MicroServiceDB.getInstance().noticeApiListener(microServiceInfo, "DELETE","");\r
- } else {\r
- //delete Node\r
- MicroServiceDB.getInstance().deleteNode(serviceName, version, ip,port);\r
- MicroServiceDB.getInstance().noticeUpdateApiListener(serviceName, version,microServiceInfo,"");\r
- }\r
-\r
- break;\r
- }\r
- }\r
-\r
- if (!ifFindBNode) {\r
- throw new ExtendedNotFoundException("delete MicroServiceInfo FAIL: node-" + ip+":"+port\r
- + " not fond ");\r
- }\r
-\r
-\r
- } catch (ExtendedNotFoundException e) {\r
- throw e;\r
- } catch (Exception e) {\r
- LOGGER.error("deleteApiRoute throw exception", e);\r
- throw new ExtendedInternalServerErrorException(e.getMessage());\r
-\r
- }\r
-\r
- }\r
-\r
-\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.wrapper;
+
+import java.util.Set;
+
+import org.apache.commons.lang3.StringUtils;
+import org.openo.msb.api.MicroServiceFullInfo;
+import org.openo.msb.api.MicroServiceInfo;
+import org.openo.msb.api.Node;
+import org.openo.msb.api.NodeInfo;
+import org.openo.msb.api.exception.ExtendedInternalServerErrorException;
+import org.openo.msb.api.exception.ExtendedNotFoundException;
+import org.openo.msb.api.exception.ExtendedNotSupportedException;
+import org.openo.msb.wrapper.util.MicroServiceDB;
+import org.openo.msb.wrapper.util.RegExpTestUtil;
+import org.openo.msb.wrapper.util.RouteUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class MicroServiceWrapper {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(MicroServiceWrapper.class);
+
+ private static MicroServiceWrapper instance = new MicroServiceWrapper();
+
+
+ private MicroServiceWrapper() {}
+
+ public static MicroServiceWrapper getInstance() {
+ return instance;
+ }
+
+
+ /**
+ * @Title: getAllMicroServiceInstances
+ * @Description: getAllMicroServiceInstances
+ * @param: @return
+ * @return: Response
+ * @throws Exception
+ */
+ public MicroServiceFullInfo[] getAllMicroServiceInstances(){
+
+ try {
+ return MicroServiceDB.getInstance().getAllMicroServiceInstances();
+
+ } catch (Exception e) {
+ throw new ExtendedInternalServerErrorException(e.getMessage());
+ }
+
+ }
+
+ /**
+ * @Title: getMicroServiceInstance
+ * @Description: (getMicroServiceInstance)
+ * @param: @param serviceName
+ * @param: @param version
+ * @param: @return
+ * @return: ApiRouteInfo
+ */
+ public MicroServiceFullInfo getMicroServiceInstance(String serviceName, String version,String serverPort) {
+ if("null".equals(version)) {
+ version="";
+ }
+ serviceName=serviceName.replace("*", "/");
+
+ if (StringUtils.isBlank(serviceName)) {
+ throw new ExtendedNotSupportedException("serviceName can't be empty");
+ }
+
+ if (StringUtils.isNotBlank(version)) {
+ if (!RegExpTestUtil.versionRegExpTest(version)) {
+ throw new ExtendedNotSupportedException("version (" + version
+ + ") is not a valid format");
+ }
+ }
+
+ MicroServiceFullInfo microServiceInfo;
+ try {
+ microServiceInfo =
+ MicroServiceDB.getInstance().getMicroServiceInstance(serviceName, version,serverPort);
+
+ } catch (Exception e) {
+ throw new ExtendedInternalServerErrorException(e.getMessage());
+ }
+
+ if (null == microServiceInfo) {
+ String errInfo =
+ "microservice not found: serviceName-" + serviceName + ",version-" + version;
+ LOGGER.warn(errInfo);
+ throw new ExtendedNotFoundException(errInfo);
+
+ }
+
+ return microServiceInfo;
+ }
+
+
+
+ /**
+ * @Title: updateMicroServiceInstance
+ * @Description: updateMicroServiceInstance
+ * @param: serviceName
+ * @param: version
+ * @param: microServiceInfo
+ * @return: RouteResult
+ */
+ public synchronized MicroServiceFullInfo updateMicroServiceInstance(String serviceName,
+ String version, MicroServiceInfo microServiceInfo) {
+ if("null".equals(version)) {
+ version="";
+ }
+ serviceName=serviceName.replace("*", "/");
+
+ try {
+
+
+ MicroServiceFullInfo oldService= getMicroServiceInstance(serviceName,version,"");
+
+ // Delete the original record
+ MicroServiceDB.getInstance().deleteMicroService(serviceName, version,"");
+ // Notify the listeners
+ MicroServiceDB.getInstance().noticeApiListener(oldService, "DELETE","");
+ // Save the new record
+ MicroServiceDB.getInstance().saveMicroServiceInfo2Redis(microServiceInfo,"");
+
+ MicroServiceDB.getInstance().noticeApiListener(microServiceInfo, "ADD","");
+ MicroServiceFullInfo newMicroServiceInfo =
+ MicroServiceDB.getInstance().getMicroServiceInstance(
+ microServiceInfo.getServiceName(), microServiceInfo.getVersion(),"");
+ return newMicroServiceInfo;
+ } catch (Exception e) {
+ LOGGER.error("update MicroService throw exception", e);
+ throw new ExtendedInternalServerErrorException(e.getMessage());
+ }
+
+
+ }
+
+ public synchronized MicroServiceFullInfo updateMicroServiceNode(String serviceName,
+ String version, String ip,String port, int ttl) {
+ if("null".equals(version)) {
+ version="";
+ }
+ serviceName=serviceName.replace("*", "/");
+
+ if (StringUtils.isBlank(serviceName)) {
+ throw new ExtendedNotSupportedException(
+ "update MicroService Node FAIL:serviceName can't be empty");
+ }
+
+ if (StringUtils.isNotBlank(version)) {
+ if (!RegExpTestUtil.versionRegExpTest(version)) {
+ throw new ExtendedNotSupportedException(
+ "update MicroService Node FAIL:version is not a valid format");
+ }
+ }
+
+ if (!RegExpTestUtil.ipRegExpTest(ip)) {
+ throw new ExtendedNotSupportedException("update MicroService Node FAIL:ip(" + ip
+ + ")is not a valid IP address");
+ }
+
+ if (!RegExpTestUtil.portRegExpTest(port)) {
+ throw new ExtendedNotSupportedException("update MicroService Node FAIL:port(" + port
+ + ")is not a valid Port address");
+ }
+
+ try {
+
+ MicroServiceDB.getInstance().updateMicroServiceNode2Redis(serviceName, version, ip,port,ttl);
+
+ MicroServiceFullInfo newMicroServiceInfo =
+ MicroServiceDB.getInstance().getMicroServiceInstance(serviceName, version,"");
+
+ return newMicroServiceInfo;
+ } catch (NullPointerException e) {
+ throw new ExtendedNotFoundException(e.getMessage());
+ } catch (Exception e) {
+ LOGGER.error("update MicroServiceNode throw exception", e);
+ throw new ExtendedInternalServerErrorException(e.getMessage());
+ }
+ }
+
+ /**
+ * @Title updateMicroServiceStatus
+ * @Description updateMicroServiceStatus
+ * @param serviceName
+ * @param version
+ * @param status
+ * @return
+ * @return RouteResult
+ */
+
+ public synchronized MicroServiceFullInfo updateMicroServiceStatus(String serviceName, String version,
+ String status) {
+
+ if ("null".equals(version)) {
+ version = "";
+ }
+ serviceName=serviceName.replace("*", "/");
+
+ if (StringUtils.isBlank(serviceName)) {
+ throw new ExtendedNotSupportedException(
+ "update MicroService status FAIL:serviceName can't be empty");
+ }
+
+ if (StringUtils.isNotBlank(version)) {
+ if (!RegExpTestUtil.versionRegExpTest(version)) {
+ throw new ExtendedNotSupportedException(
+ "update MicroService status FAIL:version is not a valid format");
+ }
+ }
+
+ if(!"0".equals(status) && !"2".equals(status) && !"1".equals(status)){
+
+ throw new ExtendedNotSupportedException("update MicroService status FAIL:status is wrong");
+ }
+
+
+ try {
+
+ MicroServiceDB.getInstance().updateMicroServiceStatus(serviceName, version, status);
+
+ MicroServiceFullInfo newMicroServiceInfo =
+ MicroServiceDB.getInstance().getMicroServiceInstance(serviceName, version,"");
+
+ // Notify the listeners
+ MicroServiceDB.getInstance().noticeUpdateStatusListener(newMicroServiceInfo, status);
+
+
+ return newMicroServiceInfo;
+ } catch (NullPointerException e) {
+ throw new ExtendedNotFoundException(e.getMessage());
+ } catch (Exception e) {
+ LOGGER.error("update MicroServiceNode throw exception", e);
+ throw new ExtendedInternalServerErrorException(e.getMessage());
+ }
+
+
+ }
+
+
+ public synchronized MicroServiceFullInfo saveMicroServiceInstance(
+ MicroServiceInfo microServiceInfo, boolean createOrUpdate,String requestIP,String serverPort) {
+ // 保存数据格式判断
+
+ if (StringUtils.isBlank(microServiceInfo.getServiceName())
+ || StringUtils.isBlank(microServiceInfo.getProtocol())
+ || microServiceInfo.getNodes().size() == 0) {
+ throw new ExtendedNotSupportedException(
+ "register MicroServiceInfo FAIL: Some required fields are empty");
+ }
+
+ for (Node node : microServiceInfo.getNodes()) {
+
+ if(node.getIp()==null || node.getIp().isEmpty()){
+ node.setIp(requestIP);
+ }
+ else if (!RegExpTestUtil.ipRegExpTest(node.getIp())) {
+ throw new ExtendedNotSupportedException("register MicroServiceInfo FAIL:IP("
+ + node.getIp() + ")is not a valid ip address");
+ }
+
+ if (!RegExpTestUtil.portRegExpTest(node.getPort())) {
+ throw new ExtendedNotSupportedException("register MicroServiceInfo FAIL:Port("
+ + node.getPort() + ")is not a valid Port address");
+ }
+ }
+
+ if (StringUtils.isNotBlank(microServiceInfo.getVersion())) {
+ if (!RegExpTestUtil.versionRegExpTest(microServiceInfo.getVersion())) {
+ throw new ExtendedNotSupportedException(
+ "register MicroServiceInfo FAIL:version is not a valid format");
+
+ }
+ }
+
+ if (StringUtils.isNotBlank(microServiceInfo.getUrl().trim())) {
+ if (!RegExpTestUtil.urlRegExpTest(microServiceInfo.getUrl())) {
+ throw new ExtendedNotSupportedException(
+ "register MicroServiceInfo FAIL:url is not a valid format(url must be begin with /)");
+
+ }
+ }
+
+
+ if (RouteUtil.PROTOCOL_LIST.indexOf(microServiceInfo.getProtocol().trim()) == -1) {
+ throw new ExtendedNotSupportedException(
+ "register MicroServiceInfo FAIL:Protocol is wrong,value range:("
+ + RouteUtil.PROTOCOL_LIST + ")");
+ }
+
+ MicroServiceFullInfo existingMicroServiceInfo;
+ try {
+ //To determine whether a service already exists
+ existingMicroServiceInfo =
+ MicroServiceDB.getInstance().getMicroServiceInstance(
+ microServiceInfo.getServiceName().trim(), microServiceInfo.getVersion().trim(),serverPort);
+
+ MicroServiceFullInfo newMicroServiceInfo ;
+ if (existingMicroServiceInfo != null) {
+ //a service already exists
+
+ if (!existingMicroServiceInfo.getProtocol().equals(microServiceInfo.getProtocol())) {
+ throw new ExtendedNotSupportedException(
+ "MicroServiceInfo with different protocols and same serviceName is already existing");
+ }
+
+ if (createOrUpdate == false) {
+ //After the first remove added
+ MicroServiceDB.getInstance().deleteMicroService(
+ microServiceInfo.getServiceName(), microServiceInfo.getVersion(),serverPort);
+
+ MicroServiceDB.getInstance().saveMicroServiceInfo2Redis(microServiceInfo,serverPort);
+
+ } else {
+ //Add the original record and save directly
+ MicroServiceDB.getInstance().saveMicroServiceInfo2Redis(microServiceInfo,serverPort);
+ }
+
+ newMicroServiceInfo =
+ MicroServiceDB.getInstance().getMicroServiceInstance(
+ microServiceInfo.getServiceName(), microServiceInfo.getVersion(),serverPort);
+
+ //Notify the listeners
+ MicroServiceDB.getInstance().noticeUpdateApiListener(microServiceInfo.getServiceName(),microServiceInfo.getVersion(),newMicroServiceInfo,serverPort);
+
+ } else {
+ //Save the new record
+ MicroServiceDB.getInstance().saveMicroServiceInfo2Redis(microServiceInfo,serverPort);
+ //Notify the listeners
+ MicroServiceDB.getInstance().noticeApiListener(microServiceInfo, "ADD",serverPort);
+ newMicroServiceInfo =
+ MicroServiceDB.getInstance().getMicroServiceInstance(
+ microServiceInfo.getServiceName(), microServiceInfo.getVersion(),serverPort);
+ }
+
+
+
+ return newMicroServiceInfo;
+
+ } catch (ExtendedNotSupportedException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new ExtendedInternalServerErrorException(e.getMessage());
+ }
+
+ }
+
+
+ public synchronized void deleteMicroService(String serviceName, String version) {
+ if("null".equals(version)) {
+ version="";
+ }
+ serviceName=serviceName.replace("*", "/");
+
+ if (StringUtils.isBlank(serviceName)) {
+ throw new ExtendedNotSupportedException(
+ "delete MicroServiceInfo FAIL:serviceName can't be empty");
+ }
+
+ if (StringUtils.isNotBlank(version)) {
+ if (!RegExpTestUtil.versionRegExpTest(version)) {
+ throw new ExtendedNotSupportedException(
+ "delete MicroServiceInfo FAIL:version is not a valid format");
+
+ }
+ }
+
+ try {
+
+ MicroServiceFullInfo microServiceInfo =
+ MicroServiceDB.getInstance().getMicroServiceInstance(serviceName, version,"");
+
+ if (microServiceInfo == null) {
+ LOGGER.warn("serviceName-"+ serviceName + ",version-" + version + " not fond ");
+ return;
+ }
+
+ MicroServiceDB.getInstance().deleteMicroService(serviceName, version,"");
+ //Notify the listeners
+ MicroServiceDB.getInstance().noticeApiListener(microServiceInfo, "DELETE","");
+
+ } catch (Exception e) {
+ LOGGER.error("delete MicroServiceInfo throw exception", e);
+ throw new ExtendedInternalServerErrorException(e.getMessage());
+
+ }
+
+ LOGGER.info("delete MicroServiceInfo success:serviceName-"
+ + serviceName + ",version-" + version );
+
+ }
+
+
+ public synchronized void deleteMicroService(String serviceName, String version,String serverPort) {
+ if("null".equals(version)) {
+ version="";
+ }
+ serviceName=serviceName.replace("*", "/");
+
+ if (StringUtils.isBlank(serviceName)) {
+ throw new ExtendedNotSupportedException(
+ "delete MicroServiceInfo FAIL:serviceName can't be empty");
+ }
+
+ if (StringUtils.isNotBlank(version)) {
+ if (!RegExpTestUtil.versionRegExpTest(version)) {
+ throw new ExtendedNotSupportedException(
+ "delete MicroServiceInfo FAIL:version is not a valid format");
+
+ }
+ }
+
+ try {
+
+ MicroServiceFullInfo microServiceInfo =
+ MicroServiceDB.getInstance().getMicroServiceInstance(serviceName, version,serverPort);
+
+ if (microServiceInfo == null) {
+ throw new ExtendedNotFoundException("delete MicroServiceInfo FAIL:serviceName-"
+ + serviceName + ",version-" + version + " not fond ");
+ }
+
+ MicroServiceDB.getInstance().deleteMicroService(serviceName, version,serverPort);
+ //Notify the listeners
+ MicroServiceDB.getInstance().noticeApiListener(microServiceInfo, "DELETE",serverPort);
+ } catch (ExtendedNotFoundException e) {
+ throw e;
+ } catch (Exception e) {
+ LOGGER.error("delete MicroServiceInfo throw exception", e);
+ throw new ExtendedInternalServerErrorException(e.getMessage());
+
+ }
+
+ LOGGER.info("delete MicroServiceInfo success:serviceName-"
+ + serviceName + ",version-" + version );
+
+ }
+
+ public synchronized void deleteMicroServiceInstance(String serviceName, String version,
+ String ip,String port) {
+ if("null".equals(version)) {
+ version="";
+ }
+ serviceName=serviceName.replace("*", "/");
+
+ if (StringUtils.isBlank(serviceName)) {
+ throw new ExtendedNotSupportedException(
+ "delete MicroServiceInfo FAIL:serviceName can't be empty");
+ }
+
+ if (StringUtils.isNotBlank(version)) {
+ if (!RegExpTestUtil.versionRegExpTest(version)) {
+ throw new ExtendedNotSupportedException(
+ "delete MicroServiceInfo FAIL:version is not a valid format");
+ }
+ }
+
+ if (!RegExpTestUtil.ipRegExpTest(ip)) {
+ throw new ExtendedNotSupportedException("delete MicroServiceInfo FAIL:IP(" + ip
+ + ")is not a valid IP address");
+ }
+
+ if (!RegExpTestUtil.portRegExpTest(port)) {
+ throw new ExtendedNotSupportedException("delete MicroServiceInfo FAIL:Port(" + port
+ + ")is not a valid Port address");
+ }
+
+
+ try {
+ MicroServiceFullInfo microServiceInfo =
+ MicroServiceDB.getInstance().getMicroServiceInstance(serviceName, version,"");
+
+ if (microServiceInfo == null) {
+ throw new ExtendedNotFoundException("delete MicroServiceInfo FAIL:serviceName-"
+ + serviceName + ",version-" + version + " not fond ");
+ }
+
+ Set<NodeInfo> nodes = microServiceInfo.getNodes();
+
+ boolean ifFindBNode = false;
+
+ for (Node node : nodes) {
+ if (node.getIp().equals(ip) && node.getPort().equals(port)) {
+ ifFindBNode = true;
+ nodes.remove(node);
+
+ if (nodes.isEmpty()) {
+ //delete MicroService
+ MicroServiceDB.getInstance().deleteMicroService(serviceName, version,"");
+ //Notify the listeners
+ MicroServiceDB.getInstance().noticeApiListener(microServiceInfo, "DELETE","");
+ } else {
+ //delete Node
+ MicroServiceDB.getInstance().deleteNode(serviceName, version, ip,port);
+ MicroServiceDB.getInstance().noticeUpdateApiListener(serviceName, version,microServiceInfo,"");
+ }
+
+ break;
+ }
+ }
+
+ if (!ifFindBNode) {
+ throw new ExtendedNotFoundException("delete MicroServiceInfo FAIL: node-" + ip+":"+port
+ + " not fond ");
+ }
+
+
+ } catch (ExtendedNotFoundException e) {
+ throw e;
+ } catch (Exception e) {
+ LOGGER.error("deleteApiRoute throw exception", e);
+ throw new ExtendedInternalServerErrorException(e.getMessage());
+
+ }
+
+ }
+
+
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.wrapper;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.openo.msb.api.ServiceAccessInfo;
+import org.openo.msb.wrapper.util.JedisUtil;
+import org.openo.msb.wrapper.util.RouteUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import redis.clients.jedis.Jedis;
+
+public class ServiceAccessWrapper {
+ private static final Logger LOGGER = LoggerFactory.getLogger(ServiceAccessWrapper.class);
+
+ private static ServiceAccessWrapper instance = new ServiceAccessWrapper();
+
+ private ServiceAccessWrapper() {}
+
+ public static ServiceAccessWrapper getInstance() {
+ return instance;
+ }
+
+ public ServiceAccessInfo getApiServiceAccessAddr(String serviceName, String version, String host) {
+
+ ServiceAccessInfo apiRouteAccessInfo = null;
+
+ Jedis jedis = null;
+ try {
+ jedis = JedisUtil.borrowJedisInstance();
+ if (jedis == null) {
+ throw new Exception("fetch from jedis pool failed,null object!");
+ }
+
+ if ("null".equals(version)) {
+ version = "";
+ }
+
+ String routekey =
+ RouteUtil.getPrefixedKey("",RouteUtil.APIROUTE, serviceName, version,
+ RouteUtil.ROUTE_PATH_INFO);
+ Boolean isExist = jedis.exists(routekey);
+ if (isExist) {
+ apiRouteAccessInfo = new ServiceAccessInfo();
+ apiRouteAccessInfo.setServiceName(serviceName);
+ apiRouteAccessInfo.setVersion(version);
+ String accessAddr = "http://" + host + "/api/" + serviceName + "/" + version;
+ apiRouteAccessInfo.setAccessAddr(accessAddr);
+ }
+ } catch (Exception e) {
+ LOGGER.error("call redis throw exception", e);
+ } finally {
+ JedisUtil.returnJedisInstance(jedis);
+ }
+ return apiRouteAccessInfo;
+
+ }
+
+ public List<ServiceAccessInfo> getApiRouteAccessAddr(String serviceType, String serviceName,
+ String version, String host) {
+ List<ServiceAccessInfo> serviceList = new ArrayList<ServiceAccessInfo>();
+ Jedis jedis = null;
+ try {
+ jedis = JedisUtil.borrowJedisInstance();
+ if (jedis == null) {
+ throw new Exception("fetch from jedis pool failed,null object!");
+ }
+
+ String keyPattern = this.getRedisSearchPattern(serviceType, serviceName, version);
+ Set<String> infoKeys = jedis.keys(keyPattern);
+ Pattern pattern = this.getKeyPattern();
+ for (Iterator<String> iterator = infoKeys.iterator(); iterator.hasNext();) {
+ String infoKey = (String) iterator.next();
+ Matcher matcher = pattern.matcher(infoKey);
+ if (matcher.matches()) {
+ ServiceAccessInfo serviceAccessInfo = new ServiceAccessInfo();
+ serviceAccessInfo.setServiceType(matcher.group("servicetype"));
+ serviceAccessInfo.setServiceName(matcher.group("servicename"));
+ serviceAccessInfo.setVersion(matcher.group("version"));
+ this.buildServiceAccessAddr(serviceAccessInfo, host, infoKey, jedis);
+ serviceList.add(serviceAccessInfo);
+ }
+ }
+ } catch (Exception e) {
+ LOGGER.error("call redis throw exception", e);
+ } finally {
+ JedisUtil.returnJedisInstance(jedis);
+ }
+ return serviceList;
+
+ }
+
+ private void buildServiceAccessAddr(ServiceAccessInfo serviceAccessInfo, String host,
+ String infoKey, Jedis jedis) {
+ String serviceType = serviceAccessInfo.getServiceType();
+ StringBuffer accessAddr = new StringBuffer();
+ switch (serviceType) {
+ case RouteUtil.APIROUTE:
+ accessAddr.append("http://").append(host).append(":").append(JedisUtil.serverPort)
+ .append("/").append(serviceAccessInfo.getServiceType()).append("/")
+ .append(serviceAccessInfo.getServiceName()).append("/")
+ .append(serviceAccessInfo.getVersion());
+ serviceAccessInfo.setAccessAddr(accessAddr.toString());
+ break;
+ case RouteUtil.IUIROUTE:
+ accessAddr.append("http://").append(host).append(":").append(JedisUtil.serverPort)
+ .append("/").append(serviceAccessInfo.getServiceType()).append("/")
+ .append(serviceAccessInfo.getServiceName());
+ serviceAccessInfo.setAccessAddr(accessAddr.toString());
+ break;
+ case RouteUtil.CUSTOMROUTE:
+ accessAddr.append("http://").append(host).append(":").append(JedisUtil.serverPort)
+ .append(serviceAccessInfo.getServiceName());
+ serviceAccessInfo.setAccessAddr(accessAddr.toString());
+ break;
+ case RouteUtil.P2PROUTE:
+ accessAddr.append(jedis.hget(infoKey, "url"));
+ serviceAccessInfo.setAccessAddr(accessAddr.toString());
+ break;
+ default:
+ serviceAccessInfo.setAccessAddr("not supported now");
+ break;
+ }
+ }
+
+ private String getRedisSearchPattern(String serviceType, String serviceName, String version) {
+ StringBuffer sb = new StringBuffer();
+ sb.append(RouteUtil.ROUTE_PATH);
+ if (null != serviceType && !"".equals(serviceType)) {
+ sb.append(":").append(serviceType);
+ } else {
+ sb.append(":").append("*");
+ }
+ sb.append(":").append(serviceName);
+ if (null != version && !"".equals(version)) {
+ sb.append(":");
+ sb.append(version);
+ sb.append(":");
+ } else {
+ sb.append(":*");
+ }
+ sb.append(RouteUtil.ROUTE_PATH_INFO);
+ return sb.toString();
+ }
+
+ private Pattern getKeyPattern() {
+ String pStr =
+ "conductor:routing:(?<servicetype>api|iui|custom|p2p):(?<servicename>[^:]+)(:(?<version>[^:]*))?:info";
+ return Pattern.compile(pStr);
+ }
}
\ No newline at end of file
/**
- * Copyright 2016 ZTE, Inc. and others.
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
/**
- * Copyright 2016 ZTE, Inc. and others.
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
/**
- * Copyright 2016 ZTE, Inc. and others.
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
/**
- * Copyright 2016 ZTE, Inc. and others.
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
/**
- * Copyright 2016 ZTE, Inc. and others.
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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.consul.cache;\r
-\r
-import java.math.BigInteger;\r
-import java.util.List;\r
-\r
-import org.openo.msb.wrapper.consul.CatalogClient;\r
-import org.openo.msb.wrapper.consul.async.ConsulResponseCallback;\r
-import org.openo.msb.wrapper.consul.model.catalog.CatalogService;\r
-\r
-import com.google.common.base.Function;\r
-\r
-public class CatalogCache extends ConsulCache<String, CatalogService>{\r
- \r
- private final String serviceName;\r
-\r
- private CatalogCache(Function<CatalogService, String> keyConversion,\r
- ConsulCache.CallbackConsumer<CatalogService> callbackConsumer,String serviceName) {\r
- super(keyConversion, callbackConsumer);\r
- this.serviceName=serviceName;\r
- // TODO Auto-generated constructor stub\r
- }\r
- \r
- \r
- public static CatalogCache newCache(\r
- final CatalogClient catalogClient,\r
- final String serviceName,\r
- final int watchSeconds){\r
- Function<CatalogService,String> keyExtractor = new Function<CatalogService, String>() {\r
- @Override\r
- public String apply(CatalogService input) {\r
- //return input.getKey().substring(rootPath.length() + 1);\r
- return input.getServiceId();\r
- }\r
- }; \r
- \r
- final CallbackConsumer<CatalogService> callbackConsumer = new CallbackConsumer<CatalogService>() {\r
- @Override\r
- public void consume(BigInteger index, ConsulResponseCallback<List<CatalogService>> callback) {\r
- catalogClient.getService(serviceName, watchParams(index, watchSeconds),callback);\r
- }\r
- };\r
- \r
- \r
- return new CatalogCache(keyExtractor, callbackConsumer,serviceName);\r
- \r
- \r
- }\r
- \r
- public String getServiceName(){\r
- return this.serviceName;\r
- }\r
- \r
-\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.wrapper.consul.cache;
+
+import java.math.BigInteger;
+import java.util.List;
+
+import org.openo.msb.wrapper.consul.CatalogClient;
+import org.openo.msb.wrapper.consul.async.ConsulResponseCallback;
+import org.openo.msb.wrapper.consul.model.catalog.CatalogService;
+
+import com.google.common.base.Function;
+
+public class CatalogCache extends ConsulCache<String, CatalogService>{
+
+ private final String serviceName;
+
+ private CatalogCache(Function<CatalogService, String> keyConversion,
+ ConsulCache.CallbackConsumer<CatalogService> callbackConsumer,String serviceName) {
+ super(keyConversion, callbackConsumer);
+ this.serviceName=serviceName;
+ // TODO Auto-generated constructor stub
+ }
+
+
+ public static CatalogCache newCache(
+ final CatalogClient catalogClient,
+ final String serviceName,
+ final int watchSeconds){
+ Function<CatalogService,String> keyExtractor = new Function<CatalogService, String>() {
+ @Override
+ public String apply(CatalogService input) {
+ //return input.getKey().substring(rootPath.length() + 1);
+ return input.getServiceId();
+ }
+ };
+
+ final CallbackConsumer<CatalogService> callbackConsumer = new CallbackConsumer<CatalogService>() {
+ @Override
+ public void consume(BigInteger index, ConsulResponseCallback<List<CatalogService>> callback) {
+ catalogClient.getService(serviceName, watchParams(index, watchSeconds),callback);
+ }
+ };
+
+
+ return new CatalogCache(keyExtractor, callbackConsumer,serviceName);
+
+
+ }
+
+ public String getServiceName(){
+ return this.serviceName;
+ }
+
+
+}
/**
- * Copyright 2016 ZTE, Inc. and others.
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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.consul.cache;\r
-\r
-\r
-import static com.google.common.base.Preconditions.checkState;\r
-\r
-import java.math.BigInteger;\r
-import java.util.HashSet;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-import java.util.Map;\r
-import java.util.Set;\r
-import java.util.concurrent.CopyOnWriteArrayList;\r
-import java.util.concurrent.CountDownLatch;\r
-import java.util.concurrent.Executors;\r
-import java.util.concurrent.ScheduledExecutorService;\r
-import java.util.concurrent.TimeUnit;\r
-import java.util.concurrent.atomic.AtomicReference;\r
-\r
-import org.openo.msb.wrapper.consul.async.ConsulResponseCallback;\r
-import org.openo.msb.wrapper.consul.model.ConsulResponse;\r
-import org.openo.msb.wrapper.consul.model.catalog.CatalogService;\r
-import org.openo.msb.wrapper.consul.model.catalog.ServiceInfo;\r
-import org.openo.msb.wrapper.consul.option.QueryOptions;\r
-import org.slf4j.Logger;\r
-import org.slf4j.LoggerFactory;\r
-\r
-import com.google.common.annotations.VisibleForTesting;\r
-import com.google.common.collect.ImmutableList;\r
-\r
-/**\r
- * A cache structure that can provide an up-to-date read-only\r
- * map backed by consul data\r
- *\r
- * @param <V>\r
- */\r
-public class ConsulCache4Map<K, V> {\r
-\r
- enum State {latent, starting, started, stopped }\r
-\r
- private final static Logger LOGGER = LoggerFactory.getLogger(ConsulCache4Map.class);\r
-\r
- private final AtomicReference<BigInteger> latestIndex = new AtomicReference<BigInteger>(null);\r
- private final AtomicReference<ImmutableList<ServiceInfo>> lastResponse = new AtomicReference<ImmutableList<ServiceInfo>>(ImmutableList.<ServiceInfo>of());\r
- private final AtomicReference<State> state = new AtomicReference<State>(State.latent);\r
- private final CountDownLatch initLatch = new CountDownLatch(1);\r
- private final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();\r
- private final CopyOnWriteArrayList<Listener<K, V>> listeners = new CopyOnWriteArrayList<Listener<K, V>>();\r
-\r
- private final CallbackConsumer<V> callBackConsumer;\r
- private final ConsulResponseCallback<Map<String,List<String>>> responseCallback;\r
-\r
- ConsulCache4Map(CallbackConsumer<V> callbackConsumer) {\r
- this( callbackConsumer, 10, TimeUnit.SECONDS);\r
- }\r
-\r
- ConsulCache4Map(\r
- CallbackConsumer<V> callbackConsumer,\r
- final long backoffDelayQty,\r
- final TimeUnit backoffDelayUnit) {\r
-\r
- this.callBackConsumer = callbackConsumer;\r
-\r
- this.responseCallback = new ConsulResponseCallback<Map<String,List<String>>>() {\r
- @Override\r
- public void onComplete(ConsulResponse<Map<String,List<String>>> consulResponse) {\r
-\r
- if (!isRunning()) {\r
- return;\r
- }\r
- updateIndex(consulResponse);\r
- ImmutableList<ServiceInfo> full = convertToList(consulResponse);\r
- List<ServiceInfo> oldList=lastResponse.get();\r
- boolean changed = !full.equals(lastResponse.get());\r
-// LOGGER.info("service changed:"+changed+"----"+full);\r
- if (changed) {\r
- // changes\r
- lastResponse.set(full);\r
- }\r
-\r
- if (changed) {\r
- for (Listener<K, V> l : listeners) {\r
- l.notify(oldList,full);\r
- }\r
- }\r
-\r
- if (state.compareAndSet(State.starting, State.started)) {\r
- initLatch.countDown();\r
- }\r
- runCallback();\r
- }\r
-\r
- @Override\r
- public void onFailure(Throwable throwable) {\r
-\r
- if (!isRunning()) {\r
- return;\r
- }\r
- LOGGER.error(String.format("Error getting response from consul. will retry in %d %s", backoffDelayQty, backoffDelayUnit), throwable);\r
-\r
- executorService.schedule(new Runnable() {\r
- @Override\r
- public void run() {\r
- runCallback();\r
- }\r
- }, backoffDelayQty, backoffDelayUnit);\r
- }\r
- };\r
- }\r
-\r
- public void start() throws Exception {\r
- checkState(state.compareAndSet(State.latent, State.starting),"Cannot transition from state %s to %s", state.get(), State.starting);\r
- runCallback();\r
- }\r
-\r
- public void stop() throws Exception {\r
- State previous = state.getAndSet(State.stopped);\r
- if (previous != State.stopped) {\r
- executorService.shutdownNow();\r
- }\r
- }\r
-\r
- private void runCallback() {\r
- if (isRunning()) {\r
- callBackConsumer.consume(latestIndex.get(), responseCallback);\r
- }\r
- }\r
-\r
- private boolean isRunning() {\r
- return state.get() == State.started || state.get() == State.starting;\r
- }\r
-\r
- public boolean awaitInitialized(long timeout, TimeUnit unit) throws InterruptedException {\r
- return initLatch.await(timeout, unit);\r
- }\r
-\r
- public ImmutableList<ServiceInfo> getMap() {\r
- return lastResponse.get();\r
- }\r
-\r
- @VisibleForTesting\r
- ImmutableList<ServiceInfo> convertToList(final ConsulResponse<Map<String,List<String>>> response) {\r
- if (response == null || response.getResponse() == null || response.getResponse().isEmpty()) {\r
- return ImmutableList.of();\r
- }\r
-\r
- final ImmutableList.Builder<ServiceInfo> builder = ImmutableList.builder();\r
- final Set<String> keySet = new HashSet<>();\r
- \r
- for(Map.Entry<String,List<String>> entry : response.getResponse().entrySet()) {\r
- \r
- String key = entry.getKey(); \r
- \r
- if (key != null && !"consul".equals(key)) {\r
- if (!keySet.contains(key)) {\r
- ServiceInfo serviceInfo=new ServiceInfo();\r
- serviceInfo.setServiceName(key);\r
- \r
- List<String> value=entry.getValue();\r
- for(String tag:value){\r
- \r
- if(tag.startsWith("version")){\r
- String version; \r
- if(tag.split(":").length==2)\r
- {\r
- version = tag.split(":")[1];\r
- }\r
- else{\r
- version=""; \r
- }\r
- \r
- serviceInfo.setVersion(version);\r
- break;\r
- }\r
- }\r
- \r
- builder.add(serviceInfo);\r
- } else {\r
- System.out.println(key.toString());\r
- LOGGER.warn("Duplicate service encountered. May differ by tags. Try using more specific tags? " + key.toString());\r
- }\r
- }\r
- keySet.add(key);\r
- \r
- } \r
- \r
- \r
- return builder.build();\r
- }\r
-\r
- private void updateIndex(ConsulResponse<Map<String,List<String>>> consulResponse) {\r
- if (consulResponse != null && consulResponse.getIndex() != null) {\r
- this.latestIndex.set(consulResponse.getIndex());\r
- }\r
- }\r
-\r
- protected static QueryOptions watchParams(BigInteger index, int blockSeconds) {\r
- if (index == null) {\r
- return QueryOptions.BLANK;\r
- } else {\r
- return QueryOptions.blockSeconds(blockSeconds, index).build();\r
- }\r
- }\r
-\r
- /**\r
- * passed in by creators to vary the content of the cached values\r
- *\r
- * @param <V>\r
- */\r
- protected interface CallbackConsumer<V> {\r
- void consume(BigInteger index, ConsulResponseCallback<Map<String,List<String>>> callback);\r
- }\r
-\r
- /**\r
- * Implementers can register a listener to receive\r
- * a new map when it changes\r
- *\r
- * @param <V>\r
- */\r
- public interface Listener<K, V> {\r
- void notify(List<ServiceInfo> oldValues,List<ServiceInfo> newValues);\r
- }\r
-\r
- public boolean addListener(Listener<K, V> listener) {\r
- boolean added = listeners.add(listener);\r
- if (state.get() == State.started) {\r
- listener.notify(lastResponse.get(),lastResponse.get());\r
- }\r
- return added;\r
- }\r
-\r
- public boolean removeListener(Listener<K, V> listener) {\r
- return listeners.remove(listener);\r
- }\r
-\r
- @VisibleForTesting\r
- protected State getState() {\r
- return state.get();\r
- }\r
- \r
- \r
- \r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.wrapper.consul.cache;
+
+
+import static com.google.common.base.Preconditions.checkState;
+
+import java.math.BigInteger;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.openo.msb.wrapper.consul.async.ConsulResponseCallback;
+import org.openo.msb.wrapper.consul.model.ConsulResponse;
+import org.openo.msb.wrapper.consul.model.catalog.CatalogService;
+import org.openo.msb.wrapper.consul.model.catalog.ServiceInfo;
+import org.openo.msb.wrapper.consul.option.QueryOptions;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableList;
+
+/**
+ * A cache structure that can provide an up-to-date read-only
+ * map backed by consul data
+ *
+ * @param <V>
+ */
+public class ConsulCache4Map<K, V> {
+
+ enum State {latent, starting, started, stopped }
+
+ private final static Logger LOGGER = LoggerFactory.getLogger(ConsulCache4Map.class);
+
+ private final AtomicReference<BigInteger> latestIndex = new AtomicReference<BigInteger>(null);
+ private final AtomicReference<ImmutableList<ServiceInfo>> lastResponse = new AtomicReference<ImmutableList<ServiceInfo>>(ImmutableList.<ServiceInfo>of());
+ private final AtomicReference<State> state = new AtomicReference<State>(State.latent);
+ private final CountDownLatch initLatch = new CountDownLatch(1);
+ private final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
+ private final CopyOnWriteArrayList<Listener<K, V>> listeners = new CopyOnWriteArrayList<Listener<K, V>>();
+
+ private final CallbackConsumer<V> callBackConsumer;
+ private final ConsulResponseCallback<Map<String,List<String>>> responseCallback;
+
+ ConsulCache4Map(CallbackConsumer<V> callbackConsumer) {
+ this( callbackConsumer, 10, TimeUnit.SECONDS);
+ }
+
+ ConsulCache4Map(
+ CallbackConsumer<V> callbackConsumer,
+ final long backoffDelayQty,
+ final TimeUnit backoffDelayUnit) {
+
+ this.callBackConsumer = callbackConsumer;
+
+ this.responseCallback = new ConsulResponseCallback<Map<String,List<String>>>() {
+ @Override
+ public void onComplete(ConsulResponse<Map<String,List<String>>> consulResponse) {
+
+ if (!isRunning()) {
+ return;
+ }
+ updateIndex(consulResponse);
+ ImmutableList<ServiceInfo> full = convertToList(consulResponse);
+ List<ServiceInfo> oldList=lastResponse.get();
+ boolean changed = !full.equals(lastResponse.get());
+// LOGGER.info("service changed:"+changed+"----"+full);
+ if (changed) {
+ // changes
+ lastResponse.set(full);
+ }
+
+ if (changed) {
+ for (Listener<K, V> l : listeners) {
+ l.notify(oldList,full);
+ }
+ }
+
+ if (state.compareAndSet(State.starting, State.started)) {
+ initLatch.countDown();
+ }
+ runCallback();
+ }
+
+ @Override
+ public void onFailure(Throwable throwable) {
+
+ if (!isRunning()) {
+ return;
+ }
+ LOGGER.error(String.format("Error getting response from consul. will retry in %d %s", backoffDelayQty, backoffDelayUnit), throwable);
+
+ executorService.schedule(new Runnable() {
+ @Override
+ public void run() {
+ runCallback();
+ }
+ }, backoffDelayQty, backoffDelayUnit);
+ }
+ };
+ }
+
+ public void start() throws Exception {
+ checkState(state.compareAndSet(State.latent, State.starting),"Cannot transition from state %s to %s", state.get(), State.starting);
+ runCallback();
+ }
+
+ public void stop() throws Exception {
+ State previous = state.getAndSet(State.stopped);
+ if (previous != State.stopped) {
+ executorService.shutdownNow();
+ }
+ }
+
+ private void runCallback() {
+ if (isRunning()) {
+ callBackConsumer.consume(latestIndex.get(), responseCallback);
+ }
+ }
+
+ private boolean isRunning() {
+ return state.get() == State.started || state.get() == State.starting;
+ }
+
+ public boolean awaitInitialized(long timeout, TimeUnit unit) throws InterruptedException {
+ return initLatch.await(timeout, unit);
+ }
+
+ public ImmutableList<ServiceInfo> getMap() {
+ return lastResponse.get();
+ }
+
+ @VisibleForTesting
+ ImmutableList<ServiceInfo> convertToList(final ConsulResponse<Map<String,List<String>>> response) {
+ if (response == null || response.getResponse() == null || response.getResponse().isEmpty()) {
+ return ImmutableList.of();
+ }
+
+ final ImmutableList.Builder<ServiceInfo> builder = ImmutableList.builder();
+ final Set<String> keySet = new HashSet<>();
+
+ for(Map.Entry<String,List<String>> entry : response.getResponse().entrySet()) {
+
+ String key = entry.getKey();
+
+ if (key != null && !"consul".equals(key)) {
+ if (!keySet.contains(key)) {
+ ServiceInfo serviceInfo=new ServiceInfo();
+ serviceInfo.setServiceName(key);
+
+ List<String> value=entry.getValue();
+ for(String tag:value){
+
+ if(tag.startsWith("version")){
+ String version;
+ if(tag.split(":").length==2)
+ {
+ version = tag.split(":")[1];
+ }
+ else{
+ version="";
+ }
+
+ serviceInfo.setVersion(version);
+ break;
+ }
+ }
+
+ builder.add(serviceInfo);
+ } else {
+ System.out.println(key.toString());
+ LOGGER.warn("Duplicate service encountered. May differ by tags. Try using more specific tags? " + key.toString());
+ }
+ }
+ keySet.add(key);
+
+ }
+
+
+ return builder.build();
+ }
+
+ private void updateIndex(ConsulResponse<Map<String,List<String>>> consulResponse) {
+ if (consulResponse != null && consulResponse.getIndex() != null) {
+ this.latestIndex.set(consulResponse.getIndex());
+ }
+ }
+
+ protected static QueryOptions watchParams(BigInteger index, int blockSeconds) {
+ if (index == null) {
+ return QueryOptions.BLANK;
+ } else {
+ return QueryOptions.blockSeconds(blockSeconds, index).build();
+ }
+ }
+
+ /**
+ * passed in by creators to vary the content of the cached values
+ *
+ * @param <V>
+ */
+ protected interface CallbackConsumer<V> {
+ void consume(BigInteger index, ConsulResponseCallback<Map<String,List<String>>> callback);
+ }
+
+ /**
+ * Implementers can register a listener to receive
+ * a new map when it changes
+ *
+ * @param <V>
+ */
+ public interface Listener<K, V> {
+ void notify(List<ServiceInfo> oldValues,List<ServiceInfo> newValues);
+ }
+
+ public boolean addListener(Listener<K, V> listener) {
+ boolean added = listeners.add(listener);
+ if (state.get() == State.started) {
+ listener.notify(lastResponse.get(),lastResponse.get());
+ }
+ return added;
+ }
+
+ public boolean removeListener(Listener<K, V> listener) {
+ return listeners.remove(listener);
+ }
+
+ @VisibleForTesting
+ protected State getState() {
+ return state.get();
+ }
+
+
+
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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.consul.cache;\r
-\r
-import java.math.BigInteger;\r
-import java.util.List;\r
-\r
-import org.openo.msb.wrapper.consul.HealthClient;\r
-import org.openo.msb.wrapper.consul.async.ConsulResponseCallback;\r
-import org.openo.msb.wrapper.consul.model.health.ServiceHealth;\r
-\r
-import com.google.common.base.Function;\r
-\r
-public class HealthCache extends ConsulCache<String, ServiceHealth>{\r
- \r
- private final String serviceName;\r
-\r
- private HealthCache(Function<ServiceHealth, String> keyConversion,\r
- ConsulCache.CallbackConsumer<ServiceHealth> callbackConsumer,String serviceName) {\r
- super(keyConversion, callbackConsumer);\r
- this.serviceName=serviceName;\r
- // TODO Auto-generated constructor stub\r
- }\r
- \r
- \r
- public static HealthCache newCache(\r
- final HealthClient healthClient,\r
- final String serviceName,\r
- final int watchSeconds){\r
- Function<ServiceHealth,String> keyExtractor = new Function<ServiceHealth, String>() {\r
- @Override\r
- public String apply(ServiceHealth input) {\r
- //return input.getKey().substring(rootPath.length() + 1);\r
- return input.getService().getId();\r
- }\r
- }; \r
- \r
- final CallbackConsumer<ServiceHealth> callbackConsumer = new CallbackConsumer<ServiceHealth>() {\r
- @Override\r
- public void consume(BigInteger index, ConsulResponseCallback<List<ServiceHealth>> callback) {\r
- healthClient.getHealthyServiceInstances(serviceName, watchParams(index, watchSeconds),callback);\r
- }\r
- };\r
- \r
- \r
- return new HealthCache(keyExtractor, callbackConsumer,serviceName);\r
- \r
- \r
- }\r
- \r
- public String getServiceName(){\r
- return this.serviceName;\r
- }\r
- \r
-\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.wrapper.consul.cache;
+
+import java.math.BigInteger;
+import java.util.List;
+
+import org.openo.msb.wrapper.consul.HealthClient;
+import org.openo.msb.wrapper.consul.async.ConsulResponseCallback;
+import org.openo.msb.wrapper.consul.model.health.ServiceHealth;
+
+import com.google.common.base.Function;
+
+public class HealthCache extends ConsulCache<String, ServiceHealth>{
+
+ private final String serviceName;
+
+ private HealthCache(Function<ServiceHealth, String> keyConversion,
+ ConsulCache.CallbackConsumer<ServiceHealth> callbackConsumer,String serviceName) {
+ super(keyConversion, callbackConsumer);
+ this.serviceName=serviceName;
+ // TODO Auto-generated constructor stub
+ }
+
+
+ public static HealthCache newCache(
+ final HealthClient healthClient,
+ final String serviceName,
+ final int watchSeconds){
+ Function<ServiceHealth,String> keyExtractor = new Function<ServiceHealth, String>() {
+ @Override
+ public String apply(ServiceHealth input) {
+ //return input.getKey().substring(rootPath.length() + 1);
+ return input.getService().getId();
+ }
+ };
+
+ final CallbackConsumer<ServiceHealth> callbackConsumer = new CallbackConsumer<ServiceHealth>() {
+ @Override
+ public void consume(BigInteger index, ConsulResponseCallback<List<ServiceHealth>> callback) {
+ healthClient.getHealthyServiceInstances(serviceName, watchParams(index, watchSeconds),callback);
+ }
+ };
+
+
+ return new HealthCache(keyExtractor, callbackConsumer,serviceName);
+
+
+ }
+
+ public String getServiceName(){
+ return this.serviceName;
+ }
+
+
}
\ No newline at end of file
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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.consul.cache;\r
-\r
-import java.math.BigInteger;\r
-import java.util.List;\r
-import java.util.Map;\r
-\r
-import org.openo.msb.wrapper.consul.CatalogClient;\r
-import org.openo.msb.wrapper.consul.async.ConsulResponseCallback;\r
-\r
-public class ServiceCache extends ConsulCache4Map<String, Map<String, List<String>>> {\r
- private ServiceCache( ConsulCache4Map.CallbackConsumer<Map<String, List<String>>> callbackConsumer) {\r
- super(callbackConsumer);\r
- // TODO Auto-generated constructor stub\r
- }\r
- \r
- \r
- public static ServiceCache newCache(\r
- final CatalogClient catalogClient,\r
- final int watchSeconds){\r
- \r
- \r
- final CallbackConsumer<Map<String, List<String>>> callbackConsumer = new CallbackConsumer<Map<String, List<String>>>() {\r
- @Override\r
- public void consume(BigInteger index, ConsulResponseCallback<Map<String, List<String>>> callback) {\r
- catalogClient.getService(watchParams(index, watchSeconds),callback);\r
- }\r
- };\r
- \r
- \r
- return new ServiceCache(callbackConsumer);\r
- \r
- \r
- }\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.wrapper.consul.cache;
+
+import java.math.BigInteger;
+import java.util.List;
+import java.util.Map;
+
+import org.openo.msb.wrapper.consul.CatalogClient;
+import org.openo.msb.wrapper.consul.async.ConsulResponseCallback;
+
+public class ServiceCache extends ConsulCache4Map<String, Map<String, List<String>>> {
+ private ServiceCache( ConsulCache4Map.CallbackConsumer<Map<String, List<String>>> callbackConsumer) {
+ super(callbackConsumer);
+ // TODO Auto-generated constructor stub
+ }
+
+
+ public static ServiceCache newCache(
+ final CatalogClient catalogClient,
+ final int watchSeconds){
+
+
+ final CallbackConsumer<Map<String, List<String>>> callbackConsumer = new CallbackConsumer<Map<String, List<String>>>() {
+ @Override
+ public void consume(BigInteger index, ConsulResponseCallback<Map<String, List<String>>> callback) {
+ catalogClient.getService(watchParams(index, watchSeconds),callback);
+ }
+ };
+
+
+ return new ServiceCache(callbackConsumer);
+
+
+ }
+}
/**
- * Copyright 2016 ZTE, Inc. and others.
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
/**
- * Copyright 2016 ZTE, Inc. and others.
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
/**
- * Copyright 2016 ZTE, Inc. and others.
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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.consul.model.catalog;\r
-\r
-import com.fasterxml.jackson.annotation.JsonCreator;\r
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;\r
-import com.fasterxml.jackson.annotation.JsonProperty;\r
-import com.fasterxml.jackson.databind.annotation.JsonDeserialize;\r
-import com.google.common.base.MoreObjects;\r
-import com.google.common.base.Preconditions;\r
-import com.google.common.collect.ImmutableMap;\r
-import com.google.common.collect.Lists;\r
-\r
-import java.util.List;\r
-import java.util.Map;\r
-\r
-import javax.annotation.Generated;\r
-\r
-import org.openo.msb.wrapper.consul.model.health.Node;\r
-import org.openo.msb.wrapper.consul.model.health.Service;\r
-\r
-/**\r
- * Immutable implementation of {@link CatalogNode}.\r
- * <p>\r
- * Use the builder to create immutable instances:\r
- * {@code ImmutableCatalogNode.builder()}.\r
- */\r
-@SuppressWarnings("all")\r
-@Generated({"Immutables.generator", "CatalogNode"})\r
-@JsonIgnoreProperties(ignoreUnknown = true)\r
-public final class ImmutableCatalogNode extends CatalogNode {\r
- private final Node node;\r
- private final ImmutableMap<String, Service> services;\r
-\r
- private ImmutableCatalogNode(\r
- Node node,\r
- ImmutableMap<String, Service> services) {\r
- this.node = node;\r
- this.services = services;\r
- }\r
-\r
- /**\r
- * @return The value of the {@code node} attribute\r
- */\r
- @JsonProperty(value = "Node")\r
- @Override\r
- public Node getNode() {\r
- return node;\r
- }\r
-\r
- /**\r
- * @return The value of the {@code services} attribute\r
- */\r
- @JsonProperty(value = "Services")\r
- @Override\r
- public ImmutableMap<String, Service> getServices() {\r
- return services;\r
- }\r
-\r
- /**\r
- * Copy the current immutable object by setting a value for the {@link CatalogNode#getNode() node} attribute.\r
- * A shallow reference equality check is used to prevent copying of the same value by returning {@code this}.\r
- * @param value A new value for node\r
- * @return A modified copy of the {@code this} object\r
- */\r
- public final ImmutableCatalogNode withNode(Node value) {\r
- if (this.node == value) return this;\r
- return new ImmutableCatalogNode(Preconditions.checkNotNull(value, "node"), this.services);\r
- }\r
-\r
- /**\r
- * Copy the current immutable object by replacing the {@link CatalogNode#getServices() services} map with the specified map.\r
- * Nulls are not permitted as keys or values.\r
- * A shallow reference equality check is used to prevent copying of the same value by returning {@code this}.\r
- * @param entries The entries to be added to the services map\r
- * @return A modified copy of {@code this} object\r
- */\r
- public final ImmutableCatalogNode withServices(Map<String, ? extends Service> entries) {\r
- if (this.services == entries) return this;\r
- ImmutableMap<String, Service> value = ImmutableMap.copyOf(entries);\r
- return new ImmutableCatalogNode(this.node, value);\r
- }\r
-\r
- /**\r
- * This instance is equal to all instances of {@code ImmutableCatalogNode} that have equal attribute values.\r
- * @return {@code true} if {@code this} is equal to {@code another} instance\r
- */\r
- @Override\r
- public boolean equals(Object another) {\r
- if (this == another) return true;\r
- return another instanceof ImmutableCatalogNode\r
- && equalTo((ImmutableCatalogNode) another);\r
- }\r
-\r
- private boolean equalTo(ImmutableCatalogNode another) {\r
- return node.equals(another.node)\r
- && services.equals(another.services);\r
- }\r
-\r
- /**\r
- * Computes a hash code from attributes: {@code node}, {@code services}.\r
- * @return hashCode value\r
- */\r
- @Override\r
- public int hashCode() {\r
- int h = 31;\r
- h = h * 17 + node.hashCode();\r
- h = h * 17 + services.hashCode();\r
- return h;\r
- }\r
-\r
- /**\r
- * Prints the immutable value {@code CatalogNode...} with all non-generated\r
- * and non-auxiliary attribute values.\r
- * @return A string representation of the value\r
- */\r
- @Override\r
- public String toString() {\r
- return MoreObjects.toStringHelper("CatalogNode")\r
- .add("node", node)\r
- .add("services", services)\r
- .toString();\r
- }\r
-\r
- /**\r
- * Utility type used to correctly read immutable object from JSON representation.\r
- * @deprecated Do not use this type directly, it exists only for the <em>Jackson</em>-binding infrastructure\r
- */\r
- @Deprecated\r
- @JsonDeserialize\r
- static final class Json extends CatalogNode {\r
- Node node;\r
- Map<String, Service> services;\r
- @JsonProperty(value = "Node")\r
- public void setNode(Node node) {\r
- this.node = node;\r
- }\r
- @JsonProperty(value = "Services")\r
- public void setServices(Map<String, Service> services) {\r
- this.services = services;\r
- }\r
- @Override\r
- public Node getNode() { throw new UnsupportedOperationException(); }\r
- @Override\r
- public Map<String, Service> getServices() { throw new UnsupportedOperationException(); }\r
- }\r
-\r
- /**\r
- * @param json A JSON-bindable data structure\r
- * @return An immutable value type\r
- * @deprecated Do not use this method directly, it exists only for the <em>Jackson</em>-binding infrastructure\r
- */\r
- @Deprecated\r
- @JsonCreator\r
- static ImmutableCatalogNode fromJson(Json json) {\r
- ImmutableCatalogNode.Builder builder = ImmutableCatalogNode.builder();\r
- if (json.node != null) {\r
- builder.node(json.node);\r
- }\r
- if (json.services != null) {\r
- builder.putAllServices(json.services);\r
- }\r
- return builder.build();\r
- }\r
-\r
- /**\r
- * Creates an immutable copy of a {@link CatalogNode} value.\r
- * Uses accessors to get values to initialize the new immutable instance.\r
- * If an instance is already immutable, it is returned as is.\r
- * @param instance The instance to copy\r
- * @return A copied immutable CatalogNode instance\r
- */\r
- public static ImmutableCatalogNode copyOf(CatalogNode instance) {\r
- if (instance instanceof ImmutableCatalogNode) {\r
- return (ImmutableCatalogNode) instance;\r
- }\r
- return ImmutableCatalogNode.builder()\r
- .from(instance)\r
- .build();\r
- }\r
-\r
- /**\r
- * Creates a builder for {@link ImmutableCatalogNode ImmutableCatalogNode}.\r
- * @return A new ImmutableCatalogNode builder\r
- */\r
- public static ImmutableCatalogNode.Builder builder() {\r
- return new ImmutableCatalogNode.Builder();\r
- }\r
-\r
- /**\r
- * Builds instances of type {@link ImmutableCatalogNode ImmutableCatalogNode}.\r
- * Initialize attributes and then invoke the {@link #build()} method to create an\r
- * immutable instance.\r
- * <p><em>{@code Builder} is not thread-safe and generally should not be stored in a field or collection,\r
- * but instead used immediately to create instances.</em>\r
- */\r
- public static final class Builder {\r
- private static final long INIT_BIT_NODE = 0x1L;\r
- private long initBits = 0x1;\r
-\r
- private Node node;\r
- private ImmutableMap.Builder<String, Service> servicesBuilder = ImmutableMap.builder();\r
-\r
- private Builder() {\r
- }\r
-\r
- /**\r
- * Fill a builder with attribute values from the provided {@code CatalogNode} instance.\r
- * Regular attribute values will be replaced with those from the given instance.\r
- * Absent optional values will not replace present values.\r
- * Collection elements and entries will be added, not replaced.\r
- * @param instance The instance from which to copy values\r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder from(CatalogNode instance) {\r
- Preconditions.checkNotNull(instance, "instance");\r
- node(instance.getNode());\r
- putAllServices(instance.getServices());\r
- return this;\r
- }\r
-\r
- /**\r
- * Initializes the value for the {@link CatalogNode#getNode() node} attribute.\r
- * @param node The value for node \r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder node(Node node) {\r
- this.node = Preconditions.checkNotNull(node, "node");\r
- initBits &= ~INIT_BIT_NODE;\r
- return this;\r
- }\r
-\r
- /**\r
- * Put one entry to the {@link CatalogNode#getServices() services} map.\r
- * @param key The key in the services map\r
- * @param value The associated value in the services map\r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder putServices(String key, Service value) {\r
- servicesBuilder.put(key, value);\r
- return this;\r
- }\r
-\r
- /**\r
- * Put one entry to the {@link CatalogNode#getServices() services} map. Nulls are not permitted\r
- * @param entry The key and value entry\r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder putServices(Map.Entry<String, ? extends Service> entry) {\r
- servicesBuilder.put(entry);\r
- return this;\r
- }\r
-\r
- /**\r
- * Sets or replaces all mappings from the specified map as entries for the {@link CatalogNode#getServices() services} map. Nulls are not permitted\r
- * @param entries The entries that will be added to the services map\r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder services(Map<String, ? extends Service> entries) {\r
- servicesBuilder = ImmutableMap.builder();\r
- return putAllServices(entries);\r
- }\r
-\r
- /**\r
- * Put all mappings from the specified map as entries to {@link CatalogNode#getServices() services} map. Nulls are not permitted\r
- * @param entries The entries that will be added to the services map\r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder putAllServices(Map<String, ? extends Service> entries) {\r
- servicesBuilder.putAll(entries);\r
- return this;\r
- }\r
-\r
- /**\r
- * Builds a new {@link ImmutableCatalogNode ImmutableCatalogNode}.\r
- * @return An immutable instance of CatalogNode\r
- * @throws java.lang.IllegalStateException if any required attributes are missing\r
- */\r
- public ImmutableCatalogNode build() throws IllegalStateException {\r
- if (initBits != 0) {\r
- throw new IllegalStateException(formatRequiredAttributesMessage());\r
- }\r
- return new ImmutableCatalogNode(node, servicesBuilder.build());\r
- }\r
-\r
- private String formatRequiredAttributesMessage() {\r
- List<String> attributes = Lists.newArrayList();\r
- if ((initBits & INIT_BIT_NODE) != 0) attributes.add("node");\r
- return "Cannot build CatalogNode, some of required attributes are not set " + attributes;\r
- }\r
- }\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.wrapper.consul.model.catalog;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Lists;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.Generated;
+
+import org.openo.msb.wrapper.consul.model.health.Node;
+import org.openo.msb.wrapper.consul.model.health.Service;
+
+/**
+ * Immutable implementation of {@link CatalogNode}.
+ * <p>
+ * Use the builder to create immutable instances:
+ * {@code ImmutableCatalogNode.builder()}.
+ */
+@SuppressWarnings("all")
+@Generated({"Immutables.generator", "CatalogNode"})
+@JsonIgnoreProperties(ignoreUnknown = true)
+public final class ImmutableCatalogNode extends CatalogNode {
+ private final Node node;
+ private final ImmutableMap<String, Service> services;
+
+ private ImmutableCatalogNode(
+ Node node,
+ ImmutableMap<String, Service> services) {
+ this.node = node;
+ this.services = services;
+ }
+
+ /**
+ * @return The value of the {@code node} attribute
+ */
+ @JsonProperty(value = "Node")
+ @Override
+ public Node getNode() {
+ return node;
+ }
+
+ /**
+ * @return The value of the {@code services} attribute
+ */
+ @JsonProperty(value = "Services")
+ @Override
+ public ImmutableMap<String, Service> getServices() {
+ return services;
+ }
+
+ /**
+ * Copy the current immutable object by setting a value for the {@link CatalogNode#getNode() node} attribute.
+ * A shallow reference equality check is used to prevent copying of the same value by returning {@code this}.
+ * @param value A new value for node
+ * @return A modified copy of the {@code this} object
+ */
+ public final ImmutableCatalogNode withNode(Node value) {
+ if (this.node == value) return this;
+ return new ImmutableCatalogNode(Preconditions.checkNotNull(value, "node"), this.services);
+ }
+
+ /**
+ * Copy the current immutable object by replacing the {@link CatalogNode#getServices() services} map with the specified map.
+ * Nulls are not permitted as keys or values.
+ * A shallow reference equality check is used to prevent copying of the same value by returning {@code this}.
+ * @param entries The entries to be added to the services map
+ * @return A modified copy of {@code this} object
+ */
+ public final ImmutableCatalogNode withServices(Map<String, ? extends Service> entries) {
+ if (this.services == entries) return this;
+ ImmutableMap<String, Service> value = ImmutableMap.copyOf(entries);
+ return new ImmutableCatalogNode(this.node, value);
+ }
+
+ /**
+ * This instance is equal to all instances of {@code ImmutableCatalogNode} that have equal attribute values.
+ * @return {@code true} if {@code this} is equal to {@code another} instance
+ */
+ @Override
+ public boolean equals(Object another) {
+ if (this == another) return true;
+ return another instanceof ImmutableCatalogNode
+ && equalTo((ImmutableCatalogNode) another);
+ }
+
+ private boolean equalTo(ImmutableCatalogNode another) {
+ return node.equals(another.node)
+ && services.equals(another.services);
+ }
+
+ /**
+ * Computes a hash code from attributes: {@code node}, {@code services}.
+ * @return hashCode value
+ */
+ @Override
+ public int hashCode() {
+ int h = 31;
+ h = h * 17 + node.hashCode();
+ h = h * 17 + services.hashCode();
+ return h;
+ }
+
+ /**
+ * Prints the immutable value {@code CatalogNode...} with all non-generated
+ * and non-auxiliary attribute values.
+ * @return A string representation of the value
+ */
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper("CatalogNode")
+ .add("node", node)
+ .add("services", services)
+ .toString();
+ }
+
+ /**
+ * Utility type used to correctly read immutable object from JSON representation.
+ * @deprecated Do not use this type directly, it exists only for the <em>Jackson</em>-binding infrastructure
+ */
+ @Deprecated
+ @JsonDeserialize
+ static final class Json extends CatalogNode {
+ Node node;
+ Map<String, Service> services;
+ @JsonProperty(value = "Node")
+ public void setNode(Node node) {
+ this.node = node;
+ }
+ @JsonProperty(value = "Services")
+ public void setServices(Map<String, Service> services) {
+ this.services = services;
+ }
+ @Override
+ public Node getNode() { throw new UnsupportedOperationException(); }
+ @Override
+ public Map<String, Service> getServices() { throw new UnsupportedOperationException(); }
+ }
+
+ /**
+ * @param json A JSON-bindable data structure
+ * @return An immutable value type
+ * @deprecated Do not use this method directly, it exists only for the <em>Jackson</em>-binding infrastructure
+ */
+ @Deprecated
+ @JsonCreator
+ static ImmutableCatalogNode fromJson(Json json) {
+ ImmutableCatalogNode.Builder builder = ImmutableCatalogNode.builder();
+ if (json.node != null) {
+ builder.node(json.node);
+ }
+ if (json.services != null) {
+ builder.putAllServices(json.services);
+ }
+ return builder.build();
+ }
+
+ /**
+ * Creates an immutable copy of a {@link CatalogNode} value.
+ * Uses accessors to get values to initialize the new immutable instance.
+ * If an instance is already immutable, it is returned as is.
+ * @param instance The instance to copy
+ * @return A copied immutable CatalogNode instance
+ */
+ public static ImmutableCatalogNode copyOf(CatalogNode instance) {
+ if (instance instanceof ImmutableCatalogNode) {
+ return (ImmutableCatalogNode) instance;
+ }
+ return ImmutableCatalogNode.builder()
+ .from(instance)
+ .build();
+ }
+
+ /**
+ * Creates a builder for {@link ImmutableCatalogNode ImmutableCatalogNode}.
+ * @return A new ImmutableCatalogNode builder
+ */
+ public static ImmutableCatalogNode.Builder builder() {
+ return new ImmutableCatalogNode.Builder();
+ }
+
+ /**
+ * Builds instances of type {@link ImmutableCatalogNode ImmutableCatalogNode}.
+ * Initialize attributes and then invoke the {@link #build()} method to create an
+ * immutable instance.
+ * <p><em>{@code Builder} is not thread-safe and generally should not be stored in a field or collection,
+ * but instead used immediately to create instances.</em>
+ */
+ public static final class Builder {
+ private static final long INIT_BIT_NODE = 0x1L;
+ private long initBits = 0x1;
+
+ private Node node;
+ private ImmutableMap.Builder<String, Service> servicesBuilder = ImmutableMap.builder();
+
+ private Builder() {
+ }
+
+ /**
+ * Fill a builder with attribute values from the provided {@code CatalogNode} instance.
+ * Regular attribute values will be replaced with those from the given instance.
+ * Absent optional values will not replace present values.
+ * Collection elements and entries will be added, not replaced.
+ * @param instance The instance from which to copy values
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder from(CatalogNode instance) {
+ Preconditions.checkNotNull(instance, "instance");
+ node(instance.getNode());
+ putAllServices(instance.getServices());
+ return this;
+ }
+
+ /**
+ * Initializes the value for the {@link CatalogNode#getNode() node} attribute.
+ * @param node The value for node
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder node(Node node) {
+ this.node = Preconditions.checkNotNull(node, "node");
+ initBits &= ~INIT_BIT_NODE;
+ return this;
+ }
+
+ /**
+ * Put one entry to the {@link CatalogNode#getServices() services} map.
+ * @param key The key in the services map
+ * @param value The associated value in the services map
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder putServices(String key, Service value) {
+ servicesBuilder.put(key, value);
+ return this;
+ }
+
+ /**
+ * Put one entry to the {@link CatalogNode#getServices() services} map. Nulls are not permitted
+ * @param entry The key and value entry
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder putServices(Map.Entry<String, ? extends Service> entry) {
+ servicesBuilder.put(entry);
+ return this;
+ }
+
+ /**
+ * Sets or replaces all mappings from the specified map as entries for the {@link CatalogNode#getServices() services} map. Nulls are not permitted
+ * @param entries The entries that will be added to the services map
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder services(Map<String, ? extends Service> entries) {
+ servicesBuilder = ImmutableMap.builder();
+ return putAllServices(entries);
+ }
+
+ /**
+ * Put all mappings from the specified map as entries to {@link CatalogNode#getServices() services} map. Nulls are not permitted
+ * @param entries The entries that will be added to the services map
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder putAllServices(Map<String, ? extends Service> entries) {
+ servicesBuilder.putAll(entries);
+ return this;
+ }
+
+ /**
+ * Builds a new {@link ImmutableCatalogNode ImmutableCatalogNode}.
+ * @return An immutable instance of CatalogNode
+ * @throws java.lang.IllegalStateException if any required attributes are missing
+ */
+ public ImmutableCatalogNode build() throws IllegalStateException {
+ if (initBits != 0) {
+ throw new IllegalStateException(formatRequiredAttributesMessage());
+ }
+ return new ImmutableCatalogNode(node, servicesBuilder.build());
+ }
+
+ private String formatRequiredAttributesMessage() {
+ List<String> attributes = Lists.newArrayList();
+ if ((initBits & INIT_BIT_NODE) != 0) attributes.add("node");
+ return "Cannot build CatalogNode, some of required attributes are not set " + attributes;
+ }
+ }
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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.consul.model.catalog;\r
-\r
-import com.fasterxml.jackson.annotation.JsonCreator;\r
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;\r
-import com.fasterxml.jackson.annotation.JsonProperty;\r
-import com.fasterxml.jackson.databind.annotation.JsonDeserialize;\r
-import com.google.common.base.MoreObjects;\r
-import com.google.common.base.Preconditions;\r
-import com.google.common.collect.ImmutableList;\r
-import com.google.common.collect.Lists;\r
-import java.util.List;\r
-import javax.annotation.Generated;\r
-\r
-/**\r
- * Immutable implementation of {@link CatalogService}.\r
- * <p>\r
- * Use the builder to create immutable instances:\r
- * {@code ImmutableCatalogService.builder()}.\r
- */\r
-@SuppressWarnings("all")\r
-@Generated({"Immutables.generator", "CatalogService"})\r
-@JsonIgnoreProperties(ignoreUnknown = true)\r
-public final class ImmutableCatalogService extends CatalogService {\r
- private final String node;\r
- private final String address;\r
- private final String serviceName;\r
- private final String serviceId;\r
- private final String serviceAddress;\r
- private final int servicePort;\r
- private final ImmutableList<String> serviceTags;\r
-\r
- private ImmutableCatalogService(\r
- String node,\r
- String address,\r
- String serviceName,\r
- String serviceId,\r
- String serviceAddress,\r
- int servicePort,\r
- ImmutableList<String> serviceTags) {\r
- this.node = node;\r
- this.address = address;\r
- this.serviceName = serviceName;\r
- this.serviceId = serviceId;\r
- this.serviceAddress = serviceAddress;\r
- this.servicePort = servicePort;\r
- this.serviceTags = serviceTags;\r
- }\r
-\r
- /**\r
- * @return The value of the {@code node} attribute\r
- */\r
- @JsonProperty(value = "Node")\r
- @Override\r
- public String getNode() {\r
- return node;\r
- }\r
-\r
- /**\r
- * @return The value of the {@code address} attribute\r
- */\r
- @JsonProperty(value = "Address")\r
- @Override\r
- public String getAddress() {\r
- return address;\r
- }\r
-\r
- /**\r
- * @return The value of the {@code serviceName} attribute\r
- */\r
- @JsonProperty(value = "ServiceName")\r
- @Override\r
- public String getServiceName() {\r
- return serviceName;\r
- }\r
-\r
- /**\r
- * @return The value of the {@code serviceId} attribute\r
- */\r
- @JsonProperty(value = "ServiceID")\r
- @Override\r
- public String getServiceId() {\r
- return serviceId;\r
- }\r
-\r
- /**\r
- * @return The value of the {@code serviceAddress} attribute\r
- */\r
- @JsonProperty(value = "ServiceAddress")\r
- @Override\r
- public String getServiceAddress() {\r
- return serviceAddress;\r
- }\r
-\r
- /**\r
- * @return The value of the {@code servicePort} attribute\r
- */\r
- @JsonProperty(value = "ServicePort")\r
- @Override\r
- public int getServicePort() {\r
- return servicePort;\r
- }\r
-\r
- /**\r
- * @return The value of the {@code serviceTags} attribute\r
- */\r
- @JsonProperty(value = "ServiceTags")\r
- @Override\r
- public ImmutableList<String> getServiceTags() {\r
- return serviceTags;\r
- }\r
-\r
- /**\r
- * Copy the current immutable object by setting a value for the {@link CatalogService#getNode() node} attribute.\r
- * An equals check used to prevent copying of the same value by returning {@code this}.\r
- * @param value A new value for node\r
- * @return A modified copy of the {@code this} object\r
- */\r
- public final ImmutableCatalogService withNode(String value) {\r
- if (this.node.equals(value)) return this;\r
- return new ImmutableCatalogService(\r
- Preconditions.checkNotNull(value, "node"),\r
- this.address,\r
- this.serviceName,\r
- this.serviceId,\r
- this.serviceAddress,\r
- this.servicePort,\r
- this.serviceTags);\r
- }\r
-\r
- /**\r
- * Copy the current immutable object by setting a value for the {@link CatalogService#getAddress() address} attribute.\r
- * An equals check used to prevent copying of the same value by returning {@code this}.\r
- * @param value A new value for address\r
- * @return A modified copy of the {@code this} object\r
- */\r
- public final ImmutableCatalogService withAddress(String value) {\r
- if (this.address.equals(value)) return this;\r
- return new ImmutableCatalogService(\r
- this.node,\r
- Preconditions.checkNotNull(value, "address"),\r
- this.serviceName,\r
- this.serviceId,\r
- this.serviceAddress,\r
- this.servicePort,\r
- this.serviceTags);\r
- }\r
-\r
- /**\r
- * Copy the current immutable object by setting a value for the {@link CatalogService#getServiceName() serviceName} attribute.\r
- * An equals check used to prevent copying of the same value by returning {@code this}.\r
- * @param value A new value for serviceName\r
- * @return A modified copy of the {@code this} object\r
- */\r
- public final ImmutableCatalogService withServiceName(String value) {\r
- if (this.serviceName.equals(value)) return this;\r
- return new ImmutableCatalogService(\r
- this.node,\r
- this.address,\r
- Preconditions.checkNotNull(value, "serviceName"),\r
- this.serviceId,\r
- this.serviceAddress,\r
- this.servicePort,\r
- this.serviceTags);\r
- }\r
-\r
- /**\r
- * Copy the current immutable object by setting a value for the {@link CatalogService#getServiceId() serviceId} attribute.\r
- * An equals check used to prevent copying of the same value by returning {@code this}.\r
- * @param value A new value for serviceId\r
- * @return A modified copy of the {@code this} object\r
- */\r
- public final ImmutableCatalogService withServiceId(String value) {\r
- if (this.serviceId.equals(value)) return this;\r
- return new ImmutableCatalogService(\r
- this.node,\r
- this.address,\r
- this.serviceName,\r
- Preconditions.checkNotNull(value, "serviceId"),\r
- this.serviceAddress,\r
- this.servicePort,\r
- this.serviceTags);\r
- }\r
-\r
- /**\r
- * Copy the current immutable object by setting a value for the {@link CatalogService#getServiceAddress() serviceAddress} attribute.\r
- * An equals check used to prevent copying of the same value by returning {@code this}.\r
- * @param value A new value for serviceAddress\r
- * @return A modified copy of the {@code this} object\r
- */\r
- public final ImmutableCatalogService withServiceAddress(String value) {\r
- if (this.serviceAddress.equals(value)) return this;\r
- return new ImmutableCatalogService(\r
- this.node,\r
- this.address,\r
- this.serviceName,\r
- this.serviceId,\r
- Preconditions.checkNotNull(value, "serviceAddress"),\r
- this.servicePort,\r
- this.serviceTags);\r
- }\r
-\r
- /**\r
- * Copy the current immutable object by setting a value for the {@link CatalogService#getServicePort() servicePort} attribute.\r
- * A value equality check is used to prevent copying of the same value by returning {@code this}.\r
- * @param value A new value for servicePort\r
- * @return A modified copy of the {@code this} object\r
- */\r
- public final ImmutableCatalogService withServicePort(int value) {\r
- if (this.servicePort == value) return this;\r
- return new ImmutableCatalogService(\r
- this.node,\r
- this.address,\r
- this.serviceName,\r
- this.serviceId,\r
- this.serviceAddress,\r
- value,\r
- this.serviceTags);\r
- }\r
-\r
- /**\r
- * Copy the current immutable object with elements that replace the content of {@link CatalogService#getServiceTags() serviceTags}.\r
- * @param elements The elements to set\r
- * @return A modified copy of {@code this} object\r
- */\r
- public final ImmutableCatalogService withServiceTags(String... elements) {\r
- ImmutableList<String> newValue = ImmutableList.copyOf(elements);\r
- return new ImmutableCatalogService(\r
- this.node,\r
- this.address,\r
- this.serviceName,\r
- this.serviceId,\r
- this.serviceAddress,\r
- this.servicePort,\r
- newValue);\r
- }\r
-\r
- /**\r
- * Copy the current immutable object with elements that replace the content of {@link CatalogService#getServiceTags() serviceTags}.\r
- * A shallow reference equality check is used to prevent copying of the same value by returning {@code this}.\r
- * @param elements An iterable of serviceTags elements to set\r
- * @return A modified copy of {@code this} object\r
- */\r
- public final ImmutableCatalogService withServiceTags(Iterable<String> elements) {\r
- if (this.serviceTags == elements) return this;\r
- ImmutableList<String> newValue = ImmutableList.copyOf(elements);\r
- return new ImmutableCatalogService(\r
- this.node,\r
- this.address,\r
- this.serviceName,\r
- this.serviceId,\r
- this.serviceAddress,\r
- this.servicePort,\r
- newValue);\r
- }\r
-\r
- /**\r
- * This instance is equal to all instances of {@code ImmutableCatalogService} that have equal attribute values.\r
- * @return {@code true} if {@code this} is equal to {@code another} instance\r
- */\r
- @Override\r
- public boolean equals(Object another) {\r
- if (this == another) return true;\r
- return another instanceof ImmutableCatalogService\r
- && equalTo((ImmutableCatalogService) another);\r
- }\r
-\r
- private boolean equalTo(ImmutableCatalogService another) {\r
- return node.equals(another.node)\r
- && address.equals(another.address)\r
- && serviceName.equals(another.serviceName)\r
- && serviceId.equals(another.serviceId)\r
- && serviceAddress.equals(another.serviceAddress)\r
- && servicePort == another.servicePort\r
- && serviceTags.equals(another.serviceTags);\r
- }\r
-\r
- /**\r
- * Computes a hash code from attributes: {@code node}, {@code address}, {@code serviceName}, {@code serviceId}, {@code serviceAddress}, {@code servicePort}, {@code serviceTags}.\r
- * @return hashCode value\r
- */\r
- @Override\r
- public int hashCode() {\r
- int h = 31;\r
- h = h * 17 + node.hashCode();\r
- h = h * 17 + address.hashCode();\r
- h = h * 17 + serviceName.hashCode();\r
- h = h * 17 + serviceId.hashCode();\r
- h = h * 17 + serviceAddress.hashCode();\r
- h = h * 17 + servicePort;\r
- h = h * 17 + serviceTags.hashCode();\r
- return h;\r
- }\r
-\r
- /**\r
- * Prints the immutable value {@code CatalogService...} with all non-generated\r
- * and non-auxiliary attribute values.\r
- * @return A string representation of the value\r
- */\r
- @Override\r
- public String toString() {\r
- return MoreObjects.toStringHelper("CatalogService")\r
- .add("node", node)\r
- .add("address", address)\r
- .add("serviceName", serviceName)\r
- .add("serviceId", serviceId)\r
- .add("serviceAddress", serviceAddress)\r
- .add("servicePort", servicePort)\r
- .add("serviceTags", serviceTags)\r
- .toString();\r
- }\r
-\r
- /**\r
- * Utility type used to correctly read immutable object from JSON representation.\r
- * @deprecated Do not use this type directly, it exists only for the <em>Jackson</em>-binding infrastructure\r
- */\r
- @Deprecated\r
- @JsonDeserialize\r
- static final class Json extends CatalogService {\r
- String node;\r
- String address;\r
- String serviceName;\r
- String serviceId;\r
- String serviceAddress;\r
- Integer servicePort;\r
- List<String> serviceTags = ImmutableList.of();\r
- @JsonProperty(value = "Node")\r
- public void setNode(String node) {\r
- this.node = node;\r
- }\r
- @JsonProperty(value = "Address")\r
- public void setAddress(String address) {\r
- this.address = address;\r
- }\r
- @JsonProperty(value = "ServiceName")\r
- public void setServiceName(String serviceName) {\r
- this.serviceName = serviceName;\r
- }\r
- @JsonProperty(value = "ServiceID")\r
- public void setServiceId(String serviceId) {\r
- this.serviceId = serviceId;\r
- }\r
- @JsonProperty(value = "ServiceAddress")\r
- public void setServiceAddress(String serviceAddress) {\r
- this.serviceAddress = serviceAddress;\r
- }\r
- @JsonProperty(value = "ServicePort")\r
- public void setServicePort(int servicePort) {\r
- this.servicePort = servicePort;\r
- }\r
- @JsonProperty(value = "ServiceTags")\r
- public void setServiceTags(List<String> serviceTags) {\r
- this.serviceTags = serviceTags;\r
- }\r
- @Override\r
- public String getNode() { throw new UnsupportedOperationException(); }\r
- @Override\r
- public String getAddress() { throw new UnsupportedOperationException(); }\r
- @Override\r
- public String getServiceName() { throw new UnsupportedOperationException(); }\r
- @Override\r
- public String getServiceId() { throw new UnsupportedOperationException(); }\r
- @Override\r
- public String getServiceAddress() { throw new UnsupportedOperationException(); }\r
- @Override\r
- public int getServicePort() { throw new UnsupportedOperationException(); }\r
- @Override\r
- public List<String> getServiceTags() { throw new UnsupportedOperationException(); }\r
- }\r
-\r
- /**\r
- * @param json A JSON-bindable data structure\r
- * @return An immutable value type\r
- * @deprecated Do not use this method directly, it exists only for the <em>Jackson</em>-binding infrastructure\r
- */\r
- @Deprecated\r
- @JsonCreator\r
- static ImmutableCatalogService fromJson(Json json) {\r
- ImmutableCatalogService.Builder builder = ImmutableCatalogService.builder();\r
- if (json.node != null) {\r
- builder.node(json.node);\r
- }\r
- if (json.address != null) {\r
- builder.address(json.address);\r
- }\r
- if (json.serviceName != null) {\r
- builder.serviceName(json.serviceName);\r
- }\r
- if (json.serviceId != null) {\r
- builder.serviceId(json.serviceId);\r
- }\r
- if (json.serviceAddress != null) {\r
- builder.serviceAddress(json.serviceAddress);\r
- }\r
- if (json.servicePort != null) {\r
- builder.servicePort(json.servicePort);\r
- }\r
- if (json.serviceTags != null) {\r
- builder.addAllServiceTags(json.serviceTags);\r
- }\r
- return builder.build();\r
- }\r
-\r
- /**\r
- * Creates an immutable copy of a {@link CatalogService} value.\r
- * Uses accessors to get values to initialize the new immutable instance.\r
- * If an instance is already immutable, it is returned as is.\r
- * @param instance The instance to copy\r
- * @return A copied immutable CatalogService instance\r
- */\r
- public static ImmutableCatalogService copyOf(CatalogService instance) {\r
- if (instance instanceof ImmutableCatalogService) {\r
- return (ImmutableCatalogService) instance;\r
- }\r
- return ImmutableCatalogService.builder()\r
- .from(instance)\r
- .build();\r
- }\r
-\r
- /**\r
- * Creates a builder for {@link ImmutableCatalogService ImmutableCatalogService}.\r
- * @return A new ImmutableCatalogService builder\r
- */\r
- public static ImmutableCatalogService.Builder builder() {\r
- return new ImmutableCatalogService.Builder();\r
- }\r
-\r
- /**\r
- * Builds instances of type {@link ImmutableCatalogService ImmutableCatalogService}.\r
- * Initialize attributes and then invoke the {@link #build()} method to create an\r
- * immutable instance.\r
- * <p><em>{@code Builder} is not thread-safe and generally should not be stored in a field or collection,\r
- * but instead used immediately to create instances.</em>\r
- */\r
- public static final class Builder {\r
- private static final long INIT_BIT_NODE = 0x1L;\r
- private static final long INIT_BIT_ADDRESS = 0x2L;\r
- private static final long INIT_BIT_SERVICE_NAME = 0x4L;\r
- private static final long INIT_BIT_SERVICE_ID = 0x8L;\r
- private static final long INIT_BIT_SERVICE_ADDRESS = 0x10L;\r
- private static final long INIT_BIT_SERVICE_PORT = 0x20L;\r
- private long initBits = 0x3f;\r
-\r
- private String node;\r
- private String address;\r
- private String serviceName;\r
- private String serviceId;\r
- private String serviceAddress;\r
- private int servicePort;\r
- private ImmutableList.Builder<String> serviceTagsBuilder = ImmutableList.builder();\r
-\r
- private Builder() {\r
- }\r
-\r
- /**\r
- * Fill a builder with attribute values from the provided {@code CatalogService} instance.\r
- * Regular attribute values will be replaced with those from the given instance.\r
- * Absent optional values will not replace present values.\r
- * Collection elements and entries will be added, not replaced.\r
- * @param instance The instance from which to copy values\r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder from(CatalogService instance) {\r
- Preconditions.checkNotNull(instance, "instance");\r
- node(instance.getNode());\r
- address(instance.getAddress());\r
- serviceName(instance.getServiceName());\r
- serviceId(instance.getServiceId());\r
- serviceAddress(instance.getServiceAddress());\r
- servicePort(instance.getServicePort());\r
- addAllServiceTags(instance.getServiceTags());\r
- return this;\r
- }\r
-\r
- /**\r
- * Initializes the value for the {@link CatalogService#getNode() node} attribute.\r
- * @param node The value for node \r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder node(String node) {\r
- this.node = Preconditions.checkNotNull(node, "node");\r
- initBits &= ~INIT_BIT_NODE;\r
- return this;\r
- }\r
-\r
- /**\r
- * Initializes the value for the {@link CatalogService#getAddress() address} attribute.\r
- * @param address The value for address \r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder address(String address) {\r
- this.address = Preconditions.checkNotNull(address, "address");\r
- initBits &= ~INIT_BIT_ADDRESS;\r
- return this;\r
- }\r
-\r
- /**\r
- * Initializes the value for the {@link CatalogService#getServiceName() serviceName} attribute.\r
- * @param serviceName The value for serviceName \r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder serviceName(String serviceName) {\r
- this.serviceName = Preconditions.checkNotNull(serviceName, "serviceName");\r
- initBits &= ~INIT_BIT_SERVICE_NAME;\r
- return this;\r
- }\r
-\r
- /**\r
- * Initializes the value for the {@link CatalogService#getServiceId() serviceId} attribute.\r
- * @param serviceId The value for serviceId \r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder serviceId(String serviceId) {\r
- this.serviceId = Preconditions.checkNotNull(serviceId, "serviceId");\r
- initBits &= ~INIT_BIT_SERVICE_ID;\r
- return this;\r
- }\r
-\r
- /**\r
- * Initializes the value for the {@link CatalogService#getServiceAddress() serviceAddress} attribute.\r
- * @param serviceAddress The value for serviceAddress \r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder serviceAddress(String serviceAddress) {\r
- this.serviceAddress = Preconditions.checkNotNull(serviceAddress, "serviceAddress");\r
- initBits &= ~INIT_BIT_SERVICE_ADDRESS;\r
- return this;\r
- }\r
-\r
- /**\r
- * Initializes the value for the {@link CatalogService#getServicePort() servicePort} attribute.\r
- * @param servicePort The value for servicePort \r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder servicePort(int servicePort) {\r
- this.servicePort = servicePort;\r
- initBits &= ~INIT_BIT_SERVICE_PORT;\r
- return this;\r
- }\r
-\r
- /**\r
- * Adds one element to {@link CatalogService#getServiceTags() serviceTags} list.\r
- * @param element A serviceTags element\r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder addServiceTags(String element) {\r
- serviceTagsBuilder.add(element);\r
- return this;\r
- }\r
-\r
- /**\r
- * Adds elements to {@link CatalogService#getServiceTags() serviceTags} list.\r
- * @param elements An array of serviceTags elements\r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder addServiceTags(String... elements) {\r
- serviceTagsBuilder.add(elements);\r
- return this;\r
- }\r
-\r
- /**\r
- * Sets or replaces all elements for {@link CatalogService#getServiceTags() serviceTags} list.\r
- * @param elements An iterable of serviceTags elements\r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder serviceTags(Iterable<String> elements) {\r
- serviceTagsBuilder = ImmutableList.builder();\r
- return addAllServiceTags(elements);\r
- }\r
-\r
- /**\r
- * Adds elements to {@link CatalogService#getServiceTags() serviceTags} list.\r
- * @param elements An iterable of serviceTags elements\r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder addAllServiceTags(Iterable<String> elements) {\r
- serviceTagsBuilder.addAll(elements);\r
- return this;\r
- }\r
-\r
- /**\r
- * Builds a new {@link ImmutableCatalogService ImmutableCatalogService}.\r
- * @return An immutable instance of CatalogService\r
- * @throws java.lang.IllegalStateException if any required attributes are missing\r
- */\r
- public ImmutableCatalogService build() throws IllegalStateException {\r
- if (initBits != 0) {\r
- throw new IllegalStateException(formatRequiredAttributesMessage());\r
- }\r
- return new ImmutableCatalogService(\r
- node,\r
- address,\r
- serviceName,\r
- serviceId,\r
- serviceAddress,\r
- servicePort,\r
- serviceTagsBuilder.build());\r
- }\r
-\r
- private String formatRequiredAttributesMessage() {\r
- List<String> attributes = Lists.newArrayList();\r
- if ((initBits & INIT_BIT_NODE) != 0) attributes.add("node");\r
- if ((initBits & INIT_BIT_ADDRESS) != 0) attributes.add("address");\r
- if ((initBits & INIT_BIT_SERVICE_NAME) != 0) attributes.add("serviceName");\r
- if ((initBits & INIT_BIT_SERVICE_ID) != 0) attributes.add("serviceId");\r
- if ((initBits & INIT_BIT_SERVICE_ADDRESS) != 0) attributes.add("serviceAddress");\r
- if ((initBits & INIT_BIT_SERVICE_PORT) != 0) attributes.add("servicePort");\r
- return "Cannot build CatalogService, some of required attributes are not set " + attributes;\r
- }\r
- }\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.wrapper.consul.model.catalog;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import java.util.List;
+import javax.annotation.Generated;
+
+/**
+ * Immutable implementation of {@link CatalogService}.
+ * <p>
+ * Use the builder to create immutable instances:
+ * {@code ImmutableCatalogService.builder()}.
+ */
+@SuppressWarnings("all")
+@Generated({"Immutables.generator", "CatalogService"})
+@JsonIgnoreProperties(ignoreUnknown = true)
+public final class ImmutableCatalogService extends CatalogService {
+ private final String node;
+ private final String address;
+ private final String serviceName;
+ private final String serviceId;
+ private final String serviceAddress;
+ private final int servicePort;
+ private final ImmutableList<String> serviceTags;
+
+ private ImmutableCatalogService(
+ String node,
+ String address,
+ String serviceName,
+ String serviceId,
+ String serviceAddress,
+ int servicePort,
+ ImmutableList<String> serviceTags) {
+ this.node = node;
+ this.address = address;
+ this.serviceName = serviceName;
+ this.serviceId = serviceId;
+ this.serviceAddress = serviceAddress;
+ this.servicePort = servicePort;
+ this.serviceTags = serviceTags;
+ }
+
+ /**
+ * @return The value of the {@code node} attribute
+ */
+ @JsonProperty(value = "Node")
+ @Override
+ public String getNode() {
+ return node;
+ }
+
+ /**
+ * @return The value of the {@code address} attribute
+ */
+ @JsonProperty(value = "Address")
+ @Override
+ public String getAddress() {
+ return address;
+ }
+
+ /**
+ * @return The value of the {@code serviceName} attribute
+ */
+ @JsonProperty(value = "ServiceName")
+ @Override
+ public String getServiceName() {
+ return serviceName;
+ }
+
+ /**
+ * @return The value of the {@code serviceId} attribute
+ */
+ @JsonProperty(value = "ServiceID")
+ @Override
+ public String getServiceId() {
+ return serviceId;
+ }
+
+ /**
+ * @return The value of the {@code serviceAddress} attribute
+ */
+ @JsonProperty(value = "ServiceAddress")
+ @Override
+ public String getServiceAddress() {
+ return serviceAddress;
+ }
+
+ /**
+ * @return The value of the {@code servicePort} attribute
+ */
+ @JsonProperty(value = "ServicePort")
+ @Override
+ public int getServicePort() {
+ return servicePort;
+ }
+
+ /**
+ * @return The value of the {@code serviceTags} attribute
+ */
+ @JsonProperty(value = "ServiceTags")
+ @Override
+ public ImmutableList<String> getServiceTags() {
+ return serviceTags;
+ }
+
+ /**
+ * Copy the current immutable object by setting a value for the {@link CatalogService#getNode() node} attribute.
+ * An equals check used to prevent copying of the same value by returning {@code this}.
+ * @param value A new value for node
+ * @return A modified copy of the {@code this} object
+ */
+ public final ImmutableCatalogService withNode(String value) {
+ if (this.node.equals(value)) return this;
+ return new ImmutableCatalogService(
+ Preconditions.checkNotNull(value, "node"),
+ this.address,
+ this.serviceName,
+ this.serviceId,
+ this.serviceAddress,
+ this.servicePort,
+ this.serviceTags);
+ }
+
+ /**
+ * Copy the current immutable object by setting a value for the {@link CatalogService#getAddress() address} attribute.
+ * An equals check used to prevent copying of the same value by returning {@code this}.
+ * @param value A new value for address
+ * @return A modified copy of the {@code this} object
+ */
+ public final ImmutableCatalogService withAddress(String value) {
+ if (this.address.equals(value)) return this;
+ return new ImmutableCatalogService(
+ this.node,
+ Preconditions.checkNotNull(value, "address"),
+ this.serviceName,
+ this.serviceId,
+ this.serviceAddress,
+ this.servicePort,
+ this.serviceTags);
+ }
+
+ /**
+ * Copy the current immutable object by setting a value for the {@link CatalogService#getServiceName() serviceName} attribute.
+ * An equals check used to prevent copying of the same value by returning {@code this}.
+ * @param value A new value for serviceName
+ * @return A modified copy of the {@code this} object
+ */
+ public final ImmutableCatalogService withServiceName(String value) {
+ if (this.serviceName.equals(value)) return this;
+ return new ImmutableCatalogService(
+ this.node,
+ this.address,
+ Preconditions.checkNotNull(value, "serviceName"),
+ this.serviceId,
+ this.serviceAddress,
+ this.servicePort,
+ this.serviceTags);
+ }
+
+ /**
+ * Copy the current immutable object by setting a value for the {@link CatalogService#getServiceId() serviceId} attribute.
+ * An equals check used to prevent copying of the same value by returning {@code this}.
+ * @param value A new value for serviceId
+ * @return A modified copy of the {@code this} object
+ */
+ public final ImmutableCatalogService withServiceId(String value) {
+ if (this.serviceId.equals(value)) return this;
+ return new ImmutableCatalogService(
+ this.node,
+ this.address,
+ this.serviceName,
+ Preconditions.checkNotNull(value, "serviceId"),
+ this.serviceAddress,
+ this.servicePort,
+ this.serviceTags);
+ }
+
+ /**
+ * Copy the current immutable object by setting a value for the {@link CatalogService#getServiceAddress() serviceAddress} attribute.
+ * An equals check used to prevent copying of the same value by returning {@code this}.
+ * @param value A new value for serviceAddress
+ * @return A modified copy of the {@code this} object
+ */
+ public final ImmutableCatalogService withServiceAddress(String value) {
+ if (this.serviceAddress.equals(value)) return this;
+ return new ImmutableCatalogService(
+ this.node,
+ this.address,
+ this.serviceName,
+ this.serviceId,
+ Preconditions.checkNotNull(value, "serviceAddress"),
+ this.servicePort,
+ this.serviceTags);
+ }
+
+ /**
+ * Copy the current immutable object by setting a value for the {@link CatalogService#getServicePort() servicePort} attribute.
+ * A value equality check is used to prevent copying of the same value by returning {@code this}.
+ * @param value A new value for servicePort
+ * @return A modified copy of the {@code this} object
+ */
+ public final ImmutableCatalogService withServicePort(int value) {
+ if (this.servicePort == value) return this;
+ return new ImmutableCatalogService(
+ this.node,
+ this.address,
+ this.serviceName,
+ this.serviceId,
+ this.serviceAddress,
+ value,
+ this.serviceTags);
+ }
+
+ /**
+ * Copy the current immutable object with elements that replace the content of {@link CatalogService#getServiceTags() serviceTags}.
+ * @param elements The elements to set
+ * @return A modified copy of {@code this} object
+ */
+ public final ImmutableCatalogService withServiceTags(String... elements) {
+ ImmutableList<String> newValue = ImmutableList.copyOf(elements);
+ return new ImmutableCatalogService(
+ this.node,
+ this.address,
+ this.serviceName,
+ this.serviceId,
+ this.serviceAddress,
+ this.servicePort,
+ newValue);
+ }
+
+ /**
+ * Copy the current immutable object with elements that replace the content of {@link CatalogService#getServiceTags() serviceTags}.
+ * A shallow reference equality check is used to prevent copying of the same value by returning {@code this}.
+ * @param elements An iterable of serviceTags elements to set
+ * @return A modified copy of {@code this} object
+ */
+ public final ImmutableCatalogService withServiceTags(Iterable<String> elements) {
+ if (this.serviceTags == elements) return this;
+ ImmutableList<String> newValue = ImmutableList.copyOf(elements);
+ return new ImmutableCatalogService(
+ this.node,
+ this.address,
+ this.serviceName,
+ this.serviceId,
+ this.serviceAddress,
+ this.servicePort,
+ newValue);
+ }
+
+ /**
+ * This instance is equal to all instances of {@code ImmutableCatalogService} that have equal attribute values.
+ * @return {@code true} if {@code this} is equal to {@code another} instance
+ */
+ @Override
+ public boolean equals(Object another) {
+ if (this == another) return true;
+ return another instanceof ImmutableCatalogService
+ && equalTo((ImmutableCatalogService) another);
+ }
+
+ private boolean equalTo(ImmutableCatalogService another) {
+ return node.equals(another.node)
+ && address.equals(another.address)
+ && serviceName.equals(another.serviceName)
+ && serviceId.equals(another.serviceId)
+ && serviceAddress.equals(another.serviceAddress)
+ && servicePort == another.servicePort
+ && serviceTags.equals(another.serviceTags);
+ }
+
+ /**
+ * Computes a hash code from attributes: {@code node}, {@code address}, {@code serviceName}, {@code serviceId}, {@code serviceAddress}, {@code servicePort}, {@code serviceTags}.
+ * @return hashCode value
+ */
+ @Override
+ public int hashCode() {
+ int h = 31;
+ h = h * 17 + node.hashCode();
+ h = h * 17 + address.hashCode();
+ h = h * 17 + serviceName.hashCode();
+ h = h * 17 + serviceId.hashCode();
+ h = h * 17 + serviceAddress.hashCode();
+ h = h * 17 + servicePort;
+ h = h * 17 + serviceTags.hashCode();
+ return h;
+ }
+
+ /**
+ * Prints the immutable value {@code CatalogService...} with all non-generated
+ * and non-auxiliary attribute values.
+ * @return A string representation of the value
+ */
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper("CatalogService")
+ .add("node", node)
+ .add("address", address)
+ .add("serviceName", serviceName)
+ .add("serviceId", serviceId)
+ .add("serviceAddress", serviceAddress)
+ .add("servicePort", servicePort)
+ .add("serviceTags", serviceTags)
+ .toString();
+ }
+
+ /**
+ * Utility type used to correctly read immutable object from JSON representation.
+ * @deprecated Do not use this type directly, it exists only for the <em>Jackson</em>-binding infrastructure
+ */
+ @Deprecated
+ @JsonDeserialize
+ static final class Json extends CatalogService {
+ String node;
+ String address;
+ String serviceName;
+ String serviceId;
+ String serviceAddress;
+ Integer servicePort;
+ List<String> serviceTags = ImmutableList.of();
+ @JsonProperty(value = "Node")
+ public void setNode(String node) {
+ this.node = node;
+ }
+ @JsonProperty(value = "Address")
+ public void setAddress(String address) {
+ this.address = address;
+ }
+ @JsonProperty(value = "ServiceName")
+ public void setServiceName(String serviceName) {
+ this.serviceName = serviceName;
+ }
+ @JsonProperty(value = "ServiceID")
+ public void setServiceId(String serviceId) {
+ this.serviceId = serviceId;
+ }
+ @JsonProperty(value = "ServiceAddress")
+ public void setServiceAddress(String serviceAddress) {
+ this.serviceAddress = serviceAddress;
+ }
+ @JsonProperty(value = "ServicePort")
+ public void setServicePort(int servicePort) {
+ this.servicePort = servicePort;
+ }
+ @JsonProperty(value = "ServiceTags")
+ public void setServiceTags(List<String> serviceTags) {
+ this.serviceTags = serviceTags;
+ }
+ @Override
+ public String getNode() { throw new UnsupportedOperationException(); }
+ @Override
+ public String getAddress() { throw new UnsupportedOperationException(); }
+ @Override
+ public String getServiceName() { throw new UnsupportedOperationException(); }
+ @Override
+ public String getServiceId() { throw new UnsupportedOperationException(); }
+ @Override
+ public String getServiceAddress() { throw new UnsupportedOperationException(); }
+ @Override
+ public int getServicePort() { throw new UnsupportedOperationException(); }
+ @Override
+ public List<String> getServiceTags() { throw new UnsupportedOperationException(); }
+ }
+
+ /**
+ * @param json A JSON-bindable data structure
+ * @return An immutable value type
+ * @deprecated Do not use this method directly, it exists only for the <em>Jackson</em>-binding infrastructure
+ */
+ @Deprecated
+ @JsonCreator
+ static ImmutableCatalogService fromJson(Json json) {
+ ImmutableCatalogService.Builder builder = ImmutableCatalogService.builder();
+ if (json.node != null) {
+ builder.node(json.node);
+ }
+ if (json.address != null) {
+ builder.address(json.address);
+ }
+ if (json.serviceName != null) {
+ builder.serviceName(json.serviceName);
+ }
+ if (json.serviceId != null) {
+ builder.serviceId(json.serviceId);
+ }
+ if (json.serviceAddress != null) {
+ builder.serviceAddress(json.serviceAddress);
+ }
+ if (json.servicePort != null) {
+ builder.servicePort(json.servicePort);
+ }
+ if (json.serviceTags != null) {
+ builder.addAllServiceTags(json.serviceTags);
+ }
+ return builder.build();
+ }
+
+ /**
+ * Creates an immutable copy of a {@link CatalogService} value.
+ * Uses accessors to get values to initialize the new immutable instance.
+ * If an instance is already immutable, it is returned as is.
+ * @param instance The instance to copy
+ * @return A copied immutable CatalogService instance
+ */
+ public static ImmutableCatalogService copyOf(CatalogService instance) {
+ if (instance instanceof ImmutableCatalogService) {
+ return (ImmutableCatalogService) instance;
+ }
+ return ImmutableCatalogService.builder()
+ .from(instance)
+ .build();
+ }
+
+ /**
+ * Creates a builder for {@link ImmutableCatalogService ImmutableCatalogService}.
+ * @return A new ImmutableCatalogService builder
+ */
+ public static ImmutableCatalogService.Builder builder() {
+ return new ImmutableCatalogService.Builder();
+ }
+
+ /**
+ * Builds instances of type {@link ImmutableCatalogService ImmutableCatalogService}.
+ * Initialize attributes and then invoke the {@link #build()} method to create an
+ * immutable instance.
+ * <p><em>{@code Builder} is not thread-safe and generally should not be stored in a field or collection,
+ * but instead used immediately to create instances.</em>
+ */
+ public static final class Builder {
+ private static final long INIT_BIT_NODE = 0x1L;
+ private static final long INIT_BIT_ADDRESS = 0x2L;
+ private static final long INIT_BIT_SERVICE_NAME = 0x4L;
+ private static final long INIT_BIT_SERVICE_ID = 0x8L;
+ private static final long INIT_BIT_SERVICE_ADDRESS = 0x10L;
+ private static final long INIT_BIT_SERVICE_PORT = 0x20L;
+ private long initBits = 0x3f;
+
+ private String node;
+ private String address;
+ private String serviceName;
+ private String serviceId;
+ private String serviceAddress;
+ private int servicePort;
+ private ImmutableList.Builder<String> serviceTagsBuilder = ImmutableList.builder();
+
+ private Builder() {
+ }
+
+ /**
+ * Fill a builder with attribute values from the provided {@code CatalogService} instance.
+ * Regular attribute values will be replaced with those from the given instance.
+ * Absent optional values will not replace present values.
+ * Collection elements and entries will be added, not replaced.
+ * @param instance The instance from which to copy values
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder from(CatalogService instance) {
+ Preconditions.checkNotNull(instance, "instance");
+ node(instance.getNode());
+ address(instance.getAddress());
+ serviceName(instance.getServiceName());
+ serviceId(instance.getServiceId());
+ serviceAddress(instance.getServiceAddress());
+ servicePort(instance.getServicePort());
+ addAllServiceTags(instance.getServiceTags());
+ return this;
+ }
+
+ /**
+ * Initializes the value for the {@link CatalogService#getNode() node} attribute.
+ * @param node The value for node
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder node(String node) {
+ this.node = Preconditions.checkNotNull(node, "node");
+ initBits &= ~INIT_BIT_NODE;
+ return this;
+ }
+
+ /**
+ * Initializes the value for the {@link CatalogService#getAddress() address} attribute.
+ * @param address The value for address
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder address(String address) {
+ this.address = Preconditions.checkNotNull(address, "address");
+ initBits &= ~INIT_BIT_ADDRESS;
+ return this;
+ }
+
+ /**
+ * Initializes the value for the {@link CatalogService#getServiceName() serviceName} attribute.
+ * @param serviceName The value for serviceName
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder serviceName(String serviceName) {
+ this.serviceName = Preconditions.checkNotNull(serviceName, "serviceName");
+ initBits &= ~INIT_BIT_SERVICE_NAME;
+ return this;
+ }
+
+ /**
+ * Initializes the value for the {@link CatalogService#getServiceId() serviceId} attribute.
+ * @param serviceId The value for serviceId
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder serviceId(String serviceId) {
+ this.serviceId = Preconditions.checkNotNull(serviceId, "serviceId");
+ initBits &= ~INIT_BIT_SERVICE_ID;
+ return this;
+ }
+
+ /**
+ * Initializes the value for the {@link CatalogService#getServiceAddress() serviceAddress} attribute.
+ * @param serviceAddress The value for serviceAddress
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder serviceAddress(String serviceAddress) {
+ this.serviceAddress = Preconditions.checkNotNull(serviceAddress, "serviceAddress");
+ initBits &= ~INIT_BIT_SERVICE_ADDRESS;
+ return this;
+ }
+
+ /**
+ * Initializes the value for the {@link CatalogService#getServicePort() servicePort} attribute.
+ * @param servicePort The value for servicePort
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder servicePort(int servicePort) {
+ this.servicePort = servicePort;
+ initBits &= ~INIT_BIT_SERVICE_PORT;
+ return this;
+ }
+
+ /**
+ * Adds one element to {@link CatalogService#getServiceTags() serviceTags} list.
+ * @param element A serviceTags element
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder addServiceTags(String element) {
+ serviceTagsBuilder.add(element);
+ return this;
+ }
+
+ /**
+ * Adds elements to {@link CatalogService#getServiceTags() serviceTags} list.
+ * @param elements An array of serviceTags elements
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder addServiceTags(String... elements) {
+ serviceTagsBuilder.add(elements);
+ return this;
+ }
+
+ /**
+ * Sets or replaces all elements for {@link CatalogService#getServiceTags() serviceTags} list.
+ * @param elements An iterable of serviceTags elements
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder serviceTags(Iterable<String> elements) {
+ serviceTagsBuilder = ImmutableList.builder();
+ return addAllServiceTags(elements);
+ }
+
+ /**
+ * Adds elements to {@link CatalogService#getServiceTags() serviceTags} list.
+ * @param elements An iterable of serviceTags elements
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder addAllServiceTags(Iterable<String> elements) {
+ serviceTagsBuilder.addAll(elements);
+ return this;
+ }
+
+ /**
+ * Builds a new {@link ImmutableCatalogService ImmutableCatalogService}.
+ * @return An immutable instance of CatalogService
+ * @throws java.lang.IllegalStateException if any required attributes are missing
+ */
+ public ImmutableCatalogService build() throws IllegalStateException {
+ if (initBits != 0) {
+ throw new IllegalStateException(formatRequiredAttributesMessage());
+ }
+ return new ImmutableCatalogService(
+ node,
+ address,
+ serviceName,
+ serviceId,
+ serviceAddress,
+ servicePort,
+ serviceTagsBuilder.build());
+ }
+
+ private String formatRequiredAttributesMessage() {
+ List<String> attributes = Lists.newArrayList();
+ if ((initBits & INIT_BIT_NODE) != 0) attributes.add("node");
+ if ((initBits & INIT_BIT_ADDRESS) != 0) attributes.add("address");
+ if ((initBits & INIT_BIT_SERVICE_NAME) != 0) attributes.add("serviceName");
+ if ((initBits & INIT_BIT_SERVICE_ID) != 0) attributes.add("serviceId");
+ if ((initBits & INIT_BIT_SERVICE_ADDRESS) != 0) attributes.add("serviceAddress");
+ if ((initBits & INIT_BIT_SERVICE_PORT) != 0) attributes.add("servicePort");
+ return "Cannot build CatalogService, some of required attributes are not set " + attributes;
+ }
+ }
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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.consul.model.catalog;\r
-\r
-import com.google.common.base.Objects;\r
-\r
-public class ServiceInfo {\r
-\r
- private String serviceName;\r
- \r
- private String version="";\r
-\r
- public String getServiceName() {\r
- return serviceName;\r
- }\r
-\r
- public void setServiceName(String serviceName) {\r
- this.serviceName = serviceName;\r
- }\r
-\r
- public String getVersion() {\r
- return version;\r
- }\r
-\r
- public void setVersion(String version) {\r
- this.version = version;\r
- }\r
- \r
- @Override\r
- public boolean equals(Object other)\r
- {\r
- if(this == other)\r
- return true;\r
- if(other instanceof ServiceInfo)\r
- {\r
- ServiceInfo that = (ServiceInfo)other;\r
- return Objects.equal(serviceName, that.serviceName) && Objects.equal(version, that.version);\r
- } else\r
- {\r
- return false;\r
- }\r
- }\r
- \r
- @Override\r
- public int hashCode() {\r
- return Objects.hashCode(serviceName, version);\r
- }\r
- \r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.wrapper.consul.model.catalog;
+
+import com.google.common.base.Objects;
+
+public class ServiceInfo {
+
+ private String serviceName;
+
+ private String version="";
+
+ public String getServiceName() {
+ return serviceName;
+ }
+
+ public void setServiceName(String serviceName) {
+ this.serviceName = serviceName;
+ }
+
+ public String getVersion() {
+ return version;
+ }
+
+ public void setVersion(String version) {
+ this.version = version;
+ }
+
+ @Override
+ public boolean equals(Object other)
+ {
+ if(this == other)
+ return true;
+ if(other instanceof ServiceInfo)
+ {
+ ServiceInfo that = (ServiceInfo)other;
+ return Objects.equal(serviceName, that.serviceName) && Objects.equal(version, that.version);
+ } else
+ {
+ return false;
+ }
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(serviceName, version);
+ }
+
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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.consul.model.health;\r
-\r
-import com.fasterxml.jackson.annotation.JsonCreator;\r
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;\r
-import com.fasterxml.jackson.annotation.JsonProperty;\r
-import com.fasterxml.jackson.databind.annotation.JsonDeserialize;\r
-import com.google.common.base.MoreObjects;\r
-import com.google.common.base.Preconditions;\r
-import com.google.common.collect.Lists;\r
-import java.util.List;\r
-import javax.annotation.Generated;\r
-\r
-/**\r
- * Immutable implementation of {@link Node}.\r
- * <p>\r
- * Use the builder to create immutable instances:\r
- * {@code ImmutableNode.builder()}.\r
- */\r
-@SuppressWarnings("all")\r
-@Generated({"Immutables.generator", "Node"})\r
-@JsonIgnoreProperties(ignoreUnknown = true)\r
-public final class ImmutableNode extends Node {\r
- private final String node;\r
- private final String address;\r
-\r
- private ImmutableNode(String node, String address) {\r
- this.node = node;\r
- this.address = address;\r
- }\r
-\r
- /**\r
- * @return The value of the {@code node} attribute\r
- */\r
- @JsonProperty(value = "Node")\r
- @Override\r
- public String getNode() {\r
- return node;\r
- }\r
-\r
- /**\r
- * @return The value of the {@code address} attribute\r
- */\r
- @JsonProperty(value = "Address")\r
- @Override\r
- public String getAddress() {\r
- return address;\r
- }\r
-\r
- /**\r
- * Copy the current immutable object by setting a value for the {@link Node#getNode() node} attribute.\r
- * An equals check used to prevent copying of the same value by returning {@code this}.\r
- * @param value A new value for node\r
- * @return A modified copy of the {@code this} object\r
- */\r
- public final ImmutableNode withNode(String value) {\r
- if (this.node.equals(value)) return this;\r
- return new ImmutableNode(Preconditions.checkNotNull(value, "node"), this.address);\r
- }\r
-\r
- /**\r
- * Copy the current immutable object by setting a value for the {@link Node#getAddress() address} attribute.\r
- * An equals check used to prevent copying of the same value by returning {@code this}.\r
- * @param value A new value for address\r
- * @return A modified copy of the {@code this} object\r
- */\r
- public final ImmutableNode withAddress(String value) {\r
- if (this.address.equals(value)) return this;\r
- return new ImmutableNode(this.node, Preconditions.checkNotNull(value, "address"));\r
- }\r
-\r
- /**\r
- * This instance is equal to all instances of {@code ImmutableNode} that have equal attribute values.\r
- * @return {@code true} if {@code this} is equal to {@code another} instance\r
- */\r
- @Override\r
- public boolean equals(Object another) {\r
- if (this == another) return true;\r
- return another instanceof ImmutableNode\r
- && equalTo((ImmutableNode) another);\r
- }\r
-\r
- private boolean equalTo(ImmutableNode another) {\r
- return node.equals(another.node)\r
- && address.equals(another.address);\r
- }\r
-\r
- /**\r
- * Computes a hash code from attributes: {@code node}, {@code address}.\r
- * @return hashCode value\r
- */\r
- @Override\r
- public int hashCode() {\r
- int h = 31;\r
- h = h * 17 + node.hashCode();\r
- h = h * 17 + address.hashCode();\r
- return h;\r
- }\r
-\r
- /**\r
- * Prints the immutable value {@code Node...} with all non-generated\r
- * and non-auxiliary attribute values.\r
- * @return A string representation of the value\r
- */\r
- @Override\r
- public String toString() {\r
- return MoreObjects.toStringHelper("Node")\r
- .add("node", node)\r
- .add("address", address)\r
- .toString();\r
- }\r
-\r
- /**\r
- * Utility type used to correctly read immutable object from JSON representation.\r
- * @deprecated Do not use this type directly, it exists only for the <em>Jackson</em>-binding infrastructure\r
- */\r
- @Deprecated\r
- @JsonDeserialize\r
- static final class Json extends Node {\r
- String node;\r
- String address;\r
- @JsonProperty(value = "Node")\r
- public void setNode(String node) {\r
- this.node = node;\r
- }\r
- @JsonProperty(value = "Address")\r
- public void setAddress(String address) {\r
- this.address = address;\r
- }\r
- @Override\r
- public String getNode() { throw new UnsupportedOperationException(); }\r
- @Override\r
- public String getAddress() { throw new UnsupportedOperationException(); }\r
- }\r
-\r
- /**\r
- * @param json A JSON-bindable data structure\r
- * @return An immutable value type\r
- * @deprecated Do not use this method directly, it exists only for the <em>Jackson</em>-binding infrastructure\r
- */\r
- @Deprecated\r
- @JsonCreator\r
- static ImmutableNode fromJson(Json json) {\r
- ImmutableNode.Builder builder = ImmutableNode.builder();\r
- if (json.node != null) {\r
- builder.node(json.node);\r
- }\r
- if (json.address != null) {\r
- builder.address(json.address);\r
- }\r
- return builder.build();\r
- }\r
-\r
- /**\r
- * Creates an immutable copy of a {@link Node} value.\r
- * Uses accessors to get values to initialize the new immutable instance.\r
- * If an instance is already immutable, it is returned as is.\r
- * @param instance The instance to copy\r
- * @return A copied immutable Node instance\r
- */\r
- public static ImmutableNode copyOf(Node instance) {\r
- if (instance instanceof ImmutableNode) {\r
- return (ImmutableNode) instance;\r
- }\r
- return ImmutableNode.builder()\r
- .from(instance)\r
- .build();\r
- }\r
-\r
- /**\r
- * Creates a builder for {@link ImmutableNode ImmutableNode}.\r
- * @return A new ImmutableNode builder\r
- */\r
- public static ImmutableNode.Builder builder() {\r
- return new ImmutableNode.Builder();\r
- }\r
-\r
- /**\r
- * Builds instances of type {@link ImmutableNode ImmutableNode}.\r
- * Initialize attributes and then invoke the {@link #build()} method to create an\r
- * immutable instance.\r
- * <p><em>{@code Builder} is not thread-safe and generally should not be stored in a field or collection,\r
- * but instead used immediately to create instances.</em>\r
- */\r
- public static final class Builder {\r
- private static final long INIT_BIT_NODE = 0x1L;\r
- private static final long INIT_BIT_ADDRESS = 0x2L;\r
- private long initBits = 0x3;\r
-\r
- private String node;\r
- private String address;\r
-\r
- private Builder() {\r
- }\r
-\r
- /**\r
- * Fill a builder with attribute values from the provided {@code Node} instance.\r
- * Regular attribute values will be replaced with those from the given instance.\r
- * Absent optional values will not replace present values.\r
- * @param instance The instance from which to copy values\r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder from(Node instance) {\r
- Preconditions.checkNotNull(instance, "instance");\r
- node(instance.getNode());\r
- address(instance.getAddress());\r
- return this;\r
- }\r
-\r
- /**\r
- * Initializes the value for the {@link Node#getNode() node} attribute.\r
- * @param node The value for node \r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder node(String node) {\r
- this.node = Preconditions.checkNotNull(node, "node");\r
- initBits &= ~INIT_BIT_NODE;\r
- return this;\r
- }\r
-\r
- /**\r
- * Initializes the value for the {@link Node#getAddress() address} attribute.\r
- * @param address The value for address \r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder address(String address) {\r
- this.address = Preconditions.checkNotNull(address, "address");\r
- initBits &= ~INIT_BIT_ADDRESS;\r
- return this;\r
- }\r
-\r
- /**\r
- * Builds a new {@link ImmutableNode ImmutableNode}.\r
- * @return An immutable instance of Node\r
- * @throws java.lang.IllegalStateException if any required attributes are missing\r
- */\r
- public ImmutableNode build() throws IllegalStateException {\r
- if (initBits != 0) {\r
- throw new IllegalStateException(formatRequiredAttributesMessage());\r
- }\r
- return new ImmutableNode(node, address);\r
- }\r
-\r
- private String formatRequiredAttributesMessage() {\r
- List<String> attributes = Lists.newArrayList();\r
- if ((initBits & INIT_BIT_NODE) != 0) attributes.add("node");\r
- if ((initBits & INIT_BIT_ADDRESS) != 0) attributes.add("address");\r
- return "Cannot build Node, some of required attributes are not set " + attributes;\r
- }\r
- }\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.wrapper.consul.model.health;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Lists;
+import java.util.List;
+import javax.annotation.Generated;
+
+/**
+ * Immutable implementation of {@link Node}.
+ * <p>
+ * Use the builder to create immutable instances:
+ * {@code ImmutableNode.builder()}.
+ */
+@SuppressWarnings("all")
+@Generated({"Immutables.generator", "Node"})
+@JsonIgnoreProperties(ignoreUnknown = true)
+public final class ImmutableNode extends Node {
+ private final String node;
+ private final String address;
+
+ private ImmutableNode(String node, String address) {
+ this.node = node;
+ this.address = address;
+ }
+
+ /**
+ * @return The value of the {@code node} attribute
+ */
+ @JsonProperty(value = "Node")
+ @Override
+ public String getNode() {
+ return node;
+ }
+
+ /**
+ * @return The value of the {@code address} attribute
+ */
+ @JsonProperty(value = "Address")
+ @Override
+ public String getAddress() {
+ return address;
+ }
+
+ /**
+ * Copy the current immutable object by setting a value for the {@link Node#getNode() node} attribute.
+ * An equals check used to prevent copying of the same value by returning {@code this}.
+ * @param value A new value for node
+ * @return A modified copy of the {@code this} object
+ */
+ public final ImmutableNode withNode(String value) {
+ if (this.node.equals(value)) return this;
+ return new ImmutableNode(Preconditions.checkNotNull(value, "node"), this.address);
+ }
+
+ /**
+ * Copy the current immutable object by setting a value for the {@link Node#getAddress() address} attribute.
+ * An equals check used to prevent copying of the same value by returning {@code this}.
+ * @param value A new value for address
+ * @return A modified copy of the {@code this} object
+ */
+ public final ImmutableNode withAddress(String value) {
+ if (this.address.equals(value)) return this;
+ return new ImmutableNode(this.node, Preconditions.checkNotNull(value, "address"));
+ }
+
+ /**
+ * This instance is equal to all instances of {@code ImmutableNode} that have equal attribute values.
+ * @return {@code true} if {@code this} is equal to {@code another} instance
+ */
+ @Override
+ public boolean equals(Object another) {
+ if (this == another) return true;
+ return another instanceof ImmutableNode
+ && equalTo((ImmutableNode) another);
+ }
+
+ private boolean equalTo(ImmutableNode another) {
+ return node.equals(another.node)
+ && address.equals(another.address);
+ }
+
+ /**
+ * Computes a hash code from attributes: {@code node}, {@code address}.
+ * @return hashCode value
+ */
+ @Override
+ public int hashCode() {
+ int h = 31;
+ h = h * 17 + node.hashCode();
+ h = h * 17 + address.hashCode();
+ return h;
+ }
+
+ /**
+ * Prints the immutable value {@code Node...} with all non-generated
+ * and non-auxiliary attribute values.
+ * @return A string representation of the value
+ */
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper("Node")
+ .add("node", node)
+ .add("address", address)
+ .toString();
+ }
+
+ /**
+ * Utility type used to correctly read immutable object from JSON representation.
+ * @deprecated Do not use this type directly, it exists only for the <em>Jackson</em>-binding infrastructure
+ */
+ @Deprecated
+ @JsonDeserialize
+ static final class Json extends Node {
+ String node;
+ String address;
+ @JsonProperty(value = "Node")
+ public void setNode(String node) {
+ this.node = node;
+ }
+ @JsonProperty(value = "Address")
+ public void setAddress(String address) {
+ this.address = address;
+ }
+ @Override
+ public String getNode() { throw new UnsupportedOperationException(); }
+ @Override
+ public String getAddress() { throw new UnsupportedOperationException(); }
+ }
+
+ /**
+ * @param json A JSON-bindable data structure
+ * @return An immutable value type
+ * @deprecated Do not use this method directly, it exists only for the <em>Jackson</em>-binding infrastructure
+ */
+ @Deprecated
+ @JsonCreator
+ static ImmutableNode fromJson(Json json) {
+ ImmutableNode.Builder builder = ImmutableNode.builder();
+ if (json.node != null) {
+ builder.node(json.node);
+ }
+ if (json.address != null) {
+ builder.address(json.address);
+ }
+ return builder.build();
+ }
+
+ /**
+ * Creates an immutable copy of a {@link Node} value.
+ * Uses accessors to get values to initialize the new immutable instance.
+ * If an instance is already immutable, it is returned as is.
+ * @param instance The instance to copy
+ * @return A copied immutable Node instance
+ */
+ public static ImmutableNode copyOf(Node instance) {
+ if (instance instanceof ImmutableNode) {
+ return (ImmutableNode) instance;
+ }
+ return ImmutableNode.builder()
+ .from(instance)
+ .build();
+ }
+
+ /**
+ * Creates a builder for {@link ImmutableNode ImmutableNode}.
+ * @return A new ImmutableNode builder
+ */
+ public static ImmutableNode.Builder builder() {
+ return new ImmutableNode.Builder();
+ }
+
+ /**
+ * Builds instances of type {@link ImmutableNode ImmutableNode}.
+ * Initialize attributes and then invoke the {@link #build()} method to create an
+ * immutable instance.
+ * <p><em>{@code Builder} is not thread-safe and generally should not be stored in a field or collection,
+ * but instead used immediately to create instances.</em>
+ */
+ public static final class Builder {
+ private static final long INIT_BIT_NODE = 0x1L;
+ private static final long INIT_BIT_ADDRESS = 0x2L;
+ private long initBits = 0x3;
+
+ private String node;
+ private String address;
+
+ private Builder() {
+ }
+
+ /**
+ * Fill a builder with attribute values from the provided {@code Node} instance.
+ * Regular attribute values will be replaced with those from the given instance.
+ * Absent optional values will not replace present values.
+ * @param instance The instance from which to copy values
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder from(Node instance) {
+ Preconditions.checkNotNull(instance, "instance");
+ node(instance.getNode());
+ address(instance.getAddress());
+ return this;
+ }
+
+ /**
+ * Initializes the value for the {@link Node#getNode() node} attribute.
+ * @param node The value for node
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder node(String node) {
+ this.node = Preconditions.checkNotNull(node, "node");
+ initBits &= ~INIT_BIT_NODE;
+ return this;
+ }
+
+ /**
+ * Initializes the value for the {@link Node#getAddress() address} attribute.
+ * @param address The value for address
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder address(String address) {
+ this.address = Preconditions.checkNotNull(address, "address");
+ initBits &= ~INIT_BIT_ADDRESS;
+ return this;
+ }
+
+ /**
+ * Builds a new {@link ImmutableNode ImmutableNode}.
+ * @return An immutable instance of Node
+ * @throws java.lang.IllegalStateException if any required attributes are missing
+ */
+ public ImmutableNode build() throws IllegalStateException {
+ if (initBits != 0) {
+ throw new IllegalStateException(formatRequiredAttributesMessage());
+ }
+ return new ImmutableNode(node, address);
+ }
+
+ private String formatRequiredAttributesMessage() {
+ List<String> attributes = Lists.newArrayList();
+ if ((initBits & INIT_BIT_NODE) != 0) attributes.add("node");
+ if ((initBits & INIT_BIT_ADDRESS) != 0) attributes.add("address");
+ return "Cannot build Node, some of required attributes are not set " + attributes;
+ }
+ }
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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.consul.model.health;\r
-\r
-import com.fasterxml.jackson.annotation.JsonCreator;\r
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;\r
-import com.fasterxml.jackson.annotation.JsonProperty;\r
-import com.fasterxml.jackson.databind.annotation.JsonDeserialize;\r
-import com.google.common.base.MoreObjects;\r
-import com.google.common.base.Preconditions;\r
-import com.google.common.collect.ImmutableList;\r
-import com.google.common.collect.Lists;\r
-import java.util.List;\r
-import javax.annotation.Generated;\r
-\r
-/**\r
- * Immutable implementation of {@link Service}.\r
- * <p>\r
- * Use the builder to create immutable instances:\r
- * {@code ImmutableService.builder()}.\r
- */\r
-@SuppressWarnings("all")\r
-@Generated({"Immutables.generator", "Service"})\r
-@JsonIgnoreProperties(ignoreUnknown = true)\r
-public final class ImmutableService extends Service {\r
- private final String id;\r
- private final String service;\r
- private final ImmutableList<String> tags;\r
- private final String address;\r
- private final int port;\r
-\r
- private ImmutableService(\r
- String id,\r
- String service,\r
- ImmutableList<String> tags,\r
- String address,\r
- int port) {\r
- this.id = id;\r
- this.service = service;\r
- this.tags = tags;\r
- this.address = address;\r
- this.port = port;\r
- }\r
-\r
- /**\r
- * @return The value of the {@code id} attribute\r
- */\r
- @JsonProperty(value = "ID")\r
- @Override\r
- public String getId() {\r
- return id;\r
- }\r
-\r
- /**\r
- * @return The value of the {@code service} attribute\r
- */\r
- @JsonProperty(value = "Service")\r
- @Override\r
- public String getService() {\r
- return service;\r
- }\r
-\r
- /**\r
- * @return The value of the {@code tags} attribute\r
- */\r
- @JsonProperty(value = "Tags")\r
- @JsonDeserialize(as = ImmutableList.class, contentAs = String.class)\r
- @Override\r
- public ImmutableList<String> getTags() {\r
- return tags;\r
- }\r
-\r
- /**\r
- * @return The value of the {@code address} attribute\r
- */\r
- @JsonProperty(value = "Address")\r
- @Override\r
- public String getAddress() {\r
- return address;\r
- }\r
-\r
- /**\r
- * @return The value of the {@code port} attribute\r
- */\r
- @JsonProperty(value = "Port")\r
- @Override\r
- public int getPort() {\r
- return port;\r
- }\r
-\r
- /**\r
- * Copy the current immutable object by setting a value for the {@link Service#getId() id} attribute.\r
- * An equals check used to prevent copying of the same value by returning {@code this}.\r
- * @param value A new value for id\r
- * @return A modified copy of the {@code this} object\r
- */\r
- public final ImmutableService withId(String value) {\r
- if (this.id.equals(value)) return this;\r
- return new ImmutableService(\r
- Preconditions.checkNotNull(value, "id"),\r
- this.service,\r
- this.tags,\r
- this.address,\r
- this.port);\r
- }\r
-\r
- /**\r
- * Copy the current immutable object by setting a value for the {@link Service#getService() service} attribute.\r
- * An equals check used to prevent copying of the same value by returning {@code this}.\r
- * @param value A new value for service\r
- * @return A modified copy of the {@code this} object\r
- */\r
- public final ImmutableService withService(String value) {\r
- if (this.service.equals(value)) return this;\r
- return new ImmutableService(\r
- this.id,\r
- Preconditions.checkNotNull(value, "service"),\r
- this.tags,\r
- this.address,\r
- this.port);\r
- }\r
-\r
- /**\r
- * Copy the current immutable object with elements that replace the content of {@link Service#getTags() tags}.\r
- * @param elements The elements to set\r
- * @return A modified copy of {@code this} object\r
- */\r
- public final ImmutableService withTags(String... elements) {\r
- ImmutableList<String> newValue = ImmutableList.copyOf(elements);\r
- return new ImmutableService(this.id, this.service, newValue, this.address, this.port);\r
- }\r
-\r
- /**\r
- * Copy the current immutable object with elements that replace the content of {@link Service#getTags() tags}.\r
- * A shallow reference equality check is used to prevent copying of the same value by returning {@code this}.\r
- * @param elements An iterable of tags elements to set\r
- * @return A modified copy of {@code this} object\r
- */\r
- public final ImmutableService withTags(Iterable<String> elements) {\r
- if (this.tags == elements) return this;\r
- ImmutableList<String> newValue = ImmutableList.copyOf(elements);\r
- return new ImmutableService(this.id, this.service, newValue, this.address, this.port);\r
- }\r
-\r
- /**\r
- * Copy the current immutable object by setting a value for the {@link Service#getAddress() address} attribute.\r
- * An equals check used to prevent copying of the same value by returning {@code this}.\r
- * @param value A new value for address\r
- * @return A modified copy of the {@code this} object\r
- */\r
- public final ImmutableService withAddress(String value) {\r
- if (this.address.equals(value)) return this;\r
- return new ImmutableService(\r
- this.id,\r
- this.service,\r
- this.tags,\r
- Preconditions.checkNotNull(value, "address"),\r
- this.port);\r
- }\r
-\r
- /**\r
- * Copy the current immutable object by setting a value for the {@link Service#getPort() port} attribute.\r
- * A value equality check is used to prevent copying of the same value by returning {@code this}.\r
- * @param value A new value for port\r
- * @return A modified copy of the {@code this} object\r
- */\r
- public final ImmutableService withPort(int value) {\r
- if (this.port == value) return this;\r
- return new ImmutableService(this.id, this.service, this.tags, this.address, value);\r
- }\r
-\r
- /**\r
- * This instance is equal to all instances of {@code ImmutableService} that have equal attribute values.\r
- * @return {@code true} if {@code this} is equal to {@code another} instance\r
- */\r
- @Override\r
- public boolean equals(Object another) {\r
- if (this == another) return true;\r
- return another instanceof ImmutableService\r
- && equalTo((ImmutableService) another);\r
- }\r
-\r
- private boolean equalTo(ImmutableService another) {\r
- return id.equals(another.id)\r
- && service.equals(another.service)\r
- && tags.equals(another.tags)\r
- && address.equals(another.address)\r
- && port == another.port;\r
- }\r
-\r
- /**\r
- * Computes a hash code from attributes: {@code id}, {@code service}, {@code tags}, {@code address}, {@code port}.\r
- * @return hashCode value\r
- */\r
- @Override\r
- public int hashCode() {\r
- int h = 31;\r
- h = h * 17 + id.hashCode();\r
- h = h * 17 + service.hashCode();\r
- h = h * 17 + tags.hashCode();\r
- h = h * 17 + address.hashCode();\r
- h = h * 17 + port;\r
- return h;\r
- }\r
-\r
- /**\r
- * Prints the immutable value {@code Service...} with all non-generated\r
- * and non-auxiliary attribute values.\r
- * @return A string representation of the value\r
- */\r
- @Override\r
- public String toString() {\r
- return MoreObjects.toStringHelper("Service")\r
- .add("id", id)\r
- .add("service", service)\r
- .add("tags", tags)\r
- .add("address", address)\r
- .add("port", port)\r
- .toString();\r
- }\r
-\r
- /**\r
- * Utility type used to correctly read immutable object from JSON representation.\r
- * @deprecated Do not use this type directly, it exists only for the <em>Jackson</em>-binding infrastructure\r
- */\r
- @Deprecated\r
- @JsonDeserialize\r
- static final class Json extends Service {\r
- String id;\r
- String service;\r
- List<String> tags = ImmutableList.of();\r
- String address;\r
- Integer port;\r
- @JsonProperty(value = "ID")\r
- public void setId(String id) {\r
- this.id = id;\r
- }\r
- @JsonProperty(value = "Service")\r
- public void setService(String service) {\r
- this.service = service;\r
- }\r
- @JsonProperty(value = "Tags")\r
- @JsonDeserialize(as = ImmutableList.class, contentAs = String.class)\r
- public void setTags(List<String> tags) {\r
- this.tags = tags;\r
- }\r
- @JsonProperty(value = "Address")\r
- public void setAddress(String address) {\r
- this.address = address;\r
- }\r
- @JsonProperty(value = "Port")\r
- public void setPort(int port) {\r
- this.port = port;\r
- }\r
- @Override\r
- public String getId() { throw new UnsupportedOperationException(); }\r
- @Override\r
- public String getService() { throw new UnsupportedOperationException(); }\r
- @Override\r
- public List<String> getTags() { throw new UnsupportedOperationException(); }\r
- @Override\r
- public String getAddress() { throw new UnsupportedOperationException(); }\r
- @Override\r
- public int getPort() { throw new UnsupportedOperationException(); }\r
- }\r
-\r
- /**\r
- * @param json A JSON-bindable data structure\r
- * @return An immutable value type\r
- * @deprecated Do not use this method directly, it exists only for the <em>Jackson</em>-binding infrastructure\r
- */\r
- @Deprecated\r
- @JsonCreator\r
- static ImmutableService fromJson(Json json) {\r
- ImmutableService.Builder builder = ImmutableService.builder();\r
- if (json.id != null) {\r
- builder.id(json.id);\r
- }\r
- if (json.service != null) {\r
- builder.service(json.service);\r
- }\r
- if (json.tags != null) {\r
- builder.addAllTags(json.tags);\r
- }\r
- if (json.address != null) {\r
- builder.address(json.address);\r
- }\r
- if (json.port != null) {\r
- builder.port(json.port);\r
- }\r
- return builder.build();\r
- }\r
-\r
- /**\r
- * Creates an immutable copy of a {@link Service} value.\r
- * Uses accessors to get values to initialize the new immutable instance.\r
- * If an instance is already immutable, it is returned as is.\r
- * @param instance The instance to copy\r
- * @return A copied immutable Service instance\r
- */\r
- public static ImmutableService copyOf(Service instance) {\r
- if (instance instanceof ImmutableService) {\r
- return (ImmutableService) instance;\r
- }\r
- return ImmutableService.builder()\r
- .from(instance)\r
- .build();\r
- }\r
-\r
- /**\r
- * Creates a builder for {@link ImmutableService ImmutableService}.\r
- * @return A new ImmutableService builder\r
- */\r
- public static ImmutableService.Builder builder() {\r
- return new ImmutableService.Builder();\r
- }\r
-\r
- /**\r
- * Builds instances of type {@link ImmutableService ImmutableService}.\r
- * Initialize attributes and then invoke the {@link #build()} method to create an\r
- * immutable instance.\r
- * <p><em>{@code Builder} is not thread-safe and generally should not be stored in a field or collection,\r
- * but instead used immediately to create instances.</em>\r
- */\r
- public static final class Builder {\r
- private static final long INIT_BIT_ID = 0x1L;\r
- private static final long INIT_BIT_SERVICE = 0x2L;\r
- private static final long INIT_BIT_ADDRESS = 0x4L;\r
- private static final long INIT_BIT_PORT = 0x8L;\r
- private long initBits = 0xf;\r
-\r
- private String id;\r
- private String service;\r
- private ImmutableList.Builder<String> tagsBuilder = ImmutableList.builder();\r
- private String address;\r
- private int port;\r
-\r
- private Builder() {\r
- }\r
-\r
- /**\r
- * Fill a builder with attribute values from the provided {@code Service} instance.\r
- * Regular attribute values will be replaced with those from the given instance.\r
- * Absent optional values will not replace present values.\r
- * Collection elements and entries will be added, not replaced.\r
- * @param instance The instance from which to copy values\r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder from(Service instance) {\r
- Preconditions.checkNotNull(instance, "instance");\r
- id(instance.getId());\r
- service(instance.getService());\r
- addAllTags(instance.getTags());\r
- address(instance.getAddress());\r
- port(instance.getPort());\r
- return this;\r
- }\r
-\r
- /**\r
- * Initializes the value for the {@link Service#getId() id} attribute.\r
- * @param id The value for id \r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder id(String id) {\r
- this.id = Preconditions.checkNotNull(id, "id");\r
- initBits &= ~INIT_BIT_ID;\r
- return this;\r
- }\r
-\r
- /**\r
- * Initializes the value for the {@link Service#getService() service} attribute.\r
- * @param service The value for service \r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder service(String service) {\r
- this.service = Preconditions.checkNotNull(service, "service");\r
- initBits &= ~INIT_BIT_SERVICE;\r
- return this;\r
- }\r
-\r
- /**\r
- * Adds one element to {@link Service#getTags() tags} list.\r
- * @param element A tags element\r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder addTags(String element) {\r
- tagsBuilder.add(element);\r
- return this;\r
- }\r
-\r
- /**\r
- * Adds elements to {@link Service#getTags() tags} list.\r
- * @param elements An array of tags elements\r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder addTags(String... elements) {\r
- tagsBuilder.add(elements);\r
- return this;\r
- }\r
-\r
- /**\r
- * Sets or replaces all elements for {@link Service#getTags() tags} list.\r
- * @param elements An iterable of tags elements\r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder tags(Iterable<String> elements) {\r
- tagsBuilder = ImmutableList.builder();\r
- return addAllTags(elements);\r
- }\r
-\r
- /**\r
- * Adds elements to {@link Service#getTags() tags} list.\r
- * @param elements An iterable of tags elements\r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder addAllTags(Iterable<String> elements) {\r
- tagsBuilder.addAll(elements);\r
- return this;\r
- }\r
-\r
- /**\r
- * Initializes the value for the {@link Service#getAddress() address} attribute.\r
- * @param address The value for address \r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder address(String address) {\r
- this.address = Preconditions.checkNotNull(address, "address");\r
- initBits &= ~INIT_BIT_ADDRESS;\r
- return this;\r
- }\r
-\r
- /**\r
- * Initializes the value for the {@link Service#getPort() port} attribute.\r
- * @param port The value for port \r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder port(int port) {\r
- this.port = port;\r
- initBits &= ~INIT_BIT_PORT;\r
- return this;\r
- }\r
-\r
- /**\r
- * Builds a new {@link ImmutableService ImmutableService}.\r
- * @return An immutable instance of Service\r
- * @throws java.lang.IllegalStateException if any required attributes are missing\r
- */\r
- public ImmutableService build() throws IllegalStateException {\r
- if (initBits != 0) {\r
- throw new IllegalStateException(formatRequiredAttributesMessage());\r
- }\r
- return new ImmutableService(id, service, tagsBuilder.build(), address, port);\r
- }\r
-\r
- private String formatRequiredAttributesMessage() {\r
- List<String> attributes = Lists.newArrayList();\r
- if ((initBits & INIT_BIT_ID) != 0) attributes.add("id");\r
- if ((initBits & INIT_BIT_SERVICE) != 0) attributes.add("service");\r
- if ((initBits & INIT_BIT_ADDRESS) != 0) attributes.add("address");\r
- if ((initBits & INIT_BIT_PORT) != 0) attributes.add("port");\r
- return "Cannot build Service, some of required attributes are not set " + attributes;\r
- }\r
- }\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.wrapper.consul.model.health;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import java.util.List;
+import javax.annotation.Generated;
+
+/**
+ * Immutable implementation of {@link Service}.
+ * <p>
+ * Use the builder to create immutable instances:
+ * {@code ImmutableService.builder()}.
+ */
+@SuppressWarnings("all")
+@Generated({"Immutables.generator", "Service"})
+@JsonIgnoreProperties(ignoreUnknown = true)
+public final class ImmutableService extends Service {
+ private final String id;
+ private final String service;
+ private final ImmutableList<String> tags;
+ private final String address;
+ private final int port;
+
+ private ImmutableService(
+ String id,
+ String service,
+ ImmutableList<String> tags,
+ String address,
+ int port) {
+ this.id = id;
+ this.service = service;
+ this.tags = tags;
+ this.address = address;
+ this.port = port;
+ }
+
+ /**
+ * @return The value of the {@code id} attribute
+ */
+ @JsonProperty(value = "ID")
+ @Override
+ public String getId() {
+ return id;
+ }
+
+ /**
+ * @return The value of the {@code service} attribute
+ */
+ @JsonProperty(value = "Service")
+ @Override
+ public String getService() {
+ return service;
+ }
+
+ /**
+ * @return The value of the {@code tags} attribute
+ */
+ @JsonProperty(value = "Tags")
+ @JsonDeserialize(as = ImmutableList.class, contentAs = String.class)
+ @Override
+ public ImmutableList<String> getTags() {
+ return tags;
+ }
+
+ /**
+ * @return The value of the {@code address} attribute
+ */
+ @JsonProperty(value = "Address")
+ @Override
+ public String getAddress() {
+ return address;
+ }
+
+ /**
+ * @return The value of the {@code port} attribute
+ */
+ @JsonProperty(value = "Port")
+ @Override
+ public int getPort() {
+ return port;
+ }
+
+ /**
+ * Copy the current immutable object by setting a value for the {@link Service#getId() id} attribute.
+ * An equals check used to prevent copying of the same value by returning {@code this}.
+ * @param value A new value for id
+ * @return A modified copy of the {@code this} object
+ */
+ public final ImmutableService withId(String value) {
+ if (this.id.equals(value)) return this;
+ return new ImmutableService(
+ Preconditions.checkNotNull(value, "id"),
+ this.service,
+ this.tags,
+ this.address,
+ this.port);
+ }
+
+ /**
+ * Copy the current immutable object by setting a value for the {@link Service#getService() service} attribute.
+ * An equals check used to prevent copying of the same value by returning {@code this}.
+ * @param value A new value for service
+ * @return A modified copy of the {@code this} object
+ */
+ public final ImmutableService withService(String value) {
+ if (this.service.equals(value)) return this;
+ return new ImmutableService(
+ this.id,
+ Preconditions.checkNotNull(value, "service"),
+ this.tags,
+ this.address,
+ this.port);
+ }
+
+ /**
+ * Copy the current immutable object with elements that replace the content of {@link Service#getTags() tags}.
+ * @param elements The elements to set
+ * @return A modified copy of {@code this} object
+ */
+ public final ImmutableService withTags(String... elements) {
+ ImmutableList<String> newValue = ImmutableList.copyOf(elements);
+ return new ImmutableService(this.id, this.service, newValue, this.address, this.port);
+ }
+
+ /**
+ * Copy the current immutable object with elements that replace the content of {@link Service#getTags() tags}.
+ * A shallow reference equality check is used to prevent copying of the same value by returning {@code this}.
+ * @param elements An iterable of tags elements to set
+ * @return A modified copy of {@code this} object
+ */
+ public final ImmutableService withTags(Iterable<String> elements) {
+ if (this.tags == elements) return this;
+ ImmutableList<String> newValue = ImmutableList.copyOf(elements);
+ return new ImmutableService(this.id, this.service, newValue, this.address, this.port);
+ }
+
+ /**
+ * Copy the current immutable object by setting a value for the {@link Service#getAddress() address} attribute.
+ * An equals check used to prevent copying of the same value by returning {@code this}.
+ * @param value A new value for address
+ * @return A modified copy of the {@code this} object
+ */
+ public final ImmutableService withAddress(String value) {
+ if (this.address.equals(value)) return this;
+ return new ImmutableService(
+ this.id,
+ this.service,
+ this.tags,
+ Preconditions.checkNotNull(value, "address"),
+ this.port);
+ }
+
+ /**
+ * Copy the current immutable object by setting a value for the {@link Service#getPort() port} attribute.
+ * A value equality check is used to prevent copying of the same value by returning {@code this}.
+ * @param value A new value for port
+ * @return A modified copy of the {@code this} object
+ */
+ public final ImmutableService withPort(int value) {
+ if (this.port == value) return this;
+ return new ImmutableService(this.id, this.service, this.tags, this.address, value);
+ }
+
+ /**
+ * This instance is equal to all instances of {@code ImmutableService} that have equal attribute values.
+ * @return {@code true} if {@code this} is equal to {@code another} instance
+ */
+ @Override
+ public boolean equals(Object another) {
+ if (this == another) return true;
+ return another instanceof ImmutableService
+ && equalTo((ImmutableService) another);
+ }
+
+ private boolean equalTo(ImmutableService another) {
+ return id.equals(another.id)
+ && service.equals(another.service)
+ && tags.equals(another.tags)
+ && address.equals(another.address)
+ && port == another.port;
+ }
+
+ /**
+ * Computes a hash code from attributes: {@code id}, {@code service}, {@code tags}, {@code address}, {@code port}.
+ * @return hashCode value
+ */
+ @Override
+ public int hashCode() {
+ int h = 31;
+ h = h * 17 + id.hashCode();
+ h = h * 17 + service.hashCode();
+ h = h * 17 + tags.hashCode();
+ h = h * 17 + address.hashCode();
+ h = h * 17 + port;
+ return h;
+ }
+
+ /**
+ * Prints the immutable value {@code Service...} with all non-generated
+ * and non-auxiliary attribute values.
+ * @return A string representation of the value
+ */
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper("Service")
+ .add("id", id)
+ .add("service", service)
+ .add("tags", tags)
+ .add("address", address)
+ .add("port", port)
+ .toString();
+ }
+
+ /**
+ * Utility type used to correctly read immutable object from JSON representation.
+ * @deprecated Do not use this type directly, it exists only for the <em>Jackson</em>-binding infrastructure
+ */
+ @Deprecated
+ @JsonDeserialize
+ static final class Json extends Service {
+ String id;
+ String service;
+ List<String> tags = ImmutableList.of();
+ String address;
+ Integer port;
+ @JsonProperty(value = "ID")
+ public void setId(String id) {
+ this.id = id;
+ }
+ @JsonProperty(value = "Service")
+ public void setService(String service) {
+ this.service = service;
+ }
+ @JsonProperty(value = "Tags")
+ @JsonDeserialize(as = ImmutableList.class, contentAs = String.class)
+ public void setTags(List<String> tags) {
+ this.tags = tags;
+ }
+ @JsonProperty(value = "Address")
+ public void setAddress(String address) {
+ this.address = address;
+ }
+ @JsonProperty(value = "Port")
+ public void setPort(int port) {
+ this.port = port;
+ }
+ @Override
+ public String getId() { throw new UnsupportedOperationException(); }
+ @Override
+ public String getService() { throw new UnsupportedOperationException(); }
+ @Override
+ public List<String> getTags() { throw new UnsupportedOperationException(); }
+ @Override
+ public String getAddress() { throw new UnsupportedOperationException(); }
+ @Override
+ public int getPort() { throw new UnsupportedOperationException(); }
+ }
+
+ /**
+ * @param json A JSON-bindable data structure
+ * @return An immutable value type
+ * @deprecated Do not use this method directly, it exists only for the <em>Jackson</em>-binding infrastructure
+ */
+ @Deprecated
+ @JsonCreator
+ static ImmutableService fromJson(Json json) {
+ ImmutableService.Builder builder = ImmutableService.builder();
+ if (json.id != null) {
+ builder.id(json.id);
+ }
+ if (json.service != null) {
+ builder.service(json.service);
+ }
+ if (json.tags != null) {
+ builder.addAllTags(json.tags);
+ }
+ if (json.address != null) {
+ builder.address(json.address);
+ }
+ if (json.port != null) {
+ builder.port(json.port);
+ }
+ return builder.build();
+ }
+
+ /**
+ * Creates an immutable copy of a {@link Service} value.
+ * Uses accessors to get values to initialize the new immutable instance.
+ * If an instance is already immutable, it is returned as is.
+ * @param instance The instance to copy
+ * @return A copied immutable Service instance
+ */
+ public static ImmutableService copyOf(Service instance) {
+ if (instance instanceof ImmutableService) {
+ return (ImmutableService) instance;
+ }
+ return ImmutableService.builder()
+ .from(instance)
+ .build();
+ }
+
+ /**
+ * Creates a builder for {@link ImmutableService ImmutableService}.
+ * @return A new ImmutableService builder
+ */
+ public static ImmutableService.Builder builder() {
+ return new ImmutableService.Builder();
+ }
+
+ /**
+ * Builds instances of type {@link ImmutableService ImmutableService}.
+ * Initialize attributes and then invoke the {@link #build()} method to create an
+ * immutable instance.
+ * <p><em>{@code Builder} is not thread-safe and generally should not be stored in a field or collection,
+ * but instead used immediately to create instances.</em>
+ */
+ public static final class Builder {
+ private static final long INIT_BIT_ID = 0x1L;
+ private static final long INIT_BIT_SERVICE = 0x2L;
+ private static final long INIT_BIT_ADDRESS = 0x4L;
+ private static final long INIT_BIT_PORT = 0x8L;
+ private long initBits = 0xf;
+
+ private String id;
+ private String service;
+ private ImmutableList.Builder<String> tagsBuilder = ImmutableList.builder();
+ private String address;
+ private int port;
+
+ private Builder() {
+ }
+
+ /**
+ * Fill a builder with attribute values from the provided {@code Service} instance.
+ * Regular attribute values will be replaced with those from the given instance.
+ * Absent optional values will not replace present values.
+ * Collection elements and entries will be added, not replaced.
+ * @param instance The instance from which to copy values
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder from(Service instance) {
+ Preconditions.checkNotNull(instance, "instance");
+ id(instance.getId());
+ service(instance.getService());
+ addAllTags(instance.getTags());
+ address(instance.getAddress());
+ port(instance.getPort());
+ return this;
+ }
+
+ /**
+ * Initializes the value for the {@link Service#getId() id} attribute.
+ * @param id The value for id
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder id(String id) {
+ this.id = Preconditions.checkNotNull(id, "id");
+ initBits &= ~INIT_BIT_ID;
+ return this;
+ }
+
+ /**
+ * Initializes the value for the {@link Service#getService() service} attribute.
+ * @param service The value for service
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder service(String service) {
+ this.service = Preconditions.checkNotNull(service, "service");
+ initBits &= ~INIT_BIT_SERVICE;
+ return this;
+ }
+
+ /**
+ * Adds one element to {@link Service#getTags() tags} list.
+ * @param element A tags element
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder addTags(String element) {
+ tagsBuilder.add(element);
+ return this;
+ }
+
+ /**
+ * Adds elements to {@link Service#getTags() tags} list.
+ * @param elements An array of tags elements
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder addTags(String... elements) {
+ tagsBuilder.add(elements);
+ return this;
+ }
+
+ /**
+ * Sets or replaces all elements for {@link Service#getTags() tags} list.
+ * @param elements An iterable of tags elements
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder tags(Iterable<String> elements) {
+ tagsBuilder = ImmutableList.builder();
+ return addAllTags(elements);
+ }
+
+ /**
+ * Adds elements to {@link Service#getTags() tags} list.
+ * @param elements An iterable of tags elements
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder addAllTags(Iterable<String> elements) {
+ tagsBuilder.addAll(elements);
+ return this;
+ }
+
+ /**
+ * Initializes the value for the {@link Service#getAddress() address} attribute.
+ * @param address The value for address
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder address(String address) {
+ this.address = Preconditions.checkNotNull(address, "address");
+ initBits &= ~INIT_BIT_ADDRESS;
+ return this;
+ }
+
+ /**
+ * Initializes the value for the {@link Service#getPort() port} attribute.
+ * @param port The value for port
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder port(int port) {
+ this.port = port;
+ initBits &= ~INIT_BIT_PORT;
+ return this;
+ }
+
+ /**
+ * Builds a new {@link ImmutableService ImmutableService}.
+ * @return An immutable instance of Service
+ * @throws java.lang.IllegalStateException if any required attributes are missing
+ */
+ public ImmutableService build() throws IllegalStateException {
+ if (initBits != 0) {
+ throw new IllegalStateException(formatRequiredAttributesMessage());
+ }
+ return new ImmutableService(id, service, tagsBuilder.build(), address, port);
+ }
+
+ private String formatRequiredAttributesMessage() {
+ List<String> attributes = Lists.newArrayList();
+ if ((initBits & INIT_BIT_ID) != 0) attributes.add("id");
+ if ((initBits & INIT_BIT_SERVICE) != 0) attributes.add("service");
+ if ((initBits & INIT_BIT_ADDRESS) != 0) attributes.add("address");
+ if ((initBits & INIT_BIT_PORT) != 0) attributes.add("port");
+ return "Cannot build Service, some of required attributes are not set " + attributes;
+ }
+ }
+}
/**
- * Copyright 2016 ZTE, Inc. and others.
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
/**
- * Copyright 2016 ZTE, Inc. and others.
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
/**
- * Copyright 2016 ZTE, Inc. and others.
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
/**
- * Copyright 2016 ZTE, Inc. and others.
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
/**
- * Copyright 2016 ZTE, Inc. and others.
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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.consul.option;\r
-\r
-import com.google.common.base.MoreObjects;\r
-import com.google.common.base.Optional;\r
-import com.google.common.base.Preconditions;\r
-import javax.annotation.Generated;\r
-\r
-/**\r
- * Immutable implementation of {@link CatalogOptions}.\r
- * <p>\r
- * Use the builder to create immutable instances:\r
- * {@code ImmutableCatalogOptions.builder()}.\r
- */\r
-@SuppressWarnings("all")\r
-@Generated({"Immutables.generator", "CatalogOptions"})\r
-public final class ImmutableCatalogOptions extends CatalogOptions {\r
- private final Optional<String> datacenter;\r
- private final Optional<String> tag;\r
-\r
- private ImmutableCatalogOptions(\r
- Optional<String> datacenter,\r
- Optional<String> tag) {\r
- this.datacenter = datacenter;\r
- this.tag = tag;\r
- }\r
-\r
- /**\r
- * @return The value of the {@code datacenter} attribute\r
- */\r
- @Override\r
- public Optional<String> getDatacenter() {\r
- return datacenter;\r
- }\r
-\r
- /**\r
- * @return The value of the {@code tag} attribute\r
- */\r
- @Override\r
- public Optional<String> getTag() {\r
- return tag;\r
- }\r
-\r
- /**\r
- * Copy the current immutable object by setting a <i>present</i> value for the optional {@link CatalogOptions#getDatacenter() datacenter} attribute.\r
- * @param value The value for datacenter\r
- * @return A modified copy of {@code this} object\r
- */\r
- public final ImmutableCatalogOptions withDatacenter(String value) {\r
- Optional<String> newValue = Optional.of(value);\r
- return new ImmutableCatalogOptions(newValue, this.tag);\r
- }\r
-\r
- /**\r
- * Copy the current immutable object by setting an optional value for the {@link CatalogOptions#getDatacenter() datacenter} attribute.\r
- * A shallow reference equality check on the optional value is used to prevent copying of the same value by returning {@code this}.\r
- * @param optional A value for datacenter\r
- * @return A modified copy of {@code this} object\r
- */\r
- public final ImmutableCatalogOptions withDatacenter(Optional<String> optional) {\r
- Optional<String> value = Preconditions.checkNotNull(optional, "datacenter");\r
- if (this.datacenter == value) return this;\r
- return new ImmutableCatalogOptions(value, this.tag);\r
- }\r
-\r
- /**\r
- * Copy the current immutable object by setting a <i>present</i> value for the optional {@link CatalogOptions#getTag() tag} attribute.\r
- * @param value The value for tag\r
- * @return A modified copy of {@code this} object\r
- */\r
- public final ImmutableCatalogOptions withTag(String value) {\r
- Optional<String> newValue = Optional.of(value);\r
- return new ImmutableCatalogOptions(this.datacenter, newValue);\r
- }\r
-\r
- /**\r
- * Copy the current immutable object by setting an optional value for the {@link CatalogOptions#getTag() tag} attribute.\r
- * A shallow reference equality check on the optional value is used to prevent copying of the same value by returning {@code this}.\r
- * @param optional A value for tag\r
- * @return A modified copy of {@code this} object\r
- */\r
- public final ImmutableCatalogOptions withTag(Optional<String> optional) {\r
- Optional<String> value = Preconditions.checkNotNull(optional, "tag");\r
- if (this.tag == value) return this;\r
- return new ImmutableCatalogOptions(this.datacenter, value);\r
- }\r
-\r
- /**\r
- * This instance is equal to all instances of {@code ImmutableCatalogOptions} that have equal attribute values.\r
- * @return {@code true} if {@code this} is equal to {@code another} instance\r
- */\r
- @Override\r
- public boolean equals(Object another) {\r
- if (this == another) return true;\r
- return another instanceof ImmutableCatalogOptions\r
- && equalTo((ImmutableCatalogOptions) another);\r
- }\r
-\r
- private boolean equalTo(ImmutableCatalogOptions another) {\r
- return datacenter.equals(another.datacenter)\r
- && tag.equals(another.tag);\r
- }\r
-\r
- /**\r
- * Computes a hash code from attributes: {@code datacenter}, {@code tag}.\r
- * @return hashCode value\r
- */\r
- @Override\r
- public int hashCode() {\r
- int h = 31;\r
- h = h * 17 + datacenter.hashCode();\r
- h = h * 17 + tag.hashCode();\r
- return h;\r
- }\r
-\r
- /**\r
- * Prints the immutable value {@code CatalogOptions...} with all non-generated\r
- * and non-auxiliary attribute values.\r
- * @return A string representation of the value\r
- */\r
- @Override\r
- public String toString() {\r
- return MoreObjects.toStringHelper("CatalogOptions")\r
- .add("datacenter", datacenter)\r
- .add("tag", tag)\r
- .toString();\r
- }\r
-\r
- /**\r
- * Creates an immutable copy of a {@link CatalogOptions} value.\r
- * Uses accessors to get values to initialize the new immutable instance.\r
- * If an instance is already immutable, it is returned as is.\r
- * @param instance The instance to copy\r
- * @return A copied immutable CatalogOptions instance\r
- */\r
- public static ImmutableCatalogOptions copyOf(CatalogOptions instance) {\r
- if (instance instanceof ImmutableCatalogOptions) {\r
- return (ImmutableCatalogOptions) instance;\r
- }\r
- return ImmutableCatalogOptions.builder()\r
- .from(instance)\r
- .build();\r
- }\r
-\r
- /**\r
- * Creates a builder for {@link ImmutableCatalogOptions ImmutableCatalogOptions}.\r
- * @return A new ImmutableCatalogOptions builder\r
- */\r
- public static ImmutableCatalogOptions.Builder builder() {\r
- return new ImmutableCatalogOptions.Builder();\r
- }\r
-\r
- /**\r
- * Builds instances of type {@link ImmutableCatalogOptions ImmutableCatalogOptions}.\r
- * Initialize attributes and then invoke the {@link #build()} method to create an\r
- * immutable instance.\r
- * <p><em>{@code Builder} is not thread-safe and generally should not be stored in a field or collection,\r
- * but instead used immediately to create instances.</em>\r
- */\r
- public static final class Builder {\r
- private Optional<String> datacenter = Optional.absent();\r
- private Optional<String> tag = Optional.absent();\r
-\r
- private Builder() {\r
- }\r
-\r
- /**\r
- * Fill a builder with attribute values from the provided {@code CatalogOptions} instance.\r
- * Regular attribute values will be replaced with those from the given instance.\r
- * Absent optional values will not replace present values.\r
- * @param instance The instance from which to copy values\r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder from(CatalogOptions instance) {\r
- Preconditions.checkNotNull(instance, "instance");\r
- Optional<String> datacenterOptional = instance.getDatacenter();\r
- if (datacenterOptional.isPresent()) {\r
- datacenter(datacenterOptional);\r
- }\r
- Optional<String> tagOptional = instance.getTag();\r
- if (tagOptional.isPresent()) {\r
- tag(tagOptional);\r
- }\r
- return this;\r
- }\r
-\r
- /**\r
- * Initializes the optional value {@link CatalogOptions#getDatacenter() datacenter} to datacenter.\r
- * @param datacenter The value for datacenter\r
- * @return {@code this} builder for chained invocation\r
- */\r
- public final Builder datacenter(String datacenter) {\r
- this.datacenter = Optional.of(datacenter);\r
- return this;\r
- }\r
-\r
- /**\r
- * Initializes the optional value {@link CatalogOptions#getDatacenter() datacenter} to datacenter.\r
- * @param datacenter The value for datacenter\r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder datacenter(Optional<String> datacenter) {\r
- this.datacenter = Preconditions.checkNotNull(datacenter, "datacenter");\r
- return this;\r
- }\r
-\r
- /**\r
- * Initializes the optional value {@link CatalogOptions#getTag() tag} to tag.\r
- * @param tag The value for tag\r
- * @return {@code this} builder for chained invocation\r
- */\r
- public final Builder tag(String tag) {\r
- this.tag = Optional.of(tag);\r
- return this;\r
- }\r
-\r
- /**\r
- * Initializes the optional value {@link CatalogOptions#getTag() tag} to tag.\r
- * @param tag The value for tag\r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder tag(Optional<String> tag) {\r
- this.tag = Preconditions.checkNotNull(tag, "tag");\r
- return this;\r
- }\r
-\r
- /**\r
- * Builds a new {@link ImmutableCatalogOptions ImmutableCatalogOptions}.\r
- * @return An immutable instance of CatalogOptions\r
- * @throws java.lang.IllegalStateException if any required attributes are missing\r
- */\r
- public ImmutableCatalogOptions build() throws IllegalStateException {\r
- return new ImmutableCatalogOptions(datacenter, tag);\r
- }\r
- }\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.wrapper.consul.option;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import javax.annotation.Generated;
+
+/**
+ * Immutable implementation of {@link CatalogOptions}.
+ * <p>
+ * Use the builder to create immutable instances:
+ * {@code ImmutableCatalogOptions.builder()}.
+ */
+@SuppressWarnings("all")
+@Generated({"Immutables.generator", "CatalogOptions"})
+public final class ImmutableCatalogOptions extends CatalogOptions {
+ private final Optional<String> datacenter;
+ private final Optional<String> tag;
+
+ private ImmutableCatalogOptions(
+ Optional<String> datacenter,
+ Optional<String> tag) {
+ this.datacenter = datacenter;
+ this.tag = tag;
+ }
+
+ /**
+ * @return The value of the {@code datacenter} attribute
+ */
+ @Override
+ public Optional<String> getDatacenter() {
+ return datacenter;
+ }
+
+ /**
+ * @return The value of the {@code tag} attribute
+ */
+ @Override
+ public Optional<String> getTag() {
+ return tag;
+ }
+
+ /**
+ * Copy the current immutable object by setting a <i>present</i> value for the optional {@link CatalogOptions#getDatacenter() datacenter} attribute.
+ * @param value The value for datacenter
+ * @return A modified copy of {@code this} object
+ */
+ public final ImmutableCatalogOptions withDatacenter(String value) {
+ Optional<String> newValue = Optional.of(value);
+ return new ImmutableCatalogOptions(newValue, this.tag);
+ }
+
+ /**
+ * Copy the current immutable object by setting an optional value for the {@link CatalogOptions#getDatacenter() datacenter} attribute.
+ * A shallow reference equality check on the optional value is used to prevent copying of the same value by returning {@code this}.
+ * @param optional A value for datacenter
+ * @return A modified copy of {@code this} object
+ */
+ public final ImmutableCatalogOptions withDatacenter(Optional<String> optional) {
+ Optional<String> value = Preconditions.checkNotNull(optional, "datacenter");
+ if (this.datacenter == value) return this;
+ return new ImmutableCatalogOptions(value, this.tag);
+ }
+
+ /**
+ * Copy the current immutable object by setting a <i>present</i> value for the optional {@link CatalogOptions#getTag() tag} attribute.
+ * @param value The value for tag
+ * @return A modified copy of {@code this} object
+ */
+ public final ImmutableCatalogOptions withTag(String value) {
+ Optional<String> newValue = Optional.of(value);
+ return new ImmutableCatalogOptions(this.datacenter, newValue);
+ }
+
+ /**
+ * Copy the current immutable object by setting an optional value for the {@link CatalogOptions#getTag() tag} attribute.
+ * A shallow reference equality check on the optional value is used to prevent copying of the same value by returning {@code this}.
+ * @param optional A value for tag
+ * @return A modified copy of {@code this} object
+ */
+ public final ImmutableCatalogOptions withTag(Optional<String> optional) {
+ Optional<String> value = Preconditions.checkNotNull(optional, "tag");
+ if (this.tag == value) return this;
+ return new ImmutableCatalogOptions(this.datacenter, value);
+ }
+
+ /**
+ * This instance is equal to all instances of {@code ImmutableCatalogOptions} that have equal attribute values.
+ * @return {@code true} if {@code this} is equal to {@code another} instance
+ */
+ @Override
+ public boolean equals(Object another) {
+ if (this == another) return true;
+ return another instanceof ImmutableCatalogOptions
+ && equalTo((ImmutableCatalogOptions) another);
+ }
+
+ private boolean equalTo(ImmutableCatalogOptions another) {
+ return datacenter.equals(another.datacenter)
+ && tag.equals(another.tag);
+ }
+
+ /**
+ * Computes a hash code from attributes: {@code datacenter}, {@code tag}.
+ * @return hashCode value
+ */
+ @Override
+ public int hashCode() {
+ int h = 31;
+ h = h * 17 + datacenter.hashCode();
+ h = h * 17 + tag.hashCode();
+ return h;
+ }
+
+ /**
+ * Prints the immutable value {@code CatalogOptions...} with all non-generated
+ * and non-auxiliary attribute values.
+ * @return A string representation of the value
+ */
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper("CatalogOptions")
+ .add("datacenter", datacenter)
+ .add("tag", tag)
+ .toString();
+ }
+
+ /**
+ * Creates an immutable copy of a {@link CatalogOptions} value.
+ * Uses accessors to get values to initialize the new immutable instance.
+ * If an instance is already immutable, it is returned as is.
+ * @param instance The instance to copy
+ * @return A copied immutable CatalogOptions instance
+ */
+ public static ImmutableCatalogOptions copyOf(CatalogOptions instance) {
+ if (instance instanceof ImmutableCatalogOptions) {
+ return (ImmutableCatalogOptions) instance;
+ }
+ return ImmutableCatalogOptions.builder()
+ .from(instance)
+ .build();
+ }
+
+ /**
+ * Creates a builder for {@link ImmutableCatalogOptions ImmutableCatalogOptions}.
+ * @return A new ImmutableCatalogOptions builder
+ */
+ public static ImmutableCatalogOptions.Builder builder() {
+ return new ImmutableCatalogOptions.Builder();
+ }
+
+ /**
+ * Builds instances of type {@link ImmutableCatalogOptions ImmutableCatalogOptions}.
+ * Initialize attributes and then invoke the {@link #build()} method to create an
+ * immutable instance.
+ * <p><em>{@code Builder} is not thread-safe and generally should not be stored in a field or collection,
+ * but instead used immediately to create instances.</em>
+ */
+ public static final class Builder {
+ private Optional<String> datacenter = Optional.absent();
+ private Optional<String> tag = Optional.absent();
+
+ private Builder() {
+ }
+
+ /**
+ * Fill a builder with attribute values from the provided {@code CatalogOptions} instance.
+ * Regular attribute values will be replaced with those from the given instance.
+ * Absent optional values will not replace present values.
+ * @param instance The instance from which to copy values
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder from(CatalogOptions instance) {
+ Preconditions.checkNotNull(instance, "instance");
+ Optional<String> datacenterOptional = instance.getDatacenter();
+ if (datacenterOptional.isPresent()) {
+ datacenter(datacenterOptional);
+ }
+ Optional<String> tagOptional = instance.getTag();
+ if (tagOptional.isPresent()) {
+ tag(tagOptional);
+ }
+ return this;
+ }
+
+ /**
+ * Initializes the optional value {@link CatalogOptions#getDatacenter() datacenter} to datacenter.
+ * @param datacenter The value for datacenter
+ * @return {@code this} builder for chained invocation
+ */
+ public final Builder datacenter(String datacenter) {
+ this.datacenter = Optional.of(datacenter);
+ return this;
+ }
+
+ /**
+ * Initializes the optional value {@link CatalogOptions#getDatacenter() datacenter} to datacenter.
+ * @param datacenter The value for datacenter
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder datacenter(Optional<String> datacenter) {
+ this.datacenter = Preconditions.checkNotNull(datacenter, "datacenter");
+ return this;
+ }
+
+ /**
+ * Initializes the optional value {@link CatalogOptions#getTag() tag} to tag.
+ * @param tag The value for tag
+ * @return {@code this} builder for chained invocation
+ */
+ public final Builder tag(String tag) {
+ this.tag = Optional.of(tag);
+ return this;
+ }
+
+ /**
+ * Initializes the optional value {@link CatalogOptions#getTag() tag} to tag.
+ * @param tag The value for tag
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder tag(Optional<String> tag) {
+ this.tag = Preconditions.checkNotNull(tag, "tag");
+ return this;
+ }
+
+ /**
+ * Builds a new {@link ImmutableCatalogOptions ImmutableCatalogOptions}.
+ * @return An immutable instance of CatalogOptions
+ * @throws java.lang.IllegalStateException if any required attributes are missing
+ */
+ public ImmutableCatalogOptions build() throws IllegalStateException {
+ return new ImmutableCatalogOptions(datacenter, tag);
+ }
+ }
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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.consul.option;\r
-\r
-import com.google.common.base.MoreObjects;\r
-import com.google.common.base.Optional;\r
-import com.google.common.base.Preconditions;\r
-import com.google.common.collect.Lists;\r
-import com.google.common.primitives.Booleans;\r
-import java.math.BigInteger;\r
-import java.util.ArrayList;\r
-import javax.annotation.Generated;\r
-\r
-/**\r
- * Immutable implementation of {@link QueryOptions}.\r
- * <p>\r
- * Use the builder to create immutable instances:\r
- * {@code ImmutableQueryOptions.builder()}.\r
- */\r
-@SuppressWarnings("all")\r
-@Generated({"Immutables.generator", "QueryOptions"})\r
-public final class ImmutableQueryOptions extends QueryOptions {\r
- private final Optional<String> wait;\r
- private final Optional<String> token;\r
- private final Optional<BigInteger> index;\r
- private final Optional<String> near;\r
- private final ConsistencyMode consistencyMode;\r
- private final boolean isBlocking;\r
- private final boolean hasToken;\r
-\r
- private ImmutableQueryOptions(ImmutableQueryOptions.Builder builder) {\r
- this.wait = builder.wait;\r
- this.token = builder.token;\r
- this.index = builder.index;\r
- this.near = builder.near;\r
- if (builder.consistencyMode != null) {\r
- initShim.consistencyMode(builder.consistencyMode);\r
- }\r
- this.consistencyMode = initShim.getConsistencyMode();\r
- this.isBlocking = initShim.isBlocking();\r
- this.hasToken = initShim.hasToken();\r
- this.initShim = null;\r
- }\r
-\r
- private ImmutableQueryOptions(\r
- Optional<String> wait,\r
- Optional<String> token,\r
- Optional<BigInteger> index,\r
- Optional<String> near,\r
- ConsistencyMode consistencyMode) {\r
- this.wait = wait;\r
- this.token = token;\r
- this.index = index;\r
- this.near = near;\r
- this.consistencyMode = consistencyMode;\r
- initShim.consistencyMode(consistencyMode);\r
- this.isBlocking = initShim.isBlocking();\r
- this.hasToken = initShim.hasToken();\r
- this.initShim = null;\r
- }\r
-\r
- private static final int STAGE_INITIALIZING = -1;\r
- private static final int STAGE_UNINITIALIZED = 0;\r
- private static final int STAGE_INITIALIZED = 1;\r
- private volatile InitShim initShim = new InitShim();\r
-\r
- private final class InitShim {\r
- private ConsistencyMode consistencyMode;\r
- private byte consistencyModeStage;\r
-\r
- ConsistencyMode getConsistencyMode() {\r
- if (consistencyModeStage == STAGE_INITIALIZING) throw new IllegalStateException(formatInitCycleMessage());\r
- if (consistencyModeStage == STAGE_UNINITIALIZED) {\r
- consistencyModeStage = STAGE_INITIALIZING;\r
- this.consistencyMode = Preconditions.checkNotNull(ImmutableQueryOptions.super.getConsistencyMode(), "consistencyMode");\r
- consistencyModeStage = STAGE_INITIALIZED;\r
- }\r
- return consistencyMode;\r
- }\r
-\r
- ConsistencyMode consistencyMode(ConsistencyMode value) {\r
- this.consistencyMode = value;\r
- consistencyModeStage = STAGE_INITIALIZED;\r
- return value;\r
- }\r
- private boolean isBlocking;\r
- private byte isBlockingStage;\r
-\r
- boolean isBlocking() {\r
- if (isBlockingStage == STAGE_INITIALIZING) throw new IllegalStateException(formatInitCycleMessage());\r
- if (isBlockingStage == STAGE_UNINITIALIZED) {\r
- isBlockingStage = STAGE_INITIALIZING;\r
- this.isBlocking = ImmutableQueryOptions.super.isBlocking();\r
- isBlockingStage = STAGE_INITIALIZED;\r
- }\r
- return isBlocking;\r
- }\r
- private boolean hasToken;\r
- private byte hasTokenStage;\r
-\r
- boolean hasToken() {\r
- if (hasTokenStage == STAGE_INITIALIZING) throw new IllegalStateException(formatInitCycleMessage());\r
- if (hasTokenStage == STAGE_UNINITIALIZED) {\r
- hasTokenStage = STAGE_INITIALIZING;\r
- this.hasToken = ImmutableQueryOptions.super.hasToken();\r
- hasTokenStage = STAGE_INITIALIZED;\r
- }\r
- return hasToken;\r
- }\r
-\r
- private String formatInitCycleMessage() {\r
- ArrayList<String> attributes = Lists.newArrayList();\r
- if (consistencyModeStage == STAGE_INITIALIZING) attributes.add("consistencyMode");\r
- if (isBlockingStage == STAGE_INITIALIZING) attributes.add("isBlocking");\r
- if (hasTokenStage == STAGE_INITIALIZING) attributes.add("hasToken");\r
- return "Cannot build QueryOptions, attribute initializers form cycle" + attributes;\r
- }\r
- }\r
-\r
- /**\r
- * @return The value of the {@code wait} attribute\r
- */\r
- @Override\r
- public Optional<String> getWait() {\r
- return wait;\r
- }\r
-\r
- /**\r
- * @return The value of the {@code token} attribute\r
- */\r
- @Override\r
- public Optional<String> getToken() {\r
- return token;\r
- }\r
-\r
- /**\r
- * @return The value of the {@code index} attribute\r
- */\r
- @Override\r
- public Optional<BigInteger> getIndex() {\r
- return index;\r
- }\r
-\r
- /**\r
- * @return The value of the {@code near} attribute\r
- */\r
- @Override\r
- public Optional<String> getNear() {\r
- return near;\r
- }\r
-\r
- /**\r
- * @return The value of the {@code consistencyMode} attribute\r
- */\r
- @Override\r
- public ConsistencyMode getConsistencyMode() {\r
- return initShim != null\r
- ? initShim.getConsistencyMode()\r
- : consistencyMode;\r
- }\r
-\r
- /**\r
- * @return The computed-at-construction value of the {@code isBlocking} attribute\r
- */\r
- @Override\r
- public boolean isBlocking() {\r
- return initShim != null\r
- ? initShim.isBlocking()\r
- : isBlocking;\r
- }\r
-\r
- /**\r
- * @return The computed-at-construction value of the {@code hasToken} attribute\r
- */\r
- @Override\r
- public boolean hasToken() {\r
- return initShim != null\r
- ? initShim.hasToken()\r
- : hasToken;\r
- }\r
-\r
- /**\r
- * Copy the current immutable object by setting a <i>present</i> value for the optional {@link QueryOptions#getWait() wait} attribute.\r
- * @param value The value for wait\r
- * @return A modified copy of {@code this} object\r
- */\r
- public final ImmutableQueryOptions withWait(String value) {\r
- Optional<String> newValue = Optional.of(value);\r
- return validate(new ImmutableQueryOptions(newValue, this.token, this.index, this.near, this.consistencyMode));\r
- }\r
-\r
- /**\r
- * Copy the current immutable object by setting an optional value for the {@link QueryOptions#getWait() wait} attribute.\r
- * A shallow reference equality check on the optional value is used to prevent copying of the same value by returning {@code this}.\r
- * @param optional A value for wait\r
- * @return A modified copy of {@code this} object\r
- */\r
- public final ImmutableQueryOptions withWait(Optional<String> optional) {\r
- Optional<String> value = Preconditions.checkNotNull(optional, "wait");\r
- if (this.wait == value) return this;\r
- return validate(new ImmutableQueryOptions(value, this.token, this.index, this.near, this.consistencyMode));\r
- }\r
-\r
- /**\r
- * Copy the current immutable object by setting a <i>present</i> value for the optional {@link QueryOptions#getToken() token} attribute.\r
- * @param value The value for token\r
- * @return A modified copy of {@code this} object\r
- */\r
- public final ImmutableQueryOptions withToken(String value) {\r
- Optional<String> newValue = Optional.of(value);\r
- return validate(new ImmutableQueryOptions(this.wait, newValue, this.index, this.near, this.consistencyMode));\r
- }\r
-\r
- /**\r
- * Copy the current immutable object by setting an optional value for the {@link QueryOptions#getToken() token} attribute.\r
- * A shallow reference equality check on the optional value is used to prevent copying of the same value by returning {@code this}.\r
- * @param optional A value for token\r
- * @return A modified copy of {@code this} object\r
- */\r
- public final ImmutableQueryOptions withToken(Optional<String> optional) {\r
- Optional<String> value = Preconditions.checkNotNull(optional, "token");\r
- if (this.token == value) return this;\r
- return validate(new ImmutableQueryOptions(this.wait, value, this.index, this.near, this.consistencyMode));\r
- }\r
-\r
- /**\r
- * Copy the current immutable object by setting a <i>present</i> value for the optional {@link QueryOptions#getIndex() index} attribute.\r
- * @param value The value for index\r
- * @return A modified copy of {@code this} object\r
- */\r
- public final ImmutableQueryOptions withIndex(BigInteger value) {\r
- Optional<BigInteger> newValue = Optional.of(value);\r
- return validate(new ImmutableQueryOptions(this.wait, this.token, newValue, this.near, this.consistencyMode));\r
- }\r
-\r
- /**\r
- * Copy the current immutable object by setting an optional value for the {@link QueryOptions#getIndex() index} attribute.\r
- * A shallow reference equality check on the optional value is used to prevent copying of the same value by returning {@code this}.\r
- * @param optional A value for index\r
- * @return A modified copy of {@code this} object\r
- */\r
- public final ImmutableQueryOptions withIndex(Optional<BigInteger> optional) {\r
- Optional<BigInteger> value = Preconditions.checkNotNull(optional, "index");\r
- if (this.index == value) return this;\r
- return validate(new ImmutableQueryOptions(this.wait, this.token, value, this.near, this.consistencyMode));\r
- }\r
-\r
- /**\r
- * Copy the current immutable object by setting a <i>present</i> value for the optional {@link QueryOptions#getNear() near} attribute.\r
- * @param value The value for near\r
- * @return A modified copy of {@code this} object\r
- */\r
- public final ImmutableQueryOptions withNear(String value) {\r
- Optional<String> newValue = Optional.of(value);\r
- return validate(new ImmutableQueryOptions(this.wait, this.token, this.index, newValue, this.consistencyMode));\r
- }\r
-\r
- /**\r
- * Copy the current immutable object by setting an optional value for the {@link QueryOptions#getNear() near} attribute.\r
- * A shallow reference equality check on the optional value is used to prevent copying of the same value by returning {@code this}.\r
- * @param optional A value for near\r
- * @return A modified copy of {@code this} object\r
- */\r
- public final ImmutableQueryOptions withNear(Optional<String> optional) {\r
- Optional<String> value = Preconditions.checkNotNull(optional, "near");\r
- if (this.near == value) return this;\r
- return validate(new ImmutableQueryOptions(this.wait, this.token, this.index, value, this.consistencyMode));\r
- }\r
-\r
- /**\r
- * Copy the current immutable object by setting a value for the {@link QueryOptions#getConsistencyMode() consistencyMode} attribute.\r
- * A shallow reference equality check is used to prevent copying of the same value by returning {@code this}.\r
- * @param value A new value for consistencyMode\r
- * @return A modified copy of the {@code this} object\r
- */\r
- public final ImmutableQueryOptions withConsistencyMode(ConsistencyMode value) {\r
- if (this.consistencyMode == value) return this;\r
- return validate(new ImmutableQueryOptions(\r
- this.wait,\r
- this.token,\r
- this.index,\r
- this.near,\r
- Preconditions.checkNotNull(value, "consistencyMode")));\r
- }\r
-\r
- /**\r
- * This instance is equal to all instances of {@code ImmutableQueryOptions} that have equal attribute values.\r
- * @return {@code true} if {@code this} is equal to {@code another} instance\r
- */\r
- @Override\r
- public boolean equals(Object another) {\r
- if (this == another) return true;\r
- return another instanceof ImmutableQueryOptions\r
- && equalTo((ImmutableQueryOptions) another);\r
- }\r
-\r
- private boolean equalTo(ImmutableQueryOptions another) {\r
- return wait.equals(another.wait)\r
- && token.equals(another.token)\r
- && index.equals(another.index)\r
- && near.equals(another.near)\r
- && consistencyMode.equals(another.consistencyMode)\r
- && isBlocking == another.isBlocking\r
- && hasToken == another.hasToken;\r
- }\r
-\r
- /**\r
- * Computes a hash code from attributes: {@code wait}, {@code token}, {@code index}, {@code near}, {@code consistencyMode}, {@code isBlocking}, {@code hasToken}.\r
- * @return hashCode value\r
- */\r
- @Override\r
- public int hashCode() {\r
- int h = 31;\r
- h = h * 17 + wait.hashCode();\r
- h = h * 17 + token.hashCode();\r
- h = h * 17 + index.hashCode();\r
- h = h * 17 + near.hashCode();\r
- h = h * 17 + consistencyMode.hashCode();\r
- h = h * 17 + Booleans.hashCode(isBlocking);\r
- h = h * 17 + Booleans.hashCode(hasToken);\r
- return h;\r
- }\r
-\r
- /**\r
- * Prints the immutable value {@code QueryOptions...} with all non-generated\r
- * and non-auxiliary attribute values.\r
- * @return A string representation of the value\r
- */\r
- @Override\r
- public String toString() {\r
- return MoreObjects.toStringHelper("QueryOptions")\r
- .add("wait", wait)\r
- .add("token", token)\r
- .add("index", index)\r
- .add("near", near)\r
- .add("consistencyMode", consistencyMode)\r
- .add("isBlocking", isBlocking)\r
- .add("hasToken", hasToken)\r
- .toString();\r
- }\r
-\r
- private static ImmutableQueryOptions validate(ImmutableQueryOptions instance) {\r
- instance.validate();\r
- return instance;\r
- }\r
-\r
- /**\r
- * Creates an immutable copy of a {@link QueryOptions} value.\r
- * Uses accessors to get values to initialize the new immutable instance.\r
- * If an instance is already immutable, it is returned as is.\r
- * @param instance The instance to copy\r
- * @return A copied immutable QueryOptions instance\r
- */\r
- public static ImmutableQueryOptions copyOf(QueryOptions instance) {\r
- if (instance instanceof ImmutableQueryOptions) {\r
- return (ImmutableQueryOptions) instance;\r
- }\r
- return ImmutableQueryOptions.builder()\r
- .from(instance)\r
- .build();\r
- }\r
-\r
- /**\r
- * Creates a builder for {@link ImmutableQueryOptions ImmutableQueryOptions}.\r
- * @return A new ImmutableQueryOptions builder\r
- */\r
- public static ImmutableQueryOptions.Builder builder() {\r
- return new ImmutableQueryOptions.Builder();\r
- }\r
-\r
- /**\r
- * Builds instances of type {@link ImmutableQueryOptions ImmutableQueryOptions}.\r
- * Initialize attributes and then invoke the {@link #build()} method to create an\r
- * immutable instance.\r
- * <p><em>{@code Builder} is not thread-safe and generally should not be stored in a field or collection,\r
- * but instead used immediately to create instances.</em>\r
- */\r
- public static final class Builder {\r
- private Optional<String> wait = Optional.absent();\r
- private Optional<String> token = Optional.absent();\r
- private Optional<BigInteger> index = Optional.absent();\r
- private Optional<String> near = Optional.absent();\r
- private ConsistencyMode consistencyMode;\r
-\r
- private Builder() {\r
- }\r
-\r
- /**\r
- * Fill a builder with attribute values from the provided {@code QueryOptions} instance.\r
- * Regular attribute values will be replaced with those from the given instance.\r
- * Absent optional values will not replace present values.\r
- * @param instance The instance from which to copy values\r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder from(QueryOptions instance) {\r
- Preconditions.checkNotNull(instance, "instance");\r
- Optional<String> waitOptional = instance.getWait();\r
- if (waitOptional.isPresent()) {\r
- wait(waitOptional);\r
- }\r
- Optional<String> tokenOptional = instance.getToken();\r
- if (tokenOptional.isPresent()) {\r
- token(tokenOptional);\r
- }\r
- Optional<BigInteger> indexOptional = instance.getIndex();\r
- if (indexOptional.isPresent()) {\r
- index(indexOptional);\r
- }\r
- Optional<String> nearOptional = instance.getNear();\r
- if (nearOptional.isPresent()) {\r
- near(nearOptional);\r
- }\r
- consistencyMode(instance.getConsistencyMode());\r
- return this;\r
- }\r
-\r
- /**\r
- * Initializes the optional value {@link QueryOptions#getWait() wait} to wait.\r
- * @param wait The value for wait\r
- * @return {@code this} builder for chained invocation\r
- */\r
- public final Builder wait(String wait) {\r
- this.wait = Optional.of(wait);\r
- return this;\r
- }\r
-\r
- /**\r
- * Initializes the optional value {@link QueryOptions#getWait() wait} to wait.\r
- * @param wait The value for wait\r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder wait(Optional<String> wait) {\r
- this.wait = Preconditions.checkNotNull(wait, "wait");\r
- return this;\r
- }\r
-\r
- /**\r
- * Initializes the optional value {@link QueryOptions#getToken() token} to token.\r
- * @param token The value for token\r
- * @return {@code this} builder for chained invocation\r
- */\r
- public final Builder token(String token) {\r
- this.token = Optional.of(token);\r
- return this;\r
- }\r
-\r
- /**\r
- * Initializes the optional value {@link QueryOptions#getToken() token} to token.\r
- * @param token The value for token\r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder token(Optional<String> token) {\r
- this.token = Preconditions.checkNotNull(token, "token");\r
- return this;\r
- }\r
-\r
- /**\r
- * Initializes the optional value {@link QueryOptions#getIndex() index} to index.\r
- * @param index The value for index\r
- * @return {@code this} builder for chained invocation\r
- */\r
- public final Builder index(BigInteger index) {\r
- this.index = Optional.of(index);\r
- return this;\r
- }\r
-\r
- /**\r
- * Initializes the optional value {@link QueryOptions#getIndex() index} to index.\r
- * @param index The value for index\r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder index(Optional<BigInteger> index) {\r
- this.index = Preconditions.checkNotNull(index, "index");\r
- return this;\r
- }\r
-\r
- /**\r
- * Initializes the optional value {@link QueryOptions#getNear() near} to near.\r
- * @param near The value for near\r
- * @return {@code this} builder for chained invocation\r
- */\r
- public final Builder near(String near) {\r
- this.near = Optional.of(near);\r
- return this;\r
- }\r
-\r
- /**\r
- * Initializes the optional value {@link QueryOptions#getNear() near} to near.\r
- * @param near The value for near\r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder near(Optional<String> near) {\r
- this.near = Preconditions.checkNotNull(near, "near");\r
- return this;\r
- }\r
-\r
- /**\r
- * Initializes the value for the {@link QueryOptions#getConsistencyMode() consistencyMode} attribute.\r
- * <p><em>If not set, this attribute will have a default value as returned by the initializer of {@link QueryOptions#getConsistencyMode() consistencyMode}.</em>\r
- * @param consistencyMode The value for consistencyMode \r
- * @return {@code this} builder for use in a chained invocation\r
- */\r
- public final Builder consistencyMode(ConsistencyMode consistencyMode) {\r
- this.consistencyMode = Preconditions.checkNotNull(consistencyMode, "consistencyMode");\r
- return this;\r
- }\r
-\r
- /**\r
- * Builds a new {@link ImmutableQueryOptions ImmutableQueryOptions}.\r
- * @return An immutable instance of QueryOptions\r
- * @throws java.lang.IllegalStateException if any required attributes are missing\r
- */\r
- public ImmutableQueryOptions build() throws IllegalStateException {\r
- return ImmutableQueryOptions.validate(new ImmutableQueryOptions(this));\r
- }\r
- }\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.wrapper.consul.option;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Lists;
+import com.google.common.primitives.Booleans;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import javax.annotation.Generated;
+
+/**
+ * Immutable implementation of {@link QueryOptions}.
+ * <p>
+ * Use the builder to create immutable instances:
+ * {@code ImmutableQueryOptions.builder()}.
+ */
+@SuppressWarnings("all")
+@Generated({"Immutables.generator", "QueryOptions"})
+public final class ImmutableQueryOptions extends QueryOptions {
+ private final Optional<String> wait;
+ private final Optional<String> token;
+ private final Optional<BigInteger> index;
+ private final Optional<String> near;
+ private final ConsistencyMode consistencyMode;
+ private final boolean isBlocking;
+ private final boolean hasToken;
+
+ private ImmutableQueryOptions(ImmutableQueryOptions.Builder builder) {
+ this.wait = builder.wait;
+ this.token = builder.token;
+ this.index = builder.index;
+ this.near = builder.near;
+ if (builder.consistencyMode != null) {
+ initShim.consistencyMode(builder.consistencyMode);
+ }
+ this.consistencyMode = initShim.getConsistencyMode();
+ this.isBlocking = initShim.isBlocking();
+ this.hasToken = initShim.hasToken();
+ this.initShim = null;
+ }
+
+ private ImmutableQueryOptions(
+ Optional<String> wait,
+ Optional<String> token,
+ Optional<BigInteger> index,
+ Optional<String> near,
+ ConsistencyMode consistencyMode) {
+ this.wait = wait;
+ this.token = token;
+ this.index = index;
+ this.near = near;
+ this.consistencyMode = consistencyMode;
+ initShim.consistencyMode(consistencyMode);
+ this.isBlocking = initShim.isBlocking();
+ this.hasToken = initShim.hasToken();
+ this.initShim = null;
+ }
+
+ private static final int STAGE_INITIALIZING = -1;
+ private static final int STAGE_UNINITIALIZED = 0;
+ private static final int STAGE_INITIALIZED = 1;
+ private volatile InitShim initShim = new InitShim();
+
+ private final class InitShim {
+ private ConsistencyMode consistencyMode;
+ private byte consistencyModeStage;
+
+ ConsistencyMode getConsistencyMode() {
+ if (consistencyModeStage == STAGE_INITIALIZING) throw new IllegalStateException(formatInitCycleMessage());
+ if (consistencyModeStage == STAGE_UNINITIALIZED) {
+ consistencyModeStage = STAGE_INITIALIZING;
+ this.consistencyMode = Preconditions.checkNotNull(ImmutableQueryOptions.super.getConsistencyMode(), "consistencyMode");
+ consistencyModeStage = STAGE_INITIALIZED;
+ }
+ return consistencyMode;
+ }
+
+ ConsistencyMode consistencyMode(ConsistencyMode value) {
+ this.consistencyMode = value;
+ consistencyModeStage = STAGE_INITIALIZED;
+ return value;
+ }
+ private boolean isBlocking;
+ private byte isBlockingStage;
+
+ boolean isBlocking() {
+ if (isBlockingStage == STAGE_INITIALIZING) throw new IllegalStateException(formatInitCycleMessage());
+ if (isBlockingStage == STAGE_UNINITIALIZED) {
+ isBlockingStage = STAGE_INITIALIZING;
+ this.isBlocking = ImmutableQueryOptions.super.isBlocking();
+ isBlockingStage = STAGE_INITIALIZED;
+ }
+ return isBlocking;
+ }
+ private boolean hasToken;
+ private byte hasTokenStage;
+
+ boolean hasToken() {
+ if (hasTokenStage == STAGE_INITIALIZING) throw new IllegalStateException(formatInitCycleMessage());
+ if (hasTokenStage == STAGE_UNINITIALIZED) {
+ hasTokenStage = STAGE_INITIALIZING;
+ this.hasToken = ImmutableQueryOptions.super.hasToken();
+ hasTokenStage = STAGE_INITIALIZED;
+ }
+ return hasToken;
+ }
+
+ private String formatInitCycleMessage() {
+ ArrayList<String> attributes = Lists.newArrayList();
+ if (consistencyModeStage == STAGE_INITIALIZING) attributes.add("consistencyMode");
+ if (isBlockingStage == STAGE_INITIALIZING) attributes.add("isBlocking");
+ if (hasTokenStage == STAGE_INITIALIZING) attributes.add("hasToken");
+ return "Cannot build QueryOptions, attribute initializers form cycle" + attributes;
+ }
+ }
+
+ /**
+ * @return The value of the {@code wait} attribute
+ */
+ @Override
+ public Optional<String> getWait() {
+ return wait;
+ }
+
+ /**
+ * @return The value of the {@code token} attribute
+ */
+ @Override
+ public Optional<String> getToken() {
+ return token;
+ }
+
+ /**
+ * @return The value of the {@code index} attribute
+ */
+ @Override
+ public Optional<BigInteger> getIndex() {
+ return index;
+ }
+
+ /**
+ * @return The value of the {@code near} attribute
+ */
+ @Override
+ public Optional<String> getNear() {
+ return near;
+ }
+
+ /**
+ * @return The value of the {@code consistencyMode} attribute
+ */
+ @Override
+ public ConsistencyMode getConsistencyMode() {
+ return initShim != null
+ ? initShim.getConsistencyMode()
+ : consistencyMode;
+ }
+
+ /**
+ * @return The computed-at-construction value of the {@code isBlocking} attribute
+ */
+ @Override
+ public boolean isBlocking() {
+ return initShim != null
+ ? initShim.isBlocking()
+ : isBlocking;
+ }
+
+ /**
+ * @return The computed-at-construction value of the {@code hasToken} attribute
+ */
+ @Override
+ public boolean hasToken() {
+ return initShim != null
+ ? initShim.hasToken()
+ : hasToken;
+ }
+
+ /**
+ * Copy the current immutable object by setting a <i>present</i> value for the optional {@link QueryOptions#getWait() wait} attribute.
+ * @param value The value for wait
+ * @return A modified copy of {@code this} object
+ */
+ public final ImmutableQueryOptions withWait(String value) {
+ Optional<String> newValue = Optional.of(value);
+ return validate(new ImmutableQueryOptions(newValue, this.token, this.index, this.near, this.consistencyMode));
+ }
+
+ /**
+ * Copy the current immutable object by setting an optional value for the {@link QueryOptions#getWait() wait} attribute.
+ * A shallow reference equality check on the optional value is used to prevent copying of the same value by returning {@code this}.
+ * @param optional A value for wait
+ * @return A modified copy of {@code this} object
+ */
+ public final ImmutableQueryOptions withWait(Optional<String> optional) {
+ Optional<String> value = Preconditions.checkNotNull(optional, "wait");
+ if (this.wait == value) return this;
+ return validate(new ImmutableQueryOptions(value, this.token, this.index, this.near, this.consistencyMode));
+ }
+
+ /**
+ * Copy the current immutable object by setting a <i>present</i> value for the optional {@link QueryOptions#getToken() token} attribute.
+ * @param value The value for token
+ * @return A modified copy of {@code this} object
+ */
+ public final ImmutableQueryOptions withToken(String value) {
+ Optional<String> newValue = Optional.of(value);
+ return validate(new ImmutableQueryOptions(this.wait, newValue, this.index, this.near, this.consistencyMode));
+ }
+
+ /**
+ * Copy the current immutable object by setting an optional value for the {@link QueryOptions#getToken() token} attribute.
+ * A shallow reference equality check on the optional value is used to prevent copying of the same value by returning {@code this}.
+ * @param optional A value for token
+ * @return A modified copy of {@code this} object
+ */
+ public final ImmutableQueryOptions withToken(Optional<String> optional) {
+ Optional<String> value = Preconditions.checkNotNull(optional, "token");
+ if (this.token == value) return this;
+ return validate(new ImmutableQueryOptions(this.wait, value, this.index, this.near, this.consistencyMode));
+ }
+
+ /**
+ * Copy the current immutable object by setting a <i>present</i> value for the optional {@link QueryOptions#getIndex() index} attribute.
+ * @param value The value for index
+ * @return A modified copy of {@code this} object
+ */
+ public final ImmutableQueryOptions withIndex(BigInteger value) {
+ Optional<BigInteger> newValue = Optional.of(value);
+ return validate(new ImmutableQueryOptions(this.wait, this.token, newValue, this.near, this.consistencyMode));
+ }
+
+ /**
+ * Copy the current immutable object by setting an optional value for the {@link QueryOptions#getIndex() index} attribute.
+ * A shallow reference equality check on the optional value is used to prevent copying of the same value by returning {@code this}.
+ * @param optional A value for index
+ * @return A modified copy of {@code this} object
+ */
+ public final ImmutableQueryOptions withIndex(Optional<BigInteger> optional) {
+ Optional<BigInteger> value = Preconditions.checkNotNull(optional, "index");
+ if (this.index == value) return this;
+ return validate(new ImmutableQueryOptions(this.wait, this.token, value, this.near, this.consistencyMode));
+ }
+
+ /**
+ * Copy the current immutable object by setting a <i>present</i> value for the optional {@link QueryOptions#getNear() near} attribute.
+ * @param value The value for near
+ * @return A modified copy of {@code this} object
+ */
+ public final ImmutableQueryOptions withNear(String value) {
+ Optional<String> newValue = Optional.of(value);
+ return validate(new ImmutableQueryOptions(this.wait, this.token, this.index, newValue, this.consistencyMode));
+ }
+
+ /**
+ * Copy the current immutable object by setting an optional value for the {@link QueryOptions#getNear() near} attribute.
+ * A shallow reference equality check on the optional value is used to prevent copying of the same value by returning {@code this}.
+ * @param optional A value for near
+ * @return A modified copy of {@code this} object
+ */
+ public final ImmutableQueryOptions withNear(Optional<String> optional) {
+ Optional<String> value = Preconditions.checkNotNull(optional, "near");
+ if (this.near == value) return this;
+ return validate(new ImmutableQueryOptions(this.wait, this.token, this.index, value, this.consistencyMode));
+ }
+
+ /**
+ * Copy the current immutable object by setting a value for the {@link QueryOptions#getConsistencyMode() consistencyMode} attribute.
+ * A shallow reference equality check is used to prevent copying of the same value by returning {@code this}.
+ * @param value A new value for consistencyMode
+ * @return A modified copy of the {@code this} object
+ */
+ public final ImmutableQueryOptions withConsistencyMode(ConsistencyMode value) {
+ if (this.consistencyMode == value) return this;
+ return validate(new ImmutableQueryOptions(
+ this.wait,
+ this.token,
+ this.index,
+ this.near,
+ Preconditions.checkNotNull(value, "consistencyMode")));
+ }
+
+ /**
+ * This instance is equal to all instances of {@code ImmutableQueryOptions} that have equal attribute values.
+ * @return {@code true} if {@code this} is equal to {@code another} instance
+ */
+ @Override
+ public boolean equals(Object another) {
+ if (this == another) return true;
+ return another instanceof ImmutableQueryOptions
+ && equalTo((ImmutableQueryOptions) another);
+ }
+
+ private boolean equalTo(ImmutableQueryOptions another) {
+ return wait.equals(another.wait)
+ && token.equals(another.token)
+ && index.equals(another.index)
+ && near.equals(another.near)
+ && consistencyMode.equals(another.consistencyMode)
+ && isBlocking == another.isBlocking
+ && hasToken == another.hasToken;
+ }
+
+ /**
+ * Computes a hash code from attributes: {@code wait}, {@code token}, {@code index}, {@code near}, {@code consistencyMode}, {@code isBlocking}, {@code hasToken}.
+ * @return hashCode value
+ */
+ @Override
+ public int hashCode() {
+ int h = 31;
+ h = h * 17 + wait.hashCode();
+ h = h * 17 + token.hashCode();
+ h = h * 17 + index.hashCode();
+ h = h * 17 + near.hashCode();
+ h = h * 17 + consistencyMode.hashCode();
+ h = h * 17 + Booleans.hashCode(isBlocking);
+ h = h * 17 + Booleans.hashCode(hasToken);
+ return h;
+ }
+
+ /**
+ * Prints the immutable value {@code QueryOptions...} with all non-generated
+ * and non-auxiliary attribute values.
+ * @return A string representation of the value
+ */
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper("QueryOptions")
+ .add("wait", wait)
+ .add("token", token)
+ .add("index", index)
+ .add("near", near)
+ .add("consistencyMode", consistencyMode)
+ .add("isBlocking", isBlocking)
+ .add("hasToken", hasToken)
+ .toString();
+ }
+
+ private static ImmutableQueryOptions validate(ImmutableQueryOptions instance) {
+ instance.validate();
+ return instance;
+ }
+
+ /**
+ * Creates an immutable copy of a {@link QueryOptions} value.
+ * Uses accessors to get values to initialize the new immutable instance.
+ * If an instance is already immutable, it is returned as is.
+ * @param instance The instance to copy
+ * @return A copied immutable QueryOptions instance
+ */
+ public static ImmutableQueryOptions copyOf(QueryOptions instance) {
+ if (instance instanceof ImmutableQueryOptions) {
+ return (ImmutableQueryOptions) instance;
+ }
+ return ImmutableQueryOptions.builder()
+ .from(instance)
+ .build();
+ }
+
+ /**
+ * Creates a builder for {@link ImmutableQueryOptions ImmutableQueryOptions}.
+ * @return A new ImmutableQueryOptions builder
+ */
+ public static ImmutableQueryOptions.Builder builder() {
+ return new ImmutableQueryOptions.Builder();
+ }
+
+ /**
+ * Builds instances of type {@link ImmutableQueryOptions ImmutableQueryOptions}.
+ * Initialize attributes and then invoke the {@link #build()} method to create an
+ * immutable instance.
+ * <p><em>{@code Builder} is not thread-safe and generally should not be stored in a field or collection,
+ * but instead used immediately to create instances.</em>
+ */
+ public static final class Builder {
+ private Optional<String> wait = Optional.absent();
+ private Optional<String> token = Optional.absent();
+ private Optional<BigInteger> index = Optional.absent();
+ private Optional<String> near = Optional.absent();
+ private ConsistencyMode consistencyMode;
+
+ private Builder() {
+ }
+
+ /**
+ * Fill a builder with attribute values from the provided {@code QueryOptions} instance.
+ * Regular attribute values will be replaced with those from the given instance.
+ * Absent optional values will not replace present values.
+ * @param instance The instance from which to copy values
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder from(QueryOptions instance) {
+ Preconditions.checkNotNull(instance, "instance");
+ Optional<String> waitOptional = instance.getWait();
+ if (waitOptional.isPresent()) {
+ wait(waitOptional);
+ }
+ Optional<String> tokenOptional = instance.getToken();
+ if (tokenOptional.isPresent()) {
+ token(tokenOptional);
+ }
+ Optional<BigInteger> indexOptional = instance.getIndex();
+ if (indexOptional.isPresent()) {
+ index(indexOptional);
+ }
+ Optional<String> nearOptional = instance.getNear();
+ if (nearOptional.isPresent()) {
+ near(nearOptional);
+ }
+ consistencyMode(instance.getConsistencyMode());
+ return this;
+ }
+
+ /**
+ * Initializes the optional value {@link QueryOptions#getWait() wait} to wait.
+ * @param wait The value for wait
+ * @return {@code this} builder for chained invocation
+ */
+ public final Builder wait(String wait) {
+ this.wait = Optional.of(wait);
+ return this;
+ }
+
+ /**
+ * Initializes the optional value {@link QueryOptions#getWait() wait} to wait.
+ * @param wait The value for wait
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder wait(Optional<String> wait) {
+ this.wait = Preconditions.checkNotNull(wait, "wait");
+ return this;
+ }
+
+ /**
+ * Initializes the optional value {@link QueryOptions#getToken() token} to token.
+ * @param token The value for token
+ * @return {@code this} builder for chained invocation
+ */
+ public final Builder token(String token) {
+ this.token = Optional.of(token);
+ return this;
+ }
+
+ /**
+ * Initializes the optional value {@link QueryOptions#getToken() token} to token.
+ * @param token The value for token
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder token(Optional<String> token) {
+ this.token = Preconditions.checkNotNull(token, "token");
+ return this;
+ }
+
+ /**
+ * Initializes the optional value {@link QueryOptions#getIndex() index} to index.
+ * @param index The value for index
+ * @return {@code this} builder for chained invocation
+ */
+ public final Builder index(BigInteger index) {
+ this.index = Optional.of(index);
+ return this;
+ }
+
+ /**
+ * Initializes the optional value {@link QueryOptions#getIndex() index} to index.
+ * @param index The value for index
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder index(Optional<BigInteger> index) {
+ this.index = Preconditions.checkNotNull(index, "index");
+ return this;
+ }
+
+ /**
+ * Initializes the optional value {@link QueryOptions#getNear() near} to near.
+ * @param near The value for near
+ * @return {@code this} builder for chained invocation
+ */
+ public final Builder near(String near) {
+ this.near = Optional.of(near);
+ return this;
+ }
+
+ /**
+ * Initializes the optional value {@link QueryOptions#getNear() near} to near.
+ * @param near The value for near
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder near(Optional<String> near) {
+ this.near = Preconditions.checkNotNull(near, "near");
+ return this;
+ }
+
+ /**
+ * Initializes the value for the {@link QueryOptions#getConsistencyMode() consistencyMode} attribute.
+ * <p><em>If not set, this attribute will have a default value as returned by the initializer of {@link QueryOptions#getConsistencyMode() consistencyMode}.</em>
+ * @param consistencyMode The value for consistencyMode
+ * @return {@code this} builder for use in a chained invocation
+ */
+ public final Builder consistencyMode(ConsistencyMode consistencyMode) {
+ this.consistencyMode = Preconditions.checkNotNull(consistencyMode, "consistencyMode");
+ return this;
+ }
+
+ /**
+ * Builds a new {@link ImmutableQueryOptions ImmutableQueryOptions}.
+ * @return An immutable instance of QueryOptions
+ * @throws java.lang.IllegalStateException if any required attributes are missing
+ */
+ public ImmutableQueryOptions build() throws IllegalStateException {
+ return ImmutableQueryOptions.validate(new ImmutableQueryOptions(this));
+ }
+ }
+}
/**
- * Copyright 2016 ZTE, Inc. and others.
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
/**
- * Copyright 2016 ZTE, Inc. and others.
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
/**
- * Copyright 2016 ZTE, Inc. and others.
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
/**
- * Copyright 2016 ZTE, Inc. and others.
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
/**
- * Copyright 2016 ZTE, Inc. and others.
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
/**
- * Copyright 2016 ZTE, Inc. and others.
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
/**
- * Copyright 2016 ZTE, Inc. and others.
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
/**
- * Copyright 2016 ZTE, Inc. and others.
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
/**
- * Copyright 2016 ZTE, Inc. and others.
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
/**
- * Copyright 2016 ZTE, Inc. and others.
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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
-\r
-package org.openo.msb.wrapper.serviceListener;\r
-\r
-import org.openo.msb.api.MicroServiceInfo;\r
-import org.openo.msb.api.Service;\r
-\r
-\r
-public interface IMicroServiceChangeListener {\r
- public void onSave(Service microServiceInfo,String serverPort);\r
- \r
- public void onChange(String serviceName,String version,Service microServiceInfo,String serverPort);\r
- \r
- public void onStatusChange(String serviceName,String url,String version,String protocol,String status);\r
- \r
- public void onDelete(String serviceName, String url,String version,String protocol,String serverPort);\r
-\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.wrapper.serviceListener;
+
+import org.openo.msb.api.MicroServiceInfo;
+import org.openo.msb.api.Service;
+
+
+public interface IMicroServiceChangeListener {
+ public void onSave(Service microServiceInfo,String serverPort);
+
+ public void onChange(String serviceName,String version,Service microServiceInfo,String serverPort);
+
+ public void onStatusChange(String serviceName,String url,String version,String protocol,String status);
+
+ public void onDelete(String serviceName, String url,String version,String protocol,String serverPort);
+
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.wrapper.serviceListener;
+
+import java.util.Set;
+
+import org.apache.commons.lang3.StringUtils;
+import org.openo.msb.api.ApiRouteInfo;
+import org.openo.msb.api.CustomRouteInfo;
+import org.openo.msb.api.IuiRouteInfo;
+import org.openo.msb.api.Node;
+import org.openo.msb.api.RouteServer;
+import org.openo.msb.api.Service;
+import org.openo.msb.wrapper.ApiRouteServiceWrapper;
+import org.openo.msb.wrapper.CustomRouteServiceWrapper;
+import org.openo.msb.wrapper.IuiRouteServiceWrapper;
+import org.openo.msb.wrapper.util.RegExpTestUtil;
+import org.openo.msb.wrapper.util.RouteUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class MicroServiceChangeListener implements IMicroServiceChangeListener {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(MicroServiceChangeListener.class);
+
+ @Override
+ public void onSave(Service microServiceInfo,String serverPort) {
+
+ if("UI".equals(microServiceInfo.getProtocol())){
+ IuiRouteInfo iuiRouteInfo = this.buildIuiRouteInfo(microServiceInfo);
+ if(null != iuiRouteInfo){
+ IuiRouteServiceWrapper.getInstance().saveIuiRouteInstance(iuiRouteInfo);
+ }
+ }
+ else{
+
+ if(ifApiRouteUrl(microServiceInfo.getUrl())){
+ ApiRouteInfo apiRouteInfo = this.buildApiRouteInfo(microServiceInfo);
+ if(null != apiRouteInfo){
+ ApiRouteServiceWrapper.getInstance().saveApiRouteInstance(apiRouteInfo,serverPort);
+ }
+ }
+ else{
+ CustomRouteInfo customRouteInfo = this.buildCustomRouteInfo(microServiceInfo);
+ if(null != customRouteInfo){
+ CustomRouteServiceWrapper.getInstance().saveCustomRouteInstance(customRouteInfo,serverPort);
+ }
+ }
+ }
+
+
+ }
+
+ @Override
+ public void onChange(String serviceName, String version, Service microServiceInfo,String serverPort) {
+
+ if("UI".equals(microServiceInfo.getProtocol())){
+ if(serviceName.startsWith("iui_")||serviceName.startsWith("IUI_")){
+ serviceName=serviceName.substring(4);
+ }
+ IuiRouteInfo iuiRouteInfo = this.buildIuiRouteInfo(microServiceInfo);
+ if(null != iuiRouteInfo){
+ IuiRouteServiceWrapper.getInstance().updateIuiRouteInstance(serviceName, iuiRouteInfo);
+ }
+ }
+ else{
+
+ if(ifApiRouteUrl(microServiceInfo.getUrl())){
+ ApiRouteInfo apiRouteInfo = this.buildApiRouteInfo(microServiceInfo);
+ if(null != apiRouteInfo){
+ ApiRouteServiceWrapper.getInstance().updateApiRouteInstance(serviceName, version, apiRouteInfo,serverPort);
+ }
+ }
+ else{
+ if(!serviceName.startsWith("/")){
+ serviceName="/"+serviceName;
+ }
+ CustomRouteInfo customRouteInfo = this.buildCustomRouteInfo(microServiceInfo);
+ if(null != customRouteInfo){
+ CustomRouteServiceWrapper.getInstance().updateCustomRouteInstance(serviceName,customRouteInfo,serverPort);
+ }
+ }
+ }
+
+ }
+
+ @Override
+ public void onStatusChange(String serviceName,String url,String version,String protocol,String status) {
+ if("UI".equals(protocol)){
+
+ if(serviceName.startsWith("iui_")||serviceName.startsWith("IUI_")){
+ serviceName=serviceName.substring(4);
+ }
+ IuiRouteServiceWrapper.getInstance().updateIuiRouteStatus(serviceName, status);
+
+ }
+ else{
+ if(ifApiRouteUrl(url)){
+ ApiRouteServiceWrapper.getInstance().updateApiRouteStatus(serviceName, version, status);
+ }
+ else{
+ if(!serviceName.startsWith("/")){
+ serviceName="/"+serviceName;
+ }
+ CustomRouteServiceWrapper.getInstance().updateCustomRouteStatus(serviceName, status);
+ }
+ }
+
+
+
+ }
+
+ @Override
+ public void onDelete(String serviceName,String url, String version,String protocol,String serverPort) {
+
+ if("UI".equals(protocol)){
+ if(serviceName.startsWith("iui_")||serviceName.startsWith("IUI_")){
+ serviceName=serviceName.substring(4);
+ }
+ IuiRouteServiceWrapper.getInstance().deleteIuiRoute(serviceName, "*");
+
+ }
+ else{
+ if(ifApiRouteUrl(url)){
+ ApiRouteServiceWrapper.getInstance().deleteApiRoute(serviceName, version, "*",serverPort);
+ }
+ else{
+
+
+ if(!serviceName.startsWith("/")){
+ serviceName="/"+serviceName;
+ }
+
+ CustomRouteServiceWrapper.getInstance().deleteCustomRoute(serviceName, "*",serverPort);
+ }
+ }
+ }
+
+
+ /**
+ * @Title ifApiRouteUrl
+ * @Description TODO(According to judge whether the API registration URL format)
+ * @param url
+ * @return
+ * @return boolean
+ */
+ private boolean ifApiRouteUrl(String url){
+ return RegExpTestUtil.apiRouteUrlRegExpTest(url);
+ }
+
+
+ /**
+ * From MicroServiceInfo to ApiRouteInfo
+ * @param microServiceInfo
+ * @return
+ */
+ private ApiRouteInfo buildApiRouteInfo(Service microServiceInfo){
+
+ ApiRouteInfo apiRouteInfo = new ApiRouteInfo();
+ apiRouteInfo.setUrl(microServiceInfo.getUrl());
+
+ Set<Node> nodes=microServiceInfo.getNodes();
+ RouteServer[] routeServers=new RouteServer[nodes.size()];
+
+
+ int i=0;
+ for(Node node:nodes){
+ RouteServer routeServer = new RouteServer(node.getIp(),node.getPort());
+ routeServers[i]=routeServer;
+ i++;
+ }
+
+
+ apiRouteInfo.setServers(routeServers);
+ String[] rangs=StringUtils.split(microServiceInfo.getVisualRange(), "|");
+ if(RouteUtil.contain(rangs, "0")){
+ apiRouteInfo.setVisualRange("0");
+ }
+ else{
+ apiRouteInfo.setVisualRange("1");
+ }
+
+
+ if("ip_hash".equals(microServiceInfo.getLb_policy())){
+ apiRouteInfo.setUseOwnUpstream("1");
+ }
+
+
+
+ apiRouteInfo.setServiceName(microServiceInfo.getServiceName());
+ apiRouteInfo.setVersion(microServiceInfo.getVersion());
+ //TODO:set json and metrics defaultValue
+ String version="".equals(microServiceInfo.getVersion())?"":"/"+microServiceInfo.getVersion();
+ apiRouteInfo.setApiJson(microServiceInfo.getUrl()+"/swagger.json");
+ apiRouteInfo.setMetricsUrl("/admin/metrics");
+ return apiRouteInfo;
+ }
+
+
+ /**
+ * From MicroServiceInfo to CustomRouteInfo
+ * @param microServiceInfo
+ * @return
+ */
+ private CustomRouteInfo buildCustomRouteInfo(Service microServiceInfo){
+
+ CustomRouteInfo customRouteInfo = new CustomRouteInfo();
+ customRouteInfo.setUrl(microServiceInfo.getUrl());
+
+ Set<Node> nodes=microServiceInfo.getNodes();
+ RouteServer[] routeServers=new RouteServer[nodes.size()];
+
+
+ int i=0;
+ for(Node node:nodes){
+ RouteServer routeServer = new RouteServer(node.getIp(),node.getPort());
+ routeServers[i]=routeServer;
+ i++;
+ }
+
+ customRouteInfo.setServers(routeServers);
+ String[] rangs=StringUtils.split(microServiceInfo.getVisualRange(), "|");
+ if(RouteUtil.contain(rangs, "0")){
+ customRouteInfo.setVisualRange("0");
+ }
+ else{
+ customRouteInfo.setVisualRange("1");
+ }
+
+ if("ip_hash".equals(microServiceInfo.getLb_policy())){
+ customRouteInfo.setUseOwnUpstream("1");
+ }
+
+ String serviceName;
+ if(!microServiceInfo.getServiceName().startsWith("/")){
+ serviceName="/"+microServiceInfo.getServiceName();
+ }
+ else{
+ serviceName=microServiceInfo.getServiceName();
+ }
+ customRouteInfo.setServiceName(serviceName);
+
+ return customRouteInfo;
+ }
+
+
+ /**
+ * From MicroServiceInfo to IuiRouteInfo
+ * @param microServiceInfo
+ * @return
+ */
+ private IuiRouteInfo buildIuiRouteInfo(Service microServiceInfo){
+
+ IuiRouteInfo iuiRouteInfo = new IuiRouteInfo();
+ iuiRouteInfo.setUrl(microServiceInfo.getUrl());
+
+ Set<Node> nodes=microServiceInfo.getNodes();
+ RouteServer[] routeServers=new RouteServer[nodes.size()];
+
+
+ int i=0;
+ for(Node node:nodes){
+ RouteServer routeServer = new RouteServer(node.getIp(),node.getPort());
+ routeServers[i]=routeServer;
+ i++;
+ }
+
+ iuiRouteInfo.setServers(routeServers);
+ String[] rangs=StringUtils.split(microServiceInfo.getVisualRange(), "|");
+ if(RouteUtil.contain(rangs, "0")){
+ iuiRouteInfo.setVisualRange("0");
+ }
+ else{
+ iuiRouteInfo.setVisualRange("1");
+ }
+
+ if("ip_hash".equals(microServiceInfo.getLb_policy())){
+ iuiRouteInfo.setUseOwnUpstream("1");
+ }
+
+ String serviceName=microServiceInfo.getServiceName();
+ if(serviceName.startsWith("iui_")||serviceName.startsWith("IUI_")){
+ serviceName=serviceName.substring(4);
+ }
+
+
+ iuiRouteInfo.setServiceName(serviceName);
+
+ return iuiRouteInfo;
+ }
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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.util;\r
-\r
-import java.io.BufferedReader;\r
-import java.io.File;\r
-import java.io.FileInputStream;\r
-import java.io.FileNotFoundException;\r
-import java.io.IOException;\r
-import java.io.InputStreamReader;\r
-\r
-public final class FileUtil {\r
-\r
- /**\r
- * Read all the files under a folder\r
- */\r
- public static File[] readFileFolder(String filepath) throws FileNotFoundException, IOException {\r
- File file = new File(filepath);\r
- if (file.isDirectory()) {\r
- File[] filelist = file.listFiles();\r
- return filelist;\r
- }\r
- \r
- return null;\r
- }\r
-\r
- public static String readFile(String Path) throws IOException{\r
- BufferedReader reader = null;\r
- String fileContent = "";\r
- try {\r
- FileInputStream fileInputStream = new FileInputStream(Path);\r
- InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8");\r
- reader = new BufferedReader(inputStreamReader);\r
- String tempString = null;\r
- while ((tempString = reader.readLine()) != null) {\r
- fileContent += tempString;\r
- }\r
- reader.close();\r
- } catch (IOException e) {\r
- throw e;\r
- } finally {\r
- if (reader != null) {\r
- try {\r
- reader.close();\r
- } catch (IOException e) {\r
- throw e;\r
- }\r
- }\r
- }\r
- return fileContent;\r
- }\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.wrapper.util;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+public final class FileUtil {
+
+ /**
+ * Read all the files under a folder
+ */
+ public static File[] readFileFolder(String filepath) throws FileNotFoundException, IOException {
+ File file = new File(filepath);
+ if (file.isDirectory()) {
+ File[] filelist = file.listFiles();
+ return filelist;
+ }
+
+ return null;
+ }
+
+ public static String readFile(String Path) throws IOException{
+ BufferedReader reader = null;
+ String fileContent = "";
+ try {
+ FileInputStream fileInputStream = new FileInputStream(Path);
+ InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8");
+ reader = new BufferedReader(inputStreamReader);
+ String tempString = null;
+ while ((tempString = reader.readLine()) != null) {
+ fileContent += tempString;
+ }
+ reader.close();
+ } catch (IOException e) {
+ throw e;
+ } finally {
+ if (reader != null) {
+ try {
+ reader.close();
+ } catch (IOException e) {
+ throw e;
+ }
+ }
+ }
+ return fileContent;
+ }
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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.util;\r
-\r
-import java.util.List;\r
-\r
-import org.openo.msb.api.ApiRouteInfo;\r
-import org.openo.msb.api.RouteServer;\r
-import org.slf4j.Logger;\r
-import org.slf4j.LoggerFactory;\r
-\r
-import com.fasterxml.jackson.core.type.TypeReference;\r
-import com.fasterxml.jackson.databind.ObjectMapper;\r
-import com.fasterxml.jackson.databind.SerializationFeature;\r
-\r
-\r
-public class JacksonJsonUtil {\r
- \r
- private static final Logger logger = LoggerFactory.getLogger(JacksonJsonUtil.class);\r
- \r
- private static ObjectMapper mapper;\r
- \r
- \r
- public static synchronized ObjectMapper getMapperInstance() { \r
- if (mapper == null) { \r
- mapper = new ObjectMapper(); \r
- } \r
- return mapper; \r
- } \r
- \r
- /**\r
- * from java object to json \r
- * @param obj \r
- * @return json\r
- * @throws Exception \r
- */\r
- public static String beanToJson(Object obj) throws Exception {\r
- String json=null;\r
- try {\r
- ObjectMapper objectMapper = getMapperInstance();\r
- objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); \r
- json =objectMapper.writeValueAsString(obj);\r
- } catch (Exception e) {\r
- logger.error("Class beanToJson faild");\r
- throw new Exception("Class beanToJson faild");\r
- } \r
- return json;\r
- }\r
- \r
- \r
- \r
- /**\r
- * from json to java object\r
- * @param json \r
- * @param cls \r
- * @return \r
- * @throws Exception \r
- */\r
- public static Object jsonToBean(String json, Class<?> cls) throws Exception {\r
- Object vo =null;\r
- try {\r
- ObjectMapper objectMapper = getMapperInstance();\r
- objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); \r
- vo = objectMapper.readValue(json, cls);\r
- \r
- } catch (Exception e) {\r
- logger.error(cls+" JsonTobean faild");\r
- throw new Exception(cls+" JsonTobean faild");\r
- } \r
- return vo;\r
- }\r
- \r
- /**\r
- * from json to java List\r
- * @param json \r
- * @return \r
- * @throws Exception \r
- */\r
- public static List<ApiRouteInfo> jsonToListBean(String json) throws Exception {\r
- List<ApiRouteInfo> vo =null;\r
- try {\r
- \r
- ObjectMapper objectMapper = getMapperInstance();\r
- \r
-\r
- vo = objectMapper.readValue(json, new TypeReference<List<ApiRouteInfo>>() {});\r
- \r
- } catch (Exception e) {\r
- throw new Exception( "JSON_TO_BEAN_FAILD");\r
- } \r
- return vo;\r
- }\r
- \r
- public static void main(String[] args) {\r
- RouteServer server=new RouteServer("127.0.0.1","80");\r
- try {\r
- String json=beanToJson(server);\r
- System.out.println(json);\r
- } catch (Exception e) {\r
- // TODO Auto-generated catch block\r
- e.printStackTrace();\r
- }\r
- }\r
- \r
-\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.wrapper.util;
+
+import java.util.List;
+
+import org.openo.msb.api.ApiRouteInfo;
+import org.openo.msb.api.RouteServer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+
+
+public class JacksonJsonUtil {
+
+ private static final Logger logger = LoggerFactory.getLogger(JacksonJsonUtil.class);
+
+ private static ObjectMapper mapper;
+
+
+ public static synchronized ObjectMapper getMapperInstance() {
+ if (mapper == null) {
+ mapper = new ObjectMapper();
+ }
+ return mapper;
+ }
+
+ /**
+ * from java object to json
+ * @param obj
+ * @return json
+ * @throws Exception
+ */
+ public static String beanToJson(Object obj) throws Exception {
+ String json=null;
+ try {
+ ObjectMapper objectMapper = getMapperInstance();
+ objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
+ json =objectMapper.writeValueAsString(obj);
+ } catch (Exception e) {
+ logger.error("Class beanToJson faild");
+ throw new Exception("Class beanToJson faild");
+ }
+ return json;
+ }
+
+
+
+ /**
+ * from json to java object
+ * @param json
+ * @param cls
+ * @return
+ * @throws Exception
+ */
+ public static Object jsonToBean(String json, Class<?> cls) throws Exception {
+ Object vo =null;
+ try {
+ ObjectMapper objectMapper = getMapperInstance();
+ objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
+ vo = objectMapper.readValue(json, cls);
+
+ } catch (Exception e) {
+ logger.error(cls+" JsonTobean faild");
+ throw new Exception(cls+" JsonTobean faild");
+ }
+ return vo;
+ }
+
+ /**
+ * from json to java List
+ * @param json
+ * @return
+ * @throws Exception
+ */
+ public static List<ApiRouteInfo> jsonToListBean(String json) throws Exception {
+ List<ApiRouteInfo> vo =null;
+ try {
+
+ ObjectMapper objectMapper = getMapperInstance();
+
+
+ vo = objectMapper.readValue(json, new TypeReference<List<ApiRouteInfo>>() {});
+
+ } catch (Exception e) {
+ throw new Exception( "JSON_TO_BEAN_FAILD");
+ }
+ return vo;
+ }
+
+ public static void main(String[] args) {
+ RouteServer server=new RouteServer("127.0.0.1","80");
+ try {
+ String json=beanToJson(server);
+ System.out.println(json);
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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.util;\r
-\r
-import java.io.BufferedInputStream;\r
-import java.io.File;\r
-import java.io.FileInputStream;\r
-import java.util.PropertyResourceBundle;\r
-import java.util.ResourceBundle;\r
-\r
-import org.apache.commons.lang3.StringUtils;\r
-import org.slf4j.Logger;\r
-import org.slf4j.LoggerFactory;\r
-\r
-import redis.clients.jedis.Jedis;\r
-import redis.clients.jedis.JedisPool;\r
-import redis.clients.jedis.JedisPoolConfig;\r
-\r
-\r
-\r
-public final class JedisUtil {\r
- private static final Logger LOGGER = LoggerFactory.getLogger(JedisUtil.class);\r
- private static String host = "127.0.0.1";\r
- private static int port = 6379;\r
- private static int connectionTimeout = 2000;\r
- private static int DEFAULT_DB_INDEX = 0;\r
-\r
- private static JedisPool jedisPool = null;\r
- \r
- public static String serverIp="127.0.0.1";\r
- \r
- public static int serverPort=10080;\r
- \r
- public static String propertiesName="redis.properties";\r
- \r
- public static String propertiesPath="";\r
-\r
- \r
- \r
-public static void main(String[] args) {\r
- \r
-}\r
-\r
- private JedisUtil() {\r
- // private constructor\r
-\r
- }\r
- \r
- private static void initialPool() {\r
- try {\r
- JedisPoolConfig config = new JedisPoolConfig();\r
- \r
-// String pathtest=JedisUtil.class.getResource("").getPath();\r
-// String path ="/"+ pathtest.substring(0, pathtest.indexOf("assembly")).replace("file:/", "") +"assembly/"+defaultWorkspace;\r
- \r
- File propertiesFile = new File(propertiesPath);\r
- \r
- if (propertiesFile.exists()) {\r
- \r
- \r
- BufferedInputStream inputStream =new BufferedInputStream(new FileInputStream(propertiesPath)); \r
- ResourceBundle bundle =new PropertyResourceBundle(inputStream);\r
- \r
- if (bundle == null) {\r
- throw new IllegalArgumentException(\r
- "[redis.properties] is not found!");\r
- }\r
- \r
-\r
- // 设置连接池基本信息\r
- String strHost = bundle.getString("redis.host");\r
- if(StringUtils.isNotEmpty(strHost)){\r
- host = strHost;\r
- }\r
- String strPort = bundle.getString("redis.port");\r
- if(StringUtils.isNotEmpty(strPort)){\r
- port = Integer.valueOf(strPort);\r
- }\r
- \r
- \r
- String strTimeout = bundle.getString("redis.connectionTimeout");\r
- if (StringUtils.isNotEmpty(strTimeout) ){\r
- connectionTimeout = Integer.valueOf(strTimeout);\r
- }\r
- \r
-// serverIp=bundle.getString("server.ip");\r
- serverPort=Integer.valueOf(bundle.getString("server.port"));\r
- \r
- String strDbIndex = bundle.getString("redis.db_index");\r
- if (StringUtils.isNotEmpty(strDbIndex)) {\r
- DEFAULT_DB_INDEX = Integer.valueOf(strDbIndex);\r
- }\r
-\r
- String strMaxTotal = bundle.getString("redis.pool.maxTotal");\r
- if (StringUtils.isNotEmpty(strMaxTotal)) {\r
- config.setMaxTotal(Integer.valueOf(strMaxTotal));\r
- }\r
-\r
- String strMaxIdle = bundle.getString("redis.pool.maxIdle");\r
- if (StringUtils.isNotEmpty(strMaxIdle)) {\r
- config.setMaxIdle(Integer.valueOf(strMaxIdle));\r
- }\r
-\r
- String strMaxWaitMillis = bundle.getString("redis.pool.maxWaitMillis");\r
- if (StringUtils.isNotEmpty(strMaxWaitMillis)) {\r
- config.setMaxWaitMillis(Long.valueOf(strMaxWaitMillis));\r
- }\r
-\r
- String strTestOnBorrow = bundle\r
- .getString("redis.pool.testOnBorrow");\r
- if (StringUtils.isNotEmpty(strTestOnBorrow)) {\r
- config.setTestOnBorrow(Boolean.valueOf(strTestOnBorrow));\r
- }\r
-\r
- String strTestOnReturn = bundle\r
- .getString("redis.pool.testOnReturn");\r
- if (StringUtils.isNotEmpty(strTestOnReturn)) {\r
- config.setTestOnReturn(Boolean.valueOf(strTestOnReturn));\r
- }\r
-\r
- }\r
- \r
- LOGGER.info("Redis server info: " + host + ":" + port);\r
- LOGGER.info("nginx server info: " + serverIp + ":" + serverPort);\r
- \r
- \r
-// ResourceBundle bundle = ResourceBundle.getBundle("conf.redis");\r
- \r
- jedisPool = new JedisPool(config, host, port, connectionTimeout);\r
- } catch (Exception e) {\r
- LOGGER.error("Initiate Jedis pool failed!", e);\r
- }\r
- }\r
- /**\r
- * From the connection pool to obtain jedis instance, use the default database index number 0\r
- * @return\r
- */\r
- public synchronized static Jedis borrowJedisInstance() {\r
- if (jedisPool == null) {\r
- initialPool();\r
- }\r
- try {\r
- if (jedisPool != null) {\r
- Jedis resource = jedisPool.getResource();\r
- resource.select(DEFAULT_DB_INDEX);\r
- return resource;\r
- } else {\r
- return null;\r
- }\r
- } catch (Exception e) {\r
- LOGGER.error("Get Jedis from pool failed!", e);\r
- return null;\r
- }\r
- }\r
- /**\r
- * From the connection pool to obtain jedis instance, using the specified database index number\r
- * @return\r
- */\r
- public synchronized static Jedis borrowJedisInstance(final int dbIndex) {\r
- if (jedisPool == null) {\r
- initialPool();\r
- }\r
- try {\r
- if (jedisPool != null) {\r
- Jedis resource = jedisPool.getResource();\r
- resource.select(dbIndex);\r
- return resource;\r
- } else {\r
- return null;\r
- }\r
- } catch (Exception e) {\r
- LOGGER.error("Get Jedis from pool failed!", e);\r
- return null;\r
- }\r
- }\r
- \r
- /**\r
- * returned to the pool jedis instance\r
- * @param jedis\r
- */\r
- public static void returnJedisInstance(final Jedis jedis) {\r
- if (jedis != null) {\r
- jedis.close();\r
- }\r
- }\r
- \r
- \r
- /** \r
- * @Title getJedis \r
- * @Description TODO(From the connection pool to obtain jedis instance) \r
- * @throws Exception \r
- * @return Jedis \r
- */\r
- public static Jedis getJedis() throws Exception{\r
- \r
- \r
- Jedis jedis = borrowJedisInstance();\r
- if (jedis == null) {\r
- throw new Exception("fetch from jedis pool failed,null object!");\r
- \r
- }\r
- \r
- return jedis;\r
- \r
- }\r
-\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.wrapper.util;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.util.PropertyResourceBundle;
+import java.util.ResourceBundle;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import redis.clients.jedis.Jedis;
+import redis.clients.jedis.JedisPool;
+import redis.clients.jedis.JedisPoolConfig;
+
+
+
+public final class JedisUtil {
+ private static final Logger LOGGER = LoggerFactory.getLogger(JedisUtil.class);
+ private static String host = "127.0.0.1";
+ private static int port = 6379;
+ private static int connectionTimeout = 2000;
+ private static int DEFAULT_DB_INDEX = 0;
+
+ private static JedisPool jedisPool = null;
+
+ public static String serverIp="127.0.0.1";
+
+ public static int serverPort=10080;
+
+ public static String propertiesName="redis.properties";
+
+ public static String propertiesPath="";
+
+
+
+public static void main(String[] args) {
+
+}
+
+ private JedisUtil() {
+ // private constructor
+
+ }
+
+ private static void initialPool() {
+ try {
+ JedisPoolConfig config = new JedisPoolConfig();
+
+// String pathtest=JedisUtil.class.getResource("").getPath();
+// String path ="/"+ pathtest.substring(0, pathtest.indexOf("assembly")).replace("file:/", "") +"assembly/"+defaultWorkspace;
+
+ File propertiesFile = new File(propertiesPath);
+
+ if (propertiesFile.exists()) {
+
+
+ BufferedInputStream inputStream =new BufferedInputStream(new FileInputStream(propertiesPath));
+ ResourceBundle bundle =new PropertyResourceBundle(inputStream);
+
+ if (bundle == null) {
+ throw new IllegalArgumentException(
+ "[redis.properties] is not found!");
+ }
+
+
+ // 设置连接池基本信息
+ String strHost = bundle.getString("redis.host");
+ if(StringUtils.isNotEmpty(strHost)){
+ host = strHost;
+ }
+ String strPort = bundle.getString("redis.port");
+ if(StringUtils.isNotEmpty(strPort)){
+ port = Integer.valueOf(strPort);
+ }
+
+
+ String strTimeout = bundle.getString("redis.connectionTimeout");
+ if (StringUtils.isNotEmpty(strTimeout) ){
+ connectionTimeout = Integer.valueOf(strTimeout);
+ }
+
+// serverIp=bundle.getString("server.ip");
+ serverPort=Integer.valueOf(bundle.getString("server.port"));
+
+ String strDbIndex = bundle.getString("redis.db_index");
+ if (StringUtils.isNotEmpty(strDbIndex)) {
+ DEFAULT_DB_INDEX = Integer.valueOf(strDbIndex);
+ }
+
+ String strMaxTotal = bundle.getString("redis.pool.maxTotal");
+ if (StringUtils.isNotEmpty(strMaxTotal)) {
+ config.setMaxTotal(Integer.valueOf(strMaxTotal));
+ }
+
+ String strMaxIdle = bundle.getString("redis.pool.maxIdle");
+ if (StringUtils.isNotEmpty(strMaxIdle)) {
+ config.setMaxIdle(Integer.valueOf(strMaxIdle));
+ }
+
+ String strMaxWaitMillis = bundle.getString("redis.pool.maxWaitMillis");
+ if (StringUtils.isNotEmpty(strMaxWaitMillis)) {
+ config.setMaxWaitMillis(Long.valueOf(strMaxWaitMillis));
+ }
+
+ String strTestOnBorrow = bundle
+ .getString("redis.pool.testOnBorrow");
+ if (StringUtils.isNotEmpty(strTestOnBorrow)) {
+ config.setTestOnBorrow(Boolean.valueOf(strTestOnBorrow));
+ }
+
+ String strTestOnReturn = bundle
+ .getString("redis.pool.testOnReturn");
+ if (StringUtils.isNotEmpty(strTestOnReturn)) {
+ config.setTestOnReturn(Boolean.valueOf(strTestOnReturn));
+ }
+
+ }
+
+ LOGGER.info("Redis server info: " + host + ":" + port);
+ LOGGER.info("nginx server info: " + serverIp + ":" + serverPort);
+
+
+// ResourceBundle bundle = ResourceBundle.getBundle("conf.redis");
+
+ jedisPool = new JedisPool(config, host, port, connectionTimeout);
+ } catch (Exception e) {
+ LOGGER.error("Initiate Jedis pool failed!", e);
+ }
+ }
+ /**
+ * From the connection pool to obtain jedis instance, use the default database index number 0
+ * @return
+ */
+ public synchronized static Jedis borrowJedisInstance() {
+ if (jedisPool == null) {
+ initialPool();
+ }
+ try {
+ if (jedisPool != null) {
+ Jedis resource = jedisPool.getResource();
+ resource.select(DEFAULT_DB_INDEX);
+ return resource;
+ } else {
+ return null;
+ }
+ } catch (Exception e) {
+ LOGGER.error("Get Jedis from pool failed!", e);
+ return null;
+ }
+ }
+ /**
+ * From the connection pool to obtain jedis instance, using the specified database index number
+ * @return
+ */
+ public synchronized static Jedis borrowJedisInstance(final int dbIndex) {
+ if (jedisPool == null) {
+ initialPool();
+ }
+ try {
+ if (jedisPool != null) {
+ Jedis resource = jedisPool.getResource();
+ resource.select(dbIndex);
+ return resource;
+ } else {
+ return null;
+ }
+ } catch (Exception e) {
+ LOGGER.error("Get Jedis from pool failed!", e);
+ return null;
+ }
+ }
+
+ /**
+ * returned to the pool jedis instance
+ * @param jedis
+ */
+ public static void returnJedisInstance(final Jedis jedis) {
+ if (jedis != null) {
+ jedis.close();
+ }
+ }
+
+
+ /**
+ * @Title getJedis
+ * @Description TODO(From the connection pool to obtain jedis instance)
+ * @throws Exception
+ * @return Jedis
+ */
+ public static Jedis getJedis() throws Exception{
+
+
+ Jedis jedis = borrowJedisInstance();
+ if (jedis == null) {
+ throw new Exception("fetch from jedis pool failed,null object!");
+
+ }
+
+ return jedis;
+
+ }
+
}
\ No newline at end of file
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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.util;\r
-\r
-public class MetricsUtil {\r
-\r
- public static String adminContextPath = "http://127.0.0.1:8086/admin/metrics";\r
- \r
- public static final int SC_OK = 200;\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.wrapper.util;
+
+public class MetricsUtil {
+
+ public static String adminContextPath = "http://127.0.0.1:8086/admin/metrics";
+
+ public static final int SC_OK = 200;
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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.util;\r
-\r
-import java.sql.Date;\r
-import java.util.ArrayList;\r
-import java.util.HashMap;\r
-import java.util.HashSet;\r
-import java.util.List;\r
-import java.util.Map;\r
-import java.util.Set;\r
-import java.util.regex.Matcher;\r
-import java.util.regex.Pattern;\r
-\r
-import org.apache.commons.lang3.StringUtils;\r
-import org.openo.msb.api.MicroServiceFullInfo;\r
-import org.openo.msb.api.MicroServiceInfo;\r
-import org.openo.msb.api.Node;\r
-import org.openo.msb.api.NodeInfo;\r
-import org.openo.msb.api.Service;\r
-import org.openo.msb.wrapper.serviceListener.IMicroServiceChangeListener;\r
-import org.slf4j.Logger;\r
-import org.slf4j.LoggerFactory;\r
-\r
-import redis.clients.jedis.Jedis;\r
-\r
-public class MicroServiceDB {\r
-\r
- private static final Logger LOGGER = LoggerFactory.getLogger(MicroServiceDB.class);\r
-\r
- private static MicroServiceDB instance = new MicroServiceDB();\r
-\r
- private List<IMicroServiceChangeListener> serviceListenerlist =\r
- new ArrayList<IMicroServiceChangeListener>();\r
-\r
- private MicroServiceDB() {}\r
-\r
- public static MicroServiceDB getInstance() {\r
- return instance;\r
- }\r
-\r
- \r
- public void addServiceChangeListener(IMicroServiceChangeListener listener) {\r
- synchronized (serviceListenerlist) {\r
- serviceListenerlist.add(listener);\r
- }\r
- }\r
-\r
- \r
- public void removeServiceChangeListener(IMicroServiceChangeListener listener) {\r
- synchronized (serviceListenerlist) {\r
- serviceListenerlist.remove(listener);\r
- }\r
- }\r
- \r
- \r
- public MicroServiceFullInfo[] getAllMicroServiceInstances() throws Exception {\r
- Jedis jedis = null;\r
- MicroServiceFullInfo[] microServiceList;\r
- try {\r
- jedis = JedisUtil.getJedis();\r
-\r
- String routekey =\r
- MicroServiceUtil.getPrefixedKey("","*", MicroServiceUtil.SUFFIX_PATH_INFO);\r
- Set<String> serviceSet = jedis.keys(routekey);\r
- microServiceList = new MicroServiceFullInfo[serviceSet.size()];\r
-\r
- Pattern redisKeyPattern = MicroServiceUtil.getRedisKeyPattern();\r
- int i = 0;\r
- for (String servicePath : serviceSet) {\r
- Matcher matcher = redisKeyPattern.matcher(servicePath);\r
- if (matcher.matches()) {\r
- microServiceList[i] = getMicroServiceByJedis(jedis, matcher.group("servicename"),matcher.group("version"), "");\r
- i++;\r
- }\r
- }\r
- } catch (Exception e) {\r
- LOGGER.error("call redis throw exception", e);\r
- throw new Exception("call redis throw exception:"+e.getMessage()); \r
- } finally {\r
- JedisUtil.returnJedisInstance(jedis);\r
- }\r
- \r
- return microServiceList;\r
- }\r
-\r
- public void saveMicroServiceInfo2Redis(MicroServiceInfo microServiceInfo,String serverPort) throws Exception {\r
- // 1.1 set info\r
- String serviceInfokey =\r
- MicroServiceUtil.getServiceInfoKey(serverPort,microServiceInfo.getServiceName(),\r
- microServiceInfo.getVersion());\r
- Map<String, String> serviceInfoMap = new HashMap<String, String>();\r
- serviceInfoMap.put("url", microServiceInfo.getUrl());\r
- serviceInfoMap.put("protocol", microServiceInfo.getProtocol());\r
- serviceInfoMap.put("visualRange",microServiceInfo.getVisualRange());\r
- serviceInfoMap.put("lb_policy",microServiceInfo.getLb_policy());\r
- serviceInfoMap.put("status", "0");\r
- \r
- \r
-\r
- // 1.2 set lb info\r
- String serviceLBkey =\r
- MicroServiceUtil.getPrefixedKey(serverPort,microServiceInfo.getServiceName(),\r
- microServiceInfo.getVersion(), MicroServiceUtil.ROUTE_PATH_LOADBALANCE);\r
-\r
-\r
- Jedis jedis = null;\r
- try {\r
- jedis = JedisUtil.getJedis();\r
- // 2.1 save info\r
- jedis.hmset(serviceInfokey, serviceInfoMap);\r
-\r
-\r
- for(Node node:microServiceInfo.getNodes()){\r
- \r
- String key=serviceLBkey+":"+node.getIp()+"-"+node.getPort();\r
- \r
- Map<String,String> nodeMap = new HashMap<String,String>();\r
- \r
- nodeMap.put("ip", node.getIp());\r
- nodeMap.put("port", node.getPort());\r
- nodeMap.put("ttl", Integer.toString(node.getTtl()));\r
- long expiration_time=System.currentTimeMillis()+node.getTtl()*1000;\r
- nodeMap.put("expiration", Long.toString(expiration_time));\r
- \r
- if(jedis.keys(key).isEmpty()){\r
- nodeMap.put("created_at", Long.toString(System.currentTimeMillis()));\r
- }\r
-// else{\r
-// Map<String,String> nodeLBmap = jedis.hgetAll(key); \r
-// nodeMap.put("created_at", nodeLBmap.get("created_at"));\r
-// }\r
- nodeMap.put("updated_at", Long.toString(System.currentTimeMillis()));\r
- \r
- jedis.hmset(key, nodeMap);\r
- }\r
- \r
-// jedis.sadd(serviceLBkey, nodeArray);\r
-\r
- } catch (Exception e) {\r
- LOGGER.error("save to redis throw exception", e);\r
- throw new Exception("save to redis throw exception:"+e.getMessage());\r
- } finally {\r
- JedisUtil.returnJedisInstance(jedis);\r
- }\r
-\r
-\r
-\r
- }\r
- \r
- public void updateMicroServiceStatus(String serviceName, String version,String status) throws Exception{\r
- \r
- \r
- String serviceInfokey = MicroServiceUtil.getServiceInfoKey("",serviceName, version);\r
- Map<String, String> serviceInfoMap = new HashMap<String, String>();\r
- serviceInfoMap.put("status", status);\r
-\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
- jedis.hmset(serviceInfokey, serviceInfoMap);\r
- }\r
- catch (Exception e) {\r
- LOGGER.error("update MicroService status throw exception", e);\r
- throw new Exception("update MicroService status throw exception:"+e.getMessage());\r
- } finally {\r
- JedisUtil.returnJedisInstance(jedis);\r
- }\r
- \r
- }\r
- \r
- \r
- public void updateMicroServiceNode2Redis(String serviceName, String version,String ip,String port,int ttl) throws Exception {\r
- String serviceLBkey =\r
- MicroServiceUtil.getPrefixedKey("",serviceName,version, MicroServiceUtil.ROUTE_PATH_LOADBALANCE);\r
-\r
-\r
- Jedis jedis = null;\r
- try {\r
- jedis = JedisUtil.getJedis();\r
- \r
- \r
- String nodeKey=serviceLBkey+":"+ip+"-"+port; \r
- Map<String,String> nodeLBmap = jedis.hgetAll(nodeKey);\r
- \r
- if(nodeLBmap.isEmpty()){\r
- throw new NullPointerException(" MicroService Node not fond "); \r
- }\r
- \r
- \r
- nodeLBmap.put("ttl", Integer.toString(ttl));\r
- long expiration_time=System.currentTimeMillis()+ttl*1000;\r
- nodeLBmap.put("expiration", Long.toString(expiration_time));\r
- nodeLBmap.put("updated_at", Long.toString(System.currentTimeMillis()));\r
- \r
- jedis.hmset(nodeKey, nodeLBmap);\r
-\r
-\r
- } \r
- catch (NullPointerException e){\r
- throw e; \r
- }\r
- catch (Exception e) {\r
- LOGGER.error("update MicroService Node throw exception", e);\r
- throw new Exception("update MicroService Node throw exception:"+e.getMessage());\r
- } finally {\r
- JedisUtil.returnJedisInstance(jedis);\r
- }\r
- }\r
- \r
- \r
- public void noticeUpdateApiListener(String serviceName,String version,Service microServiceInfo,String serverPort) {\r
- if (isNeedNotify(microServiceInfo)) {\r
- for (IMicroServiceChangeListener serviceListener : serviceListenerlist) {\r
- serviceListener.onChange(serviceName,version, microServiceInfo,serverPort);\r
- }\r
- }\r
- \r
- }\r
- \r
- public void noticeUpdateStatusListener(Service microServiceInfo,String status) {\r
- \r
- for (IMicroServiceChangeListener serviceListener : serviceListenerlist) {\r
- serviceListener.onStatusChange(microServiceInfo.getServiceName(),microServiceInfo.getUrl(),\r
- microServiceInfo.getVersion(),microServiceInfo.getProtocol(),status);\r
- }\r
- }\r
- \r
- \r
-\r
- public void noticeApiListener(Service microServiceInfo, String type,String serverPort) {\r
- if (isNeedNotify(microServiceInfo)) {\r
-\r
- if ("ADD".equals(type)) {\r
- for (IMicroServiceChangeListener serviceListener : serviceListenerlist) {\r
- serviceListener.onSave(microServiceInfo,serverPort);\r
- }\r
- } else if ("DELETE".equals(type)) {\r
- for (IMicroServiceChangeListener serviceListener : serviceListenerlist) {\r
- serviceListener.onDelete(microServiceInfo.getServiceName(),microServiceInfo.getUrl(),\r
- microServiceInfo.getVersion(),microServiceInfo.getProtocol(),serverPort);\r
- }\r
- } \r
-\r
- }\r
- }\r
-\r
-\r
- public MicroServiceFullInfo getMicroServiceInstance(String serviceName, String version,String serverPort)\r
- throws Exception {\r
- if (null == version || "null".equals(version)) {\r
- version = "";\r
- }\r
-\r
- Jedis jedis = null;\r
- MicroServiceFullInfo microServiceInfo = null;\r
- \r
- try {\r
- jedis = JedisUtil.getJedis();\r
- \r
- microServiceInfo= getMicroServiceByJedis(jedis,serviceName,version, serverPort);\r
-\r
- \r
- } catch (Exception e) {\r
- LOGGER.error("call redis throw exception", e);\r
- throw new Exception("call redis throw exception:"+e.getMessage());\r
- } finally {\r
- JedisUtil.returnJedisInstance(jedis);\r
- }\r
- \r
- return microServiceInfo;\r
- \r
- }\r
-\r
- private MicroServiceFullInfo getMicroServiceByJedis(Jedis jedis,String serviceName, String version,String serverPort){\r
- MicroServiceFullInfo microServiceInfo = null;\r
- String serviceInfoKey = MicroServiceUtil.getServiceInfoKey(serverPort,serviceName, version);\r
- Map<String, String> infomap = jedis.hgetAll(serviceInfoKey);\r
- if (!infomap.isEmpty()) {\r
- microServiceInfo = new MicroServiceFullInfo();\r
- microServiceInfo.setServiceName(serviceName);\r
- microServiceInfo.setVersion(version);\r
- microServiceInfo.setUrl(infomap.get("url"));\r
- microServiceInfo.setProtocol(infomap.get("protocol"));\r
- microServiceInfo.setVisualRange(infomap.get("visualRange"));\r
- microServiceInfo.setStatus(infomap.get("status"));\r
- microServiceInfo.setLb_policy(infomap.get("lb_policy"));\r
-\r
- String nodeLBkey =\r
- MicroServiceUtil.getPrefixedKey(serverPort,microServiceInfo.getServiceName(),\r
- microServiceInfo.getVersion(),\r
- MicroServiceUtil.ROUTE_PATH_LOADBALANCE);\r
- \r
- Set<String> nodeKeys=jedis.keys(nodeLBkey+":*");\r
- \r
- Set<NodeInfo> nodes=new HashSet<NodeInfo>();\r
- for(String nodeKey:nodeKeys){\r
- Map<String,String> nodeLBmap = jedis.hgetAll(nodeKey);\r
- NodeInfo nodeInfo=new NodeInfo();\r
- nodeInfo.setNodeId(serviceName+"_"+nodeLBmap.get("ip")+"_"+nodeLBmap.get("port"));\r
- nodeInfo.setIp(nodeLBmap.get("ip"));\r
- nodeInfo.setPort(nodeLBmap.get("port"));\r
- nodeInfo.setTtl(Integer.parseInt(nodeLBmap.get("ttl")));\r
- nodeInfo.setCreated_at(new Date(Long.parseLong(nodeLBmap.get("created_at"))));\r
- nodeInfo.setUpdated_at(new Date(Long.parseLong(nodeLBmap.get("updated_at"))));\r
- nodeInfo.setExpiration(new Date(Long.parseLong(nodeLBmap.get("expiration"))));\r
- \r
- nodes.add(nodeInfo);\r
- }\r
- \r
- microServiceInfo.setNodes(nodes);\r
- }\r
- \r
- \r
- \r
- \r
- return microServiceInfo;\r
- }\r
- \r
-\r
- public void deleteMicroService(String serviceName, String version,String serverPort) throws Exception {\r
- if (null == version || "null".equals(version)) {\r
- version = "";\r
- }\r
- \r
- Jedis jedis = null;\r
- try {\r
- jedis = JedisUtil.getJedis();\r
- String routekey = MicroServiceUtil.getPrefixedKey(serverPort,serviceName, version, "*");\r
- Set<String> infoSet = jedis.keys(routekey);\r
-\r
- String[] paths = new String[infoSet.size()];\r
-\r
- infoSet.toArray(paths);\r
-\r
- jedis.del(paths);\r
- } catch (Exception e) {\r
- LOGGER.error("call redis throw exception", e);\r
- throw new Exception("call redis throw exception:"+e.getMessage());\r
- } finally {\r
- JedisUtil.returnJedisInstance(jedis);\r
- }\r
- }\r
-\r
- public void deleteNode(String serviceName, String version, String ip,String port) throws Exception {\r
- if (null == version || "null".equals(version)) {\r
- version = "";\r
- }\r
- \r
- Jedis jedis = null;\r
- try {\r
- jedis = JedisUtil.getJedis();\r
- String serviceLBkey =\r
- MicroServiceUtil.getPrefixedKey("",serviceName, version,\r
- MicroServiceUtil.ROUTE_PATH_LOADBALANCE,ip+"-"+port);\r
- jedis.del(serviceLBkey);\r
- } catch (Exception e) {\r
- LOGGER.error("call redis throw exception", e);\r
- throw new Exception("call redis throw exception:"+e.getMessage());\r
- } finally {\r
- JedisUtil.returnJedisInstance(jedis);\r
- }\r
-\r
- }\r
-\r
-\r
- /**\r
- * Determine whether the service needs to send a notification \r
- * TODO: filter according to the agreement,\r
- * the only notice of agreement for REST \ UI interface MSB - REST \r
- * @param protocol\r
- * @return\r
- */\r
- private boolean isNeedNotifyByProtocol(String protocol) {\r
- return "UI".equalsIgnoreCase(protocol) ||("REST".equalsIgnoreCase(protocol));\r
- }\r
- \r
- /**\r
- * Determine whether the service needs to send a notification \r
- * TODO: according to the visual range filter conditions \r
- * @param visualRange\r
- * @return\r
- */\r
- private boolean isNeedNotifyByVisualRange(String visualRange) {\r
- String[] rangeArray=StringUtils.split(visualRange, "|");\r
- return RouteUtil.contain(RouteUtil.visualRangeMatches, rangeArray);\r
- }\r
-\r
- /**\r
- * According to the MicroServiceInfo entity information to judge whether need to send a notification\r
- * @param microServiceInfo\r
- * @return\r
- */\r
- private boolean isNeedNotify(Service microServiceInfo) {\r
- if (null != microServiceInfo) {\r
- return isNeedNotifyByProtocol(microServiceInfo.getProtocol()) &&\r
- isNeedNotifyByVisualRange(microServiceInfo.getVisualRange());\r
- } else {\r
- return false;\r
- }\r
- }\r
- \r
- \r
- \r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.wrapper.util;
+
+import java.sql.Date;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.commons.lang3.StringUtils;
+import org.openo.msb.api.MicroServiceFullInfo;
+import org.openo.msb.api.MicroServiceInfo;
+import org.openo.msb.api.Node;
+import org.openo.msb.api.NodeInfo;
+import org.openo.msb.api.Service;
+import org.openo.msb.wrapper.serviceListener.IMicroServiceChangeListener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import redis.clients.jedis.Jedis;
+
+public class MicroServiceDB {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(MicroServiceDB.class);
+
+ private static MicroServiceDB instance = new MicroServiceDB();
+
+ private List<IMicroServiceChangeListener> serviceListenerlist =
+ new ArrayList<IMicroServiceChangeListener>();
+
+ private MicroServiceDB() {}
+
+ public static MicroServiceDB getInstance() {
+ return instance;
+ }
+
+
+ public void addServiceChangeListener(IMicroServiceChangeListener listener) {
+ synchronized (serviceListenerlist) {
+ serviceListenerlist.add(listener);
+ }
+ }
+
+
+ public void removeServiceChangeListener(IMicroServiceChangeListener listener) {
+ synchronized (serviceListenerlist) {
+ serviceListenerlist.remove(listener);
+ }
+ }
+
+
+ public MicroServiceFullInfo[] getAllMicroServiceInstances() throws Exception {
+ Jedis jedis = null;
+ MicroServiceFullInfo[] microServiceList;
+ try {
+ jedis = JedisUtil.getJedis();
+
+ String routekey =
+ MicroServiceUtil.getPrefixedKey("","*", MicroServiceUtil.SUFFIX_PATH_INFO);
+ Set<String> serviceSet = jedis.keys(routekey);
+ microServiceList = new MicroServiceFullInfo[serviceSet.size()];
+
+ Pattern redisKeyPattern = MicroServiceUtil.getRedisKeyPattern();
+ int i = 0;
+ for (String servicePath : serviceSet) {
+ Matcher matcher = redisKeyPattern.matcher(servicePath);
+ if (matcher.matches()) {
+ microServiceList[i] = getMicroServiceByJedis(jedis, matcher.group("servicename"),matcher.group("version"), "");
+ i++;
+ }
+ }
+ } catch (Exception e) {
+ LOGGER.error("call redis throw exception", e);
+ throw new Exception("call redis throw exception:"+e.getMessage());
+ } finally {
+ JedisUtil.returnJedisInstance(jedis);
+ }
+
+ return microServiceList;
+ }
+
+ public void saveMicroServiceInfo2Redis(MicroServiceInfo microServiceInfo,String serverPort) throws Exception {
+ // 1.1 set info
+ String serviceInfokey =
+ MicroServiceUtil.getServiceInfoKey(serverPort,microServiceInfo.getServiceName(),
+ microServiceInfo.getVersion());
+ Map<String, String> serviceInfoMap = new HashMap<String, String>();
+ serviceInfoMap.put("url", microServiceInfo.getUrl());
+ serviceInfoMap.put("protocol", microServiceInfo.getProtocol());
+ serviceInfoMap.put("visualRange",microServiceInfo.getVisualRange());
+ serviceInfoMap.put("lb_policy",microServiceInfo.getLb_policy());
+ serviceInfoMap.put("status", "0");
+
+
+
+ // 1.2 set lb info
+ String serviceLBkey =
+ MicroServiceUtil.getPrefixedKey(serverPort,microServiceInfo.getServiceName(),
+ microServiceInfo.getVersion(), MicroServiceUtil.ROUTE_PATH_LOADBALANCE);
+
+
+ Jedis jedis = null;
+ try {
+ jedis = JedisUtil.getJedis();
+ // 2.1 save info
+ jedis.hmset(serviceInfokey, serviceInfoMap);
+
+
+ for(Node node:microServiceInfo.getNodes()){
+
+ String key=serviceLBkey+":"+node.getIp()+"-"+node.getPort();
+
+ Map<String,String> nodeMap = new HashMap<String,String>();
+
+ nodeMap.put("ip", node.getIp());
+ nodeMap.put("port", node.getPort());
+ nodeMap.put("ttl", Integer.toString(node.getTtl()));
+ long expiration_time=System.currentTimeMillis()+node.getTtl()*1000;
+ nodeMap.put("expiration", Long.toString(expiration_time));
+
+ if(jedis.keys(key).isEmpty()){
+ nodeMap.put("created_at", Long.toString(System.currentTimeMillis()));
+ }
+// else{
+// Map<String,String> nodeLBmap = jedis.hgetAll(key);
+// nodeMap.put("created_at", nodeLBmap.get("created_at"));
+// }
+ nodeMap.put("updated_at", Long.toString(System.currentTimeMillis()));
+
+ jedis.hmset(key, nodeMap);
+ }
+
+// jedis.sadd(serviceLBkey, nodeArray);
+
+ } catch (Exception e) {
+ LOGGER.error("save to redis throw exception", e);
+ throw new Exception("save to redis throw exception:"+e.getMessage());
+ } finally {
+ JedisUtil.returnJedisInstance(jedis);
+ }
+
+
+
+ }
+
+ public void updateMicroServiceStatus(String serviceName, String version,String status) throws Exception{
+
+
+ String serviceInfokey = MicroServiceUtil.getServiceInfoKey("",serviceName, version);
+ Map<String, String> serviceInfoMap = new HashMap<String, String>();
+ serviceInfoMap.put("status", status);
+
+
+ Jedis jedis = null;
+ try {
+ jedis = JedisUtil.borrowJedisInstance();
+ if (jedis == null) {
+ throw new Exception("fetch from jedis pool failed,null object!");
+ }
+ jedis.hmset(serviceInfokey, serviceInfoMap);
+ }
+ catch (Exception e) {
+ LOGGER.error("update MicroService status throw exception", e);
+ throw new Exception("update MicroService status throw exception:"+e.getMessage());
+ } finally {
+ JedisUtil.returnJedisInstance(jedis);
+ }
+
+ }
+
+
+ public void updateMicroServiceNode2Redis(String serviceName, String version,String ip,String port,int ttl) throws Exception {
+ String serviceLBkey =
+ MicroServiceUtil.getPrefixedKey("",serviceName,version, MicroServiceUtil.ROUTE_PATH_LOADBALANCE);
+
+
+ Jedis jedis = null;
+ try {
+ jedis = JedisUtil.getJedis();
+
+
+ String nodeKey=serviceLBkey+":"+ip+"-"+port;
+ Map<String,String> nodeLBmap = jedis.hgetAll(nodeKey);
+
+ if(nodeLBmap.isEmpty()){
+ throw new NullPointerException(" MicroService Node not fond ");
+ }
+
+
+ nodeLBmap.put("ttl", Integer.toString(ttl));
+ long expiration_time=System.currentTimeMillis()+ttl*1000;
+ nodeLBmap.put("expiration", Long.toString(expiration_time));
+ nodeLBmap.put("updated_at", Long.toString(System.currentTimeMillis()));
+
+ jedis.hmset(nodeKey, nodeLBmap);
+
+
+ }
+ catch (NullPointerException e){
+ throw e;
+ }
+ catch (Exception e) {
+ LOGGER.error("update MicroService Node throw exception", e);
+ throw new Exception("update MicroService Node throw exception:"+e.getMessage());
+ } finally {
+ JedisUtil.returnJedisInstance(jedis);
+ }
+ }
+
+
+ public void noticeUpdateApiListener(String serviceName,String version,Service microServiceInfo,String serverPort) {
+ if (isNeedNotify(microServiceInfo)) {
+ for (IMicroServiceChangeListener serviceListener : serviceListenerlist) {
+ serviceListener.onChange(serviceName,version, microServiceInfo,serverPort);
+ }
+ }
+
+ }
+
+ public void noticeUpdateStatusListener(Service microServiceInfo,String status) {
+
+ for (IMicroServiceChangeListener serviceListener : serviceListenerlist) {
+ serviceListener.onStatusChange(microServiceInfo.getServiceName(),microServiceInfo.getUrl(),
+ microServiceInfo.getVersion(),microServiceInfo.getProtocol(),status);
+ }
+ }
+
+
+
+ public void noticeApiListener(Service microServiceInfo, String type,String serverPort) {
+ if (isNeedNotify(microServiceInfo)) {
+
+ if ("ADD".equals(type)) {
+ for (IMicroServiceChangeListener serviceListener : serviceListenerlist) {
+ serviceListener.onSave(microServiceInfo,serverPort);
+ }
+ } else if ("DELETE".equals(type)) {
+ for (IMicroServiceChangeListener serviceListener : serviceListenerlist) {
+ serviceListener.onDelete(microServiceInfo.getServiceName(),microServiceInfo.getUrl(),
+ microServiceInfo.getVersion(),microServiceInfo.getProtocol(),serverPort);
+ }
+ }
+
+ }
+ }
+
+
+ public MicroServiceFullInfo getMicroServiceInstance(String serviceName, String version,String serverPort)
+ throws Exception {
+ if (null == version || "null".equals(version)) {
+ version = "";
+ }
+
+ Jedis jedis = null;
+ MicroServiceFullInfo microServiceInfo = null;
+
+ try {
+ jedis = JedisUtil.getJedis();
+
+ microServiceInfo= getMicroServiceByJedis(jedis,serviceName,version, serverPort);
+
+
+ } catch (Exception e) {
+ LOGGER.error("call redis throw exception", e);
+ throw new Exception("call redis throw exception:"+e.getMessage());
+ } finally {
+ JedisUtil.returnJedisInstance(jedis);
+ }
+
+ return microServiceInfo;
+
+ }
+
+ private MicroServiceFullInfo getMicroServiceByJedis(Jedis jedis,String serviceName, String version,String serverPort){
+ MicroServiceFullInfo microServiceInfo = null;
+ String serviceInfoKey = MicroServiceUtil.getServiceInfoKey(serverPort,serviceName, version);
+ Map<String, String> infomap = jedis.hgetAll(serviceInfoKey);
+ if (!infomap.isEmpty()) {
+ microServiceInfo = new MicroServiceFullInfo();
+ microServiceInfo.setServiceName(serviceName);
+ microServiceInfo.setVersion(version);
+ microServiceInfo.setUrl(infomap.get("url"));
+ microServiceInfo.setProtocol(infomap.get("protocol"));
+ microServiceInfo.setVisualRange(infomap.get("visualRange"));
+ microServiceInfo.setStatus(infomap.get("status"));
+ microServiceInfo.setLb_policy(infomap.get("lb_policy"));
+
+ String nodeLBkey =
+ MicroServiceUtil.getPrefixedKey(serverPort,microServiceInfo.getServiceName(),
+ microServiceInfo.getVersion(),
+ MicroServiceUtil.ROUTE_PATH_LOADBALANCE);
+
+ Set<String> nodeKeys=jedis.keys(nodeLBkey+":*");
+
+ Set<NodeInfo> nodes=new HashSet<NodeInfo>();
+ for(String nodeKey:nodeKeys){
+ Map<String,String> nodeLBmap = jedis.hgetAll(nodeKey);
+ NodeInfo nodeInfo=new NodeInfo();
+ nodeInfo.setNodeId(serviceName+"_"+nodeLBmap.get("ip")+"_"+nodeLBmap.get("port"));
+ nodeInfo.setIp(nodeLBmap.get("ip"));
+ nodeInfo.setPort(nodeLBmap.get("port"));
+ nodeInfo.setTtl(Integer.parseInt(nodeLBmap.get("ttl")));
+ nodeInfo.setCreated_at(new Date(Long.parseLong(nodeLBmap.get("created_at"))));
+ nodeInfo.setUpdated_at(new Date(Long.parseLong(nodeLBmap.get("updated_at"))));
+ nodeInfo.setExpiration(new Date(Long.parseLong(nodeLBmap.get("expiration"))));
+
+ nodes.add(nodeInfo);
+ }
+
+ microServiceInfo.setNodes(nodes);
+ }
+
+
+
+
+ return microServiceInfo;
+ }
+
+
+ public void deleteMicroService(String serviceName, String version,String serverPort) throws Exception {
+ if (null == version || "null".equals(version)) {
+ version = "";
+ }
+
+ Jedis jedis = null;
+ try {
+ jedis = JedisUtil.getJedis();
+ String routekey = MicroServiceUtil.getPrefixedKey(serverPort,serviceName, version, "*");
+ Set<String> infoSet = jedis.keys(routekey);
+
+ String[] paths = new String[infoSet.size()];
+
+ infoSet.toArray(paths);
+
+ jedis.del(paths);
+ } catch (Exception e) {
+ LOGGER.error("call redis throw exception", e);
+ throw new Exception("call redis throw exception:"+e.getMessage());
+ } finally {
+ JedisUtil.returnJedisInstance(jedis);
+ }
+ }
+
+ public void deleteNode(String serviceName, String version, String ip,String port) throws Exception {
+ if (null == version || "null".equals(version)) {
+ version = "";
+ }
+
+ Jedis jedis = null;
+ try {
+ jedis = JedisUtil.getJedis();
+ String serviceLBkey =
+ MicroServiceUtil.getPrefixedKey("",serviceName, version,
+ MicroServiceUtil.ROUTE_PATH_LOADBALANCE,ip+"-"+port);
+ jedis.del(serviceLBkey);
+ } catch (Exception e) {
+ LOGGER.error("call redis throw exception", e);
+ throw new Exception("call redis throw exception:"+e.getMessage());
+ } finally {
+ JedisUtil.returnJedisInstance(jedis);
+ }
+
+ }
+
+
+ /**
+ * Determine whether the service needs to send a notification
+ * TODO: filter according to the agreement,
+ * the only notice of agreement for REST \ UI interface MSB - REST
+ * @param protocol
+ * @return
+ */
+ private boolean isNeedNotifyByProtocol(String protocol) {
+ return "UI".equalsIgnoreCase(protocol) ||("REST".equalsIgnoreCase(protocol));
+ }
+
+ /**
+ * Determine whether the service needs to send a notification
+ * TODO: according to the visual range filter conditions
+ * @param visualRange
+ * @return
+ */
+ private boolean isNeedNotifyByVisualRange(String visualRange) {
+ String[] rangeArray=StringUtils.split(visualRange, "|");
+ return RouteUtil.contain(RouteUtil.visualRangeMatches, rangeArray);
+ }
+
+ /**
+ * According to the MicroServiceInfo entity information to judge whether need to send a notification
+ * @param microServiceInfo
+ * @return
+ */
+ private boolean isNeedNotify(Service microServiceInfo) {
+ if (null != microServiceInfo) {
+ return isNeedNotifyByProtocol(microServiceInfo.getProtocol()) &&
+ isNeedNotifyByVisualRange(microServiceInfo.getVisualRange());
+ } else {
+ return false;
+ }
+ }
+
+
+
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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.util;\r
-\r
-import java.util.regex.Pattern;\r
-\r
-import javax.servlet.http.HttpServletRequest;\r
-\r
-import org.apache.commons.lang3.StringUtils;\r
-\r
-\r
-public class MicroServiceUtil {\r
- public static final String PREFIX_PATH = "discover:microservices";\r
- \r
- public static final String PREFIX_PATH_PORT = "discover:";\r
-\r
- public static final String SUFFIX_PATH_INFO = "info";\r
-\r
- public static final String REDIS_KEY_PATTERN =\r
- "discover:microservices:(?<servicename>[^:]+)(:(?<version>[^:]*))?:info";\r
-\r
- public static final String REQUEST_SUCCESS = "SUCCESS";\r
-\r
- public static final String REQUEST_FAIL = "FAIL";\r
-\r
- public static final String ROUTE_PATH_LOADBALANCE = "lb"; // 负载均衡路径名\r
-\r
- \r
- public static String getPrefixedKey(String... paths) {\r
- StringBuffer sb = new StringBuffer();\r
- \r
- if(paths[0].trim().equals("") || paths[0].equals(String.valueOf(JedisUtil.serverPort))){\r
- sb.append(PREFIX_PATH);\r
- }\r
- else{\r
- sb.append(PREFIX_PATH_PORT).append(paths[0]); \r
- }\r
- \r
- for (int i = 1; i < paths.length; i++) {\r
- sb.append(":");\r
- sb.append(paths[i]);\r
- }\r
- return sb.toString();\r
- }\r
-\r
- \r
- public static String getServiceInfoKey(String serverPort,String serviceName, String version) {\r
- return getPrefixedKey(serverPort,serviceName, version, SUFFIX_PATH_INFO);\r
- }\r
-\r
- \r
- \r
- \r
- \r
- public static Pattern getRedisKeyPattern() {\r
- return Pattern.compile(REDIS_KEY_PATTERN);\r
- }\r
-\r
- public static String getRealIp(HttpServletRequest request) {\r
- String ip = request.getHeader("X-Forwarded-For");\r
- if (StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)) {\r
- // After the reverse proxy can have multiple IP value for many times, the first IP is the real IP\r
- int index = ip.indexOf(",");\r
- if (index != -1) {\r
- return ip.substring(0, index);\r
- } else {\r
- return ip;\r
- }\r
- }\r
- ip = request.getHeader("X-Real-IP");\r
-\r
- if (StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)) {\r
- return ip;\r
- }\r
- \r
-\r
- return request.getRemoteAddr();\r
-\r
- }\r
-\r
-\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.wrapper.util;
+
+import java.util.regex.Pattern;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.commons.lang3.StringUtils;
+
+
+public class MicroServiceUtil {
+ public static final String PREFIX_PATH = "discover:microservices";
+
+ public static final String PREFIX_PATH_PORT = "discover:";
+
+ public static final String SUFFIX_PATH_INFO = "info";
+
+ public static final String REDIS_KEY_PATTERN =
+ "discover:microservices:(?<servicename>[^:]+)(:(?<version>[^:]*))?:info";
+
+ public static final String REQUEST_SUCCESS = "SUCCESS";
+
+ public static final String REQUEST_FAIL = "FAIL";
+
+ public static final String ROUTE_PATH_LOADBALANCE = "lb"; // 负载均衡路径名
+
+
+ public static String getPrefixedKey(String... paths) {
+ StringBuffer sb = new StringBuffer();
+
+ if(paths[0].trim().equals("") || paths[0].equals(String.valueOf(JedisUtil.serverPort))){
+ sb.append(PREFIX_PATH);
+ }
+ else{
+ sb.append(PREFIX_PATH_PORT).append(paths[0]);
+ }
+
+ for (int i = 1; i < paths.length; i++) {
+ sb.append(":");
+ sb.append(paths[i]);
+ }
+ return sb.toString();
+ }
+
+
+ public static String getServiceInfoKey(String serverPort,String serviceName, String version) {
+ return getPrefixedKey(serverPort,serviceName, version, SUFFIX_PATH_INFO);
+ }
+
+
+
+
+
+ public static Pattern getRedisKeyPattern() {
+ return Pattern.compile(REDIS_KEY_PATTERN);
+ }
+
+ public static String getRealIp(HttpServletRequest request) {
+ String ip = request.getHeader("X-Forwarded-For");
+ if (StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)) {
+ // After the reverse proxy can have multiple IP value for many times, the first IP is the real IP
+ int index = ip.indexOf(",");
+ if (index != -1) {
+ return ip.substring(0, index);
+ } else {
+ return ip;
+ }
+ }
+ ip = request.getHeader("X-Real-IP");
+
+ if (StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)) {
+ return ip;
+ }
+
+
+ return request.getRemoteAddr();
+
+ }
+
+
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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
-package org.openo.msb.wrapper.util;\r
-\r
-import java.util.regex.Pattern;\r
-\r
-public class RegExpTestUtil {\r
- \r
- \r
- \r
- public static boolean hostRegExpTest(String host){\r
- \r
- String hostReg = "^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\." \r
- +"(00?\\d|1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\." \r
- +"(00?\\d|1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\." \r
- +"(00?\\d|1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)"\r
- +":(\\d{1,5})$"; \r
- return Pattern.matches(hostReg, host); \r
- \r
- }\r
- \r
- public static boolean ipRegExpTest(String ip){\r
- \r
- String hostReg = "^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\." \r
- +"(00?\\d|1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\." \r
- +"(00?\\d|1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\." \r
- +"(00?\\d|1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$"; \r
- return Pattern.matches(hostReg, ip); \r
- \r
- }\r
- \r
- public static boolean portRegExpTest(String port){\r
- \r
- String hostReg = "^\\d{1,5}$"; \r
- return Pattern.matches(hostReg, port); \r
- \r
- }\r
- \r
-public static boolean versionRegExpTest(String version){\r
- \r
- String versionReg = "^v\\d+(\\.\\d+)?$"; \r
- return Pattern.matches(versionReg, version); \r
- \r
- }\r
-\r
-public static boolean urlRegExpTest(String url){\r
- if(url.equals("/")) return true;\r
- \r
- String urlReg = "^\\/.*((?!\\/).)$"; \r
- return Pattern.matches(urlReg, url); \r
- \r
-}\r
-\r
-public static boolean apiRouteUrlRegExpTest(String url){\r
- \r
- String urlReg = "^\\/"+RouteUtil.API_ROOT_PATH+"\\/.*$"; \r
- return Pattern.matches(urlReg, url); \r
- \r
-}\r
-\r
-public static boolean iuiRouteUrlRegExpTest(String url){\r
- \r
- String urlReg = "^\\/"+RouteUtil.IUI_ROOT_PATH+"\\/.*$"; \r
- return Pattern.matches(urlReg, url); \r
- \r
-}\r
-\r
-\r
- \r
- \r
- public static void main(String[] args) {\r
- System.out.println(urlRegExpTest("/api "));\r
-// System.out.println("api".startsWith("/"));\r
- }\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.wrapper.util;
+
+import java.util.regex.Pattern;
+
+public class RegExpTestUtil {
+
+
+
+ public static boolean hostRegExpTest(String host){
+
+ String hostReg = "^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\."
+ +"(00?\\d|1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
+ +"(00?\\d|1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
+ +"(00?\\d|1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)"
+ +":(\\d{1,5})$";
+ return Pattern.matches(hostReg, host);
+
+ }
+
+ public static boolean ipRegExpTest(String ip){
+
+ String hostReg = "^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\."
+ +"(00?\\d|1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
+ +"(00?\\d|1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
+ +"(00?\\d|1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$";
+ return Pattern.matches(hostReg, ip);
+
+ }
+
+ public static boolean portRegExpTest(String port){
+
+ String hostReg = "^\\d{1,5}$";
+ return Pattern.matches(hostReg, port);
+
+ }
+
+public static boolean versionRegExpTest(String version){
+
+ String versionReg = "^v\\d+(\\.\\d+)?$";
+ return Pattern.matches(versionReg, version);
+
+ }
+
+public static boolean urlRegExpTest(String url){
+ if(url.equals("/")) return true;
+
+ String urlReg = "^\\/.*((?!\\/).)$";
+ return Pattern.matches(urlReg, url);
+
+}
+
+public static boolean apiRouteUrlRegExpTest(String url){
+
+ String urlReg = "^\\/"+RouteUtil.API_ROOT_PATH+"\\/.*$";
+ return Pattern.matches(urlReg, url);
+
+}
+
+public static boolean iuiRouteUrlRegExpTest(String url){
+
+ String urlReg = "^\\/"+RouteUtil.IUI_ROOT_PATH+"\\/.*$";
+ return Pattern.matches(urlReg, url);
+
+}
+
+
+
+
+ public static void main(String[] args) {
+ System.out.println(urlRegExpTest("/api "));
+// System.out.println("api".startsWith("/"));
+ }
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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.util;\r
-\r
-import org.apache.commons.lang3.StringUtils;\r
-import org.openo.msb.api.DiscoverInfo;\r
-\r
-\r
-public class RouteUtil {\r
-\r
- public static String IUI_ROOT_PATH="iui"; \r
- \r
- public static String API_ROOT_PATH="api"; \r
- \r
- public static final String ROUTE_PATH="msb:routing"; \r
- \r
- public static final String APIROUTE="api"; \r
- \r
- public static final String IUIROUTE="iui"; \r
- \r
- public static final String CUSTOMROUTE="custom"; \r
- \r
- public static final String P2PROUTE="p2p"; \r
- \r
- \r
- public static final String ROUTE_PATH_INFO="info"; \r
- \r
- public static final String ROUTE_PATH_LOADBALANCE="lb"; \r
- \r
- public static final String APIROUTE_PATH_LIFE="life"; \r
- \r
-\r
- public static final String REQUEST_SUCCESS = "SUCCESS";\r
- \r
- public static final String REQUEST_FAIL = "FAIL";\r
- \r
- public static String PROTOCOL_LIST="REST,UI,MQ,FTP,SNMP,TCP,UDP"; \r
- \r
- public static DiscoverInfo discoverInfo=new DiscoverInfo();\r
- \r
- \r
- public static String[] visualRangeRange={"0","1"};\r
- \r
- public static String[] controlRangeMatches={"0","1","2"};\r
- \r
- public static String[] statusRangeMatches={"0","1"};\r
- \r
- public static String[] useOwnUpstreamRangeMatches={"0","1"};\r
- \r
- public static String[] visualRangeMatches={"1"};\r
- \r
- /** \r
- * @Title: getPrefixedKey \r
- * @Description: TODO(Add base path prefix radis assembly path) \r
- * @param: @param serviceName\r
- * @param: @param version\r
- * @param: @param type\r
- * @param: @return \r
- * @return: String \r
- */\r
- \r
- public static String getPrefixedKey(String...paths){\r
- StringBuffer sb= new StringBuffer();\r
- \r
- if(paths[0].trim().equals("") || paths[0].equals(String.valueOf(JedisUtil.serverPort))){\r
- sb.append(ROUTE_PATH);\r
- }\r
- else{\r
- sb.append(paths[0]); \r
- }\r
- \r
- for (int i = 1; i < paths.length; i++) {\r
- sb.append(":");\r
- sb.append(paths[i]);\r
- }\r
- return sb.toString();\r
- }\r
- \r
- \r
- public static Object[] concat(Object[] a, Object[] b) {\r
- Object[] c= new Object[a.length+b.length];\r
- System.arraycopy(a, 0, c, 0, a.length);\r
- System.arraycopy(b, 0, c, a.length, b.length);\r
- return c;\r
- }\r
- \r
- public static boolean contain(String[] array,String str){\r
- for(int i=0;i<array.length;i++){\r
- if(array[i].equals(str)){\r
- return true; \r
- }\r
- }\r
- return false;\r
-\r
- }\r
- \r
- public static boolean contain(String[] array,String value[]){\r
- for(int i=0;i<array.length;i++){\r
- for(int n=0;n<value.length;n++){\r
- if(array[i].equals(value[n])){\r
- return true; \r
- }\r
- }\r
- }\r
- return false;\r
-\r
- }\r
- \r
- public static String show(String[] array){\r
- \r
- return StringUtils.join(array, "|");\r
-\r
- }\r
- \r
- public static void main(String[] args) {\r
- String array[]={"1","2"};\r
- System.out.println(StringUtils.join(array, "|"));\r
- }\r
- \r
-\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.wrapper.util;
+
+import org.apache.commons.lang3.StringUtils;
+import org.openo.msb.api.DiscoverInfo;
+
+
+public class RouteUtil {
+
+ public static String IUI_ROOT_PATH="iui";
+
+ public static String API_ROOT_PATH="api";
+
+ public static final String ROUTE_PATH="msb:routing";
+
+ public static final String APIROUTE="api";
+
+ public static final String IUIROUTE="iui";
+
+ public static final String CUSTOMROUTE="custom";
+
+ public static final String P2PROUTE="p2p";
+
+
+ public static final String ROUTE_PATH_INFO="info";
+
+ public static final String ROUTE_PATH_LOADBALANCE="lb";
+
+ public static final String APIROUTE_PATH_LIFE="life";
+
+
+ public static final String REQUEST_SUCCESS = "SUCCESS";
+
+ public static final String REQUEST_FAIL = "FAIL";
+
+ public static String PROTOCOL_LIST="REST,UI,MQ,FTP,SNMP,TCP,UDP";
+
+ public static DiscoverInfo discoverInfo=new DiscoverInfo();
+
+
+ public static String[] visualRangeRange={"0","1"};
+
+ public static String[] controlRangeMatches={"0","1","2"};
+
+ public static String[] statusRangeMatches={"0","1"};
+
+ public static String[] useOwnUpstreamRangeMatches={"0","1"};
+
+ public static String[] visualRangeMatches={"1"};
+
+ /**
+ * @Title: getPrefixedKey
+ * @Description: TODO(Add base path prefix radis assembly path)
+ * @param: @param serviceName
+ * @param: @param version
+ * @param: @param type
+ * @param: @return
+ * @return: String
+ */
+
+ public static String getPrefixedKey(String...paths){
+ StringBuffer sb= new StringBuffer();
+
+ if(paths[0].trim().equals("") || paths[0].equals(String.valueOf(JedisUtil.serverPort))){
+ sb.append(ROUTE_PATH);
+ }
+ else{
+ sb.append(paths[0]);
+ }
+
+ for (int i = 1; i < paths.length; i++) {
+ sb.append(":");
+ sb.append(paths[i]);
+ }
+ return sb.toString();
+ }
+
+
+ public static Object[] concat(Object[] a, Object[] b) {
+ Object[] c= new Object[a.length+b.length];
+ System.arraycopy(a, 0, c, 0, a.length);
+ System.arraycopy(b, 0, c, a.length, b.length);
+ return c;
+ }
+
+ public static boolean contain(String[] array,String str){
+ for(int i=0;i<array.length;i++){
+ if(array[i].equals(str)){
+ return true;
+ }
+ }
+ return false;
+
+ }
+
+ public static boolean contain(String[] array,String value[]){
+ for(int i=0;i<array.length;i++){
+ for(int n=0;n<value.length;n++){
+ if(array[i].equals(value[n])){
+ return true;
+ }
+ }
+ }
+ return false;
+
+ }
+
+ public static String show(String[] array){
+
+ return StringUtils.join(array, "|");
+
+ }
+
+ public static void main(String[] args) {
+ String array[]={"1","2"};
+ System.out.println(StringUtils.join(array, "|"));
+ }
+
+
+}
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
- 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.
+
+ Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+
+ Licensed 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.
+
+ Author: Zhaoxing Meng
+ email: meng.zhaoxing1@zte.com.cn
+
-->
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
/* http://meyerweb.com/eric/tools/css/reset/ v2.0 | 20110126 */
html,
body,
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
/* Original style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac@SoftwareManiacs.Org> */
.swagger-section pre code {
display: block;
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
/* droid-sans-regular - latin */
@font-face {
font-family: 'Droid Sans';
-<!--\r
-\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
-<!DOCTYPE html>\r
-<html>\r
-<head>\r
- <title>Swagger UI</title>\r
- <link href='css/typography.css' media='screen' rel='stylesheet' type='text/css'/>\r
- <link href='css/reset.css' media='screen' rel='stylesheet' type='text/css'/>\r
- <link href='css/screen.css' media='screen' rel='stylesheet' type='text/css'/>\r
- <link href='css/reset.css' media='print' rel='stylesheet' type='text/css'/>\r
- <link href='css/screen.css' media='print' rel='stylesheet' type='text/css'/>\r
- <script type="text/javascript" src="lib/shred.bundle.js"></script>\r
- <script src='lib/jquery-1.8.0.min.js' type='text/javascript'></script>\r
- <script src='lib/jquery.slideto.min.js' type='text/javascript'></script>\r
- <script src='lib/jquery.wiggle.min.js' type='text/javascript'></script>\r
- <script src='lib/jquery.ba-bbq.min.js' type='text/javascript'></script>\r
- <script src='lib/handlebars-2.0.0.js' type='text/javascript'></script>\r
- <script src='lib/underscore-min.js' type='text/javascript'></script>\r
- <script src='lib/backbone-min.js' type='text/javascript'></script>\r
- <script src='lib/swagger-client.js' type='text/javascript'></script>\r
- <script src='swagger-ui.js' type='text/javascript'></script>\r
- <script src='lib/highlight.7.3.pack.js' type='text/javascript'></script>\r
- <script src='lib/marked.js' type='text/javascript'></script>\r
- \r
-\r
- <!-- enabling this will enable oauth2 implicit scope support -->\r
- <script src='lib/swagger-oauth.js' type='text/javascript'></script>\r
- <script type="text/javascript">\r
- $(function () {\r
- var url = window.location.search.match(/url=([^&]+)/);\r
- if (url && url.length > 1) {\r
- url = decodeURIComponent(url[1]);\r
- } else {\r
- url = "/api/microservices/v1/swagger.json";\r
- }\r
- window.swaggerUi = new SwaggerUi({\r
- url: url,\r
- dom_id: "swagger-ui-container",\r
- supportedSubmitMethods: ['get', 'post', 'put', 'delete', 'patch'],\r
- onComplete: function(swaggerApi, swaggerUi){\r
- \r
- if(typeof initOAuth == "function") {\r
- /*\r
- initOAuth({\r
- clientId: "your-client-id",\r
- realm: "your-realms",\r
- appName: "your-app-name"\r
- });\r
- */\r
- }\r
- $('pre code').each(function(i, e) {\r
- hljs.highlightBlock(e)\r
- });\r
- },\r
- onFailure: function(data) {\r
- log("Unable to Load SwaggerUI");\r
- },\r
- docExpansion: "none",\r
- sorter : "alpha"\r
- });\r
-\r
- function addApiKeyAuthorization() {\r
- var key = $('#input_apiKey')[0].value;\r
- log("key: " + key);\r
- if(key && key.trim() != "") {\r
- log("added key " + key);\r
- window.authorizations.add("api_key", new ApiKeyAuthorization("api_key", key, "query"));\r
- }\r
- }\r
-\r
- $('#input_apiKey').change(function() {\r
- addApiKeyAuthorization();\r
- });\r
-\r
- // if you have an apiKey you would like to pre-populate on the page for demonstration purposes...\r
- /*\r
- var apiKey = "myApiKeyXXXX123456789";\r
- $('#input_apiKey').val(apiKey);\r
- addApiKeyAuthorization();\r
- */\r
-\r
- window.swaggerUi.load();\r
- });\r
- </script>\r
-</head>\r
-\r
-<body class="swagger-section">\r
-<div id='header' style="display:none">\r
- <div class="swagger-ui-wrap" >\r
- <a id="logo" >zte conductor</a>\r
- <form id='api_selector'>\r
- <div class='input'><input placeholder="http://example.com/api" id="input_baseUrl" name="baseUrl" type="text"/></div>\r
- <div class='input'><input placeholder="api_key" id="input_apiKey" name="apiKey" type="text"/></div>\r
- <div class='input'><a id="explore" href="#">Explore</a></div>\r
- </form>\r
- </div>\r
-</div>\r
-\r
-<div id="message-bar" class="swagger-ui-wrap"> </div>\r
-<div id="swagger-ui-container" class="swagger-ui-wrap"></div>\r
-</body>\r
- <script type="text/javascript" src="js/iframeResizer/iframeResizer.contentWindow.min.js"></script>\r
-</html>\r
+<!--
+
+ Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+
+ Licensed 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.
+
+ Author: Zhaoxing Meng
+ email: meng.zhaoxing1@zte.com.cn
+
+-->
+<!DOCTYPE html>
+<html>
+<head>
+ <title>Swagger UI</title>
+ <link href='css/typography.css' media='screen' rel='stylesheet' type='text/css'/>
+ <link href='css/reset.css' media='screen' rel='stylesheet' type='text/css'/>
+ <link href='css/screen.css' media='screen' rel='stylesheet' type='text/css'/>
+ <link href='css/reset.css' media='print' rel='stylesheet' type='text/css'/>
+ <link href='css/screen.css' media='print' rel='stylesheet' type='text/css'/>
+ <script type="text/javascript" src="lib/shred.bundle.js"></script>
+ <script src='lib/jquery-1.8.0.min.js' type='text/javascript'></script>
+ <script src='lib/jquery.slideto.min.js' type='text/javascript'></script>
+ <script src='lib/jquery.wiggle.min.js' type='text/javascript'></script>
+ <script src='lib/jquery.ba-bbq.min.js' type='text/javascript'></script>
+ <script src='lib/handlebars-2.0.0.js' type='text/javascript'></script>
+ <script src='lib/underscore-min.js' type='text/javascript'></script>
+ <script src='lib/backbone-min.js' type='text/javascript'></script>
+ <script src='lib/swagger-client.js' type='text/javascript'></script>
+ <script src='swagger-ui.js' type='text/javascript'></script>
+ <script src='lib/highlight.7.3.pack.js' type='text/javascript'></script>
+ <script src='lib/marked.js' type='text/javascript'></script>
+
+
+ <!-- enabling this will enable oauth2 implicit scope support -->
+ <script src='lib/swagger-oauth.js' type='text/javascript'></script>
+ <script type="text/javascript">
+ $(function () {
+ var url = window.location.search.match(/url=([^&]+)/);
+ if (url && url.length > 1) {
+ url = decodeURIComponent(url[1]);
+ } else {
+ url = "/api/microservices/v1/swagger.json";
+ }
+ window.swaggerUi = new SwaggerUi({
+ url: url,
+ dom_id: "swagger-ui-container",
+ supportedSubmitMethods: ['get', 'post', 'put', 'delete', 'patch'],
+ onComplete: function(swaggerApi, swaggerUi){
+
+ if(typeof initOAuth == "function") {
+ /*
+ initOAuth({
+ clientId: "your-client-id",
+ realm: "your-realms",
+ appName: "your-app-name"
+ });
+ */
+ }
+ $('pre code').each(function(i, e) {
+ hljs.highlightBlock(e)
+ });
+ },
+ onFailure: function(data) {
+ log("Unable to Load SwaggerUI");
+ },
+ docExpansion: "none",
+ sorter : "alpha"
+ });
+
+ function addApiKeyAuthorization() {
+ var key = $('#input_apiKey')[0].value;
+ log("key: " + key);
+ if(key && key.trim() != "") {
+ log("added key " + key);
+ window.authorizations.add("api_key", new ApiKeyAuthorization("api_key", key, "query"));
+ }
+ }
+
+ $('#input_apiKey').change(function() {
+ addApiKeyAuthorization();
+ });
+
+ // if you have an apiKey you would like to pre-populate on the page for demonstration purposes...
+ /*
+ var apiKey = "myApiKeyXXXX123456789";
+ $('#input_apiKey').val(apiKey);
+ addApiKeyAuthorization();
+ */
+
+ window.swaggerUi.load();
+ });
+ </script>
+</head>
+
+<body class="swagger-section">
+<div id='header' style="display:none">
+ <div class="swagger-ui-wrap" >
+ <a id="logo" >zte conductor</a>
+ <form id='api_selector'>
+ <div class='input'><input placeholder="http://example.com/api" id="input_baseUrl" name="baseUrl" type="text"/></div>
+ <div class='input'><input placeholder="api_key" id="input_apiKey" name="apiKey" type="text"/></div>
+ <div class='input'><a id="explore" href="#">Explore</a></div>
+ </form>
+ </div>
+</div>
+
+<div id="message-bar" class="swagger-ui-wrap"> </div>
+<div id="swagger-ui-container" class="swagger-ui-wrap"></div>
+</body>
+ <script type="text/javascript" src="js/iframeResizer/iframeResizer.contentWindow.min.js"></script>
+</html>
-/*! iFrame Resizer (iframeSizer.contentWindow.min.js) - v3.5.3 - 2016-02-23
- * Desc: Include this file in any page being loaded into an iframe
- * to force the iframe to resize to the content size.
- * Requires: iframeResizer.min.js on host page.
- * Copyright: (c) 2016 David J. Bradshaw - dave@bradshaw.net
- * License: MIT
- */
-
!function(a){"use strict";function b(b,c,d){"addEventListener"in a?b.addEventListener(c,d,!1):"attachEvent"in a&&b.attachEvent("on"+c,d)}function c(b,c,d){"removeEventListener"in a?b.removeEventListener(c,d,!1):"detachEvent"in a&&b.detachEvent("on"+c,d)}function d(a){return a.charAt(0).toUpperCase()+a.slice(1)}function e(a){var b,c,d,e=null,f=0,g=function(){f=Fa(),e=null,d=a.apply(b,c),e||(b=c=null)};return function(){var h=Fa();f||(f=h);var i=xa-(h-f);return b=this,c=arguments,0>=i||i>xa?(e&&(clearTimeout(e),e=null),f=h,d=a.apply(b,c),e||(b=c=null)):e||(e=setTimeout(g,i)),d}}function f(a){return ma+"["+oa+"] "+a}function g(b){la&&"object"==typeof a.console&&console.log(f(b))}function h(b){"object"==typeof a.console&&console.warn(f(b))}function i(){j(),g("Initialising iFrame ("+location.href+")"),k(),n(),m("background",W),m("padding",$),A(),s(),t(),o(),C(),u(),ia=B(),N("init","Init message from host page"),Da()}function j(){function a(a){return"true"===a?!0:!1}var b=ha.substr(na).split(":");oa=b[0],X=void 0!==b[1]?Number(b[1]):X,_=void 0!==b[2]?a(b[2]):_,la=void 0!==b[3]?a(b[3]):la,ja=void 0!==b[4]?Number(b[4]):ja,U=void 0!==b[6]?a(b[6]):U,Y=b[7],fa=void 0!==b[8]?b[8]:fa,W=b[9],$=b[10],ua=void 0!==b[11]?Number(b[11]):ua,ia.enable=void 0!==b[12]?a(b[12]):!1,qa=void 0!==b[13]?b[13]:qa,Aa=void 0!==b[14]?b[14]:Aa}function k(){function b(){var b=a.iFrameResizer;g("Reading data from page: "+JSON.stringify(b)),Ca="messageCallback"in b?b.messageCallback:Ca,Da="readyCallback"in b?b.readyCallback:Da,ta="targetOrigin"in b?b.targetOrigin:ta,fa="heightCalculationMethod"in b?b.heightCalculationMethod:fa,Aa="widthCalculationMethod"in b?b.widthCalculationMethod:Aa}"iFrameResizer"in a&&Object===a.iFrameResizer.constructor&&b(),g("TargetOrigin for parent set to: "+ta)}function l(a,b){return-1!==b.indexOf("-")&&(h("Negative CSS value ignored for "+a),b=""),b}function m(a,b){void 0!==b&&""!==b&&"null"!==b&&(document.body.style[a]=b,g("Body "+a+' set to "'+b+'"'))}function n(){void 0===Y&&(Y=X+"px"),m("margin",l("margin",Y))}function o(){document.documentElement.style.height="",document.body.style.height="",g('HTML & body height set to "auto"')}function p(e){function f(){N(e.eventName,e.eventType)}var h={add:function(c){b(a,c,f)},remove:function(b){c(a,b,f)}};e.eventNames&&Array.prototype.map?(e.eventName=e.eventNames[0],e.eventNames.map(h[e.method])):h[e.method](e.eventName),g(d(e.method)+" event listener: "+e.eventType)}function q(a){p({method:a,eventType:"Animation Start",eventNames:["animationstart","webkitAnimationStart"]}),p({method:a,eventType:"Animation Iteration",eventNames:["animationiteration","webkitAnimationIteration"]}),p({method:a,eventType:"Animation End",eventNames:["animationend","webkitAnimationEnd"]}),p({method:a,eventType:"Input",eventName:"input"}),p({method:a,eventType:"Mouse Up",eventName:"mouseup"}),p({method:a,eventType:"Mouse Down",eventName:"mousedown"}),p({method:a,eventType:"Orientation Change",eventName:"orientationchange"}),p({method:a,eventType:"Print",eventName:["afterprint","beforeprint"]}),p({method:a,eventType:"Ready State Change",eventName:"readystatechange"}),p({method:a,eventType:"Touch Start",eventName:"touchstart"}),p({method:a,eventType:"Touch End",eventName:"touchend"}),p({method:a,eventType:"Touch Cancel",eventName:"touchcancel"}),p({method:a,eventType:"Transition Start",eventNames:["transitionstart","webkitTransitionStart","MSTransitionStart","oTransitionStart","otransitionstart"]}),p({method:a,eventType:"Transition Iteration",eventNames:["transitioniteration","webkitTransitionIteration","MSTransitionIteration","oTransitionIteration","otransitioniteration"]}),p({method:a,eventType:"Transition End",eventNames:["transitionend","webkitTransitionEnd","MSTransitionEnd","oTransitionEnd","otransitionend"]}),"child"===qa&&p({method:a,eventType:"IFrame Resized",eventName:"resize"})}function r(a,b,c,d){return b!==a&&(a in c||(h(a+" is not a valid option for "+d+"CalculationMethod."),a=b),g(d+' calculation method set to "'+a+'"')),a}function s(){fa=r(fa,ea,Ga,"height")}function t(){Aa=r(Aa,za,Ha,"width")}function u(){!0===U?(q("add"),F()):g("Auto Resize disabled")}function v(){g("Disable outgoing messages"),ra=!1}function w(){g("Remove event listener: Message"),c(a,"message",S)}function x(){null!==Z&&Z.disconnect()}function y(){q("remove"),x(),clearInterval(ka)}function z(){v(),w(),!0===U&&y()}function A(){var a=document.createElement("div");a.style.clear="both",a.style.display="block",document.body.appendChild(a)}function B(){function c(){return{x:void 0!==a.pageXOffset?a.pageXOffset:document.documentElement.scrollLeft,y:void 0!==a.pageYOffset?a.pageYOffset:document.documentElement.scrollTop}}function d(a){var b=a.getBoundingClientRect(),d=c();return{x:parseInt(b.left,10)+parseInt(d.x,10),y:parseInt(b.top,10)+parseInt(d.y,10)}}function e(a){function b(a){var b=d(a);g("Moving to in page link (#"+c+") at x: "+b.x+" y: "+b.y),R(b.y,b.x,"scrollToOffset")}var c=a.split("#")[1]||a,e=decodeURIComponent(c),f=document.getElementById(e)||document.getElementsByName(e)[0];void 0!==f?b(f):(g("In page link (#"+c+") not found in iFrame, so sending to parent"),R(0,0,"inPageLink","#"+c))}function f(){""!==location.hash&&"#"!==location.hash&&e(location.href)}function i(){function a(a){function c(a){a.preventDefault(),e(this.getAttribute("href"))}"#"!==a.getAttribute("href")&&b(a,"click",c)}Array.prototype.forEach.call(document.querySelectorAll('a[href^="#"]'),a)}function j(){b(a,"hashchange",f)}function k(){setTimeout(f,ba)}function l(){Array.prototype.forEach&&document.querySelectorAll?(g("Setting up location.hash handlers"),i(),j(),k()):h("In page linking not fully supported in this browser! (See README.md for IE8 workaround)")}return ia.enable?l():g("In page linking not enabled"),{findTarget:e}}function C(){g("Enable public methods"),Ba.parentIFrame={autoResize:function(a){return!0===a&&!1===U?(U=!0,u()):!1===a&&!0===U&&(U=!1,y()),U},close:function(){R(0,0,"close"),z()},getId:function(){return oa},getPageInfo:function(a){"function"==typeof a?(Ea=a,R(0,0,"pageInfo")):(Ea=function(){},R(0,0,"pageInfoStop"))},moveToAnchor:function(a){ia.findTarget(a)},reset:function(){Q("parentIFrame.reset")},scrollTo:function(a,b){R(b,a,"scrollTo")},scrollToOffset:function(a,b){R(b,a,"scrollToOffset")},sendMessage:function(a,b){R(0,0,"message",JSON.stringify(a),b)},setHeightCalculationMethod:function(a){fa=a,s()},setWidthCalculationMethod:function(a){Aa=a,t()},setTargetOrigin:function(a){g("Set targetOrigin: "+a),ta=a},size:function(a,b){var c=""+(a?a:"")+(b?","+b:"");N("size","parentIFrame.size("+c+")",a,b)}}}function D(){0!==ja&&(g("setInterval: "+ja+"ms"),ka=setInterval(function(){N("interval","setInterval: "+ja)},Math.abs(ja)))}function E(){function b(a){function b(a){!1===a.complete&&(g("Attach listeners to "+a.src),a.addEventListener("load",f,!1),a.addEventListener("error",h,!1),k.push(a))}"attributes"===a.type&&"src"===a.attributeName?b(a.target):"childList"===a.type&&Array.prototype.forEach.call(a.target.querySelectorAll("img"),b)}function c(a){k.splice(k.indexOf(a),1)}function d(a){g("Remove listeners from "+a.src),a.removeEventListener("load",f,!1),a.removeEventListener("error",h,!1),c(a)}function e(a,b,c){d(a.target),N(b,c+": "+a.target.src,void 0,void 0)}function f(a){e(a,"imageLoad","Image loaded")}function h(a){e(a,"imageLoadFailed","Image load failed")}function i(a){N("mutationObserver","mutationObserver: "+a[0].target+" "+a[0].type),a.forEach(b)}function j(){var a=document.querySelector("body"),b={attributes:!0,attributeOldValue:!1,characterData:!0,characterDataOldValue:!1,childList:!0,subtree:!0};return m=new l(i),g("Create body MutationObserver"),m.observe(a,b),m}var k=[],l=a.MutationObserver||a.WebKitMutationObserver,m=j();return{disconnect:function(){"disconnect"in m&&(g("Disconnect body MutationObserver"),m.disconnect(),k.forEach(d))}}}function F(){var b=0>ja;a.MutationObserver||a.WebKitMutationObserver?b?D():Z=E():(g("MutationObserver not supported in this browser!"),D())}function G(a,b){function c(a){var c=/^\d+(px)?$/i;if(c.test(a))return parseInt(a,V);var d=b.style.left,e=b.runtimeStyle.left;return b.runtimeStyle.left=b.currentStyle.left,b.style.left=a||0,a=b.style.pixelLeft,b.style.left=d,b.runtimeStyle.left=e,a}var d=0;return b=b||document.body,"defaultView"in document&&"getComputedStyle"in document.defaultView?(d=document.defaultView.getComputedStyle(b,null),d=null!==d?d[a]:0):d=c(b.currentStyle[a]),parseInt(d,V)}function H(a){a>xa/2&&(xa=2*a,g("Event throttle increased to "+xa+"ms"))}function I(a,b){for(var c=b.length,e=0,f=0,h=d(a),i=Fa(),j=0;c>j;j++)e=b[j].getBoundingClientRect()[a]+G("margin"+h,b[j]),e>f&&(f=e);return i=Fa()-i,g("Parsed "+c+" HTML elements"),g("Element position calculated in "+i+"ms"),H(i),f}function J(a){return[a.bodyOffset(),a.bodyScroll(),a.documentElementOffset(),a.documentElementScroll()]}function K(a,b){function c(){return h("No tagged elements ("+b+") found on page"),da}var d=document.querySelectorAll("["+b+"]");return 0===d.length?c():I(a,d)}function L(){return document.querySelectorAll("body *")}function M(a,b,c,d){function e(){da=l,ya=m,R(da,ya,a)}function f(){function a(a,b){var c=Math.abs(a-b)<=ua;return!c}return l=void 0!==c?c:Ga[fa](),m=void 0!==d?d:Ha[Aa](),a(da,l)||_&&a(ya,m)}function h(){return!(a in{init:1,interval:1,size:1})}function i(){return fa in pa||_&&Aa in pa}function j(){g("No change in size detected")}function k(){h()&&i()?Q(b):a in{interval:1}||j()}var l,m;f()||"init"===a?(O(),e()):k()}function N(a,b,c,d){function e(){a in{reset:1,resetPage:1,init:1}||g("Trigger event: "+b)}function f(){return va&&a in aa}f()?g("Trigger event cancelled: "+a):(e(),Ia(a,b,c,d))}function O(){va||(va=!0,g("Trigger event lock on")),clearTimeout(wa),wa=setTimeout(function(){va=!1,g("Trigger event lock off"),g("--")},ba)}function P(a){da=Ga[fa](),ya=Ha[Aa](),R(da,ya,a)}function Q(a){var b=fa;fa=ea,g("Reset trigger event: "+a),O(),P("reset"),fa=b}function R(a,b,c,d,e){function f(){void 0===e?e=ta:g("Message targetOrigin: "+e)}function h(){var f=a+":"+b,h=oa+":"+f+":"+c+(void 0!==d?":"+d:"");g("Sending message to host page ("+h+")"),sa.postMessage(ma+h,e)}!0===ra&&(f(),h())}function S(b){function c(){return ma===(""+b.data).substr(0,na)}function d(){ha=b.data,sa=b.source,i(),ca=!1,setTimeout(function(){ga=!1},ba)}function e(){ga?g("Page reset ignored by init"):(g("Page size reset by host page"),P("resetPage"))}function f(){N("resizeParent","Parent window requested size check")}function j(){var a=l();ia.findTarget(a)}function k(){return b.data.split("]")[1].split(":")[0]}function l(){return b.data.substr(b.data.indexOf(":")+1)}function m(){return"iFrameResize"in a}function n(){var a=l();g("MessageCallback called from parent: "+a),Ca(JSON.parse(a)),g(" --")}function o(){var a=l();g("PageInfoFromParent called from parent: "+a),Ea(JSON.parse(a)),g(" --")}function p(){return b.data.split(":")[2]in{"true":1,"false":1}}function q(){switch(k()){case"reset":e();break;case"resize":f();break;case"moveToAnchor":j();break;case"message":n();break;case"pageInfo":o();break;default:m()||p()||h("Unexpected message ("+b.data+")")}}function r(){!1===ca?q():p()?d():g('Ignored message of type "'+k()+'". Received before initialization.')}c()&&r()}function T(){"loading"!==document.readyState&&a.parent.postMessage("[iFrameResizerChild]Ready","*")}var U=!0,V=10,W="",X=0,Y="",Z=null,$="",_=!1,aa={resize:1,click:1},ba=128,ca=!0,da=1,ea="bodyOffset",fa=ea,ga=!0,ha="",ia={},ja=32,ka=null,la=!1,ma="[iFrameSizer]",na=ma.length,oa="",pa={max:1,min:1,bodyScroll:1,documentElementScroll:1},qa="child",ra=!0,sa=a.parent,ta="*",ua=0,va=!1,wa=null,xa=16,ya=1,za="scroll",Aa=za,Ba=a,Ca=function(){h("MessageCallback function not defined")},Da=function(){},Ea=function(){},Fa=Date.now||function(){return(new Date).getTime()},Ga={bodyOffset:function(){return document.body.offsetHeight+G("marginTop")+G("marginBottom")},offset:function(){return Ga.bodyOffset()},bodyScroll:function(){return document.body.scrollHeight},documentElementOffset:function(){return document.documentElement.offsetHeight},documentElementScroll:function(){return document.documentElement.scrollHeight},max:function(){return Math.max.apply(null,J(Ga))},min:function(){return Math.min.apply(null,J(Ga))},grow:function(){return Ga.max()},lowestElement:function(){return Math.max(Ga.bodyOffset(),I("bottom",L()))},taggedElement:function(){return K("bottom","data-iframe-height")}},Ha={bodyScroll:function(){return document.body.scrollWidth},bodyOffset:function(){return document.body.offsetWidth},documentElementScroll:function(){return document.documentElement.scrollWidth},documentElementOffset:function(){return document.documentElement.offsetWidth},scroll:function(){return Math.max(Ha.bodyScroll(),Ha.documentElementScroll())},max:function(){return Math.max.apply(null,J(Ha))},min:function(){return Math.min.apply(null,J(Ha))},rightMostElement:function(){return I("right",L())},taggedElement:function(){return K("right","data-iframe-width")}},Ia=e(M);b(a,"message",S),T()}(window||{});
//# sourceMappingURL=iframeResizer.contentWindow.map
\ No newline at end of file
-/*! iFrame Resizer (iframeSizer.min.js ) - v3.5.3 - 2016-02-23
- * Desc: Force cross domain iframes to size to content.
- * Requires: iframeResizer.contentWindow.min.js to be loaded into the target frame.
- * Copyright: (c) 2016 David J. Bradshaw - dave@bradshaw.net
- * License: MIT
- */
-
!function(a){"use strict";function b(b,c,d){"addEventListener"in a?b.addEventListener(c,d,!1):"attachEvent"in a&&b.attachEvent("on"+c,d)}function c(b,c,d){"removeEventListener"in a?b.removeEventListener(c,d,!1):"detachEvent"in a&&b.detachEvent("on"+c,d)}function d(){var b,c=["moz","webkit","o","ms"];for(b=0;b<c.length&&!N;b+=1)N=a[c[b]+"RequestAnimationFrame"];N||h("setup","RequestAnimationFrame not supported")}function e(b){var c="Host page: "+b;return a.top!==a.self&&(c=a.parentIFrame&&a.parentIFrame.getId?a.parentIFrame.getId()+": "+b:"Nested host page: "+b),c}function f(a){return K+"["+e(a)+"]"}function g(a){return P[a]?P[a].log:G}function h(a,b){k("log",a,b,g(a))}function i(a,b){k("info",a,b,g(a))}function j(a,b){k("warn",a,b,!0)}function k(b,c,d,e){!0===e&&"object"==typeof a.console&&console[b](f(c),d)}function l(d){function e(){function a(){s(V),p(W)}g("Height"),g("Width"),t(a,V,"init")}function f(){var a=U.substr(L).split(":");return{iframe:P[a[0]].iframe,id:a[0],height:a[1],width:a[2],type:a[3]}}function g(a){var b=Number(P[W]["max"+a]),c=Number(P[W]["min"+a]),d=a.toLowerCase(),e=Number(V[d]);h(W,"Checking "+d+" is in range "+c+"-"+b),c>e&&(e=c,h(W,"Set "+d+" to min value")),e>b&&(e=b,h(W,"Set "+d+" to max value")),V[d]=""+e}function k(){function a(){function a(){var a=0,d=!1;for(h(W,"Checking connection is from allowed list of origins: "+c);a<c.length;a++)if(c[a]===b){d=!0;break}return d}function d(){var a=P[W].remoteHost;return h(W,"Checking connection is from: "+a),b===a}return c.constructor===Array?a():d()}var b=d.origin,c=P[W].checkOrigin;if(c&&""+b!="null"&&!a())throw new Error("Unexpected message received from: "+b+" for "+V.iframe.id+". Message was: "+d.data+". This error can be disabled by setting the checkOrigin: false option or by providing of array of trusted domains.");return!0}function l(){return K===(""+U).substr(0,L)&&U.substr(L).split(":")[0]in P}function w(){var a=V.type in{"true":1,"false":1,undefined:1};return a&&h(W,"Ignoring init message from meta parent page"),a}function y(a){return U.substr(U.indexOf(":")+J+a)}function z(a){h(W,"MessageCallback passed: {iframe: "+V.iframe.id+", message: "+a+"}"),N("messageCallback",{iframe:V.iframe,message:JSON.parse(a)}),h(W,"--")}function A(){var b=document.body.getBoundingClientRect(),c=V.iframe.getBoundingClientRect();return JSON.stringify({iframeHeight:c.height,iframeWidth:c.width,clientHeight:Math.max(document.documentElement.clientHeight,a.innerHeight||0),clientWidth:Math.max(document.documentElement.clientWidth,a.innerWidth||0),offsetTop:parseInt(c.top-b.top,10),offsetLeft:parseInt(c.left-b.left,10),scrollTop:a.pageYOffset,scrollLeft:a.pageXOffset})}function B(a,b){function c(){u("Send Page Info","pageInfo:"+A(),a,b)}x(c,32)}function C(){function d(b,c){function d(){P[g]?B(P[g].iframe,g):e()}["scroll","resize"].forEach(function(e){h(g,b+e+" listener for sendPageInfo"),c(a,e,d)})}function e(){d("Remove ",c)}function f(){d("Add ",b)}var g=W;f(),P[g].stopPageInfo=e}function D(){P[W]&&P[W].stopPageInfo&&(P[W].stopPageInfo(),delete P[W].stopPageInfo)}function E(){var a=!0;return null===V.iframe&&(j(W,"IFrame ("+V.id+") not found"),a=!1),a}function F(a){var b=a.getBoundingClientRect();return o(W),{x:Math.floor(Number(b.left)+Number(M.x)),y:Math.floor(Number(b.top)+Number(M.y))}}function G(b){function c(){M=g,H(),h(W,"--")}function d(){return{x:Number(V.width)+f.x,y:Number(V.height)+f.y}}function e(){a.parentIFrame?a.parentIFrame["scrollTo"+(b?"Offset":"")](g.x,g.y):j(W,"Unable to scroll to requested position, window.parentIFrame not found")}var f=b?F(V.iframe):{x:0,y:0},g=d();h(W,"Reposition requested from iFrame (offset x:"+f.x+" y:"+f.y+")"),a.top!==a.self?e():c()}function H(){!1!==N("scrollCallback",M)?p(W):q()}function I(b){function c(){var a=F(g);h(W,"Moving to in page link (#"+e+") at x: "+a.x+" y: "+a.y),M={x:a.x,y:a.y},H(),h(W,"--")}function d(){a.parentIFrame?a.parentIFrame.moveToAnchor(e):h(W,"In page link #"+e+" not found and window.parentIFrame not found")}var e=b.split("#")[1]||"",f=decodeURIComponent(e),g=document.getElementById(f)||document.getElementsByName(f)[0];g?c():a.top!==a.self?d():h(W,"In page link #"+e+" not found")}function N(a,b){return m(W,a,b)}function O(){switch(P[W].firstRun&&T(),V.type){case"close":n(V.iframe);break;case"message":z(y(6));break;case"scrollTo":G(!1);break;case"scrollToOffset":G(!0);break;case"pageInfo":B(P[W].iframe,W),C();break;case"pageInfoStop":D();break;case"inPageLink":I(y(9));break;case"reset":r(V);break;case"init":e(),N("initCallback",V.iframe),N("resizedCallback",V);break;default:e(),N("resizedCallback",V)}}function Q(a){var b=!0;return P[a]||(b=!1,j(V.type+" No settings for "+a+". Message was: "+U)),b}function S(){for(var a in P)u("iFrame requested init",v(a),document.getElementById(a),a)}function T(){P[W].firstRun=!1}var U=d.data,V={},W=null;"[iFrameResizerChild]Ready"===U?S():l()?(V=f(),W=R=V.id,!w()&&Q(W)&&(h(W,"Received: "+U),E()&&k()&&O())):i(W,"Ignored: "+U)}function m(a,b,c){var d=null,e=null;if(P[a]){if(d=P[a][b],"function"!=typeof d)throw new TypeError(b+" on iFrame["+a+"] is not a function");e=d(c)}return e}function n(a){var b=a.id;h(b,"Removing iFrame: "+b),a.parentNode.removeChild(a),m(b,"closedCallback",b),h(b,"--"),delete P[b]}function o(b){null===M&&(M={x:void 0!==a.pageXOffset?a.pageXOffset:document.documentElement.scrollLeft,y:void 0!==a.pageYOffset?a.pageYOffset:document.documentElement.scrollTop},h(b,"Get page position: "+M.x+","+M.y))}function p(b){null!==M&&(a.scrollTo(M.x,M.y),h(b,"Set page position: "+M.x+","+M.y),q())}function q(){M=null}function r(a){function b(){s(a),u("reset","reset",a.iframe,a.id)}h(a.id,"Size reset requested by "+("init"===a.type?"host page":"iFrame")),o(a.id),t(b,a,"reset")}function s(a){function b(b){a.iframe.style[b]=a[b]+"px",h(a.id,"IFrame ("+e+") "+b+" set to "+a[b]+"px")}function c(b){H||"0"!==a[b]||(H=!0,h(e,"Hidden iFrame detected, creating visibility listener"),y())}function d(a){b(a),c(a)}var e=a.iframe.id;P[e]&&(P[e].sizeHeight&&d("height"),P[e].sizeWidth&&d("width"))}function t(a,b,c){c!==b.type&&N?(h(b.id,"Requesting animation frame"),N(a)):a()}function u(a,b,c,d){function e(){var e=P[d].targetOrigin;h(d,"["+a+"] Sending msg to iframe["+d+"] ("+b+") targetOrigin: "+e),c.contentWindow.postMessage(K+b,e)}function f(){i(d,"["+a+"] IFrame("+d+") not found"),P[d]&&delete P[d]}function g(){c&&"contentWindow"in c&&null!==c.contentWindow?e():f()}d=d||c.id,P[d]&&g()}function v(a){return a+":"+P[a].bodyMarginV1+":"+P[a].sizeWidth+":"+P[a].log+":"+P[a].interval+":"+P[a].enablePublicMethods+":"+P[a].autoResize+":"+P[a].bodyMargin+":"+P[a].heightCalculationMethod+":"+P[a].bodyBackground+":"+P[a].bodyPadding+":"+P[a].tolerance+":"+P[a].inPageLinks+":"+P[a].resizeFrom+":"+P[a].widthCalculationMethod}function w(a,c){function d(){function b(b){1/0!==P[w][b]&&0!==P[w][b]&&(a.style[b]=P[w][b]+"px",h(w,"Set "+b+" = "+P[w][b]+"px"))}function c(a){if(P[w]["min"+a]>P[w]["max"+a])throw new Error("Value for min"+a+" can not be greater than max"+a)}c("Height"),c("Width"),b("maxHeight"),b("minHeight"),b("maxWidth"),b("minWidth")}function e(){var a=c&&c.id||S.id+F++;return null!==document.getElementById(a)&&(a+=F++),a}function f(b){return R=b,""===b&&(a.id=b=e(),G=(c||{}).log,R=b,h(b,"Added missing iframe ID: "+b+" ("+a.src+")")),b}function g(){h(w,"IFrame scrolling "+(P[w].scrolling?"enabled":"disabled")+" for "+w),a.style.overflow=!1===P[w].scrolling?"hidden":"auto",a.scrolling=!1===P[w].scrolling?"no":"yes"}function i(){("number"==typeof P[w].bodyMargin||"0"===P[w].bodyMargin)&&(P[w].bodyMarginV1=P[w].bodyMargin,P[w].bodyMargin=""+P[w].bodyMargin+"px")}function k(){var b=P[w].firstRun,c=P[w].heightCalculationMethod in O;!b&&c&&r({iframe:a,height:0,width:0,type:"init"})}function l(){Function.prototype.bind&&(P[w].iframe.iFrameResizer={close:n.bind(null,P[w].iframe),resize:u.bind(null,"Window resize","resize",P[w].iframe),moveToAnchor:function(a){u("Move to anchor","inPageLink:"+a,P[w].iframe,w)},sendMessage:function(a){a=JSON.stringify(a),u("Send Message","message:"+a,P[w].iframe,w)}})}function m(c){function d(){u("iFrame.onload",c,a),k()}b(a,"load",d),u("init",c,a)}function o(a){if("object"!=typeof a)throw new TypeError("Options is not an object")}function p(a){for(var b in S)S.hasOwnProperty(b)&&(P[w][b]=a.hasOwnProperty(b)?a[b]:S[b])}function q(a){return""===a||"file://"===a?"*":a}function s(b){b=b||{},P[w]={firstRun:!0,iframe:a,remoteHost:a.src.split("/").slice(0,3).join("/")},o(b),p(b),P[w].targetOrigin=!0===P[w].checkOrigin?q(P[w].remoteHost):"*"}function t(){return w in P&&"iFrameResizer"in a}var w=f(a.id);t()?j(w,"Ignored iFrame, already setup."):(s(c),g(),d(),i(),m(v(w)),l())}function x(a,b){null===Q&&(Q=setTimeout(function(){Q=null,a()},b))}function y(){function b(){function a(a){function b(b){return"0px"===P[a].iframe.style[b]}function c(a){return null!==a.offsetParent}c(P[a].iframe)&&(b("height")||b("width"))&&u("Visibility change","resize",P[a].iframe,a)}for(var b in P)a(b)}function c(a){h("window","Mutation observed: "+a[0].target+" "+a[0].type),x(b,16)}function d(){var a=document.querySelector("body"),b={attributes:!0,attributeOldValue:!1,characterData:!0,characterDataOldValue:!1,childList:!0,subtree:!0},d=new e(c);d.observe(a,b)}var e=a.MutationObserver||a.WebKitMutationObserver;e&&d()}function z(a){function b(){B("Window "+a,"resize")}h("window","Trigger event: "+a),x(b,16)}function A(){function a(){B("Tab Visable","resize")}"hidden"!==document.visibilityState&&(h("document","Trigger event: Visiblity change"),x(a,16))}function B(a,b){function c(a){return"parent"===P[a].resizeFrom&&P[a].autoResize&&!P[a].firstRun}for(var d in P)c(d)&&u(a,b,document.getElementById(d),d)}function C(){b(a,"message",l),b(a,"resize",function(){z("resize")}),b(document,"visibilitychange",A),b(document,"-webkit-visibilitychange",A),b(a,"focusin",function(){z("focus")}),b(a,"focus",function(){z("focus")})}function D(){function a(a,c){function d(){if(!c.tagName)throw new TypeError("Object is not a valid DOM element");if("IFRAME"!==c.tagName.toUpperCase())throw new TypeError("Expected <IFRAME> tag, found <"+c.tagName+">")}c&&(d(),w(c,a),b.push(c))}var b;return d(),C(),function(c,d){switch(b=[],typeof d){case"undefined":case"string":Array.prototype.forEach.call(document.querySelectorAll(d||"iframe"),a.bind(void 0,c));break;case"object":a(c,d);break;default:throw new TypeError("Unexpected data type ("+typeof d+")")}return b}}function E(a){a.fn.iFrameResize=function(a){return this.filter("iframe").each(function(b,c){w(c,a)}).end()}}var F=0,G=!1,H=!1,I="message",J=I.length,K="[iFrameSizer]",L=K.length,M=null,N=a.requestAnimationFrame,O={max:1,scroll:1,bodyScroll:1,documentElementScroll:1},P={},Q=null,R="Host Page",S={autoResize:!0,bodyBackground:null,bodyMargin:null,bodyMarginV1:8,bodyPadding:null,checkOrigin:!0,inPageLinks:!1,enablePublicMethods:!0,heightCalculationMethod:"bodyOffset",id:"iFrameResizer",interval:32,log:!1,maxHeight:1/0,maxWidth:1/0,minHeight:0,minWidth:0,resizeFrom:"parent",scrolling:!1,sizeHeight:!0,sizeWidth:!1,tolerance:0,widthCalculationMethod:"scroll",closedCallback:function(){},initCallback:function(){},messageCallback:function(){j("MessageCallback function not defined")},resizedCallback:function(){},scrollCallback:function(){return!0}};a.jQuery&&E(jQuery),"function"==typeof define&&define.amd?define([],D):"object"==typeof module&&"object"==typeof module.exports?module.exports=D():a.iFrameResize=a.iFrameResize||D()}(window||{});
//# sourceMappingURL=iframeResizer.map
\ No newline at end of file
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
// Backbone.js 1.1.2
(function(t,e){if(typeof define==="function"&&define.amd){define(["underscore","jquery","exports"],function(i,r,s){t.Backbone=e(t,s,i,r)})}else if(typeof exports!=="undefined"){var i=require("underscore");e(t,exports,i)}else{t.Backbone=e(t,{},t._,t.jQuery||t.Zepto||t.ender||t.$)}})(this,function(t,e,i,r){var s=t.Backbone;var n=[];var a=n.push;var o=n.slice;var h=n.splice;e.VERSION="1.1.2";e.$=r;e.noConflict=function(){t.Backbone=s;return this};e.emulateHTTP=false;e.emulateJSON=false;var u=e.Events={on:function(t,e,i){if(!c(this,"on",t,[e,i])||!e)return this;this._events||(this._events={});var r=this._events[t]||(this._events[t]=[]);r.push({callback:e,context:i,ctx:i||this});return this},once:function(t,e,r){if(!c(this,"once",t,[e,r])||!e)return this;var s=this;var n=i.once(function(){s.off(t,n);e.apply(this,arguments)});n._callback=e;return this.on(t,n,r)},off:function(t,e,r){var s,n,a,o,h,u,l,f;if(!this._events||!c(this,"off",t,[e,r]))return this;if(!t&&!e&&!r){this._events=void 0;return this}o=t?[t]:i.keys(this._events);for(h=0,u=o.length;h<u;h++){t=o[h];if(a=this._events[t]){this._events[t]=s=[];if(e||r){for(l=0,f=a.length;l<f;l++){n=a[l];if(e&&e!==n.callback&&e!==n.callback._callback||r&&r!==n.context){s.push(n)}}}if(!s.length)delete this._events[t]}}return this},trigger:function(t){if(!this._events)return this;var e=o.call(arguments,1);if(!c(this,"trigger",t,e))return this;var i=this._events[t];var r=this._events.all;if(i)f(i,e);if(r)f(r,arguments);return this},stopListening:function(t,e,r){var s=this._listeningTo;if(!s)return this;var n=!e&&!r;if(!r&&typeof e==="object")r=this;if(t)(s={})[t._listenId]=t;for(var a in s){t=s[a];t.off(e,r,this);if(n||i.isEmpty(t._events))delete this._listeningTo[a]}return this}};var l=/\s+/;var c=function(t,e,i,r){if(!i)return true;if(typeof i==="object"){for(var s in i){t[e].apply(t,[s,i[s]].concat(r))}return false}if(l.test(i)){var n=i.split(l);for(var a=0,o=n.length;a<o;a++){t[e].apply(t,[n[a]].concat(r))}return false}return true};var f=function(t,e){var i,r=-1,s=t.length,n=e[0],a=e[1],o=e[2];switch(e.length){case 0:while(++r<s)(i=t[r]).callback.call(i.ctx);return;case 1:while(++r<s)(i=t[r]).callback.call(i.ctx,n);return;case 2:while(++r<s)(i=t[r]).callback.call(i.ctx,n,a);return;case 3:while(++r<s)(i=t[r]).callback.call(i.ctx,n,a,o);return;default:while(++r<s)(i=t[r]).callback.apply(i.ctx,e);return}};var d={listenTo:"on",listenToOnce:"once"};i.each(d,function(t,e){u[e]=function(e,r,s){var n=this._listeningTo||(this._listeningTo={});var a=e._listenId||(e._listenId=i.uniqueId("l"));n[a]=e;if(!s&&typeof r==="object")s=this;e[t](r,s,this);return this}});u.bind=u.on;u.unbind=u.off;i.extend(e,u);var p=e.Model=function(t,e){var r=t||{};e||(e={});this.cid=i.uniqueId("c");this.attributes={};if(e.collection)this.collection=e.collection;if(e.parse)r=this.parse(r,e)||{};r=i.defaults({},r,i.result(this,"defaults"));this.set(r,e);this.changed={};this.initialize.apply(this,arguments)};i.extend(p.prototype,u,{changed:null,validationError:null,idAttribute:"id",initialize:function(){},toJSON:function(t){return i.clone(this.attributes)},sync:function(){return e.sync.apply(this,arguments)},get:function(t){return this.attributes[t]},escape:function(t){return i.escape(this.get(t))},has:function(t){return this.get(t)!=null},set:function(t,e,r){var s,n,a,o,h,u,l,c;if(t==null)return this;if(typeof t==="object"){n=t;r=e}else{(n={})[t]=e}r||(r={});if(!this._validate(n,r))return false;a=r.unset;h=r.silent;o=[];u=this._changing;this._changing=true;if(!u){this._previousAttributes=i.clone(this.attributes);this.changed={}}c=this.attributes,l=this._previousAttributes;if(this.idAttribute in n)this.id=n[this.idAttribute];for(s in n){e=n[s];if(!i.isEqual(c[s],e))o.push(s);if(!i.isEqual(l[s],e)){this.changed[s]=e}else{delete this.changed[s]}a?delete c[s]:c[s]=e}if(!h){if(o.length)this._pending=r;for(var f=0,d=o.length;f<d;f++){this.trigger("change:"+o[f],this,c[o[f]],r)}}if(u)return this;if(!h){while(this._pending){r=this._pending;this._pending=false;this.trigger("change",this,r)}}this._pending=false;this._changing=false;return this},unset:function(t,e){return this.set(t,void 0,i.extend({},e,{unset:true}))},clear:function(t){var e={};for(var r in this.attributes)e[r]=void 0;return this.set(e,i.extend({},t,{unset:true}))},hasChanged:function(t){if(t==null)return!i.isEmpty(this.changed);return i.has(this.changed,t)},changedAttributes:function(t){if(!t)return this.hasChanged()?i.clone(this.changed):false;var e,r=false;var s=this._changing?this._previousAttributes:this.attributes;for(var n in t){if(i.isEqual(s[n],e=t[n]))continue;(r||(r={}))[n]=e}return r},previous:function(t){if(t==null||!this._previousAttributes)return null;return this._previousAttributes[t]},previousAttributes:function(){return i.clone(this._previousAttributes)},fetch:function(t){t=t?i.clone(t):{};if(t.parse===void 0)t.parse=true;var e=this;var r=t.success;t.success=function(i){if(!e.set(e.parse(i,t),t))return false;if(r)r(e,i,t);e.trigger("sync",e,i,t)};q(this,t);return this.sync("read",this,t)},save:function(t,e,r){var s,n,a,o=this.attributes;if(t==null||typeof t==="object"){s=t;r=e}else{(s={})[t]=e}r=i.extend({validate:true},r);if(s&&!r.wait){if(!this.set(s,r))return false}else{if(!this._validate(s,r))return false}if(s&&r.wait){this.attributes=i.extend({},o,s)}if(r.parse===void 0)r.parse=true;var h=this;var u=r.success;r.success=function(t){h.attributes=o;var e=h.parse(t,r);if(r.wait)e=i.extend(s||{},e);if(i.isObject(e)&&!h.set(e,r)){return false}if(u)u(h,t,r);h.trigger("sync",h,t,r)};q(this,r);n=this.isNew()?"create":r.patch?"patch":"update";if(n==="patch")r.attrs=s;a=this.sync(n,this,r);if(s&&r.wait)this.attributes=o;return a},destroy:function(t){t=t?i.clone(t):{};var e=this;var r=t.success;var s=function(){e.trigger("destroy",e,e.collection,t)};t.success=function(i){if(t.wait||e.isNew())s();if(r)r(e,i,t);if(!e.isNew())e.trigger("sync",e,i,t)};if(this.isNew()){t.success();return false}q(this,t);var n=this.sync("delete",this,t);if(!t.wait)s();return n},url:function(){var t=i.result(this,"urlRoot")||i.result(this.collection,"url")||M();if(this.isNew())return t;return t.replace(/([^\/])$/,"$1/")+encodeURIComponent(this.id)},parse:function(t,e){return t},clone:function(){return new this.constructor(this.attributes)},isNew:function(){return!this.has(this.idAttribute)},isValid:function(t){return this._validate({},i.extend(t||{},{validate:true}))},_validate:function(t,e){if(!e.validate||!this.validate)return true;t=i.extend({},this.attributes,t);var r=this.validationError=this.validate(t,e)||null;if(!r)return true;this.trigger("invalid",this,r,i.extend(e,{validationError:r}));return false}});var v=["keys","values","pairs","invert","pick","omit"];i.each(v,function(t){p.prototype[t]=function(){var e=o.call(arguments);e.unshift(this.attributes);return i[t].apply(i,e)}});var g=e.Collection=function(t,e){e||(e={});if(e.model)this.model=e.model;if(e.comparator!==void 0)this.comparator=e.comparator;this._reset();this.initialize.apply(this,arguments);if(t)this.reset(t,i.extend({silent:true},e))};var m={add:true,remove:true,merge:true};var y={add:true,remove:false};i.extend(g.prototype,u,{model:p,initialize:function(){},toJSON:function(t){return this.map(function(e){return e.toJSON(t)})},sync:function(){return e.sync.apply(this,arguments)},add:function(t,e){return this.set(t,i.extend({merge:false},e,y))},remove:function(t,e){var r=!i.isArray(t);t=r?[t]:i.clone(t);e||(e={});var s,n,a,o;for(s=0,n=t.length;s<n;s++){o=t[s]=this.get(t[s]);if(!o)continue;delete this._byId[o.id];delete this._byId[o.cid];a=this.indexOf(o);this.models.splice(a,1);this.length--;if(!e.silent){e.index=a;o.trigger("remove",o,this,e)}this._removeReference(o,e)}return r?t[0]:t},set:function(t,e){e=i.defaults({},e,m);if(e.parse)t=this.parse(t,e);var r=!i.isArray(t);t=r?t?[t]:[]:i.clone(t);var s,n,a,o,h,u,l;var c=e.at;var f=this.model;var d=this.comparator&&c==null&&e.sort!==false;var v=i.isString(this.comparator)?this.comparator:null;var g=[],y=[],_={};var b=e.add,w=e.merge,x=e.remove;var E=!d&&b&&x?[]:false;for(s=0,n=t.length;s<n;s++){h=t[s]||{};if(h instanceof p){a=o=h}else{a=h[f.prototype.idAttribute||"id"]}if(u=this.get(a)){if(x)_[u.cid]=true;if(w){h=h===o?o.attributes:h;if(e.parse)h=u.parse(h,e);u.set(h,e);if(d&&!l&&u.hasChanged(v))l=true}t[s]=u}else if(b){o=t[s]=this._prepareModel(h,e);if(!o)continue;g.push(o);this._addReference(o,e)}o=u||o;if(E&&(o.isNew()||!_[o.id]))E.push(o);_[o.id]=true}if(x){for(s=0,n=this.length;s<n;++s){if(!_[(o=this.models[s]).cid])y.push(o)}if(y.length)this.remove(y,e)}if(g.length||E&&E.length){if(d)l=true;this.length+=g.length;if(c!=null){for(s=0,n=g.length;s<n;s++){this.models.splice(c+s,0,g[s])}}else{if(E)this.models.length=0;var k=E||g;for(s=0,n=k.length;s<n;s++){this.models.push(k[s])}}}if(l)this.sort({silent:true});if(!e.silent){for(s=0,n=g.length;s<n;s++){(o=g[s]).trigger("add",o,this,e)}if(l||E&&E.length)this.trigger("sort",this,e)}return r?t[0]:t},reset:function(t,e){e||(e={});for(var r=0,s=this.models.length;r<s;r++){this._removeReference(this.models[r],e)}e.previousModels=this.models;this._reset();t=this.add(t,i.extend({silent:true},e));if(!e.silent)this.trigger("reset",this,e);return t},push:function(t,e){return this.add(t,i.extend({at:this.length},e))},pop:function(t){var e=this.at(this.length-1);this.remove(e,t);return e},unshift:function(t,e){return this.add(t,i.extend({at:0},e))},shift:function(t){var e=this.at(0);this.remove(e,t);return e},slice:function(){return o.apply(this.models,arguments)},get:function(t){if(t==null)return void 0;return this._byId[t]||this._byId[t.id]||this._byId[t.cid]},at:function(t){return this.models[t]},where:function(t,e){if(i.isEmpty(t))return e?void 0:[];return this[e?"find":"filter"](function(e){for(var i in t){if(t[i]!==e.get(i))return false}return true})},findWhere:function(t){return this.where(t,true)},sort:function(t){if(!this.comparator)throw new Error("Cannot sort a set without a comparator");t||(t={});if(i.isString(this.comparator)||this.comparator.length===1){this.models=this.sortBy(this.comparator,this)}else{this.models.sort(i.bind(this.comparator,this))}if(!t.silent)this.trigger("sort",this,t);return this},pluck:function(t){return i.invoke(this.models,"get",t)},fetch:function(t){t=t?i.clone(t):{};if(t.parse===void 0)t.parse=true;var e=t.success;var r=this;t.success=function(i){var s=t.reset?"reset":"set";r[s](i,t);if(e)e(r,i,t);r.trigger("sync",r,i,t)};q(this,t);return this.sync("read",this,t)},create:function(t,e){e=e?i.clone(e):{};if(!(t=this._prepareModel(t,e)))return false;if(!e.wait)this.add(t,e);var r=this;var s=e.success;e.success=function(t,i){if(e.wait)r.add(t,e);if(s)s(t,i,e)};t.save(null,e);return t},parse:function(t,e){return t},clone:function(){return new this.constructor(this.models)},_reset:function(){this.length=0;this.models=[];this._byId={}},_prepareModel:function(t,e){if(t instanceof p)return t;e=e?i.clone(e):{};e.collection=this;var r=new this.model(t,e);if(!r.validationError)return r;this.trigger("invalid",this,r.validationError,e);return false},_addReference:function(t,e){this._byId[t.cid]=t;if(t.id!=null)this._byId[t.id]=t;if(!t.collection)t.collection=this;t.on("all",this._onModelEvent,this)},_removeReference:function(t,e){if(this===t.collection)delete t.collection;t.off("all",this._onModelEvent,this)},_onModelEvent:function(t,e,i,r){if((t==="add"||t==="remove")&&i!==this)return;if(t==="destroy")this.remove(e,r);if(e&&t==="change:"+e.idAttribute){delete this._byId[e.previous(e.idAttribute)];if(e.id!=null)this._byId[e.id]=e}this.trigger.apply(this,arguments)}});var _=["forEach","each","map","collect","reduce","foldl","inject","reduceRight","foldr","find","detect","filter","select","reject","every","all","some","any","include","contains","invoke","max","min","toArray","size","first","head","take","initial","rest","tail","drop","last","without","difference","indexOf","shuffle","lastIndexOf","isEmpty","chain","sample"];i.each(_,function(t){g.prototype[t]=function(){var e=o.call(arguments);e.unshift(this.models);return i[t].apply(i,e)}});var b=["groupBy","countBy","sortBy","indexBy"];i.each(b,function(t){g.prototype[t]=function(e,r){var s=i.isFunction(e)?e:function(t){return t.get(e)};return i[t](this.models,s,r)}});var w=e.View=function(t){this.cid=i.uniqueId("view");t||(t={});i.extend(this,i.pick(t,E));this._ensureElement();this.initialize.apply(this,arguments);this.delegateEvents()};var x=/^(\S+)\s*(.*)$/;var E=["model","collection","el","id","attributes","className","tagName","events"];i.extend(w.prototype,u,{tagName:"div",$:function(t){return this.$el.find(t)},initialize:function(){},render:function(){return this},remove:function(){this.$el.remove();this.stopListening();return this},setElement:function(t,i){if(this.$el)this.undelegateEvents();this.$el=t instanceof e.$?t:e.$(t);this.el=this.$el[0];if(i!==false)this.delegateEvents();return this},delegateEvents:function(t){if(!(t||(t=i.result(this,"events"))))return this;this.undelegateEvents();for(var e in t){var r=t[e];if(!i.isFunction(r))r=this[t[e]];if(!r)continue;var s=e.match(x);var n=s[1],a=s[2];r=i.bind(r,this);n+=".delegateEvents"+this.cid;if(a===""){this.$el.on(n,r)}else{this.$el.on(n,a,r)}}return this},undelegateEvents:function(){this.$el.off(".delegateEvents"+this.cid);return this},_ensureElement:function(){if(!this.el){var t=i.extend({},i.result(this,"attributes"));if(this.id)t.id=i.result(this,"id");if(this.className)t["class"]=i.result(this,"className");var r=e.$("<"+i.result(this,"tagName")+">").attr(t);this.setElement(r,false)}else{this.setElement(i.result(this,"el"),false)}}});e.sync=function(t,r,s){var n=T[t];i.defaults(s||(s={}),{emulateHTTP:e.emulateHTTP,emulateJSON:e.emulateJSON});var a={type:n,dataType:"json"};if(!s.url){a.url=i.result(r,"url")||M()}if(s.data==null&&r&&(t==="create"||t==="update"||t==="patch")){a.contentType="application/json";a.data=JSON.stringify(s.attrs||r.toJSON(s))}if(s.emulateJSON){a.contentType="application/x-www-form-urlencoded";a.data=a.data?{model:a.data}:{}}if(s.emulateHTTP&&(n==="PUT"||n==="DELETE"||n==="PATCH")){a.type="POST";if(s.emulateJSON)a.data._method=n;var o=s.beforeSend;s.beforeSend=function(t){t.setRequestHeader("X-HTTP-Method-Override",n);if(o)return o.apply(this,arguments)}}if(a.type!=="GET"&&!s.emulateJSON){a.processData=false}if(a.type==="PATCH"&&k){a.xhr=function(){return new ActiveXObject("Microsoft.XMLHTTP")}}var h=s.xhr=e.ajax(i.extend(a,s));r.trigger("request",r,h,s);return h};var k=typeof window!=="undefined"&&!!window.ActiveXObject&&!(window.XMLHttpRequest&&(new XMLHttpRequest).dispatchEvent);var T={create:"POST",update:"PUT",patch:"PATCH","delete":"DELETE",read:"GET"};e.ajax=function(){return e.$.ajax.apply(e.$,arguments)};var $=e.Router=function(t){t||(t={});if(t.routes)this.routes=t.routes;this._bindRoutes();this.initialize.apply(this,arguments)};var S=/\((.*?)\)/g;var H=/(\(\?)?:\w+/g;var A=/\*\w+/g;var I=/[\-{}\[\]+?.,\\\^$|#\s]/g;i.extend($.prototype,u,{initialize:function(){},route:function(t,r,s){if(!i.isRegExp(t))t=this._routeToRegExp(t);if(i.isFunction(r)){s=r;r=""}if(!s)s=this[r];var n=this;e.history.route(t,function(i){var a=n._extractParameters(t,i);n.execute(s,a);n.trigger.apply(n,["route:"+r].concat(a));n.trigger("route",r,a);e.history.trigger("route",n,r,a)});return this},execute:function(t,e){if(t)t.apply(this,e)},navigate:function(t,i){e.history.navigate(t,i);return this},_bindRoutes:function(){if(!this.routes)return;this.routes=i.result(this,"routes");var t,e=i.keys(this.routes);while((t=e.pop())!=null){this.route(t,this.routes[t])}},_routeToRegExp:function(t){t=t.replace(I,"\\$&").replace(S,"(?:$1)?").replace(H,function(t,e){return e?t:"([^/?]+)"}).replace(A,"([^?]*?)");return new RegExp("^"+t+"(?:\\?([\\s\\S]*))?$")},_extractParameters:function(t,e){var r=t.exec(e).slice(1);return i.map(r,function(t,e){if(e===r.length-1)return t||null;return t?decodeURIComponent(t):null})}});var N=e.History=function(){this.handlers=[];i.bindAll(this,"checkUrl");if(typeof window!=="undefined"){this.location=window.location;this.history=window.history}};var R=/^[#\/]|\s+$/g;var O=/^\/+|\/+$/g;var P=/msie [\w.]+/;var C=/\/$/;var j=/#.*$/;N.started=false;i.extend(N.prototype,u,{interval:50,atRoot:function(){return this.location.pathname.replace(/[^\/]$/,"$&/")===this.root},getHash:function(t){var e=(t||this).location.href.match(/#(.*)$/);return e?e[1]:""},getFragment:function(t,e){if(t==null){if(this._hasPushState||!this._wantsHashChange||e){t=decodeURI(this.location.pathname+this.location.search);var i=this.root.replace(C,"");if(!t.indexOf(i))t=t.slice(i.length)}else{t=this.getHash()}}return t.replace(R,"")},start:function(t){if(N.started)throw new Error("Backbone.history has already been started");N.started=true;this.options=i.extend({root:"/"},this.options,t);this.root=this.options.root;this._wantsHashChange=this.options.hashChange!==false;this._wantsPushState=!!this.options.pushState;this._hasPushState=!!(this.options.pushState&&this.history&&this.history.pushState);var r=this.getFragment();var s=document.documentMode;var n=P.exec(navigator.userAgent.toLowerCase())&&(!s||s<=7);this.root=("/"+this.root+"/").replace(O,"/");if(n&&this._wantsHashChange){var a=e.$('<iframe src="javascript:0" tabindex="-1">');this.iframe=a.hide().appendTo("body")[0].contentWindow;this.navigate(r)}if(this._hasPushState){e.$(window).on("popstate",this.checkUrl)}else if(this._wantsHashChange&&"onhashchange"in window&&!n){e.$(window).on("hashchange",this.checkUrl)}else if(this._wantsHashChange){this._checkUrlInterval=setInterval(this.checkUrl,this.interval)}this.fragment=r;var o=this.location;if(this._wantsHashChange&&this._wantsPushState){if(!this._hasPushState&&!this.atRoot()){this.fragment=this.getFragment(null,true);this.location.replace(this.root+"#"+this.fragment);return true}else if(this._hasPushState&&this.atRoot()&&o.hash){this.fragment=this.getHash().replace(R,"");this.history.replaceState({},document.title,this.root+this.fragment)}}if(!this.options.silent)return this.loadUrl()},stop:function(){e.$(window).off("popstate",this.checkUrl).off("hashchange",this.checkUrl);if(this._checkUrlInterval)clearInterval(this._checkUrlInterval);N.started=false},route:function(t,e){this.handlers.unshift({route:t,callback:e})},checkUrl:function(t){var e=this.getFragment();if(e===this.fragment&&this.iframe){e=this.getFragment(this.getHash(this.iframe))}if(e===this.fragment)return false;if(this.iframe)this.navigate(e);this.loadUrl()},loadUrl:function(t){t=this.fragment=this.getFragment(t);return i.any(this.handlers,function(e){if(e.route.test(t)){e.callback(t);return true}})},navigate:function(t,e){if(!N.started)return false;if(!e||e===true)e={trigger:!!e};var i=this.root+(t=this.getFragment(t||""));t=t.replace(j,"");if(this.fragment===t)return;this.fragment=t;if(t===""&&i!=="/")i=i.slice(0,-1);if(this._hasPushState){this.history[e.replace?"replaceState":"pushState"]({},document.title,i)}else if(this._wantsHashChange){this._updateHash(this.location,t,e.replace);if(this.iframe&&t!==this.getFragment(this.getHash(this.iframe))){if(!e.replace)this.iframe.document.open().close();this._updateHash(this.iframe.location,t,e.replace)}}else{return this.location.assign(i)}if(e.trigger)return this.loadUrl(t)},_updateHash:function(t,e,i){if(i){var r=t.href.replace(/(javascript:|#).*$/,"");t.replace(r+"#"+e)}else{t.hash="#"+e}}});e.history=new N;var U=function(t,e){var r=this;var s;if(t&&i.has(t,"constructor")){s=t.constructor}else{s=function(){return r.apply(this,arguments)}}i.extend(s,r,e);var n=function(){this.constructor=s};n.prototype=r.prototype;s.prototype=new n;if(t)i.extend(s.prototype,t);s.__super__=r.prototype;return s};p.extend=g.extend=$.extend=w.extend=N.extend=U;var M=function(){throw new Error('A "url" property or function must be specified')};var q=function(t,e){var i=e.error;e.error=function(r){if(i)i(t,r,e);t.trigger("error",t,r,e)}};return e});
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
/*!
handlebars v2.0.0
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
var hljs=new function(){function l(o){return o.replace(/&/gm,"&").replace(/</gm,"<").replace(/>/gm,">")}function b(p){for(var o=p.firstChild;o;o=o.nextSibling){if(o.nodeName=="CODE"){return o}if(!(o.nodeType==3&&o.nodeValue.match(/\s+/))){break}}}function h(p,o){return Array.prototype.map.call(p.childNodes,function(q){if(q.nodeType==3){return o?q.nodeValue.replace(/\n/g,""):q.nodeValue}if(q.nodeName=="BR"){return"\n"}return h(q,o)}).join("")}function a(q){var p=(q.className+" "+q.parentNode.className).split(/\s+/);p=p.map(function(r){return r.replace(/^language-/,"")});for(var o=0;o<p.length;o++){if(e[p[o]]||p[o]=="no-highlight"){return p[o]}}}function c(q){var o=[];(function p(r,s){for(var t=r.firstChild;t;t=t.nextSibling){if(t.nodeType==3){s+=t.nodeValue.length}else{if(t.nodeName=="BR"){s+=1}else{if(t.nodeType==1){o.push({event:"start",offset:s,node:t});s=p(t,s);o.push({event:"stop",offset:s,node:t})}}}}return s})(q,0);return o}function j(x,v,w){var p=0;var y="";var r=[];function t(){if(x.length&&v.length){if(x[0].offset!=v[0].offset){return(x[0].offset<v[0].offset)?x:v}else{return v[0].event=="start"?x:v}}else{return x.length?x:v}}function s(A){function z(B){return" "+B.nodeName+'="'+l(B.value)+'"'}return"<"+A.nodeName+Array.prototype.map.call(A.attributes,z).join("")+">"}while(x.length||v.length){var u=t().splice(0,1)[0];y+=l(w.substr(p,u.offset-p));p=u.offset;if(u.event=="start"){y+=s(u.node);r.push(u.node)}else{if(u.event=="stop"){var o,q=r.length;do{q--;o=r[q];y+=("</"+o.nodeName.toLowerCase()+">")}while(o!=u.node);r.splice(q,1);while(q<r.length){y+=s(r[q]);q++}}}}return y+l(w.substr(p))}function f(q){function o(s,r){return RegExp(s,"m"+(q.cI?"i":"")+(r?"g":""))}function p(y,w){if(y.compiled){return}y.compiled=true;var s=[];if(y.k){var r={};function z(A,t){t.split(" ").forEach(function(B){var C=B.split("|");r[C[0]]=[A,C[1]?Number(C[1]):1];s.push(C[0])})}y.lR=o(y.l||hljs.IR,true);if(typeof y.k=="string"){z("keyword",y.k)}else{for(var x in y.k){if(!y.k.hasOwnProperty(x)){continue}z(x,y.k[x])}}y.k=r}if(w){if(y.bWK){y.b="\\b("+s.join("|")+")\\s"}y.bR=o(y.b?y.b:"\\B|\\b");if(!y.e&&!y.eW){y.e="\\B|\\b"}if(y.e){y.eR=o(y.e)}y.tE=y.e||"";if(y.eW&&w.tE){y.tE+=(y.e?"|":"")+w.tE}}if(y.i){y.iR=o(y.i)}if(y.r===undefined){y.r=1}if(!y.c){y.c=[]}for(var v=0;v<y.c.length;v++){if(y.c[v]=="self"){y.c[v]=y}p(y.c[v],y)}if(y.starts){p(y.starts,w)}var u=[];for(var v=0;v<y.c.length;v++){u.push(y.c[v].b)}if(y.tE){u.push(y.tE)}if(y.i){u.push(y.i)}y.t=u.length?o(u.join("|"),true):{exec:function(t){return null}}}p(q)}function d(D,E){function o(r,M){for(var L=0;L<M.c.length;L++){var K=M.c[L].bR.exec(r);if(K&&K.index==0){return M.c[L]}}}function s(K,r){if(K.e&&K.eR.test(r)){return K}if(K.eW){return s(K.parent,r)}}function t(r,K){return K.i&&K.iR.test(r)}function y(L,r){var K=F.cI?r[0].toLowerCase():r[0];return L.k.hasOwnProperty(K)&&L.k[K]}function G(){var K=l(w);if(!A.k){return K}var r="";var N=0;A.lR.lastIndex=0;var L=A.lR.exec(K);while(L){r+=K.substr(N,L.index-N);var M=y(A,L);if(M){v+=M[1];r+='<span class="'+M[0]+'">'+L[0]+"</span>"}else{r+=L[0]}N=A.lR.lastIndex;L=A.lR.exec(K)}return r+K.substr(N)}function z(){if(A.sL&&!e[A.sL]){return l(w)}var r=A.sL?d(A.sL,w):g(w);if(A.r>0){v+=r.keyword_count;B+=r.r}return'<span class="'+r.language+'">'+r.value+"</span>"}function J(){return A.sL!==undefined?z():G()}function I(L,r){var K=L.cN?'<span class="'+L.cN+'">':"";if(L.rB){x+=K;w=""}else{if(L.eB){x+=l(r)+K;w=""}else{x+=K;w=r}}A=Object.create(L,{parent:{value:A}});B+=L.r}function C(K,r){w+=K;if(r===undefined){x+=J();return 0}var L=o(r,A);if(L){x+=J();I(L,r);return L.rB?0:r.length}var M=s(A,r);if(M){if(!(M.rE||M.eE)){w+=r}x+=J();do{if(A.cN){x+="</span>"}A=A.parent}while(A!=M.parent);if(M.eE){x+=l(r)}w="";if(M.starts){I(M.starts,"")}return M.rE?0:r.length}if(t(r,A)){throw"Illegal"}w+=r;return r.length||1}var F=e[D];f(F);var A=F;var w="";var B=0;var v=0;var x="";try{var u,q,p=0;while(true){A.t.lastIndex=p;u=A.t.exec(E);if(!u){break}q=C(E.substr(p,u.index-p),u[0]);p=u.index+q}C(E.substr(p));return{r:B,keyword_count:v,value:x,language:D}}catch(H){if(H=="Illegal"){return{r:0,keyword_count:0,value:l(E)}}else{throw H}}}function g(s){var o={keyword_count:0,r:0,value:l(s)};var q=o;for(var p in e){if(!e.hasOwnProperty(p)){continue}var r=d(p,s);r.language=p;if(r.keyword_count+r.r>q.keyword_count+q.r){q=r}if(r.keyword_count+r.r>o.keyword_count+o.r){q=o;o=r}}if(q.language){o.second_best=q}return o}function i(q,p,o){if(p){q=q.replace(/^((<[^>]+>|\t)+)/gm,function(r,v,u,t){return v.replace(/\t/g,p)})}if(o){q=q.replace(/\n/g,"<br>")}return q}function m(r,u,p){var v=h(r,p);var t=a(r);if(t=="no-highlight"){return}var w=t?d(t,v):g(v);t=w.language;var o=c(r);if(o.length){var q=document.createElement("pre");q.innerHTML=w.value;w.value=j(o,c(q),v)}w.value=i(w.value,u,p);var s=r.className;if(!s.match("(\\s|^)(language-)?"+t+"(\\s|$)")){s=s?(s+" "+t):t}r.innerHTML=w.value;r.className=s;r.result={language:t,kw:w.keyword_count,re:w.r};if(w.second_best){r.second_best={language:w.second_best.language,kw:w.second_best.keyword_count,re:w.second_best.r}}}function n(){if(n.called){return}n.called=true;Array.prototype.map.call(document.getElementsByTagName("pre"),b).filter(Boolean).forEach(function(o){m(o,hljs.tabReplace)})}function k(){window.addEventListener("DOMContentLoaded",n,false);window.addEventListener("load",n,false)}var e={};this.LANGUAGES=e;this.highlight=d;this.highlightAuto=g;this.fixMarkup=i;this.highlightBlock=m;this.initHighlighting=n;this.initHighlightingOnLoad=k;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";this.BNR="\\b(0b[01]+)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|\\.|-|-=|/|/=|:|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\[\\s\\S]",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.BNM={cN:"number",b:this.BNR,r:0};this.inherit=function(q,r){var o={};for(var p in q){o[p]=q[p]}if(r){for(var p in r){o[p]=r[p]}}return o}}();hljs.LANGUAGES.xml=function(a){var c="[A-Za-z0-9\\._:-]+";var b={eW:true,c:[{cN:"attribute",b:c,r:0},{b:'="',rB:true,e:'"',c:[{cN:"value",b:'"',eW:true}]},{b:"='",rB:true,e:"'",c:[{cN:"value",b:"'",eW:true}]},{b:"=",c:[{cN:"value",b:"[^\\s/>]+"}]}]};return{cI:true,c:[{cN:"pi",b:"<\\?",e:"\\?>",r:10},{cN:"doctype",b:"<!DOCTYPE",e:">",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"<!--",e:"-->",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"<style(?=\\s|>|$)",e:">",k:{title:"style"},c:[b],starts:{e:"</style>",rE:true,sL:"css"}},{cN:"tag",b:"<script(?=\\s|>|$)",e:">",k:{title:"script"},c:[b],starts:{e:"<\/script>",rE:true,sL:"javascript"}},{b:"<%",e:"%>",sL:"vbscript"},{cN:"tag",b:"</?",e:"/?>",c:[{cN:"title",b:"[^ />]+"},b]}]}}(hljs);hljs.LANGUAGES.json=function(a){var e={literal:"true false null"};var d=[a.QSM,a.CNM];var c={cN:"value",e:",",eW:true,eE:true,c:d,k:e};var b={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:true,eE:true,c:[a.BE],i:"\\n",starts:c}],i:"\\S"};var f={b:"\\[",e:"\\]",c:[a.inherit(c,{cN:null})],i:"\\S"};d.splice(d.length,0,b,f);return{c:d,k:e,i:"\\S"}}(hljs);
\ No newline at end of file
-/*
- * jQuery BBQ: Back Button & Query Library - v1.2.1 - 2/17/2010
- * http://benalman.com/projects/jquery-bbq-plugin/
- *
- * Copyright (c) 2010 "Cowboy" Ben Alman
- * Dual licensed under the MIT and GPL licenses.
- * http://benalman.com/about/license/
- */
(function($,p){var i,m=Array.prototype.slice,r=decodeURIComponent,a=$.param,c,l,v,b=$.bbq=$.bbq||{},q,u,j,e=$.event.special,d="hashchange",A="querystring",D="fragment",y="elemUrlAttr",g="location",k="href",t="src",x=/^.*\?|#.*$/g,w=/^.*\#/,h,C={};function E(F){return typeof F==="string"}function B(G){var F=m.call(arguments,1);return function(){return G.apply(this,F.concat(m.call(arguments)))}}function n(F){return F.replace(/^[^#]*#?(.*)$/,"$1")}function o(F){return F.replace(/(?:^[^?#]*\?([^#]*).*$)?.*/,"$1")}function f(H,M,F,I,G){var O,L,K,N,J;if(I!==i){K=F.match(H?/^([^#]*)\#?(.*)$/:/^([^#?]*)\??([^#]*)(#?.*)/);J=K[3]||"";if(G===2&&E(I)){L=I.replace(H?w:x,"")}else{N=l(K[2]);I=E(I)?l[H?D:A](I):I;L=G===2?I:G===1?$.extend({},I,N):$.extend({},N,I);L=a(L);if(H){L=L.replace(h,r)}}O=K[1]+(H?"#":L||!K[1]?"?":"")+L+J}else{O=M(F!==i?F:p[g][k])}return O}a[A]=B(f,0,o);a[D]=c=B(f,1,n);c.noEscape=function(G){G=G||"";var F=$.map(G.split(""),encodeURIComponent);h=new RegExp(F.join("|"),"g")};c.noEscape(",/");$.deparam=l=function(I,F){var H={},G={"true":!0,"false":!1,"null":null};$.each(I.replace(/\+/g," ").split("&"),function(L,Q){var K=Q.split("="),P=r(K[0]),J,O=H,M=0,R=P.split("]["),N=R.length-1;if(/\[/.test(R[0])&&/\]$/.test(R[N])){R[N]=R[N].replace(/\]$/,"");R=R.shift().split("[").concat(R);N=R.length-1}else{N=0}if(K.length===2){J=r(K[1]);if(F){J=J&&!isNaN(J)?+J:J==="undefined"?i:G[J]!==i?G[J]:J}if(N){for(;M<=N;M++){P=R[M]===""?O.length:R[M];O=O[P]=M<N?O[P]||(R[M+1]&&isNaN(R[M+1])?{}:[]):J}}else{if($.isArray(H[P])){H[P].push(J)}else{if(H[P]!==i){H[P]=[H[P],J]}else{H[P]=J}}}}else{if(P){H[P]=F?i:""}}});return H};function z(H,F,G){if(F===i||typeof F==="boolean"){G=F;F=a[H?D:A]()}else{F=E(F)?F.replace(H?w:x,""):F}return l(F,G)}l[A]=B(z,0);l[D]=v=B(z,1);$[y]||($[y]=function(F){return $.extend(C,F)})({a:k,base:k,iframe:t,img:t,input:t,form:"action",link:k,script:t});j=$[y];function s(I,G,H,F){if(!E(H)&&typeof H!=="object"){F=H;H=G;G=i}return this.each(function(){var L=$(this),J=G||j()[(this.nodeName||"").toLowerCase()]||"",K=J&&L.attr(J)||"";L.attr(J,a[I](K,H,F))})}$.fn[A]=B(s,A);$.fn[D]=B(s,D);b.pushState=q=function(I,F){if(E(I)&&/^#/.test(I)&&F===i){F=2}var H=I!==i,G=c(p[g][k],H?I:{},H?F:2);p[g][k]=G+(/#/.test(G)?"":"#")};b.getState=u=function(F,G){return F===i||typeof F==="boolean"?v(F):v(G)[F]};b.removeState=function(F){var G={};if(F!==i){G=u();$.each($.isArray(F)?F:arguments,function(I,H){delete G[H]})}q(G,2)};e[d]=$.extend(e[d],{add:function(F){var H;function G(J){var I=J[D]=c();J.getState=function(K,L){return K===i||typeof K==="boolean"?l(I,K):l(I,L)[K]};H.apply(this,arguments)}if($.isFunction(F)){H=F;return G}else{H=F.handler;F.handler=G}}})})(jQuery,this);
/*
* jQuery hashchange event - v1.2 - 2/11/2010
-/**
- * marked - a markdown parser
- * Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed)
- * https://github.com/chjj/marked
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
*/
-
;(function() {
/**
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
var require = function (file, cwd) {
var resolved = require.resolve(file, cwd || '/');
var mod = require.modules[resolved];
-
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
// The purpose of the `Content` object is to abstract away the data conversions
// to and from raw content entities as strings. For example, you want to be able
// to pass in a Javascript object and have it be automatically converted into a
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
/**
* swagger-client - swagger.js is a javascript client for use with swaggering APIs.
* @version v2.1.9-M1
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
var appName;
var popupMask;
var popupDialog;
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
// Underscore.js 1.7.0
// http://underscorejs.org
// (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+<!--
+
+ Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+
+ Licensed 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.
+
+ Author: Zhaoxing Meng
+ email: meng.zhaoxing1@zte.com.cn
+
+-->
<script>
var qp = null;
if(window.location.hash) {
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
/**
* swagger-ui - Swagger UI is a dependency-free collection of HTML, Javascript, and CSS assets that dynamically generate beautiful documentation from a Swagger-compliant API
* @version v2.1.8-M1
+====
+ Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+
+ Licensed 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.
+
+ Author: Zhaoxing Meng
+ email: meng.zhaoxing1@zte.com.cn
+====
+
__ __ _ _ ____
| \/ | (_) ___ _ __ ___ ___ ___ _ __ __ __ (_) ___ ___ | __ ) _ _ ___
| |\/| | | | / __| | '__| / _ \ / __| / _ \ | '__| \ \ / / | | / __| / _ \ | _ \ | | | | / __|
-/*
- * Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
*
* Licensed 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
+ * 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
*/
body {
color: #333;
/*
- * Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
*
* Licensed 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
+ * 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
*/
function loadPropertiesSideMenu(lang, propertiesFileNamePrefix, propertiesFilePath){
jQuery.i18n.properties({
#
-# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+# Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
#
# Licensed 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
+# 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,
# See the License for the specific language governing permissions and
# limitations under the License.
#
+# Author: Zhaoxing Meng
+# email: meng.zhaoxing1@zte.com.cn
+#
org_openo_msb_metrics_btn_refresh=Refresh
#
-# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+# Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
#
# Licensed 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
+# 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,
# See the License for the specific language governing permissions and
# limitations under the License.
#
+# Author: Zhaoxing Meng
+# email: meng.zhaoxing1@zte.com.cn
+#
org_openo_msb_metrics_btn_refresh=刷新
-<!--\r
-\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
-<!DOCTYPE html>\r
-<html>\r
-<head lang="en">\r
-<meta charset="UTF-8">\r
-<title></title>\r
-<link\r
- href="js/fontAwesome/css/font-awesome.min.css"\r
- rel="stylesheet" />\r
-<link\r
- href="js/bootstrap/css/bootstrap.min.css"\r
- rel="stylesheet" />\r
-\r
-\r
-\r
-<link href="css/metrics.css" rel="stylesheet" type="text/css" />\r
-<link href="css/animate.min.css" rel="stylesheet" type="text/css" />\r
-<link href="js/dataTables/dataTables.bootstrap.css" rel="stylesheet" type="text/css" />\r
-\r
-<style>\r
-.ms-controller {\r
- visibility: hidden\r
-}\r
-</style>\r
-\r
-</head>\r
-<body>\r
-<div class="ms-controller" ms-controller="metricsController">\r
-<div class="navbar" id="metricsHead">\r
- <div class="navbar-inner container-fluid" id="top-bar">\r
- <header class="row-fluid">\r
- <h3 class="span12" id="title">\r
- <img class="logo" src="img/netnumenLogo.png" alt="Logo"/>\r
- <small> —— Metrics</small>\r
- <button class="btn btn-default pull-right" ms-click="initMetrics()" >\r
- <i class=" fa fa-refresh"></i> <span id="org_openo_msb_metrics_btn_refresh" name_i18n="org_openo_msb_metrics_ui_i18n"></span>\r
- </button> \r
- </h3>\r
- \r
- \r
-\r
- </header>\r
-\r
- </div>\r
-</div>\r
-\r
-<div ms-visible="vm.isErr" style=" margin-top: 20px;text-align: center;" id="org_openo_msb_metrics_iserr" name_i18n="org_openo_msb_metrics_ui_i18n"></div>\r
-\r
-<div ms-visible="!vm.isErr">\r
-<span class="response_throbber" ms-visible="vm.routeLoading"></span>\r
-\r
-\r
- <div class="container-fluid">\r
-\r
-\r
-\r
- <div class="row" style=" margin-top: 15px;">\r
- <div class="col-xs-6 col-md-6 col-sm-6 col-lg-6">\r
- <i class="fa fa-cubes fa-lg"></i> \r
- <span class=" titlefont" id="org_openo_msb_metrics_jvm_title" name_i18n="org_openo_msb_metrics_ui_i18n"></span>\r
- </div> \r
- <div class="pull-right"> \r
- <i class="fa fa-clock-o"></i> <span id="org_openo_msb_metrics_jvm_time" name_i18n="org_openo_msb_metrics_ui_i18n"></span> {{vm.jvmTime}}\r
- </div> \r
- </div>\r
- <div class="separator-line"></div>\r
-\r
- <div class="row row-fluid">\r
-\r
- <div class="col-xs-12 col-sm-12 col-md-8 col-lg-7 " >\r
- <div class="panel panel-default">\r
- <div class="panel-heading">\r
- <i class="fa fa-stack-overflow fa-fw"></i> <span id="org_openo_msb_metrics_memory" name_i18n="org_openo_msb_metrics_ui_i18n"></span>\r
- </div>\r
- <!-- /.panel-heading -->\r
- <div class="panel-body">\r
- <div id="memoryBarChartDiv" style="width:100%;height:250px"></div>\r
- <div id="memoryPieChartDiv" style="width:100%;height:200px"></div>\r
- \r
- </div> \r
- </div>\r
- </div>\r
-\r
- <div class="col-xs-12 col-sm-12 col-md-4 col-lg-5 ">\r
- <div class="panel panel-default">\r
- <div class="panel-heading">\r
- <i class="fa fa-tasks fa-fw"></i> <span id="org_openo_msb_metrics_thread" name_i18n="org_openo_msb_metrics_ui_i18n"></span> \r
- <div class="pull-right"> \r
- <span id="org_openo_msb_metrics_thread_num" name_i18n="org_openo_msb_metrics_ui_i18n"></span>{{vm.threadNum}} \r
- </div>\r
- </div>\r
- <!-- /.panel-heading -->\r
- <div class="panel-body metricsChart" id="threadsChartDiv" style="height:480px">\r
- \r
- </div> \r
- </div>\r
- </div>\r
-\r
- \r
- </div>\r
-\r
- </div>\r
-\r
-\r
-\r
- <div class="container-fluid">\r
-\r
- <div class="row">\r
- <div class="col-xs-6 col-md-6 col-sm-6 col-lg-6 ">\r
- <i class="fa fa-internet-explorer fa-lg"></i> \r
- <span class=" titlefont" id="org_openo_msb_metrics_http_title" name_i18n="org_openo_msb_metrics_ui_i18n"></span>\r
-\r
- </div>\r
- \r
- </div>\r
- <div class="separator-line"></div>\r
-\r
-\r
- <div class="row row-fluid">\r
-\r
- <div class="col-xs-12 col-md-6 col-sm-6 col-lg-6 " >\r
- <div class="panel panel-default">\r
- <div class="panel-heading">\r
- <i class="fa fa-link fa-fw"></i> <span id="org_openo_msb_metrics_rest_title" name_i18n="org_openo_msb_metrics_ui_i18n"></span>\r
- </div>\r
- <!-- /.panel-heading -->\r
- <div class="panel-body metricsChart" id="restChartDiv" >\r
- \r
- </div> \r
- </div>\r
- </div>\r
-\r
- <div class="col-xs-12 col-md-6 col-sm-6 col-lg-6 ">\r
- <div class="panel panel-default">\r
- <div class="panel-heading">\r
- <i class="fa fa-bar-chart fa-fw"></i> <span id="org_openo_msb_metrics_requests_title" name_i18n="org_openo_msb_metrics_ui_i18n"></span>\r
- </div>\r
- <!-- /.panel-heading -->\r
- <div class="panel-body metricsChart" id="requestsChartDiv" >\r
- \r
- </div> \r
- </div>\r
- </div>\r
-\r
- \r
- </div>\r
- \r
-\r
- <div class="row-fluid"> \r
-\r
- <div class="panel panel-default">\r
- <div class="panel-heading">\r
- <i class="fa fa-file-text-o fa-fw"></i> <span id="org_openo_msb_metrics_http_table_title" name_i18n="org_openo_msb_metrics_ui_i18n"></span>\r
- </div>\r
- <!-- /.panel-heading -->\r
- <div class="panel-body" >\r
- \r
- <div class="table-responsive">\r
- <table class="table table-striped table-bordered table-hover" id="restTable">\r
- <thead>\r
- <tr>\r
- <th id="org_openo_msb_metrics_http_table_sn" name_i18n="org_openo_msb_metrics_ui_i18n"></th> \r
- <th id="org_openo_msb_metrics_http_table_restname" name_i18n="org_openo_msb_metrics_ui_i18n"></th> \r
- <th id="org_openo_msb_metrics_http_table_count" name_i18n="org_openo_msb_metrics_ui_i18n"></th> \r
- <th id="org_openo_msb_metrics_http_table_max" name_i18n="org_openo_msb_metrics_ui_i18n"></th>\r
- <th id="org_openo_msb_metrics_http_table_min" name_i18n="org_openo_msb_metrics_ui_i18n"></th>\r
- <th id="org_openo_msb_metrics_http_table_mean" name_i18n="org_openo_msb_metrics_ui_i18n"></th>\r
- <th id="org_openo_msb_metrics_http_table_m1" name_i18n="org_openo_msb_metrics_ui_i18n"></th> \r
- <th id="org_openo_msb_metrics_http_table_m5" name_i18n="org_openo_msb_metrics_ui_i18n"></th> \r
- </tr>\r
- </thead>\r
- <tbody ms-each-rest="restArray">\r
- <tr>\r
- <td ms-text="$index+1"></td>\r
- <td ms-text="metricsUtil.methodShortName(rest.name)" ms-attr-title="rest.name"></td>\r
- <td ms-text="rest.count"></td>\r
- <td ms-text="rest.max.toFixed(2)"></td>\r
- <td ms-text="rest.min.toFixed(2)"></td>\r
- <td ms-text="rest.mean.toFixed(2)"></td>\r
- <td ms-text="rest.m1_rate"></td>\r
- <td ms-text="rest.m5_rate"></td>\r
- \r
- </tr> \r
- \r
- </tbody>\r
- </table>\r
- \r
- </div>\r
- </div> \r
- </div>\r
-\r
- </div>\r
-\r
- </div>\r
-\r
-</div>\r
-</div>\r
-\r
-\r
-\r
- <script type="text/javascript" src="js/jquery/jquery-1.10.2.min.js"></script>\r
- <script type="text/javascript" src="js/jquery.i18n/jquery.i18n.properties-1.0.9.js"></script>\r
-<script src="i18n/loadi18nApp_iui-metrics_view.js"></script>\r
- <script type="text/javascript">\r
-\r
- var url = window.location.search.match(/url=([^&]+)/);\r
- if (url && url.length > 1) {\r
- url = decodeURIComponent(url[1]);\r
- $("#metricsHead").hide();\r
- } else {\r
- url = "/admin/microservices/v1/metrics";\r
- }\r
-\r
- loadPropertiesSideMenu('', 'msb-iui-metrics-i18n', 'i18n/'); \r
-\r
-</script>\r
-\r
-\r
- <script type="text/javascript" src="js/bootstrap/js/bootstrap.min.js"></script>\r
-\r
- <script type="text/javascript" src="js/dataTables/jquery.dataTables.min.js"></script>\r
- <script type="text/javascript" src="js/dataTables/dataTables.bootstrap.min.js"></script>\r
-\r
- <script type="text/javascript" src="js/avalon.js"></script>\r
-\r
- \r
- <script src="js/metricsUtil.js"></script>\r
-\r
-\r
- <script src="js/echarts/echarts-all.js"></script>\r
- \r
- <script src="js/metricsChart.js"></script>\r
-\r
- <script type="text/javascript" src="js/metricsController.js"></script>\r
-\r
- <script type="text/javascript" src="js/iframeResizer/iframeResizer.contentWindow.min.js"></script>\r
-\r
- \r
-</body>\r
+<!--
+
+ Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+
+ Licensed 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.
+
+ Author: Zhaoxing Meng
+ email: meng.zhaoxing1@zte.com.cn
+
+-->
+<!DOCTYPE html>
+<html>
+<head lang="en">
+<meta charset="UTF-8">
+<title></title>
+<link
+ href="js/fontAwesome/css/font-awesome.min.css"
+ rel="stylesheet" />
+<link
+ href="js/bootstrap/css/bootstrap.min.css"
+ rel="stylesheet" />
+
+
+
+<link href="css/metrics.css" rel="stylesheet" type="text/css" />
+<link href="css/animate.min.css" rel="stylesheet" type="text/css" />
+<link href="js/dataTables/dataTables.bootstrap.css" rel="stylesheet" type="text/css" />
+
+<style>
+.ms-controller {
+ visibility: hidden
+}
+</style>
+
+</head>
+<body>
+<div class="ms-controller" ms-controller="metricsController">
+<div class="navbar" id="metricsHead">
+ <div class="navbar-inner container-fluid" id="top-bar">
+ <header class="row-fluid">
+ <h3 class="span12" id="title">
+ <img class="logo" src="img/netnumenLogo.png" alt="Logo"/>
+ <small> —— Metrics</small>
+ <button class="btn btn-default pull-right" ms-click="initMetrics()" >
+ <i class=" fa fa-refresh"></i> <span id="org_openo_msb_metrics_btn_refresh" name_i18n="org_openo_msb_metrics_ui_i18n"></span>
+ </button>
+ </h3>
+
+
+
+ </header>
+
+ </div>
+</div>
+
+<div ms-visible="vm.isErr" style=" margin-top: 20px;text-align: center;" id="org_openo_msb_metrics_iserr" name_i18n="org_openo_msb_metrics_ui_i18n"></div>
+
+<div ms-visible="!vm.isErr">
+<span class="response_throbber" ms-visible="vm.routeLoading"></span>
+
+
+ <div class="container-fluid">
+
+
+
+ <div class="row" style=" margin-top: 15px;">
+ <div class="col-xs-6 col-md-6 col-sm-6 col-lg-6">
+ <i class="fa fa-cubes fa-lg"></i>
+ <span class=" titlefont" id="org_openo_msb_metrics_jvm_title" name_i18n="org_openo_msb_metrics_ui_i18n"></span>
+ </div>
+ <div class="pull-right">
+ <i class="fa fa-clock-o"></i> <span id="org_openo_msb_metrics_jvm_time" name_i18n="org_openo_msb_metrics_ui_i18n"></span> {{vm.jvmTime}}
+ </div>
+ </div>
+ <div class="separator-line"></div>
+
+ <div class="row row-fluid">
+
+ <div class="col-xs-12 col-sm-12 col-md-8 col-lg-7 " >
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <i class="fa fa-stack-overflow fa-fw"></i> <span id="org_openo_msb_metrics_memory" name_i18n="org_openo_msb_metrics_ui_i18n"></span>
+ </div>
+ <!-- /.panel-heading -->
+ <div class="panel-body">
+ <div id="memoryBarChartDiv" style="width:100%;height:250px"></div>
+ <div id="memoryPieChartDiv" style="width:100%;height:200px"></div>
+
+ </div>
+ </div>
+ </div>
+
+ <div class="col-xs-12 col-sm-12 col-md-4 col-lg-5 ">
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <i class="fa fa-tasks fa-fw"></i> <span id="org_openo_msb_metrics_thread" name_i18n="org_openo_msb_metrics_ui_i18n"></span>
+ <div class="pull-right">
+ <span id="org_openo_msb_metrics_thread_num" name_i18n="org_openo_msb_metrics_ui_i18n"></span>{{vm.threadNum}}
+ </div>
+ </div>
+ <!-- /.panel-heading -->
+ <div class="panel-body metricsChart" id="threadsChartDiv" style="height:480px">
+
+ </div>
+ </div>
+ </div>
+
+
+ </div>
+
+ </div>
+
+
+
+ <div class="container-fluid">
+
+ <div class="row">
+ <div class="col-xs-6 col-md-6 col-sm-6 col-lg-6 ">
+ <i class="fa fa-internet-explorer fa-lg"></i>
+ <span class=" titlefont" id="org_openo_msb_metrics_http_title" name_i18n="org_openo_msb_metrics_ui_i18n"></span>
+
+ </div>
+
+ </div>
+ <div class="separator-line"></div>
+
+
+ <div class="row row-fluid">
+
+ <div class="col-xs-12 col-md-6 col-sm-6 col-lg-6 " >
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <i class="fa fa-link fa-fw"></i> <span id="org_openo_msb_metrics_rest_title" name_i18n="org_openo_msb_metrics_ui_i18n"></span>
+ </div>
+ <!-- /.panel-heading -->
+ <div class="panel-body metricsChart" id="restChartDiv" >
+
+ </div>
+ </div>
+ </div>
+
+ <div class="col-xs-12 col-md-6 col-sm-6 col-lg-6 ">
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <i class="fa fa-bar-chart fa-fw"></i> <span id="org_openo_msb_metrics_requests_title" name_i18n="org_openo_msb_metrics_ui_i18n"></span>
+ </div>
+ <!-- /.panel-heading -->
+ <div class="panel-body metricsChart" id="requestsChartDiv" >
+
+ </div>
+ </div>
+ </div>
+
+
+ </div>
+
+
+ <div class="row-fluid">
+
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <i class="fa fa-file-text-o fa-fw"></i> <span id="org_openo_msb_metrics_http_table_title" name_i18n="org_openo_msb_metrics_ui_i18n"></span>
+ </div>
+ <!-- /.panel-heading -->
+ <div class="panel-body" >
+
+ <div class="table-responsive">
+ <table class="table table-striped table-bordered table-hover" id="restTable">
+ <thead>
+ <tr>
+ <th id="org_openo_msb_metrics_http_table_sn" name_i18n="org_openo_msb_metrics_ui_i18n"></th>
+ <th id="org_openo_msb_metrics_http_table_restname" name_i18n="org_openo_msb_metrics_ui_i18n"></th>
+ <th id="org_openo_msb_metrics_http_table_count" name_i18n="org_openo_msb_metrics_ui_i18n"></th>
+ <th id="org_openo_msb_metrics_http_table_max" name_i18n="org_openo_msb_metrics_ui_i18n"></th>
+ <th id="org_openo_msb_metrics_http_table_min" name_i18n="org_openo_msb_metrics_ui_i18n"></th>
+ <th id="org_openo_msb_metrics_http_table_mean" name_i18n="org_openo_msb_metrics_ui_i18n"></th>
+ <th id="org_openo_msb_metrics_http_table_m1" name_i18n="org_openo_msb_metrics_ui_i18n"></th>
+ <th id="org_openo_msb_metrics_http_table_m5" name_i18n="org_openo_msb_metrics_ui_i18n"></th>
+ </tr>
+ </thead>
+ <tbody ms-each-rest="restArray">
+ <tr>
+ <td ms-text="$index+1"></td>
+ <td ms-text="metricsUtil.methodShortName(rest.name)" ms-attr-title="rest.name"></td>
+ <td ms-text="rest.count"></td>
+ <td ms-text="rest.max.toFixed(2)"></td>
+ <td ms-text="rest.min.toFixed(2)"></td>
+ <td ms-text="rest.mean.toFixed(2)"></td>
+ <td ms-text="rest.m1_rate"></td>
+ <td ms-text="rest.m5_rate"></td>
+
+ </tr>
+
+ </tbody>
+ </table>
+
+ </div>
+ </div>
+ </div>
+
+ </div>
+
+ </div>
+
+</div>
+</div>
+
+
+
+ <script type="text/javascript" src="js/jquery/jquery-1.10.2.min.js"></script>
+ <script type="text/javascript" src="js/jquery.i18n/jquery.i18n.properties-1.0.9.js"></script>
+<script src="i18n/loadi18nApp_iui-metrics_view.js"></script>
+ <script type="text/javascript">
+
+ var url = window.location.search.match(/url=([^&]+)/);
+ if (url && url.length > 1) {
+ url = decodeURIComponent(url[1]);
+ $("#metricsHead").hide();
+ } else {
+ url = "/admin/microservices/v1/metrics";
+ }
+
+ loadPropertiesSideMenu('', 'msb-iui-metrics-i18n', 'i18n/');
+
+</script>
+
+
+ <script type="text/javascript" src="js/bootstrap/js/bootstrap.min.js"></script>
+
+ <script type="text/javascript" src="js/dataTables/jquery.dataTables.min.js"></script>
+ <script type="text/javascript" src="js/dataTables/dataTables.bootstrap.min.js"></script>
+
+ <script type="text/javascript" src="js/avalon.js"></script>
+
+
+ <script src="js/metricsUtil.js"></script>
+
+
+ <script src="js/echarts/echarts-all.js"></script>
+
+ <script src="js/metricsChart.js"></script>
+
+ <script type="text/javascript" src="js/metricsController.js"></script>
+
+ <script type="text/javascript" src="js/iframeResizer/iframeResizer.contentWindow.min.js"></script>
+
+
+</body>
</html>
\ No newline at end of file
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
/*==================================================
Copyright (c) 2013-2015 司徒正美 and other contributors
http://www.cnblogs.com/rubylouvre/
-/*!
- * Bootstrap v3.1.1 (http://getbootstrap.com)
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-
/*! normalize.css v3.0.0 | MIT License | git.io/normalize */
html {
font-family: sans-serif;
-/*!
- * Bootstrap v3.1.1 (http://getbootstrap.com)
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-
/*! normalize.css v3.0.0 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#999}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-muted{color:#999}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#999}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;white-space:nowrap;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*=col-]{position:static;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:scroll;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}input[type=date]{line-height:34px}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;margin-top:10px;margin-bottom:10px;padding-left:20px}.radio label,.checkbox label{display:inline;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.has-feedback .form-control-feedback{position:absolute;top:25px;right:0;display:block;width:34px;height:34px;line-height:34px;text-align:center}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{float:none;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-control-static{padding-top:7px}@media (min-width:768px){.form-horizontal .control-label{text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#428bca;font-weight:400;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-left:0;padding-right:0}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#999}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle=buttons]>.btn>input[type=radio],[data-toggle=buttons]>.btn>input[type=checkbox]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=radio],.input-group-addon input[type=checkbox]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{float:none;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#428bca;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:gray}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#999;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px;overflow:hidden}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:auto;overflow-y:scroll;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{margin-top:15px;padding:19px 20px 20px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;right:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.5) 0),color-stop(rgba(0,0,0,.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.0001) 0),color-stop(rgba(0,0,0,.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}}@media print{.hidden-print{display:none!important}}
\ No newline at end of file
-/*!
- * Bootstrap v3.1.1 (http://getbootstrap.com)
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-
if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') }
/* ========================================================================
-/*!
- * Bootstrap v3.1.1 (http://getbootstrap.com)
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.isLoading=!1};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",f.resetText||d.data("resetText",d[e]()),d[e](f[b]||this.options[b]),setTimeout(a.proxy(function(){"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},b.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}a&&this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}if(e.hasClass("active"))return this.sliding=!1;var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});return this.$element.trigger(j),j.isDefaultPrevented()?void 0:(this.sliding=!0,f&&this.pause(),this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid.bs.carousel",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")?(e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid.bs.carousel")},0)}).emulateTransitionEnd(1e3*d.css("transition-duration").slice(0,-1))):(d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid.bs.carousel")),f&&this.cycle(),this)};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("collapse in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?void this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);!e&&f.toggle&&"show"==c&&(c=!c),e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(jQuery),+function(a){"use strict";function b(b){a(d).remove(),a(e).each(function(){var d=c(a(this)),e={relatedTarget:this};d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown",e)),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown",e))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;f.toggleClass("open").trigger("shown.bs.dropdown",h),e.focus()}return!1}},f.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var f=c(d),g=f.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&f.find(e).focus(),d.click();var h=" li:not(.divider):visible a",i=f.find("[role=menu]"+h+", [role=listbox]"+h);if(i.length){var j=i.index(i.filter(":focus"));38==b.keyCode&&j>0&&j--,40==b.keyCode&&j<i.length-1&&j++,~j||(j=0),i.eq(j).focus()}}}};var g=a.fn.dropdown;a.fn.dropdown=function(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new f(this)),"string"==typeof b&&d[b].call(c)})},a.fn.dropdown.Constructor=f,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=g,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",e,f.prototype.toggle).on("keydown.bs.dropdown.data-api",e+", [role=menu], [role=listbox]",f.prototype.keydown)}(jQuery),+function(a){"use strict";var b=function(b,c){this.options=c,this.$element=a(b),this.$backdrop=this.isShown=null,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};b.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},b.prototype.toggle=function(a){return this[this.isShown?"hide":"show"](a)},b.prototype.show=function(b){var c=this,d=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(d),this.isShown||d.isDefaultPrevented()||(this.isShown=!0,this.escape(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var d=a.support.transition&&c.$element.hasClass("fade");c.$element.parent().length||c.$element.appendTo(document.body),c.$element.show().scrollTop(0),d&&c.$element[0].offsetWidth,c.$element.addClass("in").attr("aria-hidden",!1),c.enforceFocus();var e=a.Event("shown.bs.modal",{relatedTarget:b});d?c.$element.find(".modal-dialog").one(a.support.transition.end,function(){c.$element.focus().trigger(e)}).emulateTransitionEnd(300):c.$element.focus().trigger(e)}))},b.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one(a.support.transition.end,a.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},b.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.focus()},this))},b.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},b.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.removeBackdrop(),a.$element.trigger("hidden.bs.modal")})},b.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},b.prototype.backdrop=function(b){var c=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var d=a.support.transition&&c;if(this.$backdrop=a('<div class="modal-backdrop '+c+'" />').appendTo(document.body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),d&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;d?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()):b&&b()};var c=a.fn.modal;a.fn.modal=function(c,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},b.DEFAULTS,e.data(),"object"==typeof c&&c);f||e.data("bs.modal",f=new b(this,g)),"string"==typeof c?f[c](d):g.show&&f.show(d)})},a.fn.modal.Constructor=b,a.fn.modal.noConflict=function(){return a.fn.modal=c,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(b){var c=a(this),d=c.attr("href"),e=a(c.attr("data-target")||d&&d.replace(/.*(?=#[^\s]+$)/,"")),f=e.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(d)&&d},e.data(),c.data());c.is("a")&&b.preventDefault(),e.modal(f,this).one("hide",function(){c.is(":visible")&&c.focus()})}),a(document).on("show.bs.modal",".modal",function(){a(document.body).addClass("modal-open")}).on("hidden.bs.modal",".modal",function(){a(document.body).removeClass("modal-open")})}(jQuery),+function(a){"use strict";var b=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};b.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},b.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},b.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},b.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show()},b.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},b.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){if(this.$element.trigger(b),b.isDefaultPrevented())return;var c=this,d=this.tip();this.setContent(),this.options.animation&&d.addClass("fade");var e="function"==typeof this.options.placement?this.options.placement.call(this,d[0],this.$element[0]):this.options.placement,f=/\s?auto?\s?/i,g=f.test(e);g&&(e=e.replace(f,"")||"top"),d.detach().css({top:0,left:0,display:"block"}).addClass(e),this.options.container?d.appendTo(this.options.container):d.insertAfter(this.$element);var h=this.getPosition(),i=d[0].offsetWidth,j=d[0].offsetHeight;if(g){var k=this.$element.parent(),l=e,m=document.documentElement.scrollTop||document.body.scrollTop,n="body"==this.options.container?window.innerWidth:k.outerWidth(),o="body"==this.options.container?window.innerHeight:k.outerHeight(),p="body"==this.options.container?0:k.offset().left;e="bottom"==e&&h.top+h.height+j-m>o?"top":"top"==e&&h.top-m-j<0?"bottom":"right"==e&&h.right+i>n?"left":"left"==e&&h.left-i<p?"right":e,d.removeClass(l).addClass(e)}var q=this.getCalculatedOffset(e,h,i,j);this.applyPlacement(q,e),this.hoverState=null;var r=function(){c.$element.trigger("shown.bs."+c.type)};a.support.transition&&this.$tip.hasClass("fade")?d.one(a.support.transition.end,r).emulateTransitionEnd(150):r()}},b.prototype.applyPlacement=function(b,c){var d,e=this.tip(),f=e[0].offsetWidth,g=e[0].offsetHeight,h=parseInt(e.css("margin-top"),10),i=parseInt(e.css("margin-left"),10);isNaN(h)&&(h=0),isNaN(i)&&(i=0),b.top=b.top+h,b.left=b.left+i,a.offset.setOffset(e[0],a.extend({using:function(a){e.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),e.addClass("in");var j=e[0].offsetWidth,k=e[0].offsetHeight;if("top"==c&&k!=g&&(d=!0,b.top=b.top+g-k),/bottom|top/.test(c)){var l=0;b.left<0&&(l=-2*b.left,b.left=0,e.offset(b),j=e[0].offsetWidth,k=e[0].offsetHeight),this.replaceArrow(l-f+j,j,"left")}else this.replaceArrow(k-g,k,"top");d&&e.offset(b)},b.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},b.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach(),c.$element.trigger("hidden.bs."+c.type)}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d.one(a.support.transition.end,b).emulateTransitionEnd(150):b(),this.hoverState=null,this)},b.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},b.prototype.hasContent=function(){return this.getTitle()},b.prototype.getPosition=function(){var b=this.$element[0];return a.extend({},"function"==typeof b.getBoundingClientRect?b.getBoundingClientRect():{width:b.offsetWidth,height:b.offsetHeight},this.$element.offset())},b.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},b.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},b.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},b.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},b.prototype.enable=function(){this.enabled=!0},b.prototype.disable=function(){this.enabled=!1},b.prototype.toggleEnabled=function(){this.enabled=!this.enabled},b.prototype.toggle=function(b){var c=b?a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type):this;c.tip().hasClass("in")?c.leave(c):c.enter(c)},b.prototype.destroy=function(){clearTimeout(this.timeout),this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var c=a.fn.tooltip;a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof c&&c;(e||"destroy"!=c)&&(e||d.data("bs.tooltip",e=new b(this,f)),"string"==typeof c&&e[c]())})},a.fn.tooltip.Constructor=b,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=c,this}}(jQuery),+function(a){"use strict";var b=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");b.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;(e||"destroy"!=c)&&(e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]())})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(a(c).is("body")?window:c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);{var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})}},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);if(g&&b<=e[0])return g!=(a=f[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parentsUntil(this.options.target,".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=this.pinnedOffset=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(b.RESET).addClass("affix");var a=this.$window.scrollTop(),c=this.$element.offset();return this.pinnedOffset=c.top-a},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"top"==this.affixed&&(e.top+=d),"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top(this.$element)),"function"==typeof h&&(h=f.bottom(this.$element));var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;if(this.affixed!==i){this.unpin&&this.$element.css("top","");var j="affix"+(i?"-"+i:""),k=a.Event(j+".bs.affix");this.$element.trigger(k),k.isDefaultPrevented()||(this.affixed=i,this.unpin="bottom"==i?this.getPinnedOffset():null,this.$element.removeClass(b.RESET).addClass(j).trigger(a.Event(j.replace("affix","affixed"))),"bottom"==i&&this.$element.offset({top:c-h-this.$element.height()}))}}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(jQuery);
\ No newline at end of file
-/* =============================================================
- * bootstrap-typeahead.js v2.3.2
- * http://twitter.github.com/bootstrap/javascript.html#typeahead
- * =============================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed 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.
- * ============================================================ */
-
!function(t){"use strict";var e=function(e,s){this.$element=t(e),this.options=t.extend({},t.fn.typeahead.defaults,s),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.source=this.options.source,this.$menu=t(this.options.menu),this.shown=!1,this.listen()};e.prototype={constructor:e,select:function(){var t=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(t)).change(),this.hide()},updater:function(t){return t},show:function(){var e=t.extend({},this.$element.position(),{height:this.$element[0].offsetHeight});return this.$menu.insertAfter(this.$element).css({top:e.top+e.height,left:e.left}).show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(){var e;return this.query=this.$element.val(),!this.query||this.query.length<this.options.minLength?this.shown?this.hide():this:(e=t.isFunction(this.source)?this.source(this.query,t.proxy(this.process,this)):this.source,e?this.process(e):this)},process:function(e){var s=this;return e=t.grep(e,function(t){return s.matcher(t)}),e=this.sorter(e),e.length?this.render(e.slice(0,this.options.items)).show():this.shown?this.hide():this},matcher:function(t){return~t.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(t){for(var e,s=[],i=[],n=[];e=t.shift();)e.toLowerCase().indexOf(this.query.toLowerCase())?~e.indexOf(this.query)?i.push(e):n.push(e):s.push(e);return s.concat(i,n)},highlighter:function(t){var e=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");return t.replace(new RegExp("("+e+")","ig"),function(t,e){return"<strong>"+e+"</strong>"})},render:function(e){var s=this;return e=t(e).map(function(e,i){return e=t(s.options.item).attr("data-value",i),e.find("a").html(s.highlighter(i)),e[0]}),e.first().addClass("active"),this.$menu.html(e),this},next:function(){var e=this.$menu.find(".active").removeClass("active"),s=e.next();s.length||(s=t(this.$menu.find("li")[0])),s.addClass("active")},prev:function(){var t=this.$menu.find(".active").removeClass("active"),e=t.prev();e.length||(e=this.$menu.find("li").last()),e.addClass("active")},listen:function(){this.$element.on("focus",t.proxy(this.focus,this)).on("blur",t.proxy(this.blur,this)).on("keypress",t.proxy(this.keypress,this)).on("keyup",t.proxy(this.keyup,this)),this.eventSupported("keydown")&&this.$element.on("keydown",t.proxy(this.keydown,this)),this.$menu.on("click",t.proxy(this.click,this)).on("mouseenter","li",t.proxy(this.mouseenter,this)).on("mouseleave","li",t.proxy(this.mouseleave,this))},eventSupported:function(t){var e=t in this.$element;return e||(this.$element.setAttribute(t,"return;"),e="function"==typeof this.$element[t]),e},move:function(t){if(this.shown){switch(t.keyCode){case 9:case 13:case 27:t.preventDefault();break;case 38:t.preventDefault(),this.prev();break;case 40:t.preventDefault(),this.next()}t.stopPropagation()}},keydown:function(e){this.suppressKeyPressRepeat=~t.inArray(e.keyCode,[40,38,9,13,27]),this.move(e)},keypress:function(t){this.suppressKeyPressRepeat||this.move(t)},keyup:function(t){switch(t.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}t.stopPropagation(),t.preventDefault()},focus:function(){this.focused=!0},blur:function(){this.focused=!1,!this.mousedover&&this.shown&&this.hide()},click:function(t){t.stopPropagation(),t.preventDefault(),this.select(),this.$element.focus()},mouseenter:function(e){this.mousedover=!0,this.$menu.find(".active").removeClass("active"),t(e.currentTarget).addClass("active")},mouseleave:function(){this.mousedover=!1,!this.focused&&this.shown&&this.hide()}};var s=t.fn.typeahead;t.fn.typeahead=function(s){return this.each(function(){var i=t(this),n=i.data("typeahead"),h="object"==typeof s&&s;n||i.data("typeahead",n=new e(this,h)),"string"==typeof s&&n[s]()})},t.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>',minLength:1},t.fn.typeahead.Constructor=e,t.fn.typeahead.noConflict=function(){return t.fn.typeahead=s,this},t(document).on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(){var e=t(this);e.data("typeahead")||e.typeahead(e.data())})}(window.jQuery);
\ No newline at end of file
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
div.dataTables_length label {
font-weight: normal;
text-align: left;
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
!function(e){var t,i;!function(){function e(e,t){if(!t)return e;if(0===e.indexOf(".")){var i=t.split("/"),n=e.split("/"),a=i.length-1,o=n.length,r=0,s=0;e:for(var l=0;o>l;l++)switch(n[l]){case"..":if(!(a>r))break e;r++,s++;break;case".":s++;break;default:break e}return i.length=a-r,n=n.slice(s),i.concat(n).join("/")}return e}function n(t){function i(i,r){if("string"==typeof i){var s=n[i];return s||(s=o(e(i,t)),n[i]=s),s}i instanceof Array&&(r=r||function(){},r.apply(this,a(i,r,t)))}var n={};return i}function a(i,n,a){for(var s=[],l=r[a],h=0,m=Math.min(i.length,n.length);m>h;h++){var V,U=e(i[h],a);switch(U){case"require":V=l&&l.require||t;break;case"exports":V=l.exports;break;case"module":V=l;break;default:V=o(U)}s.push(V)}return s}function o(e){var t=r[e];if(!t)throw new Error("No "+e);if(!t.defined){var i=t.factory,n=i.apply(this,a(t.deps||[],i,e));"undefined"!=typeof n&&(t.exports=n),t.defined=1}return t.exports}var r={};i=function(e,t,i){r[e]={id:e,deps:t,factory:i,defined:0,exports:{},require:n(e)}},t=n("")}(),i("echarts",["echarts/echarts"],function(e){return e}),i("echarts/echarts",["require","./config","zrender/tool/util","zrender/tool/event","zrender/tool/env","zrender","zrender/config","./chart/island","./component/toolbox","./component","./component/title","./component/tooltip","./component/legend","./util/ecData","./chart","zrender/tool/color","./component/timeline","zrender/shape/Image","zrender/loadingEffect/Bar","zrender/loadingEffect/Bubble","zrender/loadingEffect/DynamicLine","zrender/loadingEffect/Ring","zrender/loadingEffect/Spin","zrender/loadingEffect/Whirling","./theme/macarons","./theme/infographic"],function(e){function t(){r.Dispatcher.call(this)}function i(e){e.innerHTML="",this._themeConfig={},this.dom=e,this._connected=!1,this._status={dragIn:!1,dragOut:!1,needRefresh:!1},this._curEventType=!1,this._chartList=[],this._messageCenter=new t,this._messageCenterOutSide=new t,this.resize=this.resize(),this._init()}function n(e,t,i,n,a){for(var o=e._chartList,r=o.length;r--;){var s=o[r];"function"==typeof s[t]&&s[t](i,n,a)}}var a=e("./config"),o=e("zrender/tool/util"),r=e("zrender/tool/event"),s={},l=e("zrender/tool/env").canvasSupported,h=new Date-0,m={},V="_echarts_instance_";s.version="2.2.7",s.dependencies={zrender:"2.1.1"},s.init=function(t,n){var a=e("zrender");a.version.replace(".","")-0<s.dependencies.zrender.replace(".","")-0&&console.error("ZRender "+a.version+" is too old for ECharts "+s.version+". Current version need ZRender "+s.dependencies.zrender+"+"),t=t instanceof Array?t[0]:t;var o=t.getAttribute(V);return o||(o=h++,t.setAttribute(V,o)),m[o]&&m[o].dispose(),m[o]=new i(t),m[o].id=o,m[o].canvasSupported=l,m[o].setTheme(n),m[o]},s.getInstanceById=function(e){return m[e]},o.merge(t.prototype,r.Dispatcher.prototype,!0);var U=e("zrender/config").EVENT,d=["CLICK","DBLCLICK","MOUSEOVER","MOUSEOUT","DRAGSTART","DRAGEND","DRAGENTER","DRAGOVER","DRAGLEAVE","DROP"];return i.prototype={_init:function(){var t=this,i=e("zrender").init(this.dom);this._zr=i,this._messageCenter.dispatch=function(e,i,n,a){n=n||{},n.type=e,n.event=i,t._messageCenter.dispatchWithContext(e,n,a),t._messageCenterOutSide.dispatchWithContext(e,n,a)},this._onevent=function(e){return t.__onevent(e)};for(var n in a.EVENT)"CLICK"!=n&&"DBLCLICK"!=n&&"HOVER"!=n&&"MOUSEOUT"!=n&&"MAP_ROAM"!=n&&this._messageCenter.bind(a.EVENT[n],this._onevent,this);var o={};this._onzrevent=function(e){return t[o[e.type]](e)};for(var r=0,s=d.length;s>r;r++){var l=d[r],h=U[l];o[h]="_on"+l.toLowerCase(),i.on(h,this._onzrevent)}this.chart={},this.component={};var m=e("./chart/island");this._island=new m(this._themeConfig,this._messageCenter,i,{},this),this.chart.island=this._island;var V=e("./component/toolbox");this._toolbox=new V(this._themeConfig,this._messageCenter,i,{},this),this.component.toolbox=this._toolbox;var p=e("./component");p.define("title",e("./component/title")),p.define("tooltip",e("./component/tooltip")),p.define("legend",e("./component/legend")),(0===i.getWidth()||0===i.getHeight())&&console.error("Dom’s width & height should be ready before init.")},__onevent:function(e){e.__echartsId=e.__echartsId||this.id;var t=e.__echartsId===this.id;switch(this._curEventType||(this._curEventType=e.type),e.type){case a.EVENT.LEGEND_SELECTED:this._onlegendSelected(e);break;case a.EVENT.DATA_ZOOM:if(!t){var i=this.component.dataZoom;i&&(i.silence(!0),i.absoluteZoom(e.zoom),i.silence(!1))}this._ondataZoom(e);break;case a.EVENT.DATA_RANGE:t&&this._ondataRange(e);break;case a.EVENT.MAGIC_TYPE_CHANGED:if(!t){var n=this.component.toolbox;n&&(n.silence(!0),n.setMagicType(e.magicType),n.silence(!1))}this._onmagicTypeChanged(e);break;case a.EVENT.DATA_VIEW_CHANGED:t&&this._ondataViewChanged(e);break;case a.EVENT.TOOLTIP_HOVER:t&&this._tooltipHover(e);break;case a.EVENT.RESTORE:this._onrestore();break;case a.EVENT.REFRESH:t&&this._onrefresh(e);break;case a.EVENT.TOOLTIP_IN_GRID:case a.EVENT.TOOLTIP_OUT_GRID:if(t){if(this._connected){var o=this.component.grid;o&&(e.x=(e.event.zrenderX-o.getX())/o.getWidth(),e.y=(e.event.zrenderY-o.getY())/o.getHeight())}}else{var o=this.component.grid;o&&this._zr.trigger("mousemove",{connectTrigger:!0,zrenderX:o.getX()+e.x*o.getWidth(),zrenderY:o.getY()+e.y*o.getHeight()})}}if(this._connected&&t&&this._curEventType===e.type){for(var r in this._connected)this._connected[r].connectedEventHandler(e);this._curEventType=null}(!t||!this._connected&&t)&&(this._curEventType=null)},_onclick:function(e){if(n(this,"onclick",e),e.target){var t=this._eventPackage(e.target);t&&null!=t.seriesIndex&&this._messageCenter.dispatch(a.EVENT.CLICK,e.event,t,this)}},_ondblclick:function(e){if(n(this,"ondblclick",e),e.target){var t=this._eventPackage(e.target);t&&null!=t.seriesIndex&&this._messageCenter.dispatch(a.EVENT.DBLCLICK,e.event,t,this)}},_onmouseover:function(e){if(e.target){var t=this._eventPackage(e.target);t&&null!=t.seriesIndex&&this._messageCenter.dispatch(a.EVENT.HOVER,e.event,t,this)}},_onmouseout:function(e){if(e.target){var t=this._eventPackage(e.target);t&&null!=t.seriesIndex&&this._messageCenter.dispatch(a.EVENT.MOUSEOUT,e.event,t,this)}},_ondragstart:function(e){this._status={dragIn:!1,dragOut:!1,needRefresh:!1},n(this,"ondragstart",e)},_ondragenter:function(e){n(this,"ondragenter",e)},_ondragover:function(e){n(this,"ondragover",e)},_ondragleave:function(e){n(this,"ondragleave",e)},_ondrop:function(e){n(this,"ondrop",e,this._status),this._island.ondrop(e,this._status)},_ondragend:function(e){if(n(this,"ondragend",e,this._status),this._timeline&&this._timeline.ondragend(e,this._status),this._island.ondragend(e,this._status),this._status.needRefresh){this._syncBackupData(this._option);var t=this._messageCenter;t.dispatch(a.EVENT.DATA_CHANGED,e.event,this._eventPackage(e.target),this),t.dispatch(a.EVENT.REFRESH,null,null,this)}},_onlegendSelected:function(e){this._status.needRefresh=!1,n(this,"onlegendSelected",e,this._status),this._status.needRefresh&&this._messageCenter.dispatch(a.EVENT.REFRESH,null,null,this)},_ondataZoom:function(e){this._status.needRefresh=!1,n(this,"ondataZoom",e,this._status),this._status.needRefresh&&this._messageCenter.dispatch(a.EVENT.REFRESH,null,null,this)},_ondataRange:function(e){this._clearEffect(),this._status.needRefresh=!1,n(this,"ondataRange",e,this._status),this._status.needRefresh&&this._zr.refreshNextFrame()},_onmagicTypeChanged:function(){this._clearEffect(),this._render(this._toolbox.getMagicOption())},_ondataViewChanged:function(e){this._syncBackupData(e.option),this._messageCenter.dispatch(a.EVENT.DATA_CHANGED,null,e,this),this._messageCenter.dispatch(a.EVENT.REFRESH,null,null,this)},_tooltipHover:function(e){var t=[];n(this,"ontooltipHover",e,t)},_onrestore:function(){this.restore()},_onrefresh:function(e){this._refreshInside=!0,this.refresh(e),this._refreshInside=!1},_syncBackupData:function(e){this.component.dataZoom&&this.component.dataZoom.syncBackupData(e)},_eventPackage:function(t){if(t){var i=e("./util/ecData"),n=i.get(t,"seriesIndex"),a=i.get(t,"dataIndex");return a=-1!=n&&this.component.dataZoom?this.component.dataZoom.getRealDataIndex(n,a):a,{seriesIndex:n,seriesName:(i.get(t,"series")||{}).name,dataIndex:a,data:i.get(t,"data"),name:i.get(t,"name"),value:i.get(t,"value"),special:i.get(t,"special")}}},_noDataCheck:function(e){for(var t=e.series,i=0,n=t.length;n>i;i++)if(t[i].type==a.CHART_TYPE_MAP||t[i].data&&t[i].data.length>0||t[i].markPoint&&t[i].markPoint.data&&t[i].markPoint.data.length>0||t[i].markLine&&t[i].markLine.data&&t[i].markLine.data.length>0||t[i].nodes&&t[i].nodes.length>0||t[i].links&&t[i].links.length>0||t[i].matrix&&t[i].matrix.length>0||t[i].eventList&&t[i].eventList.length>0)return!1;var o=this._option&&this._option.noDataLoadingOption||this._themeConfig.noDataLoadingOption||a.noDataLoadingOption||{text:this._option&&this._option.noDataText||this._themeConfig.noDataText||a.noDataText,effect:this._option&&this._option.noDataEffect||this._themeConfig.noDataEffect||a.noDataEffect};return this.clear(),this.showLoading(o),!0},_render:function(t){if(this._mergeGlobalConifg(t),!this._noDataCheck(t)){var i=t.backgroundColor;if(i)if(l||-1==i.indexOf("rgba"))this.dom.style.backgroundColor=i;else{var n=i.split(",");this.dom.style.filter="alpha(opacity="+100*n[3].substring(0,n[3].lastIndexOf(")"))+")",n.length=3,n[0]=n[0].replace("a",""),this.dom.style.backgroundColor=n.join(",")+")"}this._zr.clearAnimation(),this._chartList=[];var o=e("./chart"),r=e("./component");(t.xAxis||t.yAxis)&&(t.grid=t.grid||{},t.dataZoom=t.dataZoom||{});for(var s,h,m,V=["title","legend","tooltip","dataRange","roamController","grid","dataZoom","xAxis","yAxis","polar"],U=0,d=V.length;d>U;U++)h=V[U],m=this.component[h],t[h]?(m?m.refresh&&m.refresh(t):(s=r.get(/^[xy]Axis$/.test(h)?"axis":h),m=new s(this._themeConfig,this._messageCenter,this._zr,t,this,h),this.component[h]=m),this._chartList.push(m)):m&&(m.dispose(),this.component[h]=null,delete this.component[h]);for(var p,c,u,y={},U=0,d=t.series.length;d>U;U++)c=t.series[U].type,c?y[c]||(y[c]=!0,p=o.get(c),p?(this.chart[c]?(u=this.chart[c],u.refresh(t)):u=new p(this._themeConfig,this._messageCenter,this._zr,t,this),this._chartList.push(u),this.chart[c]=u):console.error(c+" has not been required.")):console.error("series["+U+"] chart type has not been defined.");for(c in this.chart)c==a.CHART_TYPE_ISLAND||y[c]||(this.chart[c].dispose(),this.chart[c]=null,delete this.chart[c]);this.component.grid&&this.component.grid.refixAxisShape(this.component),this._island.refresh(t),this._toolbox.refresh(t),t.animation&&!t.renderAsImage?this._zr.refresh():this._zr.render();var g="IMG"+this.id,b=document.getElementById(g);t.renderAsImage&&l?(b?b.src=this.getDataURL(t.renderAsImage):(b=this.getImage(t.renderAsImage),b.id=g,b.style.position="absolute",b.style.left=0,b.style.top=0,this.dom.firstChild.appendChild(b)),this.un(),this._zr.un(),this._disposeChartList(),this._zr.clear()):b&&b.parentNode.removeChild(b),b=null,this._option=t}},restore:function(){this._clearEffect(),this._option=o.clone(this._optionRestore),this._disposeChartList(),this._island.clear(),this._toolbox.reset(this._option,!0),this._render(this._option)},refresh:function(e){this._clearEffect(),e=e||{};var t=e.option;!this._refreshInside&&t&&(t=this.getOption(),o.merge(t,e.option,!0),o.merge(this._optionRestore,e.option,!0),this._toolbox.reset(t)),this._island.refresh(t),this._toolbox.refresh(t),this._zr.clearAnimation();for(var i=0,n=this._chartList.length;n>i;i++)this._chartList[i].refresh&&this._chartList[i].refresh(t);this.component.grid&&this.component.grid.refixAxisShape(this.component),this._zr.refresh()},_disposeChartList:function(){this._clearEffect(),this._zr.clearAnimation();for(var e=this._chartList.length;e--;){var t=this._chartList[e];if(t){var i=t.type;this.chart[i]&&delete this.chart[i],this.component[i]&&delete this.component[i],t.dispose&&t.dispose()}}this._chartList=[]},_mergeGlobalConifg:function(t){for(var i=["backgroundColor","calculable","calculableColor","calculableHolderColor","nameConnector","valueConnector","animation","animationThreshold","animationDuration","animationDurationUpdate","animationEasing","addDataAnimation","symbolList","DRAG_ENABLE_TIME"],n=i.length;n--;){var o=i[n];null==t[o]&&(t[o]=null!=this._themeConfig[o]?this._themeConfig[o]:a[o])}var r=t.color;r&&r.length||(r=this._themeConfig.color||a.color),this._zr.getColor=function(t){var i=e("zrender/tool/color");return i.getColor(t,r)},l||(t.animation=!1,t.addDataAnimation=!1)},setOption:function(e,t){return e.timeline?this._setTimelineOption(e):this._setOption(e,t)},_setOption:function(e,t,i){return!t&&this._option?this._option=o.merge(this.getOption(),o.clone(e),!0):(this._option=o.clone(e),!i&&this._timeline&&this._timeline.dispose()),this._optionRestore=o.clone(this._option),this._option.series&&0!==this._option.series.length?(this.component.dataZoom&&(this._option.dataZoom||this._option.toolbox&&this._option.toolbox.feature&&this._option.toolbox.feature.dataZoom&&this._option.toolbox.feature.dataZoom.show)&&this.component.dataZoom.syncOption(this._option),this._toolbox.reset(this._option),this._render(this._option),this):void this._zr.clear()},getOption:function(){function e(e){var n=i._optionRestore[e];if(n)if(n instanceof Array)for(var a=n.length;a--;)t[e][a].data=o.clone(n[a].data);else t[e].data=o.clone(n.data)}var t=o.clone(this._option),i=this;return e("xAxis"),e("yAxis"),e("series"),t},setSeries:function(e,t){return t?(this._option.series=e,this.setOption(this._option,t)):this.setOption({series:e}),this},getSeries:function(){return this.getOption().series},_setTimelineOption:function(t){this._timeline&&this._timeline.dispose();var i=e("./component/timeline"),n=new i(this._themeConfig,this._messageCenter,this._zr,t,this);return this._timeline=n,this.component.timeline=this._timeline,this},addData:function(e,t,i,n,r){function s(){if(V._zr){V._zr.clearAnimation();for(var e=0,t=X.length;t>e;e++)X[e].motionlessOnce=h.addDataAnimation&&X[e].addDataAnimation;V._messageCenter.dispatch(a.EVENT.REFRESH,null,{option:h},V)}}for(var l=e instanceof Array?e:[[e,t,i,n,r]],h=this.getOption(),m=this._optionRestore,V=this,U=0,d=l.length;d>U;U++){e=l[U][0],t=l[U][1],i=l[U][2],n=l[U][3],r=l[U][4];var p=m.series[e],c=i?"unshift":"push",u=i?"pop":"shift";if(p){var y=p.data,g=h.series[e].data;if(y[c](t),g[c](t),n||(y[u](),t=g[u]()),null!=r){var b,f;if(p.type===a.CHART_TYPE_PIE&&(b=m.legend)&&(f=b.data)){var k=h.legend.data;if(f[c](r),k[c](r),!n){var x=o.indexOf(f,t.name);-1!=x&&f.splice(x,1),x=o.indexOf(k,t.name),-1!=x&&k.splice(x,1)}}else if(null!=m.xAxis&&null!=m.yAxis){var _,L,W=p.xAxisIndex||0;(null==m.xAxis[W].type||"category"===m.xAxis[W].type)&&(_=m.xAxis[W].data,L=h.xAxis[W].data,_[c](r),L[c](r),n||(_[u](),L[u]())),W=p.yAxisIndex||0,"category"===m.yAxis[W].type&&(_=m.yAxis[W].data,L=h.yAxis[W].data,_[c](r),L[c](r),n||(_[u](),L[u]()))}}this._option.series[e].data=h.series[e].data}}this._zr.clearAnimation();for(var X=this._chartList,v=0,w=function(){v--,0===v&&s()},U=0,d=X.length;d>U;U++)h.addDataAnimation&&X[U].addDataAnimation&&(v++,X[U].addDataAnimation(l,w));return this.component.dataZoom&&this.component.dataZoom.syncOption(h),this._option=h,h.addDataAnimation||setTimeout(s,0),this},addMarkPoint:function(e,t){return this._addMark(e,t,"markPoint")},addMarkLine:function(e,t){return this._addMark(e,t,"markLine")},_addMark:function(e,t,i){var n,a=this._option.series;if(a&&(n=a[e])){var r=this._optionRestore.series,s=r[e],l=n[i],h=s[i];l=n[i]=l||{data:[]},h=s[i]=h||{data:[]};for(var m in t)"data"===m?(l.data=l.data.concat(t.data),h.data=h.data.concat(t.data)):"object"!=typeof t[m]||null==l[m]?l[m]=h[m]=t[m]:(o.merge(l[m],t[m],!0),o.merge(h[m],t[m],!0));var V=this.chart[n.type];V&&V.addMark(e,t,i)}return this},delMarkPoint:function(e,t){return this._delMark(e,t,"markPoint")},delMarkLine:function(e,t){return this._delMark(e,t,"markLine")},_delMark:function(e,t,i){var n,a,o,r=this._option.series;if(!(r&&(n=r[e])&&(a=n[i])&&(o=a.data)))return this;t=t.split(" > ");for(var s=-1,l=0,h=o.length;h>l;l++){var m=o[l];if(m instanceof Array){if(m[0].name===t[0]&&m[1].name===t[1]){s=l;break}}else if(m.name===t[0]){s=l;break}}if(s>-1){o.splice(s,1),this._optionRestore.series[e][i].data.splice(s,1);var V=this.chart[n.type];V&&V.delMark(e,t.join(" > "),i)}return this},getDom:function(){return this.dom},getZrender:function(){return this._zr},getDataURL:function(e){if(!l)return"";if(0===this._chartList.length){var t="IMG"+this.id,i=document.getElementById(t);if(i)return i.src}var n=this.component.tooltip;switch(n&&n.hideTip(),e){case"jpeg":break;default:e="png"}var a=this._option.backgroundColor;return a&&"rgba(0,0,0,0)"===a.replace(" ","")&&(a="#fff"),this._zr.toDataURL("image/"+e,a)},getImage:function(e){var t=this._optionRestore.title,i=document.createElement("img");return i.src=this.getDataURL(e),i.title=t&&t.text||"ECharts",i},getConnectedDataURL:function(t){if(!this.isConnected())return this.getDataURL(t);var i=this.dom,n={self:{img:this.getDataURL(t),left:i.offsetLeft,top:i.offsetTop,right:i.offsetLeft+i.offsetWidth,bottom:i.offsetTop+i.offsetHeight}},a=n.self.left,o=n.self.top,r=n.self.right,s=n.self.bottom;for(var l in this._connected)i=this._connected[l].getDom(),n[l]={img:this._connected[l].getDataURL(t),left:i.offsetLeft,top:i.offsetTop,right:i.offsetLeft+i.offsetWidth,bottom:i.offsetTop+i.offsetHeight},a=Math.min(a,n[l].left),o=Math.min(o,n[l].top),r=Math.max(r,n[l].right),s=Math.max(s,n[l].bottom);var h=document.createElement("div");h.style.position="absolute",h.style.left="-4000px",h.style.width=r-a+"px",h.style.height=s-o+"px",document.body.appendChild(h);var m=e("zrender").init(h),V=e("zrender/shape/Image");for(var l in n)m.addShape(new V({style:{x:n[l].left-a,y:n[l].top-o,image:n[l].img}}));m.render();var U=this._option.backgroundColor;U&&"rgba(0,0,0,0)"===U.replace(/ /g,"")&&(U="#fff");var d=m.toDataURL("image/png",U);return setTimeout(function(){m.dispose(),h.parentNode.removeChild(h),h=null},100),d},getConnectedImage:function(e){var t=this._optionRestore.title,i=document.createElement("img");return i.src=this.getConnectedDataURL(e),i.title=t&&t.text||"ECharts",i},on:function(e,t){return this._messageCenterOutSide.bind(e,t,this),this},un:function(e,t){return this._messageCenterOutSide.unbind(e,t),this},connect:function(e){if(!e)return this;if(this._connected||(this._connected={}),e instanceof Array)for(var t=0,i=e.length;i>t;t++)this._connected[e[t].id]=e[t];else this._connected[e.id]=e;return this},disConnect:function(e){if(!e||!this._connected)return this;if(e instanceof Array)for(var t=0,i=e.length;i>t;t++)delete this._connected[e[t].id];else delete this._connected[e.id];for(var n in this._connected)return this;return this._connected=!1,this},connectedEventHandler:function(e){e.__echartsId!=this.id&&this._onevent(e)},isConnected:function(){return!!this._connected},showLoading:function(t){var i={bar:e("zrender/loadingEffect/Bar"),bubble:e("zrender/loadingEffect/Bubble"),dynamicLine:e("zrender/loadingEffect/DynamicLine"),ring:e("zrender/loadingEffect/Ring"),spin:e("zrender/loadingEffect/Spin"),whirling:e("zrender/loadingEffect/Whirling")};this._toolbox.hideDataView(),t=t||{};var n=t.textStyle||{};t.textStyle=n;var r=o.merge(o.merge(o.clone(n),this._themeConfig.textStyle),a.textStyle);n.textFont=r.fontStyle+" "+r.fontWeight+" "+r.fontSize+"px "+r.fontFamily,n.text=t.text||this._option&&this._option.loadingText||this._themeConfig.loadingText||a.loadingText,null!=t.x&&(n.x=t.x),null!=t.y&&(n.y=t.y),t.effectOption=t.effectOption||{},t.effectOption.textStyle=n;var s=t.effect;return("string"==typeof s||null==s)&&(s=i[t.effect||this._option&&this._option.loadingEffect||this._themeConfig.loadingEffect||a.loadingEffect]||i.spin),this._zr.showLoading(new s(t.effectOption)),this},hideLoading:function(){return this._zr.hideLoading(),this},setTheme:function(t){if(t){if("string"==typeof t)switch(t){case"macarons":t=e("./theme/macarons");break;case"infographic":t=e("./theme/infographic");break;default:t={}}else t=t||{};this._themeConfig=t}if(!l){var i=this._themeConfig.textStyle;i&&i.fontFamily&&i.fontFamily2&&(i.fontFamily=i.fontFamily2),i=a.textStyle,i.fontFamily=i.fontFamily2}this._timeline&&this._timeline.setTheme(!0),this._optionRestore&&this.restore()},resize:function(){var e=this;return function(){if(e._clearEffect(),e._zr.resize(),e._option&&e._option.renderAsImage&&l)return e._render(e._option),e;e._zr.clearAnimation(),e._island.resize(),e._toolbox.resize(),e._timeline&&e._timeline.resize();for(var t=0,i=e._chartList.length;i>t;t++)e._chartList[t].resize&&e._chartList[t].resize();return e.component.grid&&e.component.grid.refixAxisShape(e.component),e._zr.refresh(),e._messageCenter.dispatch(a.EVENT.RESIZE,null,null,e),e}},_clearEffect:function(){this._zr.modLayer(a.EFFECT_ZLEVEL,{motionBlur:!1}),this._zr.painter.clearLayer(a.EFFECT_ZLEVEL)},clear:function(){return this._disposeChartList(),this._zr.clear(),this._option={},this._optionRestore={},this.dom.style.backgroundColor=null,this},dispose:function(){var e=this.dom.getAttribute(V);e&&delete m[e],this._island.dispose(),this._toolbox.dispose(),this._timeline&&this._timeline.dispose(),this._messageCenter.unbind(),this.clear(),this._zr.dispose(),this._zr=null}},s}),i("echarts/config",[],function(){var e={CHART_TYPE_LINE:"line",CHART_TYPE_BAR:"bar",CHART_TYPE_SCATTER:"scatter",CHART_TYPE_PIE:"pie",CHART_TYPE_RADAR:"radar",CHART_TYPE_VENN:"venn",CHART_TYPE_TREEMAP:"treemap",CHART_TYPE_TREE:"tree",CHART_TYPE_MAP:"map",CHART_TYPE_K:"k",CHART_TYPE_ISLAND:"island",CHART_TYPE_FORCE:"force",CHART_TYPE_CHORD:"chord",CHART_TYPE_GAUGE:"gauge",CHART_TYPE_FUNNEL:"funnel",CHART_TYPE_EVENTRIVER:"eventRiver",CHART_TYPE_WORDCLOUD:"wordCloud",CHART_TYPE_HEATMAP:"heatmap",COMPONENT_TYPE_TITLE:"title",COMPONENT_TYPE_LEGEND:"legend",COMPONENT_TYPE_DATARANGE:"dataRange",COMPONENT_TYPE_DATAVIEW:"dataView",COMPONENT_TYPE_DATAZOOM:"dataZoom",COMPONENT_TYPE_TOOLBOX:"toolbox",COMPONENT_TYPE_TOOLTIP:"tooltip",COMPONENT_TYPE_GRID:"grid",COMPONENT_TYPE_AXIS:"axis",COMPONENT_TYPE_POLAR:"polar",COMPONENT_TYPE_X_AXIS:"xAxis",COMPONENT_TYPE_Y_AXIS:"yAxis",COMPONENT_TYPE_AXIS_CATEGORY:"categoryAxis",COMPONENT_TYPE_AXIS_VALUE:"valueAxis",COMPONENT_TYPE_TIMELINE:"timeline",COMPONENT_TYPE_ROAMCONTROLLER:"roamController",backgroundColor:"rgba(0,0,0,0)",color:["#ff7f50","#87cefa","#da70d6","#32cd32","#6495ed","#ff69b4","#ba55d3","#cd5c5c","#ffa500","#40e0d0","#1e90ff","#ff6347","#7b68ee","#00fa9a","#ffd700","#6699FF","#ff6666","#3cb371","#b8860b","#30e0e0"],markPoint:{clickable:!0,symbol:"pin",symbolSize:10,large:!1,effect:{show:!1,loop:!0,period:15,type:"scale",scaleSize:2,bounceDistance:10},itemStyle:{normal:{borderWidth:2,label:{show:!0,position:"inside"}},emphasis:{label:{show:!0}}}},markLine:{clickable:!0,symbol:["circle","arrow"],symbolSize:[2,4],smoothness:.2,precision:2,effect:{show:!1,loop:!0,period:15,scaleSize:2},bundling:{enable:!1,maxTurningAngle:45},itemStyle:{normal:{borderWidth:1.5,label:{show:!0,position:"end"},lineStyle:{type:"dashed"}},emphasis:{label:{show:!1},lineStyle:{}}}},textStyle:{decoration:"none",fontFamily:"Arial, Verdana, sans-serif",fontFamily2:"微软雅黑",fontSize:12,fontStyle:"normal",fontWeight:"normal"},EVENT:{REFRESH:"refresh",RESTORE:"restore",RESIZE:"resize",CLICK:"click",DBLCLICK:"dblclick",HOVER:"hover",MOUSEOUT:"mouseout",DATA_CHANGED:"dataChanged",DATA_ZOOM:"dataZoom",DATA_RANGE:"dataRange",DATA_RANGE_SELECTED:"dataRangeSelected",DATA_RANGE_HOVERLINK:"dataRangeHoverLink",LEGEND_SELECTED:"legendSelected",LEGEND_HOVERLINK:"legendHoverLink",MAP_SELECTED:"mapSelected",PIE_SELECTED:"pieSelected",MAGIC_TYPE_CHANGED:"magicTypeChanged",DATA_VIEW_CHANGED:"dataViewChanged",TIMELINE_CHANGED:"timelineChanged",MAP_ROAM:"mapRoam",FORCE_LAYOUT_END:"forceLayoutEnd",TOOLTIP_HOVER:"tooltipHover",TOOLTIP_IN_GRID:"tooltipInGrid",TOOLTIP_OUT_GRID:"tooltipOutGrid",ROAMCONTROLLER:"roamController"},DRAG_ENABLE_TIME:120,EFFECT_ZLEVEL:10,effectBlendAlpha:.95,symbolList:["circle","rectangle","triangle","diamond","emptyCircle","emptyRectangle","emptyTriangle","emptyDiamond"],loadingEffect:"spin",loadingText:"数据读取中...",noDataEffect:"bubble",noDataText:"暂无数据",calculable:!1,calculableColor:"rgba(255,165,0,0.6)",calculableHolderColor:"#ccc",nameConnector:" & ",valueConnector:": ",animation:!0,addDataAnimation:!0,animationThreshold:2e3,animationDuration:2e3,animationDurationUpdate:500,animationEasing:"ExponentialOut"};return e}),i("zrender/tool/util",["require","../dep/excanvas"],function(e){function t(e){return e&&1===e.nodeType&&"string"==typeof e.nodeName}function i(e){if("object"==typeof e&&null!==e){var n=e;if(e instanceof Array){n=[];for(var a=0,o=e.length;o>a;a++)n[a]=i(e[a])}else if(!y[g.call(e)]&&!t(e)){n={};for(var r in e)e.hasOwnProperty(r)&&(n[r]=i(e[r]))}return n}return e}function n(e,i,n,o){if(i.hasOwnProperty(n)){var r=e[n];"object"!=typeof r||y[g.call(r)]||t(r)?!o&&n in e||(e[n]=i[n]):a(e[n],i[n],o)}}function a(e,t,i){for(var a in t)n(e,t,a,i);return e}function o(){if(!U)if(e("../dep/excanvas"),window.G_vmlCanvasManager){var t=document.createElement("div");t.style.position="absolute",t.style.top="-1000px",document.body.appendChild(t),U=G_vmlCanvasManager.initElement(t).getContext("2d")}else U=document.createElement("canvas").getContext("2d");return U}function r(e,t){if(e.indexOf)return e.indexOf(t);for(var i=0,n=e.length;n>i;i++)if(e[i]===t)return i;return-1}function s(e,t){function i(){}var n=e.prototype;i.prototype=t.prototype,e.prototype=new i;for(var a in n)e.prototype[a]=n[a];e.constructor=e}function l(e,t,i){if(e&&t)if(e.forEach&&e.forEach===p)e.forEach(t,i);else if(e.length===+e.length)for(var n=0,a=e.length;a>n;n++)t.call(i,e[n],n,e);else for(var o in e)e.hasOwnProperty(o)&&t.call(i,e[o],o,e)}function h(e,t,i){if(e&&t){if(e.map&&e.map===c)return e.map(t,i);for(var n=[],a=0,o=e.length;o>a;a++)n.push(t.call(i,e[a],a,e));return n}}function m(e,t,i){if(e&&t){if(e.filter&&e.filter===u)return e.filter(t,i);for(var n=[],a=0,o=e.length;o>a;a++)t.call(i,e[a],a,e)&&n.push(e[a]);return n}}function V(e,t){return function(){e.apply(t,arguments)}}var U,d=Array.prototype,p=d.forEach,c=d.map,u=d.filter,y={"[object Function]":1,"[object RegExp]":1,"[object Date]":1,"[object Error]":1,"[object CanvasGradient]":1},g=Object.prototype.toString;return{inherits:s,clone:i,merge:a,getContext:o,indexOf:r,each:l,map:h,filter:m,bind:V}}),i("zrender/tool/event",["require","../mixin/Eventful"],function(e){"use strict";function t(e){return"undefined"!=typeof e.zrenderX&&e.zrenderX||"undefined"!=typeof e.offsetX&&e.offsetX||"undefined"!=typeof e.layerX&&e.layerX||"undefined"!=typeof e.clientX&&e.clientX}function i(e){return"undefined"!=typeof e.zrenderY&&e.zrenderY||"undefined"!=typeof e.offsetY&&e.offsetY||"undefined"!=typeof e.layerY&&e.layerY||"undefined"!=typeof e.clientY&&e.clientY}function n(e){return"undefined"!=typeof e.zrenderDelta&&e.zrenderDelta||"undefined"!=typeof e.wheelDelta&&e.wheelDelta||"undefined"!=typeof e.detail&&-e.detail}var a=e("../mixin/Eventful"),o="function"==typeof window.addEventListener?function(e){e.preventDefault(),e.stopPropagation(),e.cancelBubble=!0}:function(e){e.returnValue=!1,e.cancelBubble=!0};return{getX:t,getY:i,getDelta:n,stop:o,Dispatcher:a}}),i("zrender/tool/env",[],function(){function e(e){var t=this.os={},i=this.browser={},n=e.match(/Web[kK]it[\/]{0,1}([\d.]+)/),a=e.match(/(Android);?[\s\/]+([\d.]+)?/),o=e.match(/(iPad).*OS\s([\d_]+)/),r=e.match(/(iPod)(.*OS\s([\d_]+))?/),s=!o&&e.match(/(iPhone\sOS)\s([\d_]+)/),l=e.match(/(webOS|hpwOS)[\s\/]([\d.]+)/),h=l&&e.match(/TouchPad/),m=e.match(/Kindle\/([\d.]+)/),V=e.match(/Silk\/([\d._]+)/),U=e.match(/(BlackBerry).*Version\/([\d.]+)/),d=e.match(/(BB10).*Version\/([\d.]+)/),p=e.match(/(RIM\sTablet\sOS)\s([\d.]+)/),c=e.match(/PlayBook/),u=e.match(/Chrome\/([\d.]+)/)||e.match(/CriOS\/([\d.]+)/),y=e.match(/Firefox\/([\d.]+)/),g=e.match(/MSIE ([\d.]+)/),b=n&&e.match(/Mobile\//)&&!u,f=e.match(/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/)&&!u,g=e.match(/MSIE\s([\d.]+)/);return(i.webkit=!!n)&&(i.version=n[1]),a&&(t.android=!0,t.version=a[2]),s&&!r&&(t.ios=t.iphone=!0,t.version=s[2].replace(/_/g,".")),o&&(t.ios=t.ipad=!0,t.version=o[2].replace(/_/g,".")),r&&(t.ios=t.ipod=!0,t.version=r[3]?r[3].replace(/_/g,"."):null),l&&(t.webos=!0,t.version=l[2]),h&&(t.touchpad=!0),U&&(t.blackberry=!0,t.version=U[2]),d&&(t.bb10=!0,t.version=d[2]),p&&(t.rimtabletos=!0,t.version=p[2]),c&&(i.playbook=!0),m&&(t.kindle=!0,t.version=m[1]),V&&(i.silk=!0,i.version=V[1]),!V&&t.android&&e.match(/Kindle Fire/)&&(i.silk=!0),u&&(i.chrome=!0,i.version=u[1]),y&&(i.firefox=!0,i.version=y[1]),g&&(i.ie=!0,i.version=g[1]),b&&(e.match(/Safari/)||t.ios)&&(i.safari=!0),f&&(i.webview=!0),g&&(i.ie=!0,i.version=g[1]),t.tablet=!!(o||c||a&&!e.match(/Mobile/)||y&&e.match(/Tablet/)||g&&!e.match(/Phone/)&&e.match(/Touch/)),t.phone=!(t.tablet||t.ipod||!(a||s||l||U||d||u&&e.match(/Android/)||u&&e.match(/CriOS\/([\d.]+)/)||y&&e.match(/Mobile/)||g&&e.match(/Touch/))),{browser:i,os:t,canvasSupported:document.createElement("canvas").getContext?!0:!1}}return e(navigator.userAgent)}),i("zrender",["zrender/zrender"],function(e){return e}),i("zrender/zrender",["require","./dep/excanvas","./tool/util","./tool/log","./tool/guid","./Handler","./Painter","./Storage","./animation/Animation","./tool/env"],function(e){function t(e){return function(){e._needsRefreshNextFrame&&e.refresh()}}e("./dep/excanvas");var i=e("./tool/util"),n=e("./tool/log"),a=e("./tool/guid"),o=e("./Handler"),r=e("./Painter"),s=e("./Storage"),l=e("./animation/Animation"),h={},m={};m.version="2.1.1",m.init=function(e){var t=new V(a(),e);return h[t.id]=t,t},m.dispose=function(e){if(e)e.dispose();else{for(var t in h)h[t].dispose();h={}}return m},m.getInstance=function(e){return h[e]},m.delInstance=function(e){return delete h[e],m};var V=function(i,n){this.id=i,this.env=e("./tool/env"),this.storage=new s,this.painter=new r(n,this.storage),this.handler=new o(n,this.storage,this.painter),this.animation=new l({stage:{update:t(this)}}),this.animation.start();var a=this;this.painter.refreshNextFrame=function(){a.refreshNextFrame()},this._needsRefreshNextFrame=!1;var a=this,h=this.storage,m=h.delFromMap;h.delFromMap=function(e){var t=h.get(e);a.stopAnimation(t),m.call(h,e)}};return V.prototype.getId=function(){return this.id},V.prototype.addShape=function(e){return this.addElement(e),this},V.prototype.addGroup=function(e){return this.addElement(e),this},V.prototype.delShape=function(e){return this.delElement(e),this},V.prototype.delGroup=function(e){return this.delElement(e),this},V.prototype.modShape=function(e,t){return this.modElement(e,t),this},V.prototype.modGroup=function(e,t){return this.modElement(e,t),this},V.prototype.addElement=function(e){return this.storage.addRoot(e),this._needsRefreshNextFrame=!0,this},V.prototype.delElement=function(e){return this.storage.delRoot(e),this._needsRefreshNextFrame=!0,this},V.prototype.modElement=function(e,t){return this.storage.mod(e,t),this._needsRefreshNextFrame=!0,this},V.prototype.modLayer=function(e,t){return this.painter.modLayer(e,t),this._needsRefreshNextFrame=!0,this},V.prototype.addHoverShape=function(e){return this.storage.addHover(e),this},V.prototype.render=function(e){return this.painter.render(e),this._needsRefreshNextFrame=!1,this},V.prototype.refresh=function(e){return this.painter.refresh(e),this._needsRefreshNextFrame=!1,this},V.prototype.refreshNextFrame=function(){return this._needsRefreshNextFrame=!0,this},V.prototype.refreshHover=function(e){return this.painter.refreshHover(e),this},V.prototype.refreshShapes=function(e,t){return this.painter.refreshShapes(e,t),this},V.prototype.resize=function(){return this.painter.resize(),this},V.prototype.animate=function(e,t,a){var o=this;if("string"==typeof e&&(e=this.storage.get(e)),e){var r;if(t){for(var s=t.split("."),l=e,h=0,m=s.length;m>h;h++)l&&(l=l[s[h]]);l&&(r=l)}else r=e;if(!r)return void n('Property "'+t+'" is not existed in element '+e.id);
null==e.__animators&&(e.__animators=[]);var V=e.__animators,U=this.animation.animate(r,{loop:a}).during(function(){o.modShape(e)}).done(function(){var t=i.indexOf(e.__animators,U);t>=0&&V.splice(t,1)});return V.push(U),U}n("Element not existed")},V.prototype.stopAnimation=function(e){if(e.__animators){for(var t=e.__animators,i=t.length,n=0;i>n;n++)t[n].stop();t.length=0}return this},V.prototype.clearAnimation=function(){return this.animation.clear(),this},V.prototype.showLoading=function(e){return this.painter.showLoading(e),this},V.prototype.hideLoading=function(){return this.painter.hideLoading(),this},V.prototype.getWidth=function(){return this.painter.getWidth()},V.prototype.getHeight=function(){return this.painter.getHeight()},V.prototype.toDataURL=function(e,t,i){return this.painter.toDataURL(e,t,i)},V.prototype.shapeToImage=function(e,t,i){var n=a();return this.painter.shapeToImage(n,e,t,i)},V.prototype.on=function(e,t,i){return this.handler.on(e,t,i),this},V.prototype.un=function(e,t){return this.handler.un(e,t),this},V.prototype.trigger=function(e,t){return this.handler.trigger(e,t),this},V.prototype.clear=function(){return this.storage.delRoot(),this.painter.clear(),this},V.prototype.dispose=function(){this.animation.stop(),this.clear(),this.storage.dispose(),this.painter.dispose(),this.handler.dispose(),this.animation=this.storage=this.painter=this.handler=null,m.delInstance(this.id)},m}),i("zrender/config",[],function(){var e={EVENT:{RESIZE:"resize",CLICK:"click",DBLCLICK:"dblclick",MOUSEWHEEL:"mousewheel",MOUSEMOVE:"mousemove",MOUSEOVER:"mouseover",MOUSEOUT:"mouseout",MOUSEDOWN:"mousedown",MOUSEUP:"mouseup",GLOBALOUT:"globalout",DRAGSTART:"dragstart",DRAGEND:"dragend",DRAGENTER:"dragenter",DRAGOVER:"dragover",DRAGLEAVE:"dragleave",DROP:"drop",touchClickDelay:300},elementClassName:"zr-element",catchBrushException:!1,debugMode:0,devicePixelRatio:Math.max(window.devicePixelRatio||1,1)};return e}),i("echarts/chart/island",["require","./base","zrender/shape/Circle","../config","../util/ecData","zrender/tool/util","zrender/tool/event","zrender/tool/color","../util/accMath","../chart"],function(e){function t(e,t,n,a,r){i.call(this,e,t,n,a,r),this._nameConnector,this._valueConnector,this._zrHeight=this.zr.getHeight(),this._zrWidth=this.zr.getWidth();var l=this;l.shapeHandler.onmousewheel=function(e){var t=e.target,i=e.event,n=s.getDelta(i);n=n>0?-1:1,t.style.r-=n,t.style.r=t.style.r<5?5:t.style.r;var a=o.get(t,"value"),r=a*l.option.island.calculateStep;a=r>1?Math.round(a-r*n):+(a-r*n).toFixed(2);var h=o.get(t,"name");t.style.text=h+":"+a,o.set(t,"value",a),o.set(t,"name",h),l.zr.modShape(t.id),l.zr.refreshNextFrame(),s.stop(i)}}var i=e("./base"),n=e("zrender/shape/Circle"),a=e("../config");a.island={zlevel:0,z:5,r:15,calculateStep:.1};var o=e("../util/ecData"),r=e("zrender/tool/util"),s=e("zrender/tool/event");return t.prototype={type:a.CHART_TYPE_ISLAND,_combine:function(t,i){var n=e("zrender/tool/color"),a=e("../util/accMath"),r=a.accAdd(o.get(t,"value"),o.get(i,"value")),s=o.get(t,"name")+this._nameConnector+o.get(i,"name");t.style.text=s+this._valueConnector+r,o.set(t,"value",r),o.set(t,"name",s),t.style.r=this.option.island.r,t.style.color=n.mix(t.style.color,i.style.color)},refresh:function(e){e&&(e.island=this.reformOption(e.island),this.option=e,this._nameConnector=this.option.nameConnector,this._valueConnector=this.option.valueConnector)},getOption:function(){return this.option},resize:function(){var e=this.zr.getWidth(),t=this.zr.getHeight(),i=e/(this._zrWidth||e),n=t/(this._zrHeight||t);if(1!==i||1!==n){this._zrWidth=e,this._zrHeight=t;for(var a=0,o=this.shapeList.length;o>a;a++)this.zr.modShape(this.shapeList[a].id,{style:{x:Math.round(this.shapeList[a].style.x*i),y:Math.round(this.shapeList[a].style.y*n)}})}},add:function(e){var t=o.get(e,"name"),i=o.get(e,"value"),a=null!=o.get(e,"series")?o.get(e,"series").name:"",r=this.getFont(this.option.island.textStyle),s=this.option.island,l={zlevel:s.zlevel,z:s.z,style:{x:e.style.x,y:e.style.y,r:this.option.island.r,color:e.style.color||e.style.strokeColor,text:t+this._valueConnector+i,textFont:r},draggable:!0,hoverable:!0,onmousewheel:this.shapeHandler.onmousewheel,_type:"island"};"#fff"===l.style.color&&(l.style.color=e.style.strokeColor),this.setCalculable(l),l.dragEnableTime=0,o.pack(l,{name:a},-1,i,-1,t),l=new n(l),this.shapeList.push(l),this.zr.addShape(l)},del:function(e){this.zr.delShape(e.id);for(var t=[],i=0,n=this.shapeList.length;n>i;i++)this.shapeList[i].id!=e.id&&t.push(this.shapeList[i]);this.shapeList=t},ondrop:function(e,t){if(this.isDrop&&e.target){var i=e.target,n=e.dragged;this._combine(i,n),this.zr.modShape(i.id),t.dragIn=!0,this.isDrop=!1}},ondragend:function(e,t){var i=e.target;this.isDragend?t.dragIn&&(this.del(i),t.needRefresh=!0):t.dragIn||(i.style.x=s.getX(e.event),i.style.y=s.getY(e.event),this.add(i),t.needRefresh=!0),this.isDragend=!1}},r.inherits(t,i),e("../chart").define("island",t),t}),i("echarts/component/toolbox",["require","./base","zrender/shape/Line","zrender/shape/Image","zrender/shape/Rectangle","../util/shape/Icon","../config","zrender/tool/util","zrender/config","zrender/tool/event","./dataView","../component"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.dom=o.dom,this._magicType={},this._magicMap={},this._isSilence=!1,this._iconList,this._iconShapeMap={},this._featureTitle={},this._featureIcon={},this._featureColor={},this._featureOption={},this._enableColor="red",this._disableColor="#ccc",this._markShapeList=[];var r=this;r._onMark=function(e){r.__onMark(e)},r._onMarkUndo=function(e){r.__onMarkUndo(e)},r._onMarkClear=function(e){r.__onMarkClear(e)},r._onDataZoom=function(e){r.__onDataZoom(e)},r._onDataZoomReset=function(e){r.__onDataZoomReset(e)},r._onDataView=function(e){r.__onDataView(e)},r._onRestore=function(e){r.__onRestore(e)},r._onSaveAsImage=function(e){r.__onSaveAsImage(e)},r._onMagicType=function(e){r.__onMagicType(e)},r._onCustomHandler=function(e){r.__onCustomHandler(e)},r._onmousemove=function(e){return r.__onmousemove(e)},r._onmousedown=function(e){return r.__onmousedown(e)},r._onmouseup=function(e){return r.__onmouseup(e)},r._onclick=function(e){return r.__onclick(e)}}var i=e("./base"),n=e("zrender/shape/Line"),a=e("zrender/shape/Image"),o=e("zrender/shape/Rectangle"),r=e("../util/shape/Icon"),s=e("../config");s.toolbox={zlevel:0,z:6,show:!1,orient:"horizontal",x:"right",y:"top",color:["#1e90ff","#22bb22","#4b0082","#d2691e"],disableColor:"#ddd",effectiveColor:"red",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,itemSize:16,showTitle:!0,feature:{mark:{show:!1,title:{mark:"辅助线开关",markUndo:"删除辅助线",markClear:"清空辅助线"},lineStyle:{width:1,color:"#1e90ff",type:"dashed"}},dataZoom:{show:!1,title:{dataZoom:"区域缩放",dataZoomReset:"区域缩放后退"}},dataView:{show:!1,title:"数据视图",readOnly:!1,lang:["数据视图","关闭","刷新"]},magicType:{show:!1,title:{line:"折线图切换",bar:"柱形图切换",stack:"堆积",tiled:"平铺",force:"力导向布局图切换",chord:"和弦图切换",pie:"饼图切换",funnel:"漏斗图切换"},type:[]},restore:{show:!1,title:"还原"},saveAsImage:{show:!1,title:"保存为图片",type:"png",lang:["点击保存"]}}};var l=e("zrender/tool/util"),h=e("zrender/config"),m=e("zrender/tool/event"),V="stack",U="tiled";return t.prototype={type:s.COMPONENT_TYPE_TOOLBOX,_buildShape:function(){this._iconList=[];var e=this.option.toolbox;this._enableColor=e.effectiveColor,this._disableColor=e.disableColor;var t=e.feature,i=[];for(var n in t)if(t[n].show)switch(n){case"mark":i.push({key:n,name:"mark"}),i.push({key:n,name:"markUndo"}),i.push({key:n,name:"markClear"});break;case"magicType":for(var a=0,o=t[n].type.length;o>a;a++)t[n].title[t[n].type[a]+"Chart"]=t[n].title[t[n].type[a]],t[n].option&&(t[n].option[t[n].type[a]+"Chart"]=t[n].option[t[n].type[a]]),i.push({key:n,name:t[n].type[a]+"Chart"});break;case"dataZoom":i.push({key:n,name:"dataZoom"}),i.push({key:n,name:"dataZoomReset"});break;case"saveAsImage":this.canvasSupported&&i.push({key:n,name:"saveAsImage"});break;default:i.push({key:n,name:n})}if(i.length>0){for(var r,n,a=0,o=i.length;o>a;a++)r=i[a].name,n=i[a].key,this._iconList.push(r),this._featureTitle[r]=t[n].title[r]||t[n].title,t[n].icon&&(this._featureIcon[r]=t[n].icon[r]||t[n].icon),t[n].color&&(this._featureColor[r]=t[n].color[r]||t[n].color),t[n].option&&(this._featureOption[r]=t[n].option[r]||t[n].option);this._itemGroupLocation=this._getItemGroupLocation(),this._buildBackground(),this._buildItem();for(var a=0,o=this.shapeList.length;o>a;a++)this.zr.addShape(this.shapeList[a]);this._iconShapeMap.mark&&(this._iconDisable(this._iconShapeMap.markUndo),this._iconDisable(this._iconShapeMap.markClear)),this._iconShapeMap.dataZoomReset&&0===this._zoomQueue.length&&this._iconDisable(this._iconShapeMap.dataZoomReset)}},_buildItem:function(){var t,i,n,o,s=this.option.toolbox,l=this._iconList.length,h=this._itemGroupLocation.x,m=this._itemGroupLocation.y,V=s.itemSize,U=s.itemGap,d=s.color instanceof Array?s.color:[s.color],p=this.getFont(s.textStyle);"horizontal"===s.orient?(i=this._itemGroupLocation.y/this.zr.getHeight()<.5?"bottom":"top",n=this._itemGroupLocation.x/this.zr.getWidth()<.5?"left":"right",o=this._itemGroupLocation.y/this.zr.getHeight()<.5?"top":"bottom"):i=this._itemGroupLocation.x/this.zr.getWidth()<.5?"right":"left",this._iconShapeMap={};for(var c=this,u=0;l>u;u++){switch(t={type:"icon",zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:h,y:m,width:V,height:V,iconType:this._iconList[u],lineWidth:1,strokeColor:this._featureColor[this._iconList[u]]||d[u%d.length],brushType:"stroke"},highlightStyle:{lineWidth:1,text:s.showTitle?this._featureTitle[this._iconList[u]]:void 0,textFont:p,textPosition:i,strokeColor:this._featureColor[this._iconList[u]]||d[u%d.length]},hoverable:!0,clickable:!0},this._featureIcon[this._iconList[u]]&&(t.style.image=this._featureIcon[this._iconList[u]].replace(new RegExp("^image:\\/\\/"),""),t.style.opacity=.8,t.highlightStyle.opacity=1,t.type="image"),"horizontal"===s.orient&&(0===u&&"left"===n&&(t.highlightStyle.textPosition="specific",t.highlightStyle.textAlign=n,t.highlightStyle.textBaseline=o,t.highlightStyle.textX=h,t.highlightStyle.textY="top"===o?m+V+10:m-10),u===l-1&&"right"===n&&(t.highlightStyle.textPosition="specific",t.highlightStyle.textAlign=n,t.highlightStyle.textBaseline=o,t.highlightStyle.textX=h+V,t.highlightStyle.textY="top"===o?m+V+10:m-10)),this._iconList[u]){case"mark":t.onclick=c._onMark;break;case"markUndo":t.onclick=c._onMarkUndo;break;case"markClear":t.onclick=c._onMarkClear;break;case"dataZoom":t.onclick=c._onDataZoom;break;case"dataZoomReset":t.onclick=c._onDataZoomReset;break;case"dataView":if(!this._dataView){var y=e("./dataView");this._dataView=new y(this.ecTheme,this.messageCenter,this.zr,this.option,this.myChart)}t.onclick=c._onDataView;break;case"restore":t.onclick=c._onRestore;break;case"saveAsImage":t.onclick=c._onSaveAsImage;break;default:this._iconList[u].match("Chart")?(t._name=this._iconList[u].replace("Chart",""),t.onclick=c._onMagicType):t.onclick=c._onCustomHandler}"icon"===t.type?t=new r(t):"image"===t.type&&(t=new a(t)),this.shapeList.push(t),this._iconShapeMap[this._iconList[u]]=t,"horizontal"===s.orient?h+=V+U:m+=V+U}},_buildBackground:function(){var e=this.option.toolbox,t=this.reformCssArray(this.option.toolbox.padding);this.shapeList.push(new o({zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:this._itemGroupLocation.x-t[3],y:this._itemGroupLocation.y-t[0],width:this._itemGroupLocation.width+t[3]+t[1],height:this._itemGroupLocation.height+t[0]+t[2],brushType:0===e.borderWidth?"fill":"both",color:e.backgroundColor,strokeColor:e.borderColor,lineWidth:e.borderWidth}}))},_getItemGroupLocation:function(){var e=this.option.toolbox,t=this.reformCssArray(this.option.toolbox.padding),i=this._iconList.length,n=e.itemGap,a=e.itemSize,o=0,r=0;"horizontal"===e.orient?(o=(a+n)*i-n,r=a):(r=(a+n)*i-n,o=a);var s,l=this.zr.getWidth();switch(e.x){case"center":s=Math.floor((l-o)/2);break;case"left":s=t[3]+e.borderWidth;break;case"right":s=l-o-t[1]-e.borderWidth;break;default:s=e.x-0,s=isNaN(s)?0:s}var h,m=this.zr.getHeight();switch(e.y){case"top":h=t[0]+e.borderWidth;break;case"bottom":h=m-r-t[2]-e.borderWidth;break;case"center":h=Math.floor((m-r)/2);break;default:h=e.y-0,h=isNaN(h)?0:h}return{x:s,y:h,width:o,height:r}},__onmousemove:function(e){this._marking&&(this._markShape.style.xEnd=m.getX(e.event),this._markShape.style.yEnd=m.getY(e.event),this.zr.addHoverShape(this._markShape)),this._zooming&&(this._zoomShape.style.width=m.getX(e.event)-this._zoomShape.style.x,this._zoomShape.style.height=m.getY(e.event)-this._zoomShape.style.y,this.zr.addHoverShape(this._zoomShape),this.dom.style.cursor="crosshair",m.stop(e.event)),this._zoomStart&&"pointer"!=this.dom.style.cursor&&"move"!=this.dom.style.cursor&&(this.dom.style.cursor="crosshair")},__onmousedown:function(e){if(!e.target){this._zooming=!0;var t=m.getX(e.event),i=m.getY(e.event),n=this.option.dataZoom||{};return this._zoomShape=new o({zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:t,y:i,width:1,height:1,brushType:"both"},highlightStyle:{lineWidth:2,color:n.fillerColor||s.dataZoom.fillerColor,strokeColor:n.handleColor||s.dataZoom.handleColor,brushType:"both"}}),this.zr.addHoverShape(this._zoomShape),!0}},__onmouseup:function(){if(!this._zoomShape||Math.abs(this._zoomShape.style.width)<10||Math.abs(this._zoomShape.style.height)<10)return this._zooming=!1,!0;if(this._zooming&&this.component.dataZoom){this._zooming=!1;var e=this.component.dataZoom.rectZoom(this._zoomShape.style);e&&(this._zoomQueue.push({start:e.start,end:e.end,start2:e.start2,end2:e.end2}),this._iconEnable(this._iconShapeMap.dataZoomReset),this.zr.refreshNextFrame())}return!0},__onclick:function(e){if(!e.target)if(this._marking)this._marking=!1,this._markShapeList.push(this._markShape),this._iconEnable(this._iconShapeMap.markUndo),this._iconEnable(this._iconShapeMap.markClear),this.zr.addShape(this._markShape),this.zr.refreshNextFrame();else if(this._markStart){this._marking=!0;var t=m.getX(e.event),i=m.getY(e.event);this._markShape=new n({zlevel:this.getZlevelBase(),z:this.getZBase(),style:{xStart:t,yStart:i,xEnd:t,yEnd:i,lineWidth:this.query(this.option,"toolbox.feature.mark.lineStyle.width"),strokeColor:this.query(this.option,"toolbox.feature.mark.lineStyle.color"),lineType:this.query(this.option,"toolbox.feature.mark.lineStyle.type")}}),this.zr.addHoverShape(this._markShape)}},__onMark:function(e){var t=e.target;if(this._marking||this._markStart)this._resetMark(),this.zr.refreshNextFrame();else{this._resetZoom(),this.zr.modShape(t.id,{style:{strokeColor:this._enableColor}}),this.zr.refreshNextFrame(),this._markStart=!0;var i=this;setTimeout(function(){i.zr&&i.zr.on(h.EVENT.CLICK,i._onclick)&&i.zr.on(h.EVENT.MOUSEMOVE,i._onmousemove)},10)}return!0},__onMarkUndo:function(){if(this._marking)this._marking=!1;else{var e=this._markShapeList.length;if(e>=1){var t=this._markShapeList[e-1];this.zr.delShape(t.id),this.zr.refreshNextFrame(),this._markShapeList.pop(),1===e&&(this._iconDisable(this._iconShapeMap.markUndo),this._iconDisable(this._iconShapeMap.markClear))}}return!0},__onMarkClear:function(){this._marking&&(this._marking=!1);var e=this._markShapeList.length;if(e>0){for(;e--;)this.zr.delShape(this._markShapeList.pop().id);this._iconDisable(this._iconShapeMap.markUndo),this._iconDisable(this._iconShapeMap.markClear),this.zr.refreshNextFrame()}return!0},__onDataZoom:function(e){var t=e.target;if(this._zooming||this._zoomStart)this._resetZoom(),this.zr.refreshNextFrame(),this.dom.style.cursor="default";else{this._resetMark(),this.zr.modShape(t.id,{style:{strokeColor:this._enableColor}}),this.zr.refreshNextFrame(),this._zoomStart=!0;var i=this;setTimeout(function(){i.zr&&i.zr.on(h.EVENT.MOUSEDOWN,i._onmousedown)&&i.zr.on(h.EVENT.MOUSEUP,i._onmouseup)&&i.zr.on(h.EVENT.MOUSEMOVE,i._onmousemove)},10),this.dom.style.cursor="crosshair"}return!0},__onDataZoomReset:function(){return this._zooming&&(this._zooming=!1),this._zoomQueue.pop(),this._zoomQueue.length>0?this.component.dataZoom.absoluteZoom(this._zoomQueue[this._zoomQueue.length-1]):(this.component.dataZoom.rectZoom(),this._iconDisable(this._iconShapeMap.dataZoomReset),this.zr.refreshNextFrame()),!0},_resetMark:function(){this._marking=!1,this._markStart&&(this._markStart=!1,this._iconShapeMap.mark&&this.zr.modShape(this._iconShapeMap.mark.id,{style:{strokeColor:this._iconShapeMap.mark.highlightStyle.strokeColor}}),this.zr.un(h.EVENT.CLICK,this._onclick),this.zr.un(h.EVENT.MOUSEMOVE,this._onmousemove))},_resetZoom:function(){this._zooming=!1,this._zoomStart&&(this._zoomStart=!1,this._iconShapeMap.dataZoom&&this.zr.modShape(this._iconShapeMap.dataZoom.id,{style:{strokeColor:this._iconShapeMap.dataZoom.highlightStyle.strokeColor}}),this.zr.un(h.EVENT.MOUSEDOWN,this._onmousedown),this.zr.un(h.EVENT.MOUSEUP,this._onmouseup),this.zr.un(h.EVENT.MOUSEMOVE,this._onmousemove))},_iconDisable:function(e){"image"!=e.type?this.zr.modShape(e.id,{hoverable:!1,clickable:!1,style:{strokeColor:this._disableColor}}):this.zr.modShape(e.id,{hoverable:!1,clickable:!1,style:{opacity:.3}})},_iconEnable:function(e){"image"!=e.type?this.zr.modShape(e.id,{hoverable:!0,clickable:!0,style:{strokeColor:e.highlightStyle.strokeColor}}):this.zr.modShape(e.id,{hoverable:!0,clickable:!0,style:{opacity:.8}})},__onDataView:function(){return this._dataView.show(this.option),!0},__onRestore:function(){return this._resetMark(),this._resetZoom(),this.messageCenter.dispatch(s.EVENT.RESTORE,null,null,this.myChart),!0},__onSaveAsImage:function(){var e=this.option.toolbox.feature.saveAsImage,t=e.type||"png";"png"!=t&&"jpeg"!=t&&(t="png");var i;i=this.myChart.isConnected()?this.myChart.getConnectedDataURL(t):this.zr.toDataURL("image/"+t,this.option.backgroundColor&&"rgba(0,0,0,0)"===this.option.backgroundColor.replace(" ","")?"#fff":this.option.backgroundColor);var n=document.createElement("div");n.id="__echarts_download_wrap__",n.style.cssText="position:fixed;z-index:99999;display:block;top:0;left:0;background-color:rgba(33,33,33,0.5);text-align:center;width:100%;height:100%;line-height:"+document.documentElement.clientHeight+"px;";var a=document.createElement("a");a.href=i,a.setAttribute("download",(e.name?e.name:this.option.title&&(this.option.title.text||this.option.title.subtext)?this.option.title.text||this.option.title.subtext:"ECharts")+"."+t),a.innerHTML='<img style="vertical-align:middle" src="'+i+'" title="'+(window.ActiveXObject||"ActiveXObject"in window?"右键->图片另存为":e.lang?e.lang[0]:"点击保存")+'"/>',n.appendChild(a),document.body.appendChild(n),a=null,n=null,setTimeout(function(){var e=document.getElementById("__echarts_download_wrap__");e&&(e.onclick=function(){var e=document.getElementById("__echarts_download_wrap__");e.onclick=null,e.innerHTML="",document.body.removeChild(e),e=null},e=null)},500)},__onMagicType:function(e){this._resetMark();var t=e.target._name;return this._magicType[t]||(this._magicType[t]=!0,t===s.CHART_TYPE_LINE?this._magicType[s.CHART_TYPE_BAR]=!1:t===s.CHART_TYPE_BAR&&(this._magicType[s.CHART_TYPE_LINE]=!1),t===s.CHART_TYPE_PIE?this._magicType[s.CHART_TYPE_FUNNEL]=!1:t===s.CHART_TYPE_FUNNEL&&(this._magicType[s.CHART_TYPE_PIE]=!1),t===s.CHART_TYPE_FORCE?this._magicType[s.CHART_TYPE_CHORD]=!1:t===s.CHART_TYPE_CHORD&&(this._magicType[s.CHART_TYPE_FORCE]=!1),t===V?this._magicType[U]=!1:t===U&&(this._magicType[V]=!1),this.messageCenter.dispatch(s.EVENT.MAGIC_TYPE_CHANGED,e.event,{magicType:this._magicType},this.myChart)),!0},setMagicType:function(e){this._resetMark(),this._magicType=e,!this._isSilence&&this.messageCenter.dispatch(s.EVENT.MAGIC_TYPE_CHANGED,null,{magicType:this._magicType},this.myChart)},__onCustomHandler:function(e){var t=e.target.style.iconType,i=this.option.toolbox.feature[t].onclick;"function"==typeof i&&i.call(this,this.option)},reset:function(e,t){if(t&&this.clear(),this.query(e,"toolbox.show")&&this.query(e,"toolbox.feature.magicType.show")){var i=e.toolbox.feature.magicType.type,n=i.length;for(this._magicMap={};n--;)this._magicMap[i[n]]=!0;n=e.series.length;for(var a,o;n--;)a=e.series[n].type,this._magicMap[a]&&(o=e.xAxis instanceof Array?e.xAxis[e.series[n].xAxisIndex||0]:e.xAxis,o&&"category"===(o.type||"category")&&(o.__boundaryGap=null!=o.boundaryGap?o.boundaryGap:!0),o=e.yAxis instanceof Array?e.yAxis[e.series[n].yAxisIndex||0]:e.yAxis,o&&"category"===o.type&&(o.__boundaryGap=null!=o.boundaryGap?o.boundaryGap:!0),e.series[n].__type=a,e.series[n].__itemStyle=l.clone(e.series[n].itemStyle||{})),(this._magicMap[V]||this._magicMap[U])&&(e.series[n].__stack=e.series[n].stack)}this._magicType=t?{}:this._magicType||{};for(var r in this._magicType)if(this._magicType[r]){this.option=e,this.getMagicOption();break}var s=e.dataZoom;if(s&&s.show){var h=null!=s.start&&s.start>=0&&s.start<=100?s.start:0,m=null!=s.end&&s.end>=0&&s.end<=100?s.end:100;h>m&&(h+=m,m=h-m,h-=m),this._zoomQueue=[{start:h,end:m,start2:0,end2:100}]}else this._zoomQueue=[]},getMagicOption:function(){var e,t;if(this._magicType[s.CHART_TYPE_LINE]||this._magicType[s.CHART_TYPE_BAR]){for(var i=this._magicType[s.CHART_TYPE_LINE]?!1:!0,n=0,a=this.option.series.length;a>n;n++)t=this.option.series[n].type,(t==s.CHART_TYPE_LINE||t==s.CHART_TYPE_BAR)&&(e=this.option.xAxis instanceof Array?this.option.xAxis[this.option.series[n].xAxisIndex||0]:this.option.xAxis,e&&"category"===(e.type||"category")&&(e.boundaryGap=i?!0:e.__boundaryGap),e=this.option.yAxis instanceof Array?this.option.yAxis[this.option.series[n].yAxisIndex||0]:this.option.yAxis,e&&"category"===e.type&&(e.boundaryGap=i?!0:e.__boundaryGap));this._defaultMagic(s.CHART_TYPE_LINE,s.CHART_TYPE_BAR)}if(this._defaultMagic(s.CHART_TYPE_CHORD,s.CHART_TYPE_FORCE),this._defaultMagic(s.CHART_TYPE_PIE,s.CHART_TYPE_FUNNEL),this._magicType[V]||this._magicType[U])for(var n=0,a=this.option.series.length;a>n;n++)this._magicType[V]?(this.option.series[n].stack="_ECHARTS_STACK_KENER_2014_",t=V):this._magicType[U]&&(this.option.series[n].stack=null,t=U),this._featureOption[t+"Chart"]&&l.merge(this.option.series[n],this._featureOption[t+"Chart"]||{},!0);return this.option},_defaultMagic:function(e,t){if(this._magicType[e]||this._magicType[t])for(var i=0,n=this.option.series.length;n>i;i++){var a=this.option.series[i].type;(a==e||a==t)&&(this.option.series[i].type=this._magicType[e]?e:t,this.option.series[i].itemStyle=l.clone(this.option.series[i].__itemStyle),a=this.option.series[i].type,this._featureOption[a+"Chart"]&&l.merge(this.option.series[i],this._featureOption[a+"Chart"]||{},!0))}},silence:function(e){this._isSilence=e},resize:function(){this._resetMark(),this.clear(),this.option&&this.option.toolbox&&this.option.toolbox.show&&this._buildShape(),this._dataView&&this._dataView.resize()},hideDataView:function(){this._dataView&&this._dataView.hide()},clear:function(e){this.zr&&(this.zr.delShape(this.shapeList),this.shapeList=[],e||(this.zr.delShape(this._markShapeList),this._markShapeList=[]))},onbeforDispose:function(){this._dataView&&(this._dataView.dispose(),this._dataView=null),this._markShapeList=null},refresh:function(e){e&&(this._resetMark(),this._resetZoom(),e.toolbox=this.reformOption(e.toolbox),this.option=e,this.clear(!0),e.toolbox.show&&this._buildShape(),this.hideDataView())}},l.inherits(t,i),e("../component").define("toolbox",t),t}),i("echarts/component",[],function(){var e={},t={};return e.define=function(i,n){return t[i]=n,e},e.get=function(e){return t[e]},e}),i("echarts/component/title",["require","./base","zrender/shape/Text","zrender/shape/Rectangle","../config","zrender/tool/util","zrender/tool/area","zrender/tool/color","../component"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e("./base"),n=e("zrender/shape/Text"),a=e("zrender/shape/Rectangle"),o=e("../config");o.title={zlevel:0,z:6,show:!0,text:"",subtext:"",x:"left",y:"top",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:5,textStyle:{fontSize:18,fontWeight:"bolder",color:"#333"},subtextStyle:{color:"#aaa"}};var r=e("zrender/tool/util"),s=e("zrender/tool/area"),l=e("zrender/tool/color");return t.prototype={type:o.COMPONENT_TYPE_TITLE,_buildShape:function(){if(this.titleOption.show){this._itemGroupLocation=this._getItemGroupLocation(),this._buildBackground(),this._buildItem();for(var e=0,t=this.shapeList.length;t>e;e++)this.zr.addShape(this.shapeList[e])}},_buildItem:function(){var e=this.titleOption.text,t=this.titleOption.link,i=this.titleOption.target,a=this.titleOption.subtext,o=this.titleOption.sublink,r=this.titleOption.subtarget,s=this.getFont(this.titleOption.textStyle),h=this.getFont(this.titleOption.subtextStyle),m=this._itemGroupLocation.x,V=this._itemGroupLocation.y,U=this._itemGroupLocation.width,d=this._itemGroupLocation.height,p={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{y:V,color:this.titleOption.textStyle.color,text:e,textFont:s,textBaseline:"top"},highlightStyle:{color:l.lift(this.titleOption.textStyle.color,1),brushType:"fill"},hoverable:!1};t&&(p.hoverable=!0,p.clickable=!0,p.onclick=function(){i&&"self"==i?window.location=t:window.open(t)});var c={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{y:V+d,color:this.titleOption.subtextStyle.color,text:a,textFont:h,textBaseline:"bottom"},highlightStyle:{color:l.lift(this.titleOption.subtextStyle.color,1),brushType:"fill"},hoverable:!1};switch(o&&(c.hoverable=!0,c.clickable=!0,c.onclick=function(){r&&"self"==r?window.location=o:window.open(o)}),this.titleOption.x){case"center":p.style.x=c.style.x=m+U/2,p.style.textAlign=c.style.textAlign="center";break;case"left":p.style.x=c.style.x=m,p.style.textAlign=c.style.textAlign="left";break;case"right":p.style.x=c.style.x=m+U,p.style.textAlign=c.style.textAlign="right";break;default:m=this.titleOption.x-0,m=isNaN(m)?0:m,p.style.x=c.style.x=m}this.titleOption.textAlign&&(p.style.textAlign=c.style.textAlign=this.titleOption.textAlign),this.shapeList.push(new n(p)),""!==a&&this.shapeList.push(new n(c))},_buildBackground:function(){var e=this.reformCssArray(this.titleOption.padding);this.shapeList.push(new a({zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:this._itemGroupLocation.x-e[3],y:this._itemGroupLocation.y-e[0],width:this._itemGroupLocation.width+e[3]+e[1],height:this._itemGroupLocation.height+e[0]+e[2],brushType:0===this.titleOption.borderWidth?"fill":"both",color:this.titleOption.backgroundColor,strokeColor:this.titleOption.borderColor,lineWidth:this.titleOption.borderWidth}}))},_getItemGroupLocation:function(){var e,t=this.reformCssArray(this.titleOption.padding),i=this.titleOption.text,n=this.titleOption.subtext,a=this.getFont(this.titleOption.textStyle),o=this.getFont(this.titleOption.subtextStyle),r=Math.max(s.getTextWidth(i,a),s.getTextWidth(n,o)),l=s.getTextHeight(i,a)+(""===n?0:this.titleOption.itemGap+s.getTextHeight(n,o)),h=this.zr.getWidth();switch(this.titleOption.x){case"center":e=Math.floor((h-r)/2);break;case"left":e=t[3]+this.titleOption.borderWidth;break;case"right":e=h-r-t[1]-this.titleOption.borderWidth;break;default:e=this.titleOption.x-0,e=isNaN(e)?0:e}var m,V=this.zr.getHeight();switch(this.titleOption.y){case"top":m=t[0]+this.titleOption.borderWidth;break;case"bottom":m=V-l-t[2]-this.titleOption.borderWidth;break;case"center":m=Math.floor((V-l)/2);break;default:m=this.titleOption.y-0,m=isNaN(m)?0:m}return{x:e,y:m,width:r,height:l}},refresh:function(e){e&&(this.option=e,this.option.title=this.reformOption(this.option.title),this.titleOption=this.option.title,this.titleOption.textStyle=this.getTextStyle(this.titleOption.textStyle),this.titleOption.subtextStyle=this.getTextStyle(this.titleOption.subtextStyle)),this.clear(),this._buildShape()}},r.inherits(t,i),e("../component").define("title",t),t}),i("echarts/component/tooltip",["require","./base","../util/shape/Cross","zrender/shape/Line","zrender/shape/Rectangle","../config","../util/ecData","zrender/config","zrender/tool/event","zrender/tool/area","zrender/tool/color","zrender/tool/util","zrender/shape/Base","../component"],function(e){function t(e,t,o,r,s){i.call(this,e,t,o,r,s),this.dom=s.dom;var l=this;l._onmousemove=function(e){return l.__onmousemove(e)},l._onglobalout=function(e){return l.__onglobalout(e)},this.zr.on(h.EVENT.MOUSEMOVE,l._onmousemove),this.zr.on(h.EVENT.GLOBALOUT,l._onglobalout),l._hide=function(e){return l.__hide(e)},l._tryShow=function(e){return l.__tryShow(e)},l._refixed=function(e){return l.__refixed(e)},l._setContent=function(e,t){return l.__setContent(e,t)},this._tDom=this._tDom||document.createElement("div"),this._tDom.onselectstart=function(){return!1},this._tDom.onmouseover=function(){l._mousein=!0},this._tDom.onmouseout=function(){l._mousein=!1},this._tDom.className="echarts-tooltip",this._tDom.style.position="absolute",this.hasAppend=!1,this._axisLineShape&&this.zr.delShape(this._axisLineShape.id),this._axisLineShape=new a({zlevel:this.getZlevelBase(),z:this.getZBase(),invisible:!0,hoverable:!1}),this.shapeList.push(this._axisLineShape),this.zr.addShape(this._axisLineShape),this._axisShadowShape&&this.zr.delShape(this._axisShadowShape.id),this._axisShadowShape=new a({zlevel:this.getZlevelBase(),z:1,invisible:!0,hoverable:!1}),this.shapeList.push(this._axisShadowShape),this.zr.addShape(this._axisShadowShape),this._axisCrossShape&&this.zr.delShape(this._axisCrossShape.id),this._axisCrossShape=new n({zlevel:this.getZlevelBase(),z:this.getZBase(),invisible:!0,hoverable:!1}),this.shapeList.push(this._axisCrossShape),this.zr.addShape(this._axisCrossShape),this.showing=!1,this.refresh(r)}var i=e("./base"),n=e("../util/shape/Cross"),a=e("zrender/shape/Line"),o=e("zrender/shape/Rectangle"),r=new o({}),s=e("../config");s.tooltip={zlevel:1,z:8,show:!0,showContent:!0,trigger:"item",islandFormatter:"{a} <br/>{b} : {c}",showDelay:20,hideDelay:100,transitionDuration:.4,enterable:!1,backgroundColor:"rgba(0,0,0,0.7)",borderColor:"#333",borderRadius:4,borderWidth:0,padding:5,axisPointer:{type:"line",lineStyle:{color:"#48b",width:2,type:"solid"},crossStyle:{color:"#1e90ff",width:1,type:"dashed"},shadowStyle:{color:"rgba(150,150,150,0.3)",width:"auto",type:"default"}},textStyle:{color:"#fff"}};var l=e("../util/ecData"),h=e("zrender/config"),m=e("zrender/tool/event"),V=e("zrender/tool/area"),U=e("zrender/tool/color"),d=e("zrender/tool/util"),p=e("zrender/shape/Base");return t.prototype={type:s.COMPONENT_TYPE_TOOLTIP,_gCssText:"position:absolute;display:block;border-style:solid;white-space:nowrap;",_style:function(e){if(!e)return"";var t=[];if(e.transitionDuration){var i="left "+e.transitionDuration+"s,top "+e.transitionDuration+"s";t.push("transition:"+i),t.push("-moz-transition:"+i),t.push("-webkit-transition:"+i),t.push("-o-transition:"+i)}e.backgroundColor&&(t.push("background-Color:"+U.toHex(e.backgroundColor)),t.push("filter:alpha(opacity=70)"),t.push("background-Color:"+e.backgroundColor)),null!=e.borderWidth&&t.push("border-width:"+e.borderWidth+"px"),null!=e.borderColor&&t.push("border-color:"+e.borderColor),null!=e.borderRadius&&(t.push("border-radius:"+e.borderRadius+"px"),t.push("-moz-border-radius:"+e.borderRadius+"px"),t.push("-webkit-border-radius:"+e.borderRadius+"px"),t.push("-o-border-radius:"+e.borderRadius+"px"));var n=e.textStyle;n&&(n.color&&t.push("color:"+n.color),n.decoration&&t.push("text-decoration:"+n.decoration),n.align&&t.push("text-align:"+n.align),n.fontFamily&&t.push("font-family:"+n.fontFamily),n.fontSize&&t.push("font-size:"+n.fontSize+"px"),n.fontSize&&t.push("line-height:"+Math.round(3*n.fontSize/2)+"px"),n.fontStyle&&t.push("font-style:"+n.fontStyle),n.fontWeight&&t.push("font-weight:"+n.fontWeight));var a=e.padding;return null!=a&&(a=this.reformCssArray(a),t.push("padding:"+a[0]+"px "+a[1]+"px "+a[2]+"px "+a[3]+"px")),t=t.join(";")+";"},__hide:function(){this._lastDataIndex=-1,this._lastSeriesIndex=-1,this._lastItemTriggerId=-1,this._tDom&&(this._tDom.style.display="none");var e=!1;this._axisLineShape.invisible||(this._axisLineShape.invisible=!0,
-/*!
- * Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome
- * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
*/@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.4.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.4.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.4.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.4.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.4.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.4.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}
-/*! iFrame Resizer (iframeSizer.contentWindow.min.js) - v3.5.3 - 2016-02-23
- * Desc: Include this file in any page being loaded into an iframe
- * to force the iframe to resize to the content size.
- * Requires: iframeResizer.min.js on host page.
- * Copyright: (c) 2016 David J. Bradshaw - dave@bradshaw.net
- * License: MIT
- */
-
!function(a){"use strict";function b(b,c,d){"addEventListener"in a?b.addEventListener(c,d,!1):"attachEvent"in a&&b.attachEvent("on"+c,d)}function c(b,c,d){"removeEventListener"in a?b.removeEventListener(c,d,!1):"detachEvent"in a&&b.detachEvent("on"+c,d)}function d(a){return a.charAt(0).toUpperCase()+a.slice(1)}function e(a){var b,c,d,e=null,f=0,g=function(){f=Fa(),e=null,d=a.apply(b,c),e||(b=c=null)};return function(){var h=Fa();f||(f=h);var i=xa-(h-f);return b=this,c=arguments,0>=i||i>xa?(e&&(clearTimeout(e),e=null),f=h,d=a.apply(b,c),e||(b=c=null)):e||(e=setTimeout(g,i)),d}}function f(a){return ma+"["+oa+"] "+a}function g(b){la&&"object"==typeof a.console&&console.log(f(b))}function h(b){"object"==typeof a.console&&console.warn(f(b))}function i(){j(),g("Initialising iFrame ("+location.href+")"),k(),n(),m("background",W),m("padding",$),A(),s(),t(),o(),C(),u(),ia=B(),N("init","Init message from host page"),Da()}function j(){function a(a){return"true"===a?!0:!1}var b=ha.substr(na).split(":");oa=b[0],X=void 0!==b[1]?Number(b[1]):X,_=void 0!==b[2]?a(b[2]):_,la=void 0!==b[3]?a(b[3]):la,ja=void 0!==b[4]?Number(b[4]):ja,U=void 0!==b[6]?a(b[6]):U,Y=b[7],fa=void 0!==b[8]?b[8]:fa,W=b[9],$=b[10],ua=void 0!==b[11]?Number(b[11]):ua,ia.enable=void 0!==b[12]?a(b[12]):!1,qa=void 0!==b[13]?b[13]:qa,Aa=void 0!==b[14]?b[14]:Aa}function k(){function b(){var b=a.iFrameResizer;g("Reading data from page: "+JSON.stringify(b)),Ca="messageCallback"in b?b.messageCallback:Ca,Da="readyCallback"in b?b.readyCallback:Da,ta="targetOrigin"in b?b.targetOrigin:ta,fa="heightCalculationMethod"in b?b.heightCalculationMethod:fa,Aa="widthCalculationMethod"in b?b.widthCalculationMethod:Aa}"iFrameResizer"in a&&Object===a.iFrameResizer.constructor&&b(),g("TargetOrigin for parent set to: "+ta)}function l(a,b){return-1!==b.indexOf("-")&&(h("Negative CSS value ignored for "+a),b=""),b}function m(a,b){void 0!==b&&""!==b&&"null"!==b&&(document.body.style[a]=b,g("Body "+a+' set to "'+b+'"'))}function n(){void 0===Y&&(Y=X+"px"),m("margin",l("margin",Y))}function o(){document.documentElement.style.height="",document.body.style.height="",g('HTML & body height set to "auto"')}function p(e){function f(){N(e.eventName,e.eventType)}var h={add:function(c){b(a,c,f)},remove:function(b){c(a,b,f)}};e.eventNames&&Array.prototype.map?(e.eventName=e.eventNames[0],e.eventNames.map(h[e.method])):h[e.method](e.eventName),g(d(e.method)+" event listener: "+e.eventType)}function q(a){p({method:a,eventType:"Animation Start",eventNames:["animationstart","webkitAnimationStart"]}),p({method:a,eventType:"Animation Iteration",eventNames:["animationiteration","webkitAnimationIteration"]}),p({method:a,eventType:"Animation End",eventNames:["animationend","webkitAnimationEnd"]}),p({method:a,eventType:"Input",eventName:"input"}),p({method:a,eventType:"Mouse Up",eventName:"mouseup"}),p({method:a,eventType:"Mouse Down",eventName:"mousedown"}),p({method:a,eventType:"Orientation Change",eventName:"orientationchange"}),p({method:a,eventType:"Print",eventName:["afterprint","beforeprint"]}),p({method:a,eventType:"Ready State Change",eventName:"readystatechange"}),p({method:a,eventType:"Touch Start",eventName:"touchstart"}),p({method:a,eventType:"Touch End",eventName:"touchend"}),p({method:a,eventType:"Touch Cancel",eventName:"touchcancel"}),p({method:a,eventType:"Transition Start",eventNames:["transitionstart","webkitTransitionStart","MSTransitionStart","oTransitionStart","otransitionstart"]}),p({method:a,eventType:"Transition Iteration",eventNames:["transitioniteration","webkitTransitionIteration","MSTransitionIteration","oTransitionIteration","otransitioniteration"]}),p({method:a,eventType:"Transition End",eventNames:["transitionend","webkitTransitionEnd","MSTransitionEnd","oTransitionEnd","otransitionend"]}),"child"===qa&&p({method:a,eventType:"IFrame Resized",eventName:"resize"})}function r(a,b,c,d){return b!==a&&(a in c||(h(a+" is not a valid option for "+d+"CalculationMethod."),a=b),g(d+' calculation method set to "'+a+'"')),a}function s(){fa=r(fa,ea,Ga,"height")}function t(){Aa=r(Aa,za,Ha,"width")}function u(){!0===U?(q("add"),F()):g("Auto Resize disabled")}function v(){g("Disable outgoing messages"),ra=!1}function w(){g("Remove event listener: Message"),c(a,"message",S)}function x(){null!==Z&&Z.disconnect()}function y(){q("remove"),x(),clearInterval(ka)}function z(){v(),w(),!0===U&&y()}function A(){var a=document.createElement("div");a.style.clear="both",a.style.display="block",document.body.appendChild(a)}function B(){function c(){return{x:void 0!==a.pageXOffset?a.pageXOffset:document.documentElement.scrollLeft,y:void 0!==a.pageYOffset?a.pageYOffset:document.documentElement.scrollTop}}function d(a){var b=a.getBoundingClientRect(),d=c();return{x:parseInt(b.left,10)+parseInt(d.x,10),y:parseInt(b.top,10)+parseInt(d.y,10)}}function e(a){function b(a){var b=d(a);g("Moving to in page link (#"+c+") at x: "+b.x+" y: "+b.y),R(b.y,b.x,"scrollToOffset")}var c=a.split("#")[1]||a,e=decodeURIComponent(c),f=document.getElementById(e)||document.getElementsByName(e)[0];void 0!==f?b(f):(g("In page link (#"+c+") not found in iFrame, so sending to parent"),R(0,0,"inPageLink","#"+c))}function f(){""!==location.hash&&"#"!==location.hash&&e(location.href)}function i(){function a(a){function c(a){a.preventDefault(),e(this.getAttribute("href"))}"#"!==a.getAttribute("href")&&b(a,"click",c)}Array.prototype.forEach.call(document.querySelectorAll('a[href^="#"]'),a)}function j(){b(a,"hashchange",f)}function k(){setTimeout(f,ba)}function l(){Array.prototype.forEach&&document.querySelectorAll?(g("Setting up location.hash handlers"),i(),j(),k()):h("In page linking not fully supported in this browser! (See README.md for IE8 workaround)")}return ia.enable?l():g("In page linking not enabled"),{findTarget:e}}function C(){g("Enable public methods"),Ba.parentIFrame={autoResize:function(a){return!0===a&&!1===U?(U=!0,u()):!1===a&&!0===U&&(U=!1,y()),U},close:function(){R(0,0,"close"),z()},getId:function(){return oa},getPageInfo:function(a){"function"==typeof a?(Ea=a,R(0,0,"pageInfo")):(Ea=function(){},R(0,0,"pageInfoStop"))},moveToAnchor:function(a){ia.findTarget(a)},reset:function(){Q("parentIFrame.reset")},scrollTo:function(a,b){R(b,a,"scrollTo")},scrollToOffset:function(a,b){R(b,a,"scrollToOffset")},sendMessage:function(a,b){R(0,0,"message",JSON.stringify(a),b)},setHeightCalculationMethod:function(a){fa=a,s()},setWidthCalculationMethod:function(a){Aa=a,t()},setTargetOrigin:function(a){g("Set targetOrigin: "+a),ta=a},size:function(a,b){var c=""+(a?a:"")+(b?","+b:"");N("size","parentIFrame.size("+c+")",a,b)}}}function D(){0!==ja&&(g("setInterval: "+ja+"ms"),ka=setInterval(function(){N("interval","setInterval: "+ja)},Math.abs(ja)))}function E(){function b(a){function b(a){!1===a.complete&&(g("Attach listeners to "+a.src),a.addEventListener("load",f,!1),a.addEventListener("error",h,!1),k.push(a))}"attributes"===a.type&&"src"===a.attributeName?b(a.target):"childList"===a.type&&Array.prototype.forEach.call(a.target.querySelectorAll("img"),b)}function c(a){k.splice(k.indexOf(a),1)}function d(a){g("Remove listeners from "+a.src),a.removeEventListener("load",f,!1),a.removeEventListener("error",h,!1),c(a)}function e(a,b,c){d(a.target),N(b,c+": "+a.target.src,void 0,void 0)}function f(a){e(a,"imageLoad","Image loaded")}function h(a){e(a,"imageLoadFailed","Image load failed")}function i(a){N("mutationObserver","mutationObserver: "+a[0].target+" "+a[0].type),a.forEach(b)}function j(){var a=document.querySelector("body"),b={attributes:!0,attributeOldValue:!1,characterData:!0,characterDataOldValue:!1,childList:!0,subtree:!0};return m=new l(i),g("Create body MutationObserver"),m.observe(a,b),m}var k=[],l=a.MutationObserver||a.WebKitMutationObserver,m=j();return{disconnect:function(){"disconnect"in m&&(g("Disconnect body MutationObserver"),m.disconnect(),k.forEach(d))}}}function F(){var b=0>ja;a.MutationObserver||a.WebKitMutationObserver?b?D():Z=E():(g("MutationObserver not supported in this browser!"),D())}function G(a,b){function c(a){var c=/^\d+(px)?$/i;if(c.test(a))return parseInt(a,V);var d=b.style.left,e=b.runtimeStyle.left;return b.runtimeStyle.left=b.currentStyle.left,b.style.left=a||0,a=b.style.pixelLeft,b.style.left=d,b.runtimeStyle.left=e,a}var d=0;return b=b||document.body,"defaultView"in document&&"getComputedStyle"in document.defaultView?(d=document.defaultView.getComputedStyle(b,null),d=null!==d?d[a]:0):d=c(b.currentStyle[a]),parseInt(d,V)}function H(a){a>xa/2&&(xa=2*a,g("Event throttle increased to "+xa+"ms"))}function I(a,b){for(var c=b.length,e=0,f=0,h=d(a),i=Fa(),j=0;c>j;j++)e=b[j].getBoundingClientRect()[a]+G("margin"+h,b[j]),e>f&&(f=e);return i=Fa()-i,g("Parsed "+c+" HTML elements"),g("Element position calculated in "+i+"ms"),H(i),f}function J(a){return[a.bodyOffset(),a.bodyScroll(),a.documentElementOffset(),a.documentElementScroll()]}function K(a,b){function c(){return h("No tagged elements ("+b+") found on page"),da}var d=document.querySelectorAll("["+b+"]");return 0===d.length?c():I(a,d)}function L(){return document.querySelectorAll("body *")}function M(a,b,c,d){function e(){da=l,ya=m,R(da,ya,a)}function f(){function a(a,b){var c=Math.abs(a-b)<=ua;return!c}return l=void 0!==c?c:Ga[fa](),m=void 0!==d?d:Ha[Aa](),a(da,l)||_&&a(ya,m)}function h(){return!(a in{init:1,interval:1,size:1})}function i(){return fa in pa||_&&Aa in pa}function j(){g("No change in size detected")}function k(){h()&&i()?Q(b):a in{interval:1}||j()}var l,m;f()||"init"===a?(O(),e()):k()}function N(a,b,c,d){function e(){a in{reset:1,resetPage:1,init:1}||g("Trigger event: "+b)}function f(){return va&&a in aa}f()?g("Trigger event cancelled: "+a):(e(),Ia(a,b,c,d))}function O(){va||(va=!0,g("Trigger event lock on")),clearTimeout(wa),wa=setTimeout(function(){va=!1,g("Trigger event lock off"),g("--")},ba)}function P(a){da=Ga[fa](),ya=Ha[Aa](),R(da,ya,a)}function Q(a){var b=fa;fa=ea,g("Reset trigger event: "+a),O(),P("reset"),fa=b}function R(a,b,c,d,e){function f(){void 0===e?e=ta:g("Message targetOrigin: "+e)}function h(){var f=a+":"+b,h=oa+":"+f+":"+c+(void 0!==d?":"+d:"");g("Sending message to host page ("+h+")"),sa.postMessage(ma+h,e)}!0===ra&&(f(),h())}function S(b){function c(){return ma===(""+b.data).substr(0,na)}function d(){ha=b.data,sa=b.source,i(),ca=!1,setTimeout(function(){ga=!1},ba)}function e(){ga?g("Page reset ignored by init"):(g("Page size reset by host page"),P("resetPage"))}function f(){N("resizeParent","Parent window requested size check")}function j(){var a=l();ia.findTarget(a)}function k(){return b.data.split("]")[1].split(":")[0]}function l(){return b.data.substr(b.data.indexOf(":")+1)}function m(){return"iFrameResize"in a}function n(){var a=l();g("MessageCallback called from parent: "+a),Ca(JSON.parse(a)),g(" --")}function o(){var a=l();g("PageInfoFromParent called from parent: "+a),Ea(JSON.parse(a)),g(" --")}function p(){return b.data.split(":")[2]in{"true":1,"false":1}}function q(){switch(k()){case"reset":e();break;case"resize":f();break;case"moveToAnchor":j();break;case"message":n();break;case"pageInfo":o();break;default:m()||p()||h("Unexpected message ("+b.data+")")}}function r(){!1===ca?q():p()?d():g('Ignored message of type "'+k()+'". Received before initialization.')}c()&&r()}function T(){"loading"!==document.readyState&&a.parent.postMessage("[iFrameResizerChild]Ready","*")}var U=!0,V=10,W="",X=0,Y="",Z=null,$="",_=!1,aa={resize:1,click:1},ba=128,ca=!0,da=1,ea="bodyOffset",fa=ea,ga=!0,ha="",ia={},ja=32,ka=null,la=!1,ma="[iFrameSizer]",na=ma.length,oa="",pa={max:1,min:1,bodyScroll:1,documentElementScroll:1},qa="child",ra=!0,sa=a.parent,ta="*",ua=0,va=!1,wa=null,xa=16,ya=1,za="scroll",Aa=za,Ba=a,Ca=function(){h("MessageCallback function not defined")},Da=function(){},Ea=function(){},Fa=Date.now||function(){return(new Date).getTime()},Ga={bodyOffset:function(){return document.body.offsetHeight+G("marginTop")+G("marginBottom")},offset:function(){return Ga.bodyOffset()},bodyScroll:function(){return document.body.scrollHeight},documentElementOffset:function(){return document.documentElement.offsetHeight},documentElementScroll:function(){return document.documentElement.scrollHeight},max:function(){return Math.max.apply(null,J(Ga))},min:function(){return Math.min.apply(null,J(Ga))},grow:function(){return Ga.max()},lowestElement:function(){return Math.max(Ga.bodyOffset(),I("bottom",L()))},taggedElement:function(){return K("bottom","data-iframe-height")}},Ha={bodyScroll:function(){return document.body.scrollWidth},bodyOffset:function(){return document.body.offsetWidth},documentElementScroll:function(){return document.documentElement.scrollWidth},documentElementOffset:function(){return document.documentElement.offsetWidth},scroll:function(){return Math.max(Ha.bodyScroll(),Ha.documentElementScroll())},max:function(){return Math.max.apply(null,J(Ha))},min:function(){return Math.min.apply(null,J(Ha))},rightMostElement:function(){return I("right",L())},taggedElement:function(){return K("right","data-iframe-width")}},Ia=e(M);b(a,"message",S),T()}(window||{});
//# sourceMappingURL=iframeResizer.contentWindow.map
\ No newline at end of file
-/*! iFrame Resizer (iframeSizer.min.js ) - v3.5.3 - 2016-02-23
- * Desc: Force cross domain iframes to size to content.
- * Requires: iframeResizer.contentWindow.min.js to be loaded into the target frame.
- * Copyright: (c) 2016 David J. Bradshaw - dave@bradshaw.net
- * License: MIT
- */
-
!function(a){"use strict";function b(b,c,d){"addEventListener"in a?b.addEventListener(c,d,!1):"attachEvent"in a&&b.attachEvent("on"+c,d)}function c(b,c,d){"removeEventListener"in a?b.removeEventListener(c,d,!1):"detachEvent"in a&&b.detachEvent("on"+c,d)}function d(){var b,c=["moz","webkit","o","ms"];for(b=0;b<c.length&&!N;b+=1)N=a[c[b]+"RequestAnimationFrame"];N||h("setup","RequestAnimationFrame not supported")}function e(b){var c="Host page: "+b;return a.top!==a.self&&(c=a.parentIFrame&&a.parentIFrame.getId?a.parentIFrame.getId()+": "+b:"Nested host page: "+b),c}function f(a){return K+"["+e(a)+"]"}function g(a){return P[a]?P[a].log:G}function h(a,b){k("log",a,b,g(a))}function i(a,b){k("info",a,b,g(a))}function j(a,b){k("warn",a,b,!0)}function k(b,c,d,e){!0===e&&"object"==typeof a.console&&console[b](f(c),d)}function l(d){function e(){function a(){s(V),p(W)}g("Height"),g("Width"),t(a,V,"init")}function f(){var a=U.substr(L).split(":");return{iframe:P[a[0]].iframe,id:a[0],height:a[1],width:a[2],type:a[3]}}function g(a){var b=Number(P[W]["max"+a]),c=Number(P[W]["min"+a]),d=a.toLowerCase(),e=Number(V[d]);h(W,"Checking "+d+" is in range "+c+"-"+b),c>e&&(e=c,h(W,"Set "+d+" to min value")),e>b&&(e=b,h(W,"Set "+d+" to max value")),V[d]=""+e}function k(){function a(){function a(){var a=0,d=!1;for(h(W,"Checking connection is from allowed list of origins: "+c);a<c.length;a++)if(c[a]===b){d=!0;break}return d}function d(){var a=P[W].remoteHost;return h(W,"Checking connection is from: "+a),b===a}return c.constructor===Array?a():d()}var b=d.origin,c=P[W].checkOrigin;if(c&&""+b!="null"&&!a())throw new Error("Unexpected message received from: "+b+" for "+V.iframe.id+". Message was: "+d.data+". This error can be disabled by setting the checkOrigin: false option or by providing of array of trusted domains.");return!0}function l(){return K===(""+U).substr(0,L)&&U.substr(L).split(":")[0]in P}function w(){var a=V.type in{"true":1,"false":1,undefined:1};return a&&h(W,"Ignoring init message from meta parent page"),a}function y(a){return U.substr(U.indexOf(":")+J+a)}function z(a){h(W,"MessageCallback passed: {iframe: "+V.iframe.id+", message: "+a+"}"),N("messageCallback",{iframe:V.iframe,message:JSON.parse(a)}),h(W,"--")}function A(){var b=document.body.getBoundingClientRect(),c=V.iframe.getBoundingClientRect();return JSON.stringify({iframeHeight:c.height,iframeWidth:c.width,clientHeight:Math.max(document.documentElement.clientHeight,a.innerHeight||0),clientWidth:Math.max(document.documentElement.clientWidth,a.innerWidth||0),offsetTop:parseInt(c.top-b.top,10),offsetLeft:parseInt(c.left-b.left,10),scrollTop:a.pageYOffset,scrollLeft:a.pageXOffset})}function B(a,b){function c(){u("Send Page Info","pageInfo:"+A(),a,b)}x(c,32)}function C(){function d(b,c){function d(){P[g]?B(P[g].iframe,g):e()}["scroll","resize"].forEach(function(e){h(g,b+e+" listener for sendPageInfo"),c(a,e,d)})}function e(){d("Remove ",c)}function f(){d("Add ",b)}var g=W;f(),P[g].stopPageInfo=e}function D(){P[W]&&P[W].stopPageInfo&&(P[W].stopPageInfo(),delete P[W].stopPageInfo)}function E(){var a=!0;return null===V.iframe&&(j(W,"IFrame ("+V.id+") not found"),a=!1),a}function F(a){var b=a.getBoundingClientRect();return o(W),{x:Math.floor(Number(b.left)+Number(M.x)),y:Math.floor(Number(b.top)+Number(M.y))}}function G(b){function c(){M=g,H(),h(W,"--")}function d(){return{x:Number(V.width)+f.x,y:Number(V.height)+f.y}}function e(){a.parentIFrame?a.parentIFrame["scrollTo"+(b?"Offset":"")](g.x,g.y):j(W,"Unable to scroll to requested position, window.parentIFrame not found")}var f=b?F(V.iframe):{x:0,y:0},g=d();h(W,"Reposition requested from iFrame (offset x:"+f.x+" y:"+f.y+")"),a.top!==a.self?e():c()}function H(){!1!==N("scrollCallback",M)?p(W):q()}function I(b){function c(){var a=F(g);h(W,"Moving to in page link (#"+e+") at x: "+a.x+" y: "+a.y),M={x:a.x,y:a.y},H(),h(W,"--")}function d(){a.parentIFrame?a.parentIFrame.moveToAnchor(e):h(W,"In page link #"+e+" not found and window.parentIFrame not found")}var e=b.split("#")[1]||"",f=decodeURIComponent(e),g=document.getElementById(f)||document.getElementsByName(f)[0];g?c():a.top!==a.self?d():h(W,"In page link #"+e+" not found")}function N(a,b){return m(W,a,b)}function O(){switch(P[W].firstRun&&T(),V.type){case"close":n(V.iframe);break;case"message":z(y(6));break;case"scrollTo":G(!1);break;case"scrollToOffset":G(!0);break;case"pageInfo":B(P[W].iframe,W),C();break;case"pageInfoStop":D();break;case"inPageLink":I(y(9));break;case"reset":r(V);break;case"init":e(),N("initCallback",V.iframe),N("resizedCallback",V);break;default:e(),N("resizedCallback",V)}}function Q(a){var b=!0;return P[a]||(b=!1,j(V.type+" No settings for "+a+". Message was: "+U)),b}function S(){for(var a in P)u("iFrame requested init",v(a),document.getElementById(a),a)}function T(){P[W].firstRun=!1}var U=d.data,V={},W=null;"[iFrameResizerChild]Ready"===U?S():l()?(V=f(),W=R=V.id,!w()&&Q(W)&&(h(W,"Received: "+U),E()&&k()&&O())):i(W,"Ignored: "+U)}function m(a,b,c){var d=null,e=null;if(P[a]){if(d=P[a][b],"function"!=typeof d)throw new TypeError(b+" on iFrame["+a+"] is not a function");e=d(c)}return e}function n(a){var b=a.id;h(b,"Removing iFrame: "+b),a.parentNode.removeChild(a),m(b,"closedCallback",b),h(b,"--"),delete P[b]}function o(b){null===M&&(M={x:void 0!==a.pageXOffset?a.pageXOffset:document.documentElement.scrollLeft,y:void 0!==a.pageYOffset?a.pageYOffset:document.documentElement.scrollTop},h(b,"Get page position: "+M.x+","+M.y))}function p(b){null!==M&&(a.scrollTo(M.x,M.y),h(b,"Set page position: "+M.x+","+M.y),q())}function q(){M=null}function r(a){function b(){s(a),u("reset","reset",a.iframe,a.id)}h(a.id,"Size reset requested by "+("init"===a.type?"host page":"iFrame")),o(a.id),t(b,a,"reset")}function s(a){function b(b){a.iframe.style[b]=a[b]+"px",h(a.id,"IFrame ("+e+") "+b+" set to "+a[b]+"px")}function c(b){H||"0"!==a[b]||(H=!0,h(e,"Hidden iFrame detected, creating visibility listener"),y())}function d(a){b(a),c(a)}var e=a.iframe.id;P[e]&&(P[e].sizeHeight&&d("height"),P[e].sizeWidth&&d("width"))}function t(a,b,c){c!==b.type&&N?(h(b.id,"Requesting animation frame"),N(a)):a()}function u(a,b,c,d){function e(){var e=P[d].targetOrigin;h(d,"["+a+"] Sending msg to iframe["+d+"] ("+b+") targetOrigin: "+e),c.contentWindow.postMessage(K+b,e)}function f(){i(d,"["+a+"] IFrame("+d+") not found"),P[d]&&delete P[d]}function g(){c&&"contentWindow"in c&&null!==c.contentWindow?e():f()}d=d||c.id,P[d]&&g()}function v(a){return a+":"+P[a].bodyMarginV1+":"+P[a].sizeWidth+":"+P[a].log+":"+P[a].interval+":"+P[a].enablePublicMethods+":"+P[a].autoResize+":"+P[a].bodyMargin+":"+P[a].heightCalculationMethod+":"+P[a].bodyBackground+":"+P[a].bodyPadding+":"+P[a].tolerance+":"+P[a].inPageLinks+":"+P[a].resizeFrom+":"+P[a].widthCalculationMethod}function w(a,c){function d(){function b(b){1/0!==P[w][b]&&0!==P[w][b]&&(a.style[b]=P[w][b]+"px",h(w,"Set "+b+" = "+P[w][b]+"px"))}function c(a){if(P[w]["min"+a]>P[w]["max"+a])throw new Error("Value for min"+a+" can not be greater than max"+a)}c("Height"),c("Width"),b("maxHeight"),b("minHeight"),b("maxWidth"),b("minWidth")}function e(){var a=c&&c.id||S.id+F++;return null!==document.getElementById(a)&&(a+=F++),a}function f(b){return R=b,""===b&&(a.id=b=e(),G=(c||{}).log,R=b,h(b,"Added missing iframe ID: "+b+" ("+a.src+")")),b}function g(){h(w,"IFrame scrolling "+(P[w].scrolling?"enabled":"disabled")+" for "+w),a.style.overflow=!1===P[w].scrolling?"hidden":"auto",a.scrolling=!1===P[w].scrolling?"no":"yes"}function i(){("number"==typeof P[w].bodyMargin||"0"===P[w].bodyMargin)&&(P[w].bodyMarginV1=P[w].bodyMargin,P[w].bodyMargin=""+P[w].bodyMargin+"px")}function k(){var b=P[w].firstRun,c=P[w].heightCalculationMethod in O;!b&&c&&r({iframe:a,height:0,width:0,type:"init"})}function l(){Function.prototype.bind&&(P[w].iframe.iFrameResizer={close:n.bind(null,P[w].iframe),resize:u.bind(null,"Window resize","resize",P[w].iframe),moveToAnchor:function(a){u("Move to anchor","inPageLink:"+a,P[w].iframe,w)},sendMessage:function(a){a=JSON.stringify(a),u("Send Message","message:"+a,P[w].iframe,w)}})}function m(c){function d(){u("iFrame.onload",c,a),k()}b(a,"load",d),u("init",c,a)}function o(a){if("object"!=typeof a)throw new TypeError("Options is not an object")}function p(a){for(var b in S)S.hasOwnProperty(b)&&(P[w][b]=a.hasOwnProperty(b)?a[b]:S[b])}function q(a){return""===a||"file://"===a?"*":a}function s(b){b=b||{},P[w]={firstRun:!0,iframe:a,remoteHost:a.src.split("/").slice(0,3).join("/")},o(b),p(b),P[w].targetOrigin=!0===P[w].checkOrigin?q(P[w].remoteHost):"*"}function t(){return w in P&&"iFrameResizer"in a}var w=f(a.id);t()?j(w,"Ignored iFrame, already setup."):(s(c),g(),d(),i(),m(v(w)),l())}function x(a,b){null===Q&&(Q=setTimeout(function(){Q=null,a()},b))}function y(){function b(){function a(a){function b(b){return"0px"===P[a].iframe.style[b]}function c(a){return null!==a.offsetParent}c(P[a].iframe)&&(b("height")||b("width"))&&u("Visibility change","resize",P[a].iframe,a)}for(var b in P)a(b)}function c(a){h("window","Mutation observed: "+a[0].target+" "+a[0].type),x(b,16)}function d(){var a=document.querySelector("body"),b={attributes:!0,attributeOldValue:!1,characterData:!0,characterDataOldValue:!1,childList:!0,subtree:!0},d=new e(c);d.observe(a,b)}var e=a.MutationObserver||a.WebKitMutationObserver;e&&d()}function z(a){function b(){B("Window "+a,"resize")}h("window","Trigger event: "+a),x(b,16)}function A(){function a(){B("Tab Visable","resize")}"hidden"!==document.visibilityState&&(h("document","Trigger event: Visiblity change"),x(a,16))}function B(a,b){function c(a){return"parent"===P[a].resizeFrom&&P[a].autoResize&&!P[a].firstRun}for(var d in P)c(d)&&u(a,b,document.getElementById(d),d)}function C(){b(a,"message",l),b(a,"resize",function(){z("resize")}),b(document,"visibilitychange",A),b(document,"-webkit-visibilitychange",A),b(a,"focusin",function(){z("focus")}),b(a,"focus",function(){z("focus")})}function D(){function a(a,c){function d(){if(!c.tagName)throw new TypeError("Object is not a valid DOM element");if("IFRAME"!==c.tagName.toUpperCase())throw new TypeError("Expected <IFRAME> tag, found <"+c.tagName+">")}c&&(d(),w(c,a),b.push(c))}var b;return d(),C(),function(c,d){switch(b=[],typeof d){case"undefined":case"string":Array.prototype.forEach.call(document.querySelectorAll(d||"iframe"),a.bind(void 0,c));break;case"object":a(c,d);break;default:throw new TypeError("Unexpected data type ("+typeof d+")")}return b}}function E(a){a.fn.iFrameResize=function(a){return this.filter("iframe").each(function(b,c){w(c,a)}).end()}}var F=0,G=!1,H=!1,I="message",J=I.length,K="[iFrameSizer]",L=K.length,M=null,N=a.requestAnimationFrame,O={max:1,scroll:1,bodyScroll:1,documentElementScroll:1},P={},Q=null,R="Host Page",S={autoResize:!0,bodyBackground:null,bodyMargin:null,bodyMarginV1:8,bodyPadding:null,checkOrigin:!0,inPageLinks:!1,enablePublicMethods:!0,heightCalculationMethod:"bodyOffset",id:"iFrameResizer",interval:32,log:!1,maxHeight:1/0,maxWidth:1/0,minHeight:0,minWidth:0,resizeFrom:"parent",scrolling:!1,sizeHeight:!0,sizeWidth:!1,tolerance:0,widthCalculationMethod:"scroll",closedCallback:function(){},initCallback:function(){},messageCallback:function(){j("MessageCallback function not defined")},resizedCallback:function(){},scrollCallback:function(){return!0}};a.jQuery&&E(jQuery),"function"==typeof define&&define.amd?define([],D):"object"==typeof module&&"object"==typeof module.exports?module.exports=D():a.iFrameResize=a.iFrameResize||D()}(window||{});
//# sourceMappingURL=iframeResizer.map
\ No newline at end of file
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
/******************************************************************************
* jquery.i18n.properties
*
/*
- * Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
*
* Licensed 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
+ * 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
*/
var metricsChart = {};
-/*\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
-var vm = avalon\r
- .define({\r
- $id : "metricsController",\r
- routeTargetTitle:$.i18n.prop("org_openo_msb_route_content_title"), \r
- $metricsUrl : '/admin/metrics', \r
- metricsLoading:false, \r
- metricsArray : [], \r
- threadNum:"",\r
- isErr:false,\r
- jvmTime:"",\r
- restArray:[],\r
- \r
- $dataTableLanguage: {\r
- "sProcessing": "<img src='../img/loading-spinner-grey.gif'/><span> Loadding...</span>", \r
- "sLengthMenu": $.i18n.prop("org_openo_msb_route-table-sLengthMenu"),\r
- "sZeroRecords": $.i18n.prop("org_openo_msb_route-table-sZeroRecords"),\r
- "sInfo": "<span class='seperator'> </span>" + $.i18n.prop("org_openo_msb_route-table-sInfo"),\r
- "sInfoEmpty": $.i18n.prop("org_openo_msb_route-table-sInfoEmpty"),\r
- "sGroupActions": $.i18n.prop("org_openo_msb_route-table-sGroupActions"),\r
- "sAjaxRequestGeneralError": $.i18n.prop("org_openo_msb_route-table-sAjaxRequestGeneralError"),\r
- "sEmptyTable": $.i18n.prop("org_openo_msb_route-table-sEmptyTable"),\r
- "oPaginate": {\r
- "sPrevious": $.i18n.prop("org_openo_msb_route-table-sPrevious"),\r
- "sNext": $.i18n.prop("org_openo_msb_route-table-sNext"),\r
- "sPage": $.i18n.prop("org_openo_msb_route-table-sPage"),\r
- "sPageOf": $.i18n.prop("org_openo_msb_route-table-sPageOf")\r
- },\r
- "sSearch": $.i18n.prop("org_openo_msb_route-table-search"),\r
- "sInfoFiltered": $.i18n.prop("org_openo_msb_route-table-infofilter") \r
- }, \r
- initMetrics : function() {\r
- \r
- \r
- $.ajax({\r
- "type": 'get',\r
- "url": url,\r
- "dataType": "json",\r
- success: function (resp) { \r
- vm.isErr=false; \r
- var restJson = resp; \r
- // var restJson = metricsUtil.restJson; \r
- \r
- var testRestJson=restJson.timers;\r
- var gaugesJson=restJson.gauges;\r
-\r
- //jvm Time\r
- var jvmTime=gaugesJson["jvm.attribute.uptime"].value;\r
-\r
- vm.jvmTime=metricsUtil.formatSeconds(jvmTime);\r
-\r
-\r
- //Initialize the JVM memory usage\r
- var Eden_Space_usage;\r
- if(gaugesJson["jvm.memory.pools.Eden-Space.usage"]==null){\r
- if(gaugesJson["jvm.memory.pools.PS-Eden-Space.usage"]==null)\r
- {\r
- Eden_Space_usage=0;\r
- }\r
- else{\r
- Eden_Space_usage=gaugesJson["jvm.memory.pools.PS-Eden-Space.usage"].value;\r
- }\r
- }\r
- else{\r
- Eden_Space_usage=gaugesJson["jvm.memory.pools.Eden-Space.usage"].value;\r
- }\r
-\r
-\r
-\r
-\r
- var Perm_Gen_usage;\r
- if(gaugesJson["jvm.memory.pools.Perm-Gen.usage"]==null){\r
- if(gaugesJson["jvm.memory.pools.PS-Perm-Gen.usage"]==null)\r
- {\r
- Perm_Gen_usage=0;\r
- }\r
- else{\r
- Perm_Gen_usage=gaugesJson["jvm.memory.pools.PS-Perm-Gen.usage"].value;\r
- }\r
- }\r
- else{\r
- Perm_Gen_usage=gaugesJson["jvm.memory.pools.Perm-Gen.usage"].value;\r
- }\r
-\r
-\r
- var Survivor_Space_usage;\r
- if(gaugesJson["jvm.memory.pools.Survivor-Space.usage"]==null){\r
- if(gaugesJson["jvm.memory.pools.PS-Survivor-Space.usage"]==null)\r
- {\r
- Survivor_Space_usage=0;\r
- }\r
- else{\r
- Survivor_Space_usage=gaugesJson["jvm.memory.pools.PS-Survivor-Space.usage"].value;\r
- }\r
- }\r
- else{\r
- Survivor_Space_usage=gaugesJson["jvm.memory.pools.Survivor-Space.usage"].value;\r
- }\r
-\r
-\r
- var Tenured_Gen_usage;\r
- if(gaugesJson["jvm.memory.pools.Tenured-Gen.usage"]==null){\r
- if(gaugesJson["jvm.memory.pools.PS-Old-Gen.usage"]==null)\r
- {\r
- Tenured_Gen_usage=0;\r
- }\r
- else{\r
- Tenured_Gen_usage=gaugesJson["jvm.memory.pools.PS-Old-Gen.usage"].value;\r
- }\r
- }\r
- else{\r
- Tenured_Gen_usage=gaugesJson["jvm.memory.pools.Tenured-Gen.usage"].value;\r
- } \r
-\r
-\r
- var memoryPieMetrics_data={\r
- CodeCache:(gaugesJson["jvm.memory.pools.Code-Cache.usage"].value*100).toFixed(1),\r
- EdenSpace:(Eden_Space_usage*100).toFixed(1),\r
- PermGen:(Perm_Gen_usage*100).toFixed(1),\r
- SurvivorSpace:(Survivor_Space_usage*100).toFixed(1),\r
- TenuredGen:(Tenured_Gen_usage*100).toFixed(1)\r
- };\r
- metricsChart.memoryPieMetrics(memoryPieMetrics_data);\r
-\r
- // initialize the JVM memory map\r
- var heap_init=Math.round(gaugesJson["jvm.memory.heap.init"].value/1000000);\r
- var non_heap_init=Math.round(gaugesJson["jvm.memory.non-heap.init"].value/1000000);\r
-\r
- var heap_used=Math.round(gaugesJson["jvm.memory.heap.used"].value/1000000);\r
- var non_heap_used=Math.round(gaugesJson["jvm.memory.non-heap.used"].value/1000000);\r
-\r
- var heap_max=Math.round(gaugesJson["jvm.memory.heap.max"].value/1000000);\r
- var non_heap_max=Math.round(gaugesJson["jvm.memory.non-heap.max"].value/1000000);\r
-\r
- var memoryBarMetrics_data={\r
- init:[\r
- heap_init,\r
- non_heap_init,\r
- non_heap_init+heap_init\r
- ],\r
- used:[\r
- heap_used,\r
- non_heap_used,\r
- non_heap_used+heap_used\r
- ],\r
- max:[\r
- heap_max,\r
- non_heap_max,\r
- non_heap_max+heap_max\r
- ]\r
- };\r
- metricsChart.memoryBarMetrics(memoryBarMetrics_data);\r
-\r
- //Initializes the thread profile\r
- var threadsMetrics_data= [{value:gaugesJson["jvm.threads.runnable.count"].value, name:'Runnable'},\r
- {value:gaugesJson["jvm.threads.timed_waiting.count"].value, name:'Timed waiting'},\r
- {value:gaugesJson["jvm.threads.waiting.count"].value, name:'Waiting'},\r
- {value:gaugesJson["jvm.threads.blocked.count"].value, name:'Blocked'}];\r
- vm.threadNum=gaugesJson["jvm.threads.count"].value;\r
- metricsChart.threadsMetrics(threadsMetrics_data);\r
-\r
- //Initialize the Rest interface traffic map\r
- var restMetrics_data={restName:[],restCount:[]}; \r
- $.each(testRestJson,function(name,value) {\r
- if(name=="io.dropwizard.jetty.MutableServletContextHandler.connect-requests") return false;\r
- var nameArray=name.split(".");\r
-\r
- restMetrics_data.restName.push(nameArray[nameArray.length-1]);\r
- restMetrics_data.restCount.push(value.count);\r
-\r
- });\r
- \r
-\r
- metricsChart.restMetrics(restMetrics_data); \r
-\r
-\r
- //Initialize the HTTP traffic\r
- var requestsMetrics_data={get:"",post:"",put:"",delete:"",other:""};\r
- requestsMetrics_data.get=testRestJson["io.dropwizard.jetty.MutableServletContextHandler.get-requests"].count;\r
- requestsMetrics_data.post=testRestJson["io.dropwizard.jetty.MutableServletContextHandler.post-requests"].count;\r
- requestsMetrics_data.put=testRestJson["io.dropwizard.jetty.MutableServletContextHandler.put-requests"].count;\r
- requestsMetrics_data.delete=testRestJson["io.dropwizard.jetty.MutableServletContextHandler.delete-requests"].count;\r
- requestsMetrics_data.other=testRestJson["io.dropwizard.jetty.MutableServletContextHandler.other-requests"].count;\r
- metricsChart.requestsMetrics(requestsMetrics_data);\r
-\r
- //Initialize the HTTP access list in detail\r
- $.each(testRestJson,function(name,value) {\r
- if(name.indexOf("org.eclipse.jetty.server.HttpConnectionFactory") == 0) return true;\r
- var obj=value;\r
- obj.name=name;\r
- vm.restArray.push(obj);\r
- });\r
-\r
- $('#restTable').DataTable({\r
- responsive: true,\r
- destroy: true,\r
- "oLanguage": vm.$dataTableLanguage\r
- });\r
- \r
- },\r
- error: function(XMLHttpRequest, textStatus, errorThrown) {\r
- \r
- vm.isErr=true;\r
- }\r
- });\r
-\r
- } \r
- \r
-\r
- });\r
-avalon.scan();\r
-vm.initMetrics();\r
-\r
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
+var vm = avalon
+ .define({
+ $id : "metricsController",
+ routeTargetTitle:$.i18n.prop("org_openo_msb_route_content_title"),
+ $metricsUrl : '/admin/metrics',
+ metricsLoading:false,
+ metricsArray : [],
+ threadNum:"",
+ isErr:false,
+ jvmTime:"",
+ restArray:[],
+
+ $dataTableLanguage: {
+ "sProcessing": "<img src='../img/loading-spinner-grey.gif'/><span> Loadding...</span>",
+ "sLengthMenu": $.i18n.prop("org_openo_msb_route-table-sLengthMenu"),
+ "sZeroRecords": $.i18n.prop("org_openo_msb_route-table-sZeroRecords"),
+ "sInfo": "<span class='seperator'> </span>" + $.i18n.prop("org_openo_msb_route-table-sInfo"),
+ "sInfoEmpty": $.i18n.prop("org_openo_msb_route-table-sInfoEmpty"),
+ "sGroupActions": $.i18n.prop("org_openo_msb_route-table-sGroupActions"),
+ "sAjaxRequestGeneralError": $.i18n.prop("org_openo_msb_route-table-sAjaxRequestGeneralError"),
+ "sEmptyTable": $.i18n.prop("org_openo_msb_route-table-sEmptyTable"),
+ "oPaginate": {
+ "sPrevious": $.i18n.prop("org_openo_msb_route-table-sPrevious"),
+ "sNext": $.i18n.prop("org_openo_msb_route-table-sNext"),
+ "sPage": $.i18n.prop("org_openo_msb_route-table-sPage"),
+ "sPageOf": $.i18n.prop("org_openo_msb_route-table-sPageOf")
+ },
+ "sSearch": $.i18n.prop("org_openo_msb_route-table-search"),
+ "sInfoFiltered": $.i18n.prop("org_openo_msb_route-table-infofilter")
+ },
+ initMetrics : function() {
+
+
+ $.ajax({
+ "type": 'get',
+ "url": url,
+ "dataType": "json",
+ success: function (resp) {
+ vm.isErr=false;
+ var restJson = resp;
+ // var restJson = metricsUtil.restJson;
+
+ var testRestJson=restJson.timers;
+ var gaugesJson=restJson.gauges;
+
+ //jvm Time
+ var jvmTime=gaugesJson["jvm.attribute.uptime"].value;
+
+ vm.jvmTime=metricsUtil.formatSeconds(jvmTime);
+
+
+ //Initialize the JVM memory usage
+ var Eden_Space_usage;
+ if(gaugesJson["jvm.memory.pools.Eden-Space.usage"]==null){
+ if(gaugesJson["jvm.memory.pools.PS-Eden-Space.usage"]==null)
+ {
+ Eden_Space_usage=0;
+ }
+ else{
+ Eden_Space_usage=gaugesJson["jvm.memory.pools.PS-Eden-Space.usage"].value;
+ }
+ }
+ else{
+ Eden_Space_usage=gaugesJson["jvm.memory.pools.Eden-Space.usage"].value;
+ }
+
+
+
+
+ var Perm_Gen_usage;
+ if(gaugesJson["jvm.memory.pools.Perm-Gen.usage"]==null){
+ if(gaugesJson["jvm.memory.pools.PS-Perm-Gen.usage"]==null)
+ {
+ Perm_Gen_usage=0;
+ }
+ else{
+ Perm_Gen_usage=gaugesJson["jvm.memory.pools.PS-Perm-Gen.usage"].value;
+ }
+ }
+ else{
+ Perm_Gen_usage=gaugesJson["jvm.memory.pools.Perm-Gen.usage"].value;
+ }
+
+
+ var Survivor_Space_usage;
+ if(gaugesJson["jvm.memory.pools.Survivor-Space.usage"]==null){
+ if(gaugesJson["jvm.memory.pools.PS-Survivor-Space.usage"]==null)
+ {
+ Survivor_Space_usage=0;
+ }
+ else{
+ Survivor_Space_usage=gaugesJson["jvm.memory.pools.PS-Survivor-Space.usage"].value;
+ }
+ }
+ else{
+ Survivor_Space_usage=gaugesJson["jvm.memory.pools.Survivor-Space.usage"].value;
+ }
+
+
+ var Tenured_Gen_usage;
+ if(gaugesJson["jvm.memory.pools.Tenured-Gen.usage"]==null){
+ if(gaugesJson["jvm.memory.pools.PS-Old-Gen.usage"]==null)
+ {
+ Tenured_Gen_usage=0;
+ }
+ else{
+ Tenured_Gen_usage=gaugesJson["jvm.memory.pools.PS-Old-Gen.usage"].value;
+ }
+ }
+ else{
+ Tenured_Gen_usage=gaugesJson["jvm.memory.pools.Tenured-Gen.usage"].value;
+ }
+
+
+ var memoryPieMetrics_data={
+ CodeCache:(gaugesJson["jvm.memory.pools.Code-Cache.usage"].value*100).toFixed(1),
+ EdenSpace:(Eden_Space_usage*100).toFixed(1),
+ PermGen:(Perm_Gen_usage*100).toFixed(1),
+ SurvivorSpace:(Survivor_Space_usage*100).toFixed(1),
+ TenuredGen:(Tenured_Gen_usage*100).toFixed(1)
+ };
+ metricsChart.memoryPieMetrics(memoryPieMetrics_data);
+
+ // initialize the JVM memory map
+ var heap_init=Math.round(gaugesJson["jvm.memory.heap.init"].value/1000000);
+ var non_heap_init=Math.round(gaugesJson["jvm.memory.non-heap.init"].value/1000000);
+
+ var heap_used=Math.round(gaugesJson["jvm.memory.heap.used"].value/1000000);
+ var non_heap_used=Math.round(gaugesJson["jvm.memory.non-heap.used"].value/1000000);
+
+ var heap_max=Math.round(gaugesJson["jvm.memory.heap.max"].value/1000000);
+ var non_heap_max=Math.round(gaugesJson["jvm.memory.non-heap.max"].value/1000000);
+
+ var memoryBarMetrics_data={
+ init:[
+ heap_init,
+ non_heap_init,
+ non_heap_init+heap_init
+ ],
+ used:[
+ heap_used,
+ non_heap_used,
+ non_heap_used+heap_used
+ ],
+ max:[
+ heap_max,
+ non_heap_max,
+ non_heap_max+heap_max
+ ]
+ };
+ metricsChart.memoryBarMetrics(memoryBarMetrics_data);
+
+ //Initializes the thread profile
+ var threadsMetrics_data= [{value:gaugesJson["jvm.threads.runnable.count"].value, name:'Runnable'},
+ {value:gaugesJson["jvm.threads.timed_waiting.count"].value, name:'Timed waiting'},
+ {value:gaugesJson["jvm.threads.waiting.count"].value, name:'Waiting'},
+ {value:gaugesJson["jvm.threads.blocked.count"].value, name:'Blocked'}];
+ vm.threadNum=gaugesJson["jvm.threads.count"].value;
+ metricsChart.threadsMetrics(threadsMetrics_data);
+
+ //Initialize the Rest interface traffic map
+ var restMetrics_data={restName:[],restCount:[]};
+ $.each(testRestJson,function(name,value) {
+ if(name=="io.dropwizard.jetty.MutableServletContextHandler.connect-requests") return false;
+ var nameArray=name.split(".");
+
+ restMetrics_data.restName.push(nameArray[nameArray.length-1]);
+ restMetrics_data.restCount.push(value.count);
+
+ });
+
+
+ metricsChart.restMetrics(restMetrics_data);
+
+
+ //Initialize the HTTP traffic
+ var requestsMetrics_data={get:"",post:"",put:"",delete:"",other:""};
+ requestsMetrics_data.get=testRestJson["io.dropwizard.jetty.MutableServletContextHandler.get-requests"].count;
+ requestsMetrics_data.post=testRestJson["io.dropwizard.jetty.MutableServletContextHandler.post-requests"].count;
+ requestsMetrics_data.put=testRestJson["io.dropwizard.jetty.MutableServletContextHandler.put-requests"].count;
+ requestsMetrics_data.delete=testRestJson["io.dropwizard.jetty.MutableServletContextHandler.delete-requests"].count;
+ requestsMetrics_data.other=testRestJson["io.dropwizard.jetty.MutableServletContextHandler.other-requests"].count;
+ metricsChart.requestsMetrics(requestsMetrics_data);
+
+ //Initialize the HTTP access list in detail
+ $.each(testRestJson,function(name,value) {
+ if(name.indexOf("org.eclipse.jetty.server.HttpConnectionFactory") == 0) return true;
+ var obj=value;
+ obj.name=name;
+ vm.restArray.push(obj);
+ });
+
+ $('#restTable').DataTable({
+ responsive: true,
+ destroy: true,
+ "oLanguage": vm.$dataTableLanguage
+ });
+
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+
+ vm.isErr=true;
+ }
+ });
+
+ }
+
+
+ });
+avalon.scan();
+vm.initMetrics();
+
/*
- * Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
*
* Licensed 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
+ * 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
*/
-
var metricsUtil = {};
-/*\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
-body {\r
- background-color: #4d5b69!important;\r
- font-family: "microsoft yahei";\r
-}\r
-\r
-.header.navbar {\r
- width: 100%;\r
- padding: 0 20px 0 20px;\r
- margin: 0;\r
- border: 0px;\r
- padding: 0px;\r
- box-shadow: none;\r
- height: 42px;\r
- min-height: 42px;\r
-}\r
-\r
-.header {\r
- filter: none !important;\r
- background-image: none !important;\r
- background-color: #fff !important;\r
-}\r
-\r
-.header.navbar .navbar-brand {\r
- display: inline-block;\r
- margin-right: 0;\r
- padding: 0;\r
- width: 135px !important;\r
- height: 42px !important;\r
- background-color: #238dfa !important;\r
- margin-top: 0 !important;\r
-}\r
-\r
-.page-sidebar-closed .header.navbar .navbar-brand {\r
- width: 35px !important;\r
-}\r
-\r
-.header.navbar .navbar-brand img {\r
- margin-left: 10px !important;\r
- width: 80%;\r
- margin-top: 7px;\r
-}\r
-\r
-.page-sidebar-closed .header.navbar .navbar-brand img {\r
- display: none !important;\r
-}\r
-\r
-.page-sidebar{\r
- float:left;\r
- width: 135px ;\r
- background-color: #4d5b69;\r
-}\r
-\r
-.page-sidebar-closed .page-sidebar{\r
- \r
- width: 35px !important;\r
-\r
-}\r
-\r
-.page-container {\r
- margin: 0px;\r
- padding: 0px;\r
- position: relative;\r
-}\r
-\r
-.sideBar {\r
- width: 132px;\r
- background-color: #4D5B69;\r
-}\r
-\r
-.page-sidebar-closed .sideBar{\r
-width: 35px !important;\r
-background-color: #4d5b69!important;\r
-\r
-}\r
-\r
-.sideBar .menu {\r
- width: 100%;\r
- height: 128px;\r
- color: #aaa;\r
- font-size: 16px;\r
- text-align: center;\r
- /* border-bottom: 2px solid #536372; */\r
- border-top: 1px solid #536372;\r
- /* border-bottom-style: groove; */\r
-}\r
-.page-sidebar-closed .sideBar .menu {\r
-height: 35px !important;\r
-border-bottom:0px;\r
-}\r
-\r
-.sideBar .menu i.icon.fa{\r
- font-size: 32px;\r
- margin-bottom: 7px\r
-}\r
-\r
-\r
-\r
-.page-sidebar-closed .sideBar .menu i.icon.fa{\r
- font-size: 18px;\r
- \r
-}\r
-\r
-\r
-\r
-\r
-\r
-.sideBar .menu i.icon {\r
- width: 36px;\r
- height: 36px;\r
-}\r
-\r
-.page-sidebar-closed .sideBar .menu i.icon {\r
- width: 18px;\r
- height: 18px;\r
-} \r
-.sideBar .menu i {\r
- margin-top: 25%;\r
-}\r
-\r
-.sideBar a.router-link-active .menu {\r
- color: #fff;\r
- background-color: #424e57;\r
- width: 132px;\r
-}\r
-\r
-.page-sidebar-closed .sideBar a.router-link-active .menu{\r
-width: 35px !important;\r
-height: 35px;\r
-}\r
-\r
-.page-sidebar-closed .sideBar a label{\r
- display:none\r
- \r
-}\r
-\r
-.sideBar a{\r
-text-decoration: none;\r
-cursor:pointer ;\r
-}\r
-\r
-.sideBar a:hover .menu {\r
- color: #fff;\r
- background-color: #424e57;\r
- width: 132px;\r
-\r
-}\r
-\r
-.page-sidebar-closed .sideBar a:hover .menu{\r
-width: 35px !important;\r
-}\r
-\r
-.sideBar a.router-link-active .menu .menu-left {\r
- width: 2px;\r
- height: 126px;\r
- float: left;\r
- background-color: #238ff9;\r
-}\r
-\r
-.page-sidebar-closed .sideBar a.router-link-active .menu .menu-left {\r
-\r
- height: 33px;\r
-\r
-}\r
-\r
-\r
-.sidebar-toggler {\r
- background-image: url(../img/sidebar-toggler-grey.jpg);\r
- background-color: #0f5179;\r
- margin-top: 15px;\r
- margin-left: 95px;\r
- margin-bottom: 5px;\r
- cursor: pointer;\r
- opacity: 0.5;\r
- filter: alpha(opacity=50);\r
- width: 29px;\r
- height: 29px;\r
- background-repeat: no-repeat;\r
-}\r
-\r
-.page-sidebar-closed .sidebar-toggler{\r
- margin-left: 3px;\r
-}\r
-\r
-.sideBar a .selected{\r
-display:none;\r
- }\r
-\r
-.sideBar a.router-link-active .selected{\r
- display: block;\r
- float: right;\r
- margin-top: -25px;\r
- background: none;\r
- width: 0;\r
- height: 0;\r
- border-style: solid;\r
- border-top: 12px double transparent;\r
- border-bottom: 12px double transparent;\r
- border-left: 0;\r
- border-right: 8px solid #F1F3FA; \r
-\r
-}\r
-\r
-.chineseTitle{\r
- margin: 0;\r
- float: left;\r
- margin-left: 20px;\r
- font-weight: bold;\r
- padding-top: 8px;\r
- letter-spacing: 2px;\r
- font-size: 20px;\r
- font-family: 'Microsoft Yahei', sans-serif;\r
- /* text-shadow: -1px 1px rgba(221, 221, 221, 1); */\r
-}\r
-\r
-.englishTitle{\r
- margin: 0;\r
- float: left;\r
- margin-left: 10px;\r
- font-family: Arial;\r
- font-size: 14px;\r
- padding-top: 15px;\r
-}\r
-\r
-.page-content {\r
- margin-top: 0px;\r
- padding: 0px;\r
- background-color: #9C5A5A !important;\r
- margin-left: 135px;\r
-}\r
-\r
-.page-sidebar-closed .page-content{\r
-\r
- margin-left: 35px;\r
-}\r
-\r
-.page-content-body {\r
- padding-left: 10px;\r
- padding-right: 10px;\r
- padding-top: 8px;\r
- float:left;\r
- width: 100%;\r
- background-color: #f1f3fa;\r
-}\r
-\r
-.page-sidebar-closed .page-content-body {\r
- padding-left: 0px;\r
- padding-right: 5px;\r
- padding-top: 5px;\r
-\r
-}\r
-\r
-label {\r
-\r
- font-weight: normal; \r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
+body {
+ background-color: #4d5b69!important;
+ font-family: "microsoft yahei";
+}
+
+.header.navbar {
+ width: 100%;
+ padding: 0 20px 0 20px;
+ margin: 0;
+ border: 0px;
+ padding: 0px;
+ box-shadow: none;
+ height: 42px;
+ min-height: 42px;
+}
+
+.header {
+ filter: none !important;
+ background-image: none !important;
+ background-color: #fff !important;
+}
+
+.header.navbar .navbar-brand {
+ display: inline-block;
+ margin-right: 0;
+ padding: 0;
+ width: 135px !important;
+ height: 42px !important;
+ background-color: #238dfa !important;
+ margin-top: 0 !important;
+}
+
+.page-sidebar-closed .header.navbar .navbar-brand {
+ width: 35px !important;
+}
+
+.header.navbar .navbar-brand img {
+ margin-left: 10px !important;
+ width: 80%;
+ margin-top: 7px;
+}
+
+.page-sidebar-closed .header.navbar .navbar-brand img {
+ display: none !important;
+}
+
+.page-sidebar{
+ float:left;
+ width: 135px ;
+ background-color: #4d5b69;
+}
+
+.page-sidebar-closed .page-sidebar{
+
+ width: 35px !important;
+
+}
+
+.page-container {
+ margin: 0px;
+ padding: 0px;
+ position: relative;
+}
+
+.sideBar {
+ width: 132px;
+ background-color: #4D5B69;
+}
+
+.page-sidebar-closed .sideBar{
+width: 35px !important;
+background-color: #4d5b69!important;
+
+}
+
+.sideBar .menu {
+ width: 100%;
+ height: 128px;
+ color: #aaa;
+ font-size: 16px;
+ text-align: center;
+ /* border-bottom: 2px solid #536372; */
+ border-top: 1px solid #536372;
+ /* border-bottom-style: groove; */
+}
+.page-sidebar-closed .sideBar .menu {
+height: 35px !important;
+border-bottom:0px;
+}
+
+.sideBar .menu i.icon.fa{
+ font-size: 32px;
+ margin-bottom: 7px
+}
+
+
+
+.page-sidebar-closed .sideBar .menu i.icon.fa{
+ font-size: 18px;
+
+}
+
+
+
+
+
+.sideBar .menu i.icon {
+ width: 36px;
+ height: 36px;
+}
+
+.page-sidebar-closed .sideBar .menu i.icon {
+ width: 18px;
+ height: 18px;
+}
+.sideBar .menu i {
+ margin-top: 25%;
+}
+
+.sideBar a.router-link-active .menu {
+ color: #fff;
+ background-color: #424e57;
+ width: 132px;
+}
+
+.page-sidebar-closed .sideBar a.router-link-active .menu{
+width: 35px !important;
+height: 35px;
+}
+
+.page-sidebar-closed .sideBar a label{
+ display:none
+
+}
+
+.sideBar a{
+text-decoration: none;
+cursor:pointer ;
+}
+
+.sideBar a:hover .menu {
+ color: #fff;
+ background-color: #424e57;
+ width: 132px;
+
+}
+
+.page-sidebar-closed .sideBar a:hover .menu{
+width: 35px !important;
+}
+
+.sideBar a.router-link-active .menu .menu-left {
+ width: 2px;
+ height: 126px;
+ float: left;
+ background-color: #238ff9;
+}
+
+.page-sidebar-closed .sideBar a.router-link-active .menu .menu-left {
+
+ height: 33px;
+
+}
+
+
+.sidebar-toggler {
+ background-image: url(../img/sidebar-toggler-grey.jpg);
+ background-color: #0f5179;
+ margin-top: 15px;
+ margin-left: 95px;
+ margin-bottom: 5px;
+ cursor: pointer;
+ opacity: 0.5;
+ filter: alpha(opacity=50);
+ width: 29px;
+ height: 29px;
+ background-repeat: no-repeat;
+}
+
+.page-sidebar-closed .sidebar-toggler{
+ margin-left: 3px;
+}
+
+.sideBar a .selected{
+display:none;
+ }
+
+.sideBar a.router-link-active .selected{
+ display: block;
+ float: right;
+ margin-top: -25px;
+ background: none;
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-top: 12px double transparent;
+ border-bottom: 12px double transparent;
+ border-left: 0;
+ border-right: 8px solid #F1F3FA;
+
+}
+
+.chineseTitle{
+ margin: 0;
+ float: left;
+ margin-left: 20px;
+ font-weight: bold;
+ padding-top: 8px;
+ letter-spacing: 2px;
+ font-size: 20px;
+ font-family: 'Microsoft Yahei', sans-serif;
+ /* text-shadow: -1px 1px rgba(221, 221, 221, 1); */
+}
+
+.englishTitle{
+ margin: 0;
+ float: left;
+ margin-left: 10px;
+ font-family: Arial;
+ font-size: 14px;
+ padding-top: 15px;
+}
+
+.page-content {
+ margin-top: 0px;
+ padding: 0px;
+ background-color: #9C5A5A !important;
+ margin-left: 135px;
+}
+
+.page-sidebar-closed .page-content{
+
+ margin-left: 35px;
+}
+
+.page-content-body {
+ padding-left: 10px;
+ padding-right: 10px;
+ padding-top: 8px;
+ float:left;
+ width: 100%;
+ background-color: #f1f3fa;
+}
+
+.page-sidebar-closed .page-content-body {
+ padding-left: 0px;
+ padding-right: 5px;
+ padding-top: 5px;
+
+}
+
+label {
+
+ font-weight: normal;
+}
-/*\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
-body {\r
- color: #333;\r
- font-family: "Microsoft yahei", Verdana, Arial, Helvetica, sans-serif !important;\r
- padding: 0px !important;\r
- margin: 0px !important;\r
- direction: ltr;\r
- background-color: #ffffff !important; \r
-}\r
-\r
-/*.form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control {\r
- cursor: auto;\r
-\r
- }*/\r
-.modal-footer {\r
- margin-top:0px; \r
- }\r
-.form-group {\r
- margin-bottom: 5px;\r
-}\r
-\r
-.modal-body {\r
- padding: 10px;\r
-}\r
-\r
-.row{\r
- margin-left: 0px; \r
- margin-right: 0px; \r
-}\r
-\r
-select {\r
- border-width: 1px;\r
- padding: 4px 1px;\r
- border-radius: 4px;\r
-}\r
-\r
-.navbar {\r
- overflow: visible;\r
- margin-bottom: 0px;\r
-\r
-}\r
-\r
-#top-bar, #top-bar small, #top-bar a {\r
- text-shadow: 0px -1px 0px #182127;\r
- color: #ffffff;\r
-}\r
-\r
-.span12{\r
- margin-top:5px;\r
-}\r
-\r
-#title {\r
- color: #ffffff;\r
- font-weight: bolder;\r
-}\r
-\r
-#top-bar {\r
- background-color: #363F45;\r
- background-image: -moz-linear-gradient(top, #545d63, #182127);\r
- background-image: -ms-linear-gradient(top, #545d63, #182127);\r
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#545d63), to(#182127));\r
- background-image: -webkit-linear-gradient(top, #545d63, #182127);\r
- background-image: -o-linear-gradient(top, #545d63, #182127);\r
- background-image: linear-gradient(top, #545d63, #182127);\r
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#545d63', endColorstr = '#182127', GradientType = 0);\r
- -webkit-border-radius: 0;\r
- -moz-border-radius: 0;\r
- border-radius: 0;\r
- height: 55px;\r
-}\r
-\r
-.navbar-inner {\r
- padding-left: 20px;\r
- padding-right: 20px;\r
- background-color: #2c2c2c;\r
- background-image: -moz-linear-gradient(top, #333333, #222222);\r
- background-image: -ms-linear-gradient(top, #333333, #222222);\r
- background-image: -o-linear-gradient(top, #333333, #222222);\r
- background-image: linear-gradient(top, #333333, #222222);\r
- background-repeat: repeat-x;\r
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);\r
- -webkit-border-radius: 4px;\r
- -moz-border-radius: 4px;\r
- border-radius: 4px;\r
- -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);\r
- -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);\r
-}\r
-\r
-\r
-\r
-.container-fluid {\r
- background-color: #fff;\r
-}\r
-\r
-div[data-name="route_zone"] {\r
- background-color: #fff;\r
- margin-bottom: 15px;\r
-}\r
-\r
-\r
-\r
-p[tooltip], div[tooltip], td[tooltip], span[tooltip]{\r
- overflow: hidden;\r
- text-overflow: ellipsis;\r
- white-space:nowrap; \r
-}\r
-\r
-.add-route-btn{\r
- background: #fff;\r
- color: #ccc;\r
- height: 115px;\r
- margin: 10px;\r
- padding-top: 22px;\r
- text-align: center;\r
- text-decoration: none;\r
- width: 130px;\r
- border:1px dashed #aaa;\r
- float:left;\r
-\r
-}\r
-\r
-.add-route-btn:hover{\r
- color:#3276b1;\r
- cursor: pointer;\r
-}\r
-\r
-\r
-.add-route-btn span {\r
- display: block;\r
- margin-left:5px;\r
- margin-right:5px;\r
- margin-top:5px;\r
- color: #444;\r
-}\r
-\r
-\r
-.quick-btn {\r
- background: #eee;\r
- box-shadow: 0 0 0 1px #f8f8f8 inset,0 0 0 1px #ccc;\r
- color: #444;\r
- height: 110px;\r
- margin: 10px;\r
- padding-top: 1pc;\r
- text-align: center;\r
- text-decoration: none;\r
- width: 120px;\r
- float:left;\r
-\r
-}\r
-div[data-name="route_zone"] .active{\r
- color:#fff;\r
- background-color:#444;\r
- cursor: pointer;\r
-}\r
-\r
-div[data-name="route_zone"] .sparkline .route-valid {\r
- color: #62AAF5;\r
- }\r
-\r
- div[data-name="route_zone"] .sparkline .route-invalid {\r
- color:rgba(128, 128, 128, 0.73);\r
- }\r
-\r
-div[data-name="route_zone"] .active .sparkline i{\r
- color:#C3DDF4;\r
- }\r
-\r
-\r
-\r
-.quick-btn:hover{\r
-\r
- box-shadow: 0 0 0 1px #f8f8f8 inset,0 0 0 1px #636363;\r
- cursor: pointer;\r
-}\r
-\r
-.quick-btn span {\r
- display: block;\r
- margin-left:5px;\r
- margin-right:5px;\r
- margin-top:10px;\r
-\r
-}\r
-\r
-.route-ip{\r
- font-size: 12px;\r
-}\r
-\r
-\r
-.progressList{\r
- margin-top: 15px;\r
- margin-left:15px;\r
- width:90%\r
-}\r
-\r
-.processContent{\r
- display: inline-block;margin-right:5px\r
-}\r
-\r
-.nav.nav-pills.nav-stacked > li.active > a, .nav.nav-pills.nav-stacked > li.active > a:hover,.nav.nav-pills.nav-stacked > li > a:hover {\r
- background-color: #f6f6f6;\r
- border-left-color: #3c8dbc;\r
- color: #444;\r
-}\r
-\r
-\r
-.nav.nav-pills.nav-stacked > li > a {\r
- border-top: 0;\r
- border-left: 3px solid transparent;\r
- -webkit-border-radius: 0;\r
- -moz-border-radius: 0;\r
- border-radius: 0;\r
- color: #444;\r
- height:46px;\r
-}\r
-.nav.nav-pills > li.active > a {\r
- font-weight: 600;\r
-}\r
-\r
-.btn-xs {\r
- color: #333;\r
- font-size: 14px;\r
-}\r
-.grey {\r
- background-color: #e5e5e5;\r
- color: #333;\r
-}\r
-.btn-xs, .btn-group-xs>.btn {\r
- padding: 1px 5px;\r
- font-size: 12px;\r
- line-height: 1.5;\r
- border-radius: 3px;\r
-}\r
-\r
-.control-label .required {\r
- color: #e02222;\r
- font-size: 12px;\r
- padding-left: 2px;\r
-}\r
-\r
-.nav>li>a{\r
- /*padding:10px 5px;*/\r
-}\r
-\r
-.process-btn button{\r
- padding:3px 8px\r
-}\r
-\r
-pre.prettyprint {\r
- color:#000;\r
- height: 450px;\r
-}\r
-\r
-pre {\r
- font: 14px/22px 'courier new';\r
- word-break: break-all;\r
- word-wrap: break-word;\r
- border: 0px;\r
- background-color:#fff;\r
- padding: 5px 5px;\r
-}\r
-\r
-.atv {\r
- color: #114B7E;\r
-}\r
-\r
-\r
-\r
-.stats_box {\r
- display: inline-block;\r
- list-style: none outside none;\r
- margin-left: 0;\r
- margin-top: 10px;\r
- padding: 0;\r
- /*float: left;*/\r
-}\r
-\r
-.stats_box .routeDiv{\r
- background: #F1F3FA;\r
- /* box-shadow: 0 0 0 1px #f8f8f8 inset,0 0 0 1px #ccc; */\r
- display: inline-block;\r
- line-height: 18px;\r
- margin: 0 10px 10px;\r
- padding: 0 8px;\r
- float: left;\r
- height: 125px;\r
- border: 1px solid #E0E0E0;\r
- /* border-radius: 10px; */\r
-}\r
-\r
-.routeDiv:hover{\r
-\r
- border:1px solid #cfcfcf;\r
- cursor: pointer;\r
- box-shadow:-webkit-box-shadow:0 5px 20px rgba(0,0,0,0.1);\r
- box-shadow:0 5px 20px rgba(0,0,0,0.1); \r
-}\r
-\r
-\r
-.sparkline {\r
- width: 60px;\r
- border-right: 1px solid #dcdcdc;\r
- box-shadow: 1px 0 0 0 #fff;\r
- float: left;\r
- margin-right: 9pt;\r
- padding: 25px 10px 0 4px;\r
- line-height: 70px\r
-}\r
-\r
-.table-bordered > thead > tr > th{\r
- border-bottom-width: 0;\r
-}\r
-\r
-\r
-\r
-.stats_box .stat_text {\r
- float: left;\r
- font-size: 9pt;\r
- padding: 10px 0px 10px 0;\r
- text-align: left;\r
- width: 120px;\r
- position: relative;\r
-}\r
-\r
-.stats_box .stat_text .percent {\r
- color: #444;\r
- float: right;\r
- font-size: 20px;\r
- font-weight: 700;\r
- position: absolute;\r
- right: 0;\r
- top: 17px;\r
-}\r
-\r
-.stats_box .stat_text strong {\r
- display: block;\r
- font-size: 16px\r
-; margin-bottom: 10px;\r
- margin-top: 5px;\r
-\r
-}\r
-\r
-.stat_text b{\r
- font-weight: 100;\r
-}\r
-\r
-.stat_text span,.stats_box span{\r
- display: block;\r
- margin-bottom:5px;\r
-}\r
-\r
-\r
-\r
-.stats_box span a{ \r
-padding: 0px 6px;\r
-margin-right:3px;\r
- }\r
-\r
-\r
- \r
- span.response_throbber {\r
- background-image: url('../img/throbber.gif');\r
- width: 128px;\r
- height: 16px;\r
- display: block;\r
- clear: none;\r
- float: left;\r
- margin-top: 50px;\r
-}\r
-\r
-div.separator div {\r
- text-align: center;\r
- line-height: 0;\r
-}\r
-\r
-.titlefont {\r
- font-size: 16px;\r
-}\r
-\r
-.separator-line {\r
- height: 1px;\r
- width: 100%;\r
- background: #ddd;\r
- overflow: hidden;\r
- margin-bottom: 15px;\r
- margin-top: 6px;\r
- opacity: 0.6;\r
-}\r
-\r
-\r
-\r
-.serverInput{\r
- display: inline;\r
- margin-right: 5px;\r
-}\r
-\r
-.apiRouteInput{\r
- float:left;\r
- margin-right: 10px\r
-}\r
- \r
- \r
-.input-group {\r
- position: relative;\r
- display: table;\r
- border-collapse: separate;\r
-}\r
-\r
- .input-group-btn-vertical {\r
- position: relative;\r
- white-space: nowrap;\r
- width: 10px;\r
- vertical-align: middle;\r
- display: table-cell;\r
-}\r
-\r
-.input-group-btn-vertical .bootstrap-touchspin-up {\r
- border-radius: 0;\r
- border-top-right-radius: 4px;\r
-}\r
-\r
-.input-group-btn-vertical>.btn {\r
- display: block;\r
- float: none;\r
- width: 100%;\r
- max-width: 100%;\r
- padding: 8px 10px;\r
- margin-left: -1px;\r
- position: relative;\r
-}\r
-\r
-.input-group-btn-vertical i {\r
- position: absolute;\r
- top: 3px;\r
- left: 5px;\r
- font-size: 9px;\r
- font-weight: 400;\r
-}\r
-\r
-.input-group-btn-vertical .bootstrap-touchspin-down {\r
- margin-top: -2px;\r
- border-radius: 0;\r
- border-bottom-right-radius: 4px;\r
-}\r
-\r
-\r
-\r
-.small_btn {\r
- padding: 0px 6px;\r
- margin-right: 3px;\r
-}\r
-\r
-.item-tip {\r
- position: absolute;\r
- color: #999999;\r
- top: 10px;\r
- left: 20px;\r
- transition: all linear .2s;\r
- background-color: #fff;\r
- padding: 0px 3px;\r
- font-size: 12px;\r
-}\r
-.item-tip-focus {top: -8px;font-size: 12px;color: #428bca;}\r
-\r
-.form-input-focus {border-color: #428bca;outline: 0;}\r
-\r
-.tip_color {\r
- color: #f0ad4e;\r
- cursor: help;\r
-}\r
-\r
-.item-tip-none{display: none}\r
-\r
-.tipArea{\r
- border-bottom: 1px solid #d4d4d4;\r
- width: 85%;\r
- text-align: center;\r
- margin-bottom: 20px;\r
- margin-left: 30px;\r
- font-weight: bold;\r
- position: relative;\r
-\r
-}\r
-\r
-.tipArea:after, .tipArea:before {\r
- border: 10px solid transparent;\r
- border-top: 10px solid #fff;\r
- width: 0;\r
- height: 0;\r
- right: 241px;\r
- top: 20px;\r
- content: ' ';\r
- position: absolute;\r
-}\r
-\r
-.tipArea:before {\r
- border-top-color: #d4d4d4;\r
- left: 230px;\r
- top: 21px;\r
-}\r
-\r
-\r
-.help-block {\r
- margin-top: 5px;\r
- margin-bottom: 5px;\r
- }\r
-\r
-.form-title {\r
- padding-left: 8px;\r
- padding-right: 8px;\r
- padding-top: 5px;\r
- padding-bottom: 5px;\r
- margin-bottom: 10px;\r
- margin-left:10px;\r
- border-left: 2px solid #5b9bd1;\r
- color: #1A78CA;\r
- font-size: 16px;\r
-}\r
-\r
-.form-title a{\r
- cursor: pointer;\r
-}\r
-\r
-.panel-tools {\r
- display: inline-block;\r
- float: right;\r
- margin-top: 0;\r
- padding: 0;\r
- position: relative;\r
-}\r
-\r
-.panel-tools a {\r
- margin-left: 5px;\r
- color: #9d9fa2;\r
- cursor: pointer;\r
-}\r
-\r
-.panel-tools a:hover{\r
- color: #34495e;\r
- text-decoration: none;\r
-}\r
-\r
-.table-responsive{\r
- margin-top: 15px;\r
-}\r
-\r
-.btn-s {\r
- padding: 0px 6px;\r
- margin-right: 3px;\r
-}\r
-\r
-\r
-table.dataTable thead .sorting,\r
-table.dataTable thead .sorting_asc,\r
-table.dataTable thead .sorting_desc,\r
-table.dataTable thead .sorting_asc_disabled,\r
-table.dataTable thead .sorting_desc_disabled {\r
- background: 0 0;\r
-}\r
-\r
-table.dataTable thead .sorting_asc:after {\r
- content: "\f0de";\r
- float: right;\r
- font-family: fontawesome;\r
- color:#357ebd;\r
-}\r
-\r
-table.dataTable thead .sorting_desc:after {\r
- content: "\f0dd";\r
- float: right;\r
- font-family: fontawesome;\r
- color:#357ebd;\r
-}\r
-\r
-table.dataTable thead .sorting:after {\r
- content: "\f0dc";\r
- float: right;\r
- font-family: fontawesome;\r
- color: rgba(50,50,50,.5);\r
-}\r
-\r
-\r
-.hostTableDiv{\r
- height: 100px;\r
- overflow: auto;\r
- \r
- }\r
-\r
-.hostTable{\r
- font-size: 12px;\r
- margin-bottom: 0px;\r
-}\r
-\r
-.hostTable>thead>tr>th, .hostTable>tbody>tr>th, .hostTable>tfoot>tr>th, .hostTable>thead>tr>td, .hostTable>tbody>tr>td, .hostTable>tfoot>tr>td {\r
- padding: 6px;\r
- \r
-}\r
-\r
-\r
-td.details-control {\r
- background: url('../img/details_open.png') no-repeat center center;\r
- cursor: pointer;\r
-}\r
-tr.shown td.details-control {\r
- background: url('../img/details_close.png') no-repeat center center;\r
-}\r
-\r
-\r
-input[type="checkbox"] {\r
- -webkit-appearance: none;\r
- background: #fff url(../img/checkbox-init.png);\r
- height: 18px;\r
- vertical-align: middle;\r
- width: 18px;\r
- margin-bottom:5px;\r
- margin-right:5px;\r
-}\r
-\r
-input[type="checkbox"]:checked {\r
- -webkit-appearance: none;\r
- background: #fff url(../img/checkbox-checked.png);\r
- height: 18px;\r
- vertical-align: middle;\r
- width: 18px;\r
-}\r
-\r
-input[type="checkbox"]:focus,\r
-input[type="checkbox"]:hover {\r
- outline: none;\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
+body {
+ color: #333;
+ font-family: "Microsoft yahei", Verdana, Arial, Helvetica, sans-serif !important;
+ padding: 0px !important;
+ margin: 0px !important;
+ direction: ltr;
+ background-color: #ffffff !important;
+}
+
+/*.form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control {
+ cursor: auto;
+
+ }*/
+.modal-footer {
+ margin-top:0px;
+ }
+.form-group {
+ margin-bottom: 5px;
+}
+
+.modal-body {
+ padding: 10px;
+}
+
+.row{
+ margin-left: 0px;
+ margin-right: 0px;
+}
+
+select {
+ border-width: 1px;
+ padding: 4px 1px;
+ border-radius: 4px;
+}
+
+.navbar {
+ overflow: visible;
+ margin-bottom: 0px;
+
+}
+
+#top-bar, #top-bar small, #top-bar a {
+ text-shadow: 0px -1px 0px #182127;
+ color: #ffffff;
+}
+
+.span12{
+ margin-top:5px;
+}
+
+#title {
+ color: #ffffff;
+ font-weight: bolder;
+}
+
+#top-bar {
+ background-color: #363F45;
+ background-image: -moz-linear-gradient(top, #545d63, #182127);
+ background-image: -ms-linear-gradient(top, #545d63, #182127);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#545d63), to(#182127));
+ background-image: -webkit-linear-gradient(top, #545d63, #182127);
+ background-image: -o-linear-gradient(top, #545d63, #182127);
+ background-image: linear-gradient(top, #545d63, #182127);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#545d63', endColorstr = '#182127', GradientType = 0);
+ -webkit-border-radius: 0;
+ -moz-border-radius: 0;
+ border-radius: 0;
+ height: 55px;
+}
+
+.navbar-inner {
+ padding-left: 20px;
+ padding-right: 20px;
+ background-color: #2c2c2c;
+ background-image: -moz-linear-gradient(top, #333333, #222222);
+ background-image: -ms-linear-gradient(top, #333333, #222222);
+ background-image: -o-linear-gradient(top, #333333, #222222);
+ background-image: linear-gradient(top, #333333, #222222);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);
+ -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);
+}
+
+
+
+.container-fluid {
+ background-color: #fff;
+}
+
+div[data-name="route_zone"] {
+ background-color: #fff;
+ margin-bottom: 15px;
+}
+
+
+
+p[tooltip], div[tooltip], td[tooltip], span[tooltip]{
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space:nowrap;
+}
+
+.add-route-btn{
+ background: #fff;
+ color: #ccc;
+ height: 115px;
+ margin: 10px;
+ padding-top: 22px;
+ text-align: center;
+ text-decoration: none;
+ width: 130px;
+ border:1px dashed #aaa;
+ float:left;
+
+}
+
+.add-route-btn:hover{
+ color:#3276b1;
+ cursor: pointer;
+}
+
+
+.add-route-btn span {
+ display: block;
+ margin-left:5px;
+ margin-right:5px;
+ margin-top:5px;
+ color: #444;
+}
+
+
+.quick-btn {
+ background: #eee;
+ box-shadow: 0 0 0 1px #f8f8f8 inset,0 0 0 1px #ccc;
+ color: #444;
+ height: 110px;
+ margin: 10px;
+ padding-top: 1pc;
+ text-align: center;
+ text-decoration: none;
+ width: 120px;
+ float:left;
+
+}
+div[data-name="route_zone"] .active{
+ color:#fff;
+ background-color:#444;
+ cursor: pointer;
+}
+
+div[data-name="route_zone"] .sparkline .route-valid {
+ color: #62AAF5;
+ }
+
+ div[data-name="route_zone"] .sparkline .route-invalid {
+ color:rgba(128, 128, 128, 0.73);
+ }
+
+div[data-name="route_zone"] .active .sparkline i{
+ color:#C3DDF4;
+ }
+
+
+
+.quick-btn:hover{
+
+ box-shadow: 0 0 0 1px #f8f8f8 inset,0 0 0 1px #636363;
+ cursor: pointer;
+}
+
+.quick-btn span {
+ display: block;
+ margin-left:5px;
+ margin-right:5px;
+ margin-top:10px;
+
+}
+
+.route-ip{
+ font-size: 12px;
+}
+
+
+.progressList{
+ margin-top: 15px;
+ margin-left:15px;
+ width:90%
+}
+
+.processContent{
+ display: inline-block;margin-right:5px
+}
+
+.nav.nav-pills.nav-stacked > li.active > a, .nav.nav-pills.nav-stacked > li.active > a:hover,.nav.nav-pills.nav-stacked > li > a:hover {
+ background-color: #f6f6f6;
+ border-left-color: #3c8dbc;
+ color: #444;
+}
+
+
+.nav.nav-pills.nav-stacked > li > a {
+ border-top: 0;
+ border-left: 3px solid transparent;
+ -webkit-border-radius: 0;
+ -moz-border-radius: 0;
+ border-radius: 0;
+ color: #444;
+ height:46px;
+}
+.nav.nav-pills > li.active > a {
+ font-weight: 600;
+}
+
+.btn-xs {
+ color: #333;
+ font-size: 14px;
+}
+.grey {
+ background-color: #e5e5e5;
+ color: #333;
+}
+.btn-xs, .btn-group-xs>.btn {
+ padding: 1px 5px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px;
+}
+
+.control-label .required {
+ color: #e02222;
+ font-size: 12px;
+ padding-left: 2px;
+}
+
+.nav>li>a{
+ /*padding:10px 5px;*/
+}
+
+.process-btn button{
+ padding:3px 8px
+}
+
+pre.prettyprint {
+ color:#000;
+ height: 450px;
+}
+
+pre {
+ font: 14px/22px 'courier new';
+ word-break: break-all;
+ word-wrap: break-word;
+ border: 0px;
+ background-color:#fff;
+ padding: 5px 5px;
+}
+
+.atv {
+ color: #114B7E;
+}
+
+
+
+.stats_box {
+ display: inline-block;
+ list-style: none outside none;
+ margin-left: 0;
+ margin-top: 10px;
+ padding: 0;
+ /*float: left;*/
+}
+
+.stats_box .routeDiv{
+ background: #F1F3FA;
+ /* box-shadow: 0 0 0 1px #f8f8f8 inset,0 0 0 1px #ccc; */
+ display: inline-block;
+ line-height: 18px;
+ margin: 0 10px 10px;
+ padding: 0 8px;
+ float: left;
+ height: 125px;
+ border: 1px solid #E0E0E0;
+ /* border-radius: 10px; */
+}
+
+.routeDiv:hover{
+
+ border:1px solid #cfcfcf;
+ cursor: pointer;
+ box-shadow:-webkit-box-shadow:0 5px 20px rgba(0,0,0,0.1);
+ box-shadow:0 5px 20px rgba(0,0,0,0.1);
+}
+
+
+.sparkline {
+ width: 60px;
+ border-right: 1px solid #dcdcdc;
+ box-shadow: 1px 0 0 0 #fff;
+ float: left;
+ margin-right: 9pt;
+ padding: 25px 10px 0 4px;
+ line-height: 70px
+}
+
+.table-bordered > thead > tr > th{
+ border-bottom-width: 0;
+}
+
+
+
+.stats_box .stat_text {
+ float: left;
+ font-size: 9pt;
+ padding: 10px 0px 10px 0;
+ text-align: left;
+ width: 120px;
+ position: relative;
+}
+
+.stats_box .stat_text .percent {
+ color: #444;
+ float: right;
+ font-size: 20px;
+ font-weight: 700;
+ position: absolute;
+ right: 0;
+ top: 17px;
+}
+
+.stats_box .stat_text strong {
+ display: block;
+ font-size: 16px
+; margin-bottom: 10px;
+ margin-top: 5px;
+
+}
+
+.stat_text b{
+ font-weight: 100;
+}
+
+.stat_text span,.stats_box span{
+ display: block;
+ margin-bottom:5px;
+}
+
+
+
+.stats_box span a{
+padding: 0px 6px;
+margin-right:3px;
+ }
+
+
+
+ span.response_throbber {
+ background-image: url('../img/throbber.gif');
+ width: 128px;
+ height: 16px;
+ display: block;
+ clear: none;
+ float: left;
+ margin-top: 50px;
+}
+
+div.separator div {
+ text-align: center;
+ line-height: 0;
+}
+
+.titlefont {
+ font-size: 16px;
+}
+
+.separator-line {
+ height: 1px;
+ width: 100%;
+ background: #ddd;
+ overflow: hidden;
+ margin-bottom: 15px;
+ margin-top: 6px;
+ opacity: 0.6;
+}
+
+
+
+.serverInput{
+ display: inline;
+ margin-right: 5px;
+}
+
+.apiRouteInput{
+ float:left;
+ margin-right: 10px
+}
+
+
+.input-group {
+ position: relative;
+ display: table;
+ border-collapse: separate;
+}
+
+ .input-group-btn-vertical {
+ position: relative;
+ white-space: nowrap;
+ width: 10px;
+ vertical-align: middle;
+ display: table-cell;
+}
+
+.input-group-btn-vertical .bootstrap-touchspin-up {
+ border-radius: 0;
+ border-top-right-radius: 4px;
+}
+
+.input-group-btn-vertical>.btn {
+ display: block;
+ float: none;
+ width: 100%;
+ max-width: 100%;
+ padding: 8px 10px;
+ margin-left: -1px;
+ position: relative;
+}
+
+.input-group-btn-vertical i {
+ position: absolute;
+ top: 3px;
+ left: 5px;
+ font-size: 9px;
+ font-weight: 400;
+}
+
+.input-group-btn-vertical .bootstrap-touchspin-down {
+ margin-top: -2px;
+ border-radius: 0;
+ border-bottom-right-radius: 4px;
+}
+
+
+
+.small_btn {
+ padding: 0px 6px;
+ margin-right: 3px;
+}
+
+.item-tip {
+ position: absolute;
+ color: #999999;
+ top: 10px;
+ left: 20px;
+ transition: all linear .2s;
+ background-color: #fff;
+ padding: 0px 3px;
+ font-size: 12px;
+}
+.item-tip-focus {top: -8px;font-size: 12px;color: #428bca;}
+
+.form-input-focus {border-color: #428bca;outline: 0;}
+
+.tip_color {
+ color: #f0ad4e;
+ cursor: help;
+}
+
+.item-tip-none{display: none}
+
+.tipArea{
+ border-bottom: 1px solid #d4d4d4;
+ width: 85%;
+ text-align: center;
+ margin-bottom: 20px;
+ margin-left: 30px;
+ font-weight: bold;
+ position: relative;
+
+}
+
+.tipArea:after, .tipArea:before {
+ border: 10px solid transparent;
+ border-top: 10px solid #fff;
+ width: 0;
+ height: 0;
+ right: 241px;
+ top: 20px;
+ content: ' ';
+ position: absolute;
+}
+
+.tipArea:before {
+ border-top-color: #d4d4d4;
+ left: 230px;
+ top: 21px;
+}
+
+
+.help-block {
+ margin-top: 5px;
+ margin-bottom: 5px;
+ }
+
+.form-title {
+ padding-left: 8px;
+ padding-right: 8px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ margin-bottom: 10px;
+ margin-left:10px;
+ border-left: 2px solid #5b9bd1;
+ color: #1A78CA;
+ font-size: 16px;
+}
+
+.form-title a{
+ cursor: pointer;
+}
+
+.panel-tools {
+ display: inline-block;
+ float: right;
+ margin-top: 0;
+ padding: 0;
+ position: relative;
+}
+
+.panel-tools a {
+ margin-left: 5px;
+ color: #9d9fa2;
+ cursor: pointer;
+}
+
+.panel-tools a:hover{
+ color: #34495e;
+ text-decoration: none;
+}
+
+.table-responsive{
+ margin-top: 15px;
+}
+
+.btn-s {
+ padding: 0px 6px;
+ margin-right: 3px;
+}
+
+
+table.dataTable thead .sorting,
+table.dataTable thead .sorting_asc,
+table.dataTable thead .sorting_desc,
+table.dataTable thead .sorting_asc_disabled,
+table.dataTable thead .sorting_desc_disabled {
+ background: 0 0;
+}
+
+table.dataTable thead .sorting_asc:after {
+ content: "\f0de";
+ float: right;
+ font-family: fontawesome;
+ color:#357ebd;
+}
+
+table.dataTable thead .sorting_desc:after {
+ content: "\f0dd";
+ float: right;
+ font-family: fontawesome;
+ color:#357ebd;
+}
+
+table.dataTable thead .sorting:after {
+ content: "\f0dc";
+ float: right;
+ font-family: fontawesome;
+ color: rgba(50,50,50,.5);
+}
+
+
+.hostTableDiv{
+ height: 100px;
+ overflow: auto;
+
+ }
+
+.hostTable{
+ font-size: 12px;
+ margin-bottom: 0px;
+}
+
+.hostTable>thead>tr>th, .hostTable>tbody>tr>th, .hostTable>tfoot>tr>th, .hostTable>thead>tr>td, .hostTable>tbody>tr>td, .hostTable>tfoot>tr>td {
+ padding: 6px;
+
+}
+
+
+td.details-control {
+ background: url('../img/details_open.png') no-repeat center center;
+ cursor: pointer;
+}
+tr.shown td.details-control {
+ background: url('../img/details_close.png') no-repeat center center;
+}
+
+
+input[type="checkbox"] {
+ -webkit-appearance: none;
+ background: #fff url(../img/checkbox-init.png);
+ height: 18px;
+ vertical-align: middle;
+ width: 18px;
+ margin-bottom:5px;
+ margin-right:5px;
+}
+
+input[type="checkbox"]:checked {
+ -webkit-appearance: none;
+ background: #fff url(../img/checkbox-checked.png);
+ height: 18px;
+ vertical-align: middle;
+ width: 18px;
+}
+
+input[type="checkbox"]:focus,
+input[type="checkbox"]:hover {
+ outline: none;
}
\ No newline at end of file
-<!--\r
-\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
-<!DOCTYPE html>\r
-<html>\r
-<head lang="en">\r
-<meta charset="UTF-8">\r
-<title id="org_openo_msb_route_title" name_i18n="org_openo_msb_route_ui_i18n"></title>\r
-<link\r
- href="js/fontAwesome/css/font-awesome.min.css"\r
- rel="stylesheet" />\r
-<link\r
- href="js/bootstrap/css/bootstrap.min.css"\r
- rel="stylesheet" />\r
- <link href="css/newRoute.css" rel="stylesheet" type="text/css" />\r
- <script type="text/javascript">\r
-\r
- function setIframeUrl(type){\r
- var url;\r
- switch(type){\r
- case 1:url="/iui/microservices/index.html";break;\r
- case 2:url="/iui/msdiscover/index.html";break;\r
- case 3:url="/iui/msdiscover/admin.html";break;\r
- }\r
-\r
- $('#msbPage').attr("src",url); \r
- }\r
- </script>\r
-\r
-</head>\r
-<body >\r
- <div class="header navbar mega-menu navbar-static-top">\r
- <div class="header-inner">\r
- <span class="navbar-brand zte-navbar-brand hidden-sm hidden-xs" >\r
- <img id="com_zte_ums_ict_framework_img_netnumenLogo" src="./img/logo.png" alt="logo" style="display: inline;">\r
- \r
- </span>\r
- \r
- \r
- </div>\r
- <div class="chineseTitle" id="org_openo_msb_route_chinese_name" name_i18n="org_openo_msb_route_ui_i18n"></div>\r
- <div class="englishTitle" id="org_openo_msb_route_english_name" name_i18n="org_openo_msb_route_ui_i18n">\r
- </div>\r
-</div>\r
-\r
-<div>\r
- <div class="page-sidebar" >\r
- <div class="sidebar-toggler hidden-xs hidden-sm" ></div>\r
- <div class="sideBar">\r
- <a onclick="setIframeUrl(1)" class="router-link-active"><div class="menu"><div class="menu-left"></div><i aria-hidden="true" class="icon fa fa-link"></i><br><label id="org_openo_msb_route_sideBar_serviceroute" name_i18n="org_openo_msb_route_ui_i18n"></label>\r
- \r
- </div>\r
- \r
- </a>\r
-\r
- <a onclick="setIframeUrl(2)" ><div class="menu"><div class="menu-left"></div><i aria-hidden="true" class="icon fa fa-search-plus"></i><br><label id="org_openo_msb_route_sideBar_servicediscover" name_i18n="org_openo_msb_route_ui_i18n"></label>\r
- \r
- </div>\r
-\r
- </a>\r
-\r
- <a onclick="setIframeUrl(3)" >\r
- <div class="menu">\r
- <div class="menu-left"></div>\r
- <i aria-hidden="true" class="icon fa fa-cogs"></i><br><label id="org_openo_msb_route_sideBar_servicemng" name_i18n="org_openo_msb_route_ui_i18n"></label>\r
- \r
- </div>\r
- \r
- </a>\r
- </div>\r
- </div>\r
-<div class="page-content" >\r
- <div class="page-content-body">\r
- \r
- <div id="pdiv_page-mainIframeisWare">\r
- <iframe src="/iui/microservices/index.html" width="100%" scrolling="no" marginheight="0" frameborder="0" id="msbPage" name="msbPage" class="page-mainIframeisWare" ></iframe>\r
- </div>\r
- </div>\r
- </div>\r
-</div>\r
-<script type="text/javascript" src="js/jquery/jquery-1.10.2.min.js"></script>\r
-<script type="text/javascript" src="js/iframeResizer/iframeResizer.min.js"></script>\r
-<script type="text/javascript" src="js/jquery.i18n/jquery.i18n.properties-1.0.9.js"></script>\r
-<script src="i18n/loadi18nApp_iui-route_view.js"></script>\r
-<script type="text/javascript">\r
-\r
-\r
-\r
-$(function(){\r
-\r
- loadPropertiesSideMenu('', 'msb-iui-route-i18n', 'i18n/');\r
-\r
- //Get window height\r
- var winHeight=610;\r
- if (window.innerHeight) \r
- winHeight = window.innerHeight;\r
- else if ((document.body) && (document.body.clientHeight)) \r
- winHeight = document.body.clientHeight;\r
- //Through in-depth internal Document to test the body, for the window size\r
- if (document.documentElement && document.documentElement.clientHeight ) {\r
- winHeight = document.documentElement.clientHeight;\r
-\r
- }\r
- winHeight=winHeight-55;\r
-$('iframe').iFrameResize({minHeight:winHeight});\r
-\r
- $(".sideBar a").on({\r
- click: function(){\r
- $(".sideBar a").removeClass("router-link-active");\r
- $(this).addClass("router-link-active");\r
- }\r
- });\r
-\r
-$(".sidebar-toggler").click(function(){\r
- $("body").toggleClass("page-sidebar-closed");\r
-});\r
-\r
- \r
-\r
-});\r
- \r
-\r
-</script>\r
- \r
-\r
-</body>\r
+<!--
+
+ Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+
+ Licensed 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.
+
+ Author: Zhaoxing Meng
+ email: meng.zhaoxing1@zte.com.cn
+
+-->
+<!DOCTYPE html>
+<html>
+<head lang="en">
+<meta charset="UTF-8">
+<title id="org_openo_msb_route_title" name_i18n="org_openo_msb_route_ui_i18n"></title>
+<link
+ href="js/fontAwesome/css/font-awesome.min.css"
+ rel="stylesheet" />
+<link
+ href="js/bootstrap/css/bootstrap.min.css"
+ rel="stylesheet" />
+ <link href="css/newRoute.css" rel="stylesheet" type="text/css" />
+ <script type="text/javascript">
+
+ function setIframeUrl(type){
+ var url;
+ switch(type){
+ case 1:url="/iui/microservices/index.html";break;
+ case 2:url="/iui/msdiscover/index.html";break;
+ case 3:url="/iui/msdiscover/admin.html";break;
+ }
+
+ $('#msbPage').attr("src",url);
+ }
+ </script>
+
+</head>
+<body >
+ <div class="header navbar mega-menu navbar-static-top">
+ <div class="header-inner">
+ <span class="navbar-brand zte-navbar-brand hidden-sm hidden-xs" >
+ <img id="com_zte_ums_ict_framework_img_netnumenLogo" src="./img/logo.png" alt="logo" style="display: inline;">
+
+ </span>
+
+
+ </div>
+ <div class="chineseTitle" id="org_openo_msb_route_chinese_name" name_i18n="org_openo_msb_route_ui_i18n"></div>
+ <div class="englishTitle" id="org_openo_msb_route_english_name" name_i18n="org_openo_msb_route_ui_i18n">
+ </div>
+</div>
+
+<div>
+ <div class="page-sidebar" >
+ <div class="sidebar-toggler hidden-xs hidden-sm" ></div>
+ <div class="sideBar">
+ <a onclick="setIframeUrl(1)" class="router-link-active"><div class="menu"><div class="menu-left"></div><i aria-hidden="true" class="icon fa fa-link"></i><br><label id="org_openo_msb_route_sideBar_serviceroute" name_i18n="org_openo_msb_route_ui_i18n"></label>
+
+ </div>
+
+ </a>
+
+ <a onclick="setIframeUrl(2)" ><div class="menu"><div class="menu-left"></div><i aria-hidden="true" class="icon fa fa-search-plus"></i><br><label id="org_openo_msb_route_sideBar_servicediscover" name_i18n="org_openo_msb_route_ui_i18n"></label>
+
+ </div>
+
+ </a>
+
+ <a onclick="setIframeUrl(3)" >
+ <div class="menu">
+ <div class="menu-left"></div>
+ <i aria-hidden="true" class="icon fa fa-cogs"></i><br><label id="org_openo_msb_route_sideBar_servicemng" name_i18n="org_openo_msb_route_ui_i18n"></label>
+
+ </div>
+
+ </a>
+ </div>
+ </div>
+<div class="page-content" >
+ <div class="page-content-body">
+
+ <div id="pdiv_page-mainIframeisWare">
+ <iframe src="/iui/microservices/index.html" width="100%" scrolling="no" marginheight="0" frameborder="0" id="msbPage" name="msbPage" class="page-mainIframeisWare" ></iframe>
+ </div>
+ </div>
+ </div>
+</div>
+<script type="text/javascript" src="js/jquery/jquery-1.10.2.min.js"></script>
+<script type="text/javascript" src="js/iframeResizer/iframeResizer.min.js"></script>
+<script type="text/javascript" src="js/jquery.i18n/jquery.i18n.properties-1.0.9.js"></script>
+<script src="i18n/loadi18nApp_iui-route_view.js"></script>
+<script type="text/javascript">
+
+
+
+$(function(){
+
+ loadPropertiesSideMenu('', 'msb-iui-route-i18n', 'i18n/');
+
+ //Get window height
+ var winHeight=610;
+ if (window.innerHeight)
+ winHeight = window.innerHeight;
+ else if ((document.body) && (document.body.clientHeight))
+ winHeight = document.body.clientHeight;
+ //Through in-depth internal Document to test the body, for the window size
+ if (document.documentElement && document.documentElement.clientHeight ) {
+ winHeight = document.documentElement.clientHeight;
+
+ }
+ winHeight=winHeight-55;
+$('iframe').iFrameResize({minHeight:winHeight});
+
+ $(".sideBar a").on({
+ click: function(){
+ $(".sideBar a").removeClass("router-link-active");
+ $(this).addClass("router-link-active");
+ }
+ });
+
+$(".sidebar-toggler").click(function(){
+ $("body").toggleClass("page-sidebar-closed");
+});
+
+
+
+});
+
+
+</script>
+
+
+</body>
</html>
\ No newline at end of file
/*
- * Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
*
* Licensed 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
+ * 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
*/
function loadPropertiesSideMenu(lang, propertiesFileNamePrefix, propertiesFilePath){
jQuery.i18n.properties({
#
-# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+# Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
#
# Licensed 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
+# 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,
# See the License for the specific language governing permissions and
# limitations under the License.
#
+# Author: Zhaoxing Meng
+# email: meng.zhaoxing1@zte.com.cn
+#
+
org_openo_msb_route_title=MicroService Bus
org_openo_msb_route_sideBar_serviceroute=Service Route
#
-# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+# Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
#
# Licensed 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
+# 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,
# See the License for the specific language governing permissions and
# limitations under the License.
#
+# Author: Zhaoxing Meng
+# email: meng.zhaoxing1@zte.com.cn
+#
+
org_openo_msb_route_title=ZTE 微服务
org_openo_msb_route_sideBar_serviceroute=服务路由
-<!--\r
-\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
-<!DOCTYPE html>\r
-<html>\r
-<head lang="en">\r
-<meta charset="UTF-8">\r
-<title id="org_openo_msb_route_title" name_i18n="org_openo_msb_route_ui_i18n"></title>\r
-<link rel="shortcut icon" href="img/zte_logo_16.gif" />\r
-<link\r
- href="js/fontAwesome/css/font-awesome.min.css"\r
- rel="stylesheet" />\r
-<link\r
- href="js/bootstrap/css/bootstrap.min.css"\r
- rel="stylesheet" />\r
-\r
-\r
-\r
-<link href="css/route.css" rel="stylesheet" type="text/css" />\r
-<link href="css/animate.min.css" rel="stylesheet" type="text/css" />\r
-<link href="js/dataTables/dataTables.bootstrap.css" rel="stylesheet" type="text/css" />\r
-\r
-<style>\r
-.ms-controller {\r
- visibility: hidden\r
-}\r
-</style>\r
-\r
- <script type="text/javascript" src="js/jquery/jquery-1.10.2.min.js"></script>\r
- <script type="text/javascript">\r
- var iuiRootPath="iui";\r
- var apiRootPath="api";\r
- \r
- $.ajaxSettings.async = false;\r
- $.getJSON("./ext/initUrlRootPath/initUrlRootPath.json",function(json){\r
- iuiRootPath=json.iuiRootPath;\r
- apiRootPath=json.apiRootPath;\r
- });\r
- \r
-\r
- var apiBasePath="/"+apiRootPath+"/microservices/v1";\r
- var iuiBasePath="/"+iuiRootPath+"/microservices";\r
-\r
-</script>\r
-\r
-\r
-\r
-\r
-</head>\r
-<body class="ms-controller" ms-controller="routeController">\r
-\r
-<div class="navbar" id="routeHead">\r
- <div class="navbar-inner container-fluid" id="top-bar">\r
- <header class="row-fluid">\r
- <h3 class="span12" id="title">\r
- <img class="logo" src="img/conductor-logo.png" alt="Logo" id="logo">\r
- <small id="org_openo_msb_route_banner_title" name_i18n="org_openo_msb_route_ui_i18n"></small>\r
- <button type="button" class="btn btn-default" ms-click="exportServices()" style="float:right;margin-left: 10px; margin-top: 5px;"><i class=" fa fa-external-link"></i> <span id="org_openo_msb_route_btn_export" name_i18n="org_openo_msb_route_ui_i18n"></span></button> \r
-\r
- </h3>\r
- </header>\r
- </div>\r
- </div>\r
- <script type="text/javascript">\r
- if (self != top) {document.getElementById("routeHead").style.display="none";}\r
-\r
- var currentLang = navigator.language; \r
-if(!currentLang) {currentLang = navigator.browserLanguage; } \r
-if(currentLang.toLowerCase() != "zh-cn") {$("#logo").hide(); }\r
- </script>\r
-\r
-<div style=" background-color: #f1f3fa !important; ">\r
-\r
-\r
- <div class="row row1 container-fluid" ms-visible="boxVisible">\r
-\r
- <ul class="nav nav-tabs" id="panelTab" style="margin-top: 10px;">\r
- <li class="active" ><a href="#apiPanel" data-toggle="tab" id="apiTab"><i class="fa fa-cloud fa-1x"></i> <span id="org_openo_msb_route_tab_api" name_i18n="org_openo_msb_route_ui_i18n"></span> </a></li>\r
- <li ><a href="#iuiPanel" data-toggle="tab" id="iuiTab"><i class="fa fa-tv fa-1x"></i> <span id="org_openo_msb_route_tab_iui" name_i18n="org_openo_msb_route_ui_i18n"></span></a></li>\r
- <li ><a href="#customPanel" data-toggle="tab" id="customTab"><i class="fa fa-cogs fa-1x"></i> <span id="org_openo_msb_route_tab_custom" name_i18n="org_openo_msb_route_ui_i18n"></span> </a></li> \r
- <li ms-visible="!discoverInfo.enabled" ><a href="#msbPanel" data-toggle="tab" id="msbTab"><i class="fa fa-cubes fa-1x"></i> <span id="org_openo_msb_route_tab_msb" name_i18n="org_openo_msb_route_ui_i18n"></span> </a></li> \r
-</ul>\r
-<div class="tab-content" >\r
- <div id="apiPanel" class="tab-pane active"> \r
- <div class="row" style=" margin-top: 10px;text-align:right; margin-right: 20px;">\r
- \r
- <button ms-visible="!discoverInfo.enabled" class="btn btn-primary" id="app-new-btn" ms-click="$showApiRouteDlg()" >\r
- <i class=" fa fa-plus-circle"></i> <span id="org_openo_msb_route_btn_add_api" name_i18n="org_openo_msb_route_ui_i18n"></span>\r
- </button>\r
- \r
- </div>\r
-\r
-\r
-<div id="routeDlg" class="modal fade" tabindex="-1" role="dialog"\r
- aria-labelledby="myModalLabel" aria-hidden="true" >\r
- <div class="modal-dialog">\r
- <div class="modal-content Changepasswd">\r
- <div class="content">\r
- <div class="modal-header">\r
- <button type="button" class="close" data-dismiss="modal"\r
- aria-hidden="true">×</button>\r
- <h3 id="myModalLabel" ms-text="routeDlgInfo.titleName"></h3>\r
- </div>\r
- <div class="modal-body">\r
- <div class="alert alert-info" ms-visible="server_rtn.info_block"></div>\r
- <div class="alert alert-danger " ms-visible="server_rtn.warning_block" ms-text="server_rtn.rtn_info"></div>\r
- \r
-\r
- \r
-\r
- <div id="info" class="tab-pane active"> \r
- \r
- <form class="form-horizontal" id="routeForm" role="form"> \r
- \r
- <div class="tipArea" id="org_openo_msb_route_form_sourceservice" name_i18n="org_openo_msb_route_ui_i18n"></div> \r
- <div class="form-group" ms-visible="!discoverInfo.enabled">\r
- \r
- <label class="control-label col-sm-3">\r
- <span id="org_openo_msb_route_form_address" name_i18n="org_openo_msb_route_ui_i18n"></span>\r
- <span class="required" aria-required="true">*</span>\r
- </label> \r
- \r
- \r
- <div class="col-sm-6" style="padding-right: 5px;">\r
- <div class="item-tip" id="org_openo_msb_route_form_host_tip" name_i18n="org_openo_msb_route_ui_i18n"></div>\r
- <input type="text" ms-duplex="apiRouteInfo.server" name="server" class="form-control form-tip" ms-attr-disabled="discoverInfo.enabled" style="display:inline-block;" />\r
- <span class="help-block"></span>\r
- </div>\r
- <div class="col-sm-1" style=" padding-left: 0px;" > \r
- <a href="#" ms-click="addapiHost()" class="btn btn-default " title="org_openo_msb_route_form_btn_addhost" name_i18n="org_openo_msb_route_ui_i18n"><i class="fa fa-plus-circle"></i></a>\r
- </div>\r
- </div>\r
-\r
- <div class="form-group">\r
- <label class="control-label col-sm-3">\r
- <span ms-visible="discoverInfo.enabled" id="org_openo_msb_route_form_address" name_i18n="org_openo_msb_route_ui_i18n"></span>\r
- </label> \r
- <div class="hostTableDiv col-sm-7">\r
- <table class="table table-striped hostTable">\r
- <thead>\r
- <tr>\r
- <th id="org_openo_msb_route_form_node_no" name_i18n="org_openo_msb_route_ui_i18n"></th>\r
- <th>IP</th>\r
- <th>PORT</th>\r
- <th ms-visible="!discoverInfo.enabled" id="org_openo_msb_route_form_node_control" name_i18n="org_openo_msb_route_ui_i18n"></th>\r
- </tr>\r
- </thead>\r
- <tbody ms-each-server="vm.apiRouteInfo.servers">\r
- <tr>\r
- <td>{{$index+1}}</td>\r
- <td ms-text="server.ip"></td>\r
- <td ms-text="server.port"></td>\r
- <td ms-visible="!discoverInfo.enabled"><a href="#" ms-click="delapiHost(server.ip,server.port)" style="padding: 0px 6px;" class="btn btn-default btn-s"><i class="fa fa-trash-o"></i></a></td>\r
- </tr> \r
- \r
- \r
- </tbody>\r
- </table> \r
- </div> \r
-\r
- </div>\r
- \r
- <div class="form-group" tyle="margin-bottom: 0;">\r
- <label class="control-label col-sm-3">\r
- <span id="org_openo_msb_route_form_url" name_i18n="org_openo_msb_route_ui_i18n"></span>\r
- <span class="required" aria-required="true">*</span> \r
- </label>\r
- <div class="col-sm-7">\r
- \r
- <input type="text" ms-duplex="apiRouteInfo.url" name="url" class="form-control" id="form-url" value="/" ms-attr-disabled="discoverInfo.enabled"/>\r
- <span class="help-block"></span>\r
- </div>\r
- \r
- </div>\r
- <div class="tipArea" id="org_openo_msb_route_form_target_tip" name_i18n="org_openo_msb_route_ui_i18n"></div> \r
- <div class="form-group">\r
- <label class="control-label col-sm-3">\r
- <span id="org_openo_msb_route_form_target_service" name_i18n="org_openo_msb_route_ui_i18n"></span>\r
- \r
- </label>\r
- <div class="col-sm-7">\r
- \r
- {{vm.targetServiceUrl}}/{{vm.apiRootPath}}/{{vm.apiRouteInfo.serviceName}}/{{vm.apiRouteInfo.version}}\r
- <span class="help-block"></span>\r
- </div>\r
- \r
- </div> \r
- <div class="form-group">\r
- <label class="control-label col-sm-3">\r
- <span id="org_openo_msb_route_form_servicename" name_i18n="org_openo_msb_route_ui_i18n"></span>\r
- <span class="required" aria-required="true">*</span>\r
- </label>\r
- <div class="col-sm-7"> \r
- <input type="text" ms-duplex="apiRouteInfo.serviceName" name="serviceName" class="form-control" ms-attr-disabled="discoverInfo.enabled" />\r
- <span class="help-block"></span>\r
- </div>\r
- \r
- </div>\r
- \r
- <div class="form-group">\r
- <label class="control-label col-sm-3">\r
- <span id="org_openo_msb_route_form_version" name_i18n="org_openo_msb_route_ui_i18n"></span>\r
- \r
- </label>\r
- <div class="col-sm-7"> \r
- <div class="item-tip" ms-class-item-tip-none ="routeDlgInfo.saveType=='update'" id="org_openo_msb_route_form_version_tip" name_i18n="org_openo_msb_route_ui_i18n"></div>\r
- <input type="text" ms-duplex="apiRouteInfo.version" name="version" class="form-control form-tip" ms-attr-disabled="discoverInfo.enabled" />\r
- <span class="help-block"></span>\r
- </div>\r
- \r
- </div>\r
- \r
- \r
- \r
- <div class="form-group">\r
- <label class="control-label col-sm-3">\r
- <span><a href="javascript:;" class="collapse-box" data-toggle="collapse" \r
- data-target="#apiJsonFullurl">\r
- <i class="fa fa-plus" id="apiJsonCollapse"></i> <span id="org_openo_msb_route_form_swagger" name_i18n="org_openo_msb_route_ui_i18n"></span>\r
- </a></span>\r
- \r
- </label>\r
- <div class="col-sm-7">\r
- <div class="input-group">\r
- <input type="text" class="form-control" ms-if="apiRouteInfo.apiJsonType=='1'" ms-duplex="apiJson.custom" ms-attr-disabled="routeDlgInfo.saveType=='view'"/>\r
- <select class="form-control m-b" ms-if="apiRouteInfo.apiJsonType=='0'" ms-each="jsonApiSelectList.selectItems" ms-duplex="apiJson.local" id="apiJsonSelect" ms-attr-disabled="routeDlgInfo.saveType=='view'"> \r
- <option ms-attr-value='el'>{{el}}</option>\r
- </select>\r
-\r
- <div class="input-group-btn">\r
- <button class="btn btn-default dropdown-toggle" data-toggle="dropdown" type="button" aria-expanded="false" ms-attr-disabled="routeDlgInfo.saveType=='view'">{{showAPITypeName[apiRouteInfo.apiJsonType]}} <span class="caret"></span></button>\r
- <ul class="dropdown-menu pull-right">\r
- <li><a ms-click="setAPIType(0)">{{showAPITypeName[0]}}</a></li> \r
- <li><a ms-click="setAPIType(1)">{{showAPITypeName[1]}}</a></li>\r
- </ul>\r
- </div>\r
- </div>\r
- <span class="help-block"></span>\r
- </div>\r
- \r
-\r
- \r
- \r
- </div>\r
-\r
- <div id="apiJsonFullurl" class="form-group collapse in">\r
- <label class="control-label col-sm-3"><span id="org_openo_msb_route_form_swagger_address" name_i18n="org_openo_msb_route_ui_i18n"></span></label>\r
- <div class="col-sm-9">\r
- <div> \r
- <i class="fa fa-home fa-fw"></i> <span id="org_openo_msb_route_form_target_address" name_i18n="org_openo_msb_route_ui_i18n"></span>\r
- <span ms-if="vm.apiRouteInfo.apiJsonType==0">{{vm.targetServiceUrl}}/iui/microservices/ext/initSwaggerJson/{{vm.apiJson.local}}</span>\r
- <span ms-if="vm.apiRouteInfo.apiJsonType==1">{{vm.apiRouteInfo.servers[0].ip+":"+vm.apiRouteInfo.servers[0].port}}{{vm.apiJson.custom}}</span>\r
- </div>\r
- <div> \r
- <i class="fa fa-cloud-upload fa-fw"></i><span id="org_openo_msb_route_form_publish_address" name_i18n="org_openo_msb_route_ui_i18n"></span>\r
- <span ms-if="vm.apiRouteInfo.apiJsonType==0">{{vm.targetServiceUrl}}/iui/microservices/ext/initSwaggerJson/{{vm.apiJson.local}}</span>\r
- <span ms-if="vm.apiRouteInfo.apiJsonType==1">{{vm.targetServiceUrl}}/apijson/{{vm.apiRouteInfo.serviceName}}/{{vm.apiRouteInfo.version}}</span>\r
- </div> \r
-\r
- \r
- </div>\r
- </div>\r
-\r
- <div class="form-group">\r
- <label class="control-label col-sm-3">\r
- <span><a href="javascript:;" class=" collapse-box" data-toggle="collapse" \r
- data-target="#metricsFullurl">\r
- <i class="fa fa-plus" id="metricsUrlCollapse"></i> <span id="org_openo_msb_route_form_metrics" name_i18n="org_openo_msb_route_ui_i18n"></span>\r
- </a></span> \r
- </label>\r
- <div class="col-sm-7">\r
- \r
- <input type="text" ms-duplex="apiRouteInfo.metricsUrl" name="metricsUrl" class="form-control" value="/admin/metrics" ms-attr-disabled="routeDlgInfo.saveType=='view'" />\r
- \r
- \r
- <span class="help-block"></span>\r
- </div>\r
- \r
- \r
- \r
- </div>\r
- <div id="metricsFullurl" class="form-group collapse in">\r
- <label class="control-label col-sm-3"><span id="org_openo_msb_route_form_metrics_address" name_i18n="org_openo_msb_route_ui_i18n"></span></label>\r
- <div class="col-sm-9">\r
- <div> \r
- <i class="fa fa-home fa-fw"></i><span id="org_openo_msb_route_form_target_address" name_i18n="org_openo_msb_route_ui_i18n"></span> {{vm.apiRouteInfo.servers[0].ip+":"+vm.apiRouteInfo.servers[0].port}}{{vm.apiRouteInfo.metricsUrl}}</span>\r
- </div>\r
- <div> \r
- <i class="fa fa-cloud-upload fa-fw"></i><span id="org_openo_msb_route_form_publish_address" name_i18n="org_openo_msb_route_ui_i18n"></span> {{vm.targetServiceUrl}}/admin/{{vm.apiRouteInfo.serviceName}}/{{vm.apiRouteInfo.version}}\r
- </div> \r
- \r
- </div>\r
- </div>\r
- </form>\r
- </div> \r
- \r
-\r
- \r
-\r
- </div>\r
- <div class="modal-footer" \r
- ms-visible="routeDlgInfo.saveType!='view'">\r
- <button class="btn" data-dismiss="modal" aria-hidden="true" id="org_openo_msb_route_form_btn_cancel" name_i18n="org_openo_msb_route_ui_i18n"></button>\r
- <button class="btn btn-primary" type="submit" ms-click="$saveApiRoute()" id="org_openo_msb_route_form_btn_save" name_i18n="org_openo_msb_route_ui_i18n"></button>\r
- </div>\r
- <div class="modal-footer" \r
- ms-visible="routeDlgInfo.saveType=='view'">\r
- <button class="btn btn-primary" data-dismiss="modal" aria-hidden="true" id="org_openo_msb_route_form_btn_close" name_i18n="org_openo_msb_route_ui_i18n"></button>\r
- \r
- </div>\r
- </div>\r
-\r
- </div>\r
- </div>\r
- </div>\r
-\r
- <div class="row" data-name="route_zone" >\r
-\r
- <span class="response_throbber" ms-visible="vm.routeLoading"></span>\r
-\r
- <div class="stats_box" ms-each-route="apiRouteArray">\r
-\r
- <div class="routeDiv">\r
- <div class="sparkline" ms-click="gotoTarget(route,'api')" data-name="route_click_zone"> \r
- <i class="fa fa-cloud fa-3x" ms-class-route-valid ="route.status === '1'" ms-class-route-invalid ="route.status === '0'"></i>\r
- \r
- </div>\r
- <div class="stat_text" ms-click="gotoTarget(route,'api')" data-name="route_click_zone">\r
- <strong ms-text="route.serviceName"></strong> \r
- <span><b id="org_openo_msb_route_box_version" name_i18n="org_openo_msb_route_ui_i18n"></b>{{route.version}}</span>\r
- \r
- </div> \r
- \r
- <span ms-visible="!discoverInfo.enabled">\r
- \r
- <a class="btn btn-default" ms-click="updateApiRoute(route,'update')" title="org_openo_msb_route_box_btn_update" name_i18n="org_openo_msb_route_ui_i18n"><i class="fa fa-pencil-square-o" > </i></a> \r
- <a class="btn btn-default" ms-click="delApiRoute(route.serviceName,route.version)" ms-visible="route.control !='1'" title="org_openo_msb_route_box_btn_delete" name_i18n="org_openo_msb_route_ui_i18n"><i class="fa fa-trash-o" > </i></a>\r
- <a class="btn btn-default" ms-visible="route.status === '1' && route.control !='1'" title="org_openo_msb_route_box_btn_disable" name_i18n="org_openo_msb_route_ui_i18n" ms-click="updateApiRouteStatus(route.serviceName,route.version,'0')"><i class="fa fa-stop" style="color:red;font-size:10px"></i></a>\r
- <a class="btn btn-default" ms-visible="route.status === '0' && route.control !='1'" title="org_openo_msb_route_box_btn_able" name_i18n="org_openo_msb_route_ui_i18n" ms-click="updateApiRouteStatus(route.serviceName,route.version,'1')"><i class="fa fa-play" style="color:green;font-size:10px"></i></a>\r
- </span> \r
- <span ms-visible="discoverInfo.enabled">\r
- <a class="btn btn-default" ms-click="updateApiRoute(route,'update')"><i class="fa fa-pencil-square-o" title="org_openo_msb_route_box_btn_update" name_i18n="org_openo_msb_route_ui_i18n"> </i></a> \r
- <a class="btn btn-default" ms-click="updateApiRoute(route,'view')"><i class="fa fa-file-text-o" title="org_openo_msb_route_box_btn_view" name_i18n="org_openo_msb_route_ui_i18n"> </i></a> </span>\r
- \r
- </div>\r
-\r
- </div>\r
-\r
- </div>\r
-\r
-\r
- </div>\r
- <div id="iuiPanel" class="tab-pane"> \r
- <div class="row" style=" margin-top: 10px;text-align:right; margin-right: 20px;">\r
- <button ms-visible="!discoverInfo.enabled" class="btn btn-primary" id="app-new-btn" ms-click="$showiuiRouteDlg()" >\r
- <i class=" fa fa-plus-circle"></i> <span id="org_openo_msb_route_btn_add_iui" name_i18n="org_openo_msb_route_ui_i18n">\r
- </button>\r
- \r
- </div>\r
-\r
- <div id="iuirouteDlg" class="modal fade" tabindex="-1" role="dialog"\r
- aria-labelledby="myModalLabel" aria-hidden="true" >\r
- <div class="modal-dialog">\r
- <div class="modal-content Changepasswd">\r
- <div class="content">\r
- <div class="modal-header">\r
- <button type="button" class="close" data-dismiss="modal"\r
- aria-hidden="true">×</button>\r
- <h3 id="myModalLabel" ms-text="routeDlgInfo.titleName"></h3>\r
- </div>\r
- <div class="modal-body">\r
- <div class="alert alert-info" ms-visible="server_rtn.info_block"></div>\r
- <div class="alert alert-danger " ms-visible="server_rtn.warning_block" ms-text="server_rtn.rtn_info"></div>\r
-\r
- <form class="form-horizontal" id="iuirouteForm" role="form"> \r
- \r
- <div class="tipArea" id="org_openo_msb_route_form_sourceservice" name_i18n="org_openo_msb_route_ui_i18n"></div> \r
- <div class="form-group" ms-visible="!discoverInfo.enabled">\r
- \r
- <label class="control-label col-sm-3">\r
- <span id="org_openo_msb_route_form_address" name_i18n="org_openo_msb_route_ui_i18n"></span>\r
- <span class="required" aria-required="true">*</span>\r
- </label> \r
- \r
- \r
- <div class="col-sm-6" style="padding-right: 5px;">\r
- <div class="item-tip" id="org_openo_msb_route_form_host_tip" name_i18n="org_openo_msb_route_ui_i18n"></div>\r
- <input type="text" ms-duplex="iuiRouteInfo.server" name="iuiserver" class="form-control form-tip" style="display:inline-block;" ms-attr-disabled="discoverInfo.enabled" />\r
- <span class="help-block"></span>\r
- </div>\r
- <div class="col-sm-1" style=" padding-left: 0px;" > \r
- <a href="#" ms-click="addiuiHost()" class="btn btn-default " title="org_openo_msb_route_form_btn_addhost" name_i18n="org_openo_msb_route_ui_i18n"><i class="fa fa-plus-circle"></i></a>\r
- </div>\r
- </div>\r
-\r
- <div class="form-group">\r
- <label class="control-label col-sm-3" >\r
- \r
- <span ms-visible="discoverInfo.enabled" id="org_openo_msb_route_form_address" name_i18n="org_openo_msb_route_ui_i18n"></span>\r
- </label> \r
- <div class="hostTableDiv col-sm-7">\r
- <table class="table table-striped hostTable">\r
- <thead>\r
- <tr>\r
- <th id="org_openo_msb_route_form_node_no" name_i18n="org_openo_msb_route_ui_i18n"></th>\r
- <th>IP</th>\r
- <th>PORT</th>\r
- <th ms-visible="routeDlgInfo.saveType!='view'" id="org_openo_msb_route_form_node_control" name_i18n="org_openo_msb_route_ui_i18n"></th>\r
- </tr>\r
- </thead>\r
- <tbody ms-each-server="vm.iuiRouteInfo.servers">\r
- <tr>\r
- <td>{{$index+1}}</td>\r
- <td ms-text="server.ip"></td>\r
- <td ms-text="server.port"></td>\r
- <td ms-visible="routeDlgInfo.saveType!='view'"><a href="#" ms-click="deliuiHost(server.ip,server.port)" style="padding: 0px 6px;" class="btn btn-default btn-s"><i class="fa fa-trash-o"></i></a></td>\r
- </tr> \r
- \r
- \r
- </tbody>\r
- </table> \r
- </div> \r
-\r
- </div>\r
-\r
- \r
- <div class="form-group" tyle="margin-bottom: 0;">\r
- <label class="control-label col-sm-3">\r
- <span id="org_openo_msb_route_form_url" name_i18n="org_openo_msb_route_ui_i18n"></span>\r
- <span class="required" aria-required="true">*</span>\r
- </label>\r
- <div class="col-sm-7">\r
- \r
- <input type="text" ms-duplex="iuiRouteInfo.url" name="iuiurl" class="form-control" value="/" ms-attr-disabled="discoverInfo.enabled" />\r
- <span class="help-block"></span>\r
- </div>\r
- \r
- </div>\r
- <div class="tipArea" id="org_openo_msb_route_form_target_tip" name_i18n="org_openo_msb_route_ui_i18n"></div>\r
- <div class="form-group">\r
- <label class="control-label col-sm-3">\r
- <span id="org_openo_msb_route_form_target_service" name_i18n="org_openo_msb_route_ui_i18n"></span>\r
- \r
- </label>\r
- <div class="col-sm-7">\r
- \r
- {{vm.targetServiceUrl}}/{{vm.iuiRootPath}}/{{vm.iuiRouteInfo.serviceName}}\r
- <span class="help-block"></span>\r
- </div>\r
- <!--i class="fa fa-info-circle fa-lg tip_color" data-toggle="tooltip" data-placement="bottom" title="org_openo_msb_route_form_iui_tip" name_i18n="org_openo_msb_route_ui_i18n" ></i-->\r
- \r
- </div> \r
- <div class="form-group">\r
- <label class="control-label col-sm-3">\r
- <span id="org_openo_msb_route_form_servicename" name_i18n="org_openo_msb_route_ui_i18n"></span>\r
- <span class="required" aria-required="true">*</span>\r
- </label>\r
- <div class="col-sm-7"> \r
- <input type="text" ms-duplex="iuiRouteInfo.serviceName" name="iuiserviceName" class="form-control" ms-attr-disabled="discoverInfo.enabled" />\r
- <span class="help-block"></span>\r
- </div>\r
- \r
- </div>\r
- \r
- \r
- \r
- \r
- \r
- \r
- </form>\r
- \r
- \r
- </div>\r
- \r
-\r
- </div>\r
- <div class="modal-footer" ms-visible="routeDlgInfo.saveType!='view'">\r
- <button class="btn" data-dismiss="modal" aria-hidden="true" id="org_openo_msb_route_form_btn_cancel" name_i18n="org_openo_msb_route_ui_i18n"></button>\r
- <button class="btn btn-primary" type="submit" ms-click="$saveiuiRoute()" id="org_openo_msb_route_form_btn_save" name_i18n="org_openo_msb_route_ui_i18n"></button>\r
- </div>\r
- <div class="modal-footer" \r
- ms-visible="routeDlgInfo.saveType=='view'">\r
- <button class="btn btn-primary" data-dismiss="modal" aria-hidden="true" id="org_openo_msb_route_form_btn_close" name_i18n="org_openo_msb_route_ui_i18n"></button>\r
- \r
- </div>\r
- </div>\r
-\r
- </div>\r
- </div>\r
-\r
- <div class="row" data-name="route_zone" >\r
-\r
- <span class="response_throbber" ms-visible="vm.routeLoading"></span>\r
-\r
- <div class="stats_box" ms-each-route="iuiRouteArray">\r
-\r
- <div class="routeDiv" ms-visible="route.control !='2'">\r
- <div class="sparkline" ms-click="gotoTarget(route,'iui')" data-name="route_click_zone"> \r
- <i class="fa fa-tv fa-3x" ms-class-route-valid ="route.status === '1'" ms-class-route-invalid ="route.status === '0'"></i>\r
- \r
- </div>\r
- <div class="stat_text" ms-click="gotoTarget(route,'iui')" data-name="route_click_zone">\r
- <strong ms-text="route.serviceName"></strong> \r
- <span>{{route.servers[0].ip}}:{{route.servers[0].port}}</span> \r
- </div> \r
- <span ms-visible="!discoverInfo.enabled">\r
- \r
- <a class="btn btn-default" ms-click="updateiuiRoute(route,'update')"><i class="fa fa-pencil-square-o" title="org_openo_msb_route_box_btn_update" name_i18n="org_openo_msb_route_ui_i18n" > </i></a> \r
- <a class="btn btn-default" ms-click="deliuiRoute(route.serviceName)" ms-visible="route.control !='1'"><i class="fa fa-trash-o" title="删除"> </i></a>\r
- <a class="btn btn-default" ms-visible="route.status === '1' && route.control !='1'" title="org_openo_msb_route_box_btn_disable" name_i18n="org_openo_msb_route_ui_i18n" ms-click="updateiuiRouteStatus(route.serviceName,'0')"><i class="fa fa-stop" style="color:red;font-size:10px"></i></a>\r
- <a class="btn btn-default" ms-visible="route.status === '0' && route.control !='1'" title="org_openo_msb_route_box_btn_able" name_i18n="org_openo_msb_route_ui_i18n" ms-click="updateiuiRouteStatus(route.serviceName,'1')"><i class="fa fa-play" style="color:green;font-size:10px"></i></a>\r
- </span> \r
- <span ms-visible="discoverInfo.enabled"><a class="btn btn-default" ms-click="updateiuiRoute(route,'view')"><i class="fa fa-file-text-o" title="org_openo_msb_route_box_btn_view" name_i18n="org_openo_msb_route_ui_i18n"> </i></a> </span>\r
- \r
- </div>\r
-\r
- </div>\r
-\r
- </div>\r
-\r
- </div>\r
-\r
- <div id="customPanel" class="tab-pane"> \r
- <div class="row" style=" margin-top: 10px;text-align:right; margin-right: 20px;">\r
- <button ms-visible="!discoverInfo.enabled" class="btn btn-primary" id="app-new-btn" ms-click="$showcustomRouteDlg()" >\r
- <i class=" fa fa-plus-circle"></i> <span id="org_openo_msb_route_btn_add_custom" name_i18n="org_openo_msb_route_ui_i18n"></span>\r
- </button>\r
- \r
- </div>\r
-\r
- <div id="customrouteDlg" class="modal fade" tabindex="-1" role="dialog"\r
- aria-labelledby="myModalLabel" aria-hidden="true" >\r
- <div class="modal-dialog">\r
- <div class="modal-content Changepasswd">\r
- <div class="content">\r
- <div class="modal-header">\r
- <button type="button" class="close" data-dismiss="modal"\r
- aria-hidden="true">×</button>\r
- <h3 id="myModalLabel" ms-text="routeDlgInfo.titleName"></h3>\r
- </div>\r
- <div class="modal-body">\r
- <div class="alert alert-info" ms-visible="server_rtn.info_block"></div>\r
- <div class="alert alert-danger " ms-visible="server_rtn.warning_block" ms-text="server_rtn.rtn_info"></div>\r
-\r
- <form class="form-horizontal" id="customrouteForm" role="form"> \r
- \r
- <div class="tipArea" id="org_openo_msb_route_form_sourceservice" name_i18n="org_openo_msb_route_ui_i18n"></div> \r
- <div class="form-group" ms-visible="!discoverInfo.enabled">\r
- \r
- <label class="control-label col-sm-3">\r
- <span id="org_openo_msb_route_form_address" name_i18n="org_openo_msb_route_ui_i18n"></span>\r
- <span class="required" aria-required="true">*</span>\r
- </label> \r
- \r
- \r
- <div class="col-sm-6" style="padding-right: 5px;">\r
- <div class="item-tip" id="org_openo_msb_route_form_host_tip" name_i18n="org_openo_msb_route_ui_i18n"></div>\r
- <input type="text" ms-duplex="customRouteInfo.server" name="customserver" class="form-control form-tip" style="display:inline-block;" ms-attr-disabled="discoverInfo.enabled" />\r
- <span class="help-block"></span>\r
- </div>\r
- <div class="col-sm-1" style=" padding-left: 0px;" ms-visible="routeDlgInfo.saveType!='view'"> \r
- <a href="#" ms-click="addcustomHost()" class="btn btn-default " title="org_openo_msb_route_form_btn_addhost" name_i18n="org_openo_msb_route_ui_i18n"><i class="fa fa-plus-circle"></i></a>\r
- </div>\r
- </div>\r
-\r
- <div class="form-group">\r
- <label class="control-label col-sm-3">\r
- <span ms-visible="discoverInfo.enabled" id="org_openo_msb_route_form_address" name_i18n="org_openo_msb_route_ui_i18n"></span>\r
- </label> \r
- <div class="hostTableDiv col-sm-7">\r
- <table class="table table-striped hostTable">\r
- <thead>\r
- <tr>\r
- <th id="org_openo_msb_route_form_node_no" name_i18n="org_openo_msb_route_ui_i18n"></th>\r
- <th>IP</th>\r
- <th>PORT</th>\r
- <th ms-visible="routeDlgInfo.saveType!='view'" id="org_openo_msb_route_form_node_control" name_i18n="org_openo_msb_route_ui_i18n"></th>\r
- </tr>\r
- </thead>\r
- <tbody ms-each-server="vm.customRouteInfo.servers">\r
- <tr>\r
- <td>{{$index+1}}</td>\r
- <td ms-text="server.ip"></td>\r
- <td ms-text="server.port"></td>\r
- <td ms-visible="routeDlgInfo.saveType!='view'"><a href="#" ms-click="delcustomHost(server.ip,server.port)" style="padding: 0px 6px;" class="btn btn-default btn-s"><i class="fa fa-trash-o"></i></a></td>\r
- </tr> \r
- \r
- \r
- </tbody>\r
- </table> \r
- </div> \r
-\r
- </div>\r
-\r
-\r
- \r
- <div class="form-group" tyle="margin-bottom: 0;">\r
- <label class="control-label col-sm-3">\r
- <span id="org_openo_msb_route_form_url" name_i18n="org_openo_msb_route_ui_i18n"></span>\r
- <span class="required" aria-required="true">*</span>\r
- </label>\r
- <div class="col-sm-7">\r
- \r
- <input type="text" ms-duplex="customRouteInfo.url" name="customurl" class="form-control" value="/" ms-attr-disabled="discoverInfo.enabled" />\r
- <span class="help-block"></span>\r
- </div>\r
- \r
- </div>\r
-\r
- <div class="tipArea" id="org_openo_msb_route_form_target_tip" name_i18n="org_openo_msb_route_ui_i18n"></div>\r
- <div class="form-group">\r
- <label class="control-label col-sm-3">\r
- <span id="org_openo_msb_route_form_target_service" name_i18n="org_openo_msb_route_ui_i18n"></span>\r
- \r
- </label>\r
- <div class="col-sm-7">\r
- \r
- {{vm.targetServiceUrl}}{{vm.customRouteInfo.serviceName}}\r
- <span class="help-block"></span>\r
- </div>\r
- \r
- \r
- </div> \r
- <div class="form-group">\r
- <label class="control-label col-sm-3">\r
- <span id="org_openo_msb_route_form_servicename" name_i18n="org_openo_msb_route_ui_i18n"></span>\r
- \r
- </label>\r
- <div class="col-sm-7"> \r
- <input type="text" ms-duplex="customRouteInfo.serviceName" name="customserviceName" class="form-control" ms-attr-disabled="discoverInfo.enabled" />\r
- <span class="help-block"></span>\r
- </div>\r
- \r
- </div>\r
- \r
- \r
- </form>\r
- \r
- \r
- </div>\r
- \r
-\r
- </div>\r
- <div class="modal-footer" ms-visible="routeDlgInfo.saveType!='view'">\r
- <button class="btn" data-dismiss="modal" aria-hidden="true" id="org_openo_msb_route_form_btn_cancel" name_i18n="org_openo_msb_route_ui_i18n"></button>\r
- <button class="btn btn-primary" type="submit" ms-click="$savecustomRoute()" id="org_openo_msb_route_form_btn_save" name_i18n="org_openo_msb_route_ui_i18n"></button>\r
- </div>\r
- <div class="modal-footer" \r
- ms-visible="routeDlgInfo.saveType=='view'">\r
- <button class="btn btn-primary" data-dismiss="modal" aria-hidden="true" id="org_openo_msb_route_form_btn_close" name_i18n="org_openo_msb_route_ui_i18n"></button>\r
- \r
- </div>\r
- </div>\r
-\r
- </div>\r
- </div>\r
-\r
- <div class="row" data-name="route_zone" >\r
-\r
- <span class="response_throbber" ms-visible="vm.routeLoading"></span>\r
-\r
-\r
- <div ms-each-el="customGroupRouteArray">\r
- <div class="form-title">\r
- <span><a data-toggle="collapse" >{{routeUtil.showGroupName($index,el)}}</a>\r
- <span class="label label-info" style="margin-left: 10px;">{{customGroupRouteArray[$index].length}}</span>\r
- </span>\r
- <div class="panel-tools"> \r
- <a class="showhide" data-toggle="collapse"><i class="fa fa-chevron-up"></i></a>\r
- </div>\r
- </div>\r
- <div style="width: 100%;" class="collapseContent collapse in">\r
- <div class="stats_box" ms-each-elem="el">\r
- <div class="routeDiv" ms-visible="elem.control !='2'">\r
- <div class="sparkline" data-name="route_click_zone"> \r
- <i class="fa fa-cogs fa-3x" ms-class-route-valid ="elem.status === '1'" ms-class-route-invalid ="elem.status === '0'"></i>\r
- \r
- </div>\r
- <div class="stat_text" data-name="route_click_zone" style="padding: 9px 0px 4px 0;">\r
- <strong ms-text="elem.serviceName==''?'/':elem.serviceName" style="height: 35px;word-wrap:break-word;word-break: normal;"></strong> \r
- <span>{{elem.servers[0].ip}}:{{elem.servers[0].port}}</span> \r
- </div> \r
- <span ms-visible="!discoverInfo.enabled">\r
- \r
- <a class="btn btn-default" ms-click="updatecustomRoute(elem,'update')"><i class="fa fa-pencil-square-o" title="org_openo_msb_route_box_btn_update" name_i18n="org_openo_msb_route_ui_i18n" > </i></a> \r
- <a class="btn btn-default" ms-click="delcustomRoute(elem.serviceName)" ms-visible="elem.control !='1'"><i class="fa fa-trash-o" title="删除"> </i></a>\r
- <a class="btn btn-default" ms-visible="elem.status === '1' && elem.control !='1'" title="org_openo_msb_route_box_btn_disable" name_i18n="org_openo_msb_route_ui_i18n" ms-click="updatecustomRouteStatus(elem.serviceName,'0')"><i class="fa fa-stop" style="color:red;font-size:10px"></i></a>\r
- <a class="btn btn-default" ms-visible="elem.status === '0' && elem.control !='1'" title="org_openo_msb_route_box_btn_able" name_i18n="org_openo_msb_route_ui_i18n" ms-click="updatecustomRouteStatus(elem.serviceName,'1')"><i class="fa fa-play" style="color:green;font-size:10px"></i></a>\r
- </span> \r
- <span ms-visible="discoverInfo.enabled"><a class="btn btn-default" ms-click="updatecustomRoute(elem,'view')"><i class="fa fa-file-text-o" title="org_openo_msb_route_box_btn_view" name_i18n="org_openo_msb_route_ui_i18n"> </i></a> </span>\r
- \r
- </div>\r
-\r
- </div>\r
- </div>\r
-\r
- </div>\r
-\r
- \r
-\r
- </div>\r
-\r
- </div>\r
-\r
-\r
- <div id="msbPanel" class="tab-pane"> \r
- <div class="row" style=" margin-top: 10px;text-align:right; margin-right: 20px;">\r
- <button class="btn btn-primary" id="app-new-btn" ms-click="$showmsbRouteDlg()" >\r
- <i class=" fa fa-plus-circle"></i> <span id="org_openo_msb_route_btn_add_msb" name_i18n="org_openo_msb_route_ui_i18n"></span>\r
- </button>\r
- \r
- </div>\r
-\r
- <div id="msbrouteDlg" class="modal fade" tabindex="-1" role="dialog"\r
- aria-labelledby="myModalLabel" aria-hidden="true" >\r
- <div class="modal-dialog">\r
- <div class="modal-content">\r
- <div class="content">\r
- <div class="modal-header">\r
- <button type="button" class="close" data-dismiss="modal"\r
- aria-hidden="true">×</button>\r
- <h3 id="myModalLabel" ms-text="routeDlgInfo.titleName"></h3>\r
- </div>\r
- <div class="modal-body">\r
- <div class="alert alert-info" ms-visible="server_rtn.info_block"></div>\r
- <div class="alert alert-danger " ms-visible="server_rtn.warning_block" ms-text="server_rtn.rtn_info"></div>\r
-\r
- <form class="form-horizontal" id="msbForm" role="form"> \r
- <div class="tipArea" id="org_openo_msb_route_msb_info" name_i18n="org_openo_msb_route_ui_i18n"></div> \r
- <div class="form-group">\r
- <label class="control-label col-sm-3">\r
- <span id="org_openo_msb_route_form_servicename" name_i18n="org_openo_msb_route_ui_i18n"></span>\r
- <span class="required" aria-required="true">*</span>\r
- </label>\r
- <div class="col-sm-7"> \r
- <input type="text" ms-duplex="msbRouteInfo.serviceName" name="serviceName" class="form-control" />\r
- <span class="help-block"></span>\r
- </div>\r
- \r
- </div>\r
-\r
- <div class="form-group">\r
- <label class="control-label col-sm-3">\r
- <span id="org_openo_msb_route_form_version" name_i18n="org_openo_msb_route_ui_i18n"></span>\r
- </label>\r
- <div class="col-sm-7"> \r
- <div class="item-tip" id="org_openo_msb_route_form_version_tip" name_i18n="org_openo_msb_route_ui_i18n"></div>\r
- <input type="text" ms-duplex="msbRouteInfo.version" name="version" class="form-control form-tip" />\r
- <span class="help-block"></span>\r
- </div>\r
- \r
- </div>\r
-\r
- \r
-\r
- <div class="form-group">\r
- <label class="control-label col-sm-3">\r
- <span id="org_openo_msb_route_form_url" name_i18n="org_openo_msb_route_ui_i18n"></span> \r
- </label>\r
- <div class="col-sm-7">\r
- \r
- <input type="text" ms-duplex="msbRouteInfo.url" name="url" class="form-control" />\r
- <span class="help-block"></span>\r
- </div>\r
- \r
- </div>\r
-\r
-\r
- <div class="form-group">\r
- <label class="control-label col-sm-3">\r
- <span id="org_openo_msb_route_form_protocol" name_i18n="org_openo_msb_route_ui_i18n"></span>\r
- <span class="required" aria-required="true">*</span>\r
- </label>\r
- <div class="col-sm-7">\r
- <select class="form-control m-b" ms-each="$msbProtocol" name="protocol" ms-duplex="msbRouteInfo.protocol" > \r
- <option ms-attr-value='el'>{{el}}</option>\r
- </select>\r
- <span class="help-block"></span>\r
- </div>\r
- \r
- </div>\r
-\r
- <div class="form-group">\r
- <label class="control-label col-sm-3">\r
- <span id="org_openo_msb_route_form_visualrange" name_i18n="org_openo_msb_route_ui_i18n"></span>\r
- <span class="required" aria-required="true">*</span>\r
- </label>\r
- <div class="col-sm-7">\r
- <input type="checkbox" ms-duplex="msbRouteInfo.visualRangeArray" value="0" ><span style="margin-right: 20px;" id="org_openo_msb_route_form_intersystem" name_i18n="org_openo_msb_route_ui_i18n" ></span>\r
- <input type="checkbox" ms-duplex="msbRouteInfo.visualRangeArray" value="1" ><span style="margin-right: 20px;" id="org_openo_msb_route_form_insystem" name_i18n="org_openo_msb_route_ui_i18n"></span>\r
- \r
- <span class="help-block"></span>\r
- </div>\r
- \r
- </div>\r
-\r
- <div class="tipArea" id="org_openo_msb_route_msb_hostlist" name_i18n="org_openo_msb_route_ui_i18n"></div> \r
-\r
- <div class="form-group">\r
- \r
- <label class="control-label col-sm-3">\r
- <span id="org_openo_msb_route_form_msb_host" name_i18n="org_openo_msb_route_ui_i18n"></span>\r
- <span class="required" aria-required="true">*</span>\r
- </label> \r
- \r
- \r
- <div class="col-sm-4" style="padding-right: 5px;">\r
- <div class="item-tip" id="org_openo_msb_route_form_host_tip" name_i18n="org_openo_msb_route_ui_i18n"></div>\r
- \r
- <input type="text" placeholder="" ms-duplex="msbRouteInfo.newHost" class="form-control form-tip" name="newHost" style="display:inline-block;" />\r
- \r
- <span class="help-block"></span>\r
- </div>\r
- <div class="col-sm-2" style="padding-right: 5px;">\r
- <div class="item-tip" id="org_openo_msb_route_form_ttl_tip" name_i18n="org_openo_msb_route_ui_i18n"></div>\r
- \r
- <input type="text" placeholder="" ms-duplex="msbRouteInfo.newttl" class="form-control form-tip" name="newttl" style="display:inline-block;" />\r
- \r
- <span class="help-block"></span>\r
- </div>\r
- <div class="col-sm-1" style=" padding-left: 0px;"> \r
- <a href="#" ms-click="addmsbHost()" class="btn btn-default " title="org_openo_msb_route_form_btn_addhost" name_i18n="org_openo_msb_route_ui_i18n"><i class="fa fa-plus-circle"></i></a>\r
- </div>\r
- </div>\r
-\r
- <div class="form-group">\r
- <label class="control-label col-sm-3"></label> \r
- <div class="hostTableDiv col-sm-7">\r
- <table class="table table-striped hostTable">\r
- <thead>\r
- <tr>\r
- <th id="org_openo_msb_route_form_node_no" name_i18n="org_openo_msb_route_ui_i18n"></th>\r
- <th>IP</th>\r
- <th>PORT</th>\r
- <th>TTL</th>\r
- <th id="org_openo_msb_route_form_node_control" name_i18n="org_openo_msb_route_ui_i18n"></th>\r
- </tr>\r
- </thead>\r
- <tbody ms-each-node="vm.msbRouteInfo.nodes">\r
- <tr>\r
- <td>{{$index+1}}</td>\r
- <td ms-text="node.ip"></td>\r
- <td ms-text="node.port"></td>\r
- <td ms-text="node.ttl"></td>\r
- <td><a href="#" title="org_openo_msb_route_form_btn_delhost" name_i18n="org_openo_msb_route_ui_i18n" ms-click="delmsbHost(node.ip,node.port)" style="padding: 0px 6px;" class="btn btn-default btn-s"><i class="fa fa-trash-o"></i></a></td>\r
- </tr> \r
- \r
- \r
- </tbody>\r
- </table> \r
- </div> \r
-\r
- </div>\r
-\r
- <div class="tipArea" ms-visible="msbRouteInfo.protocol=='REST'||msbRouteInfo.protocol=='UI'" id="org_openo_msb_route_form_target_tip" name_i18n="org_openo_msb_route_ui_i18n"></div> \r
- <div class="form-group" ms-visible="msbRouteInfo.protocol=='REST'||msbRouteInfo.protocol=='UI'">\r
- <label class="control-label col-sm-3">\r
- <span id="org_openo_msb_route_form_target_service" name_i18n="org_openo_msb_route_ui_i18n"></span>\r
- \r
- </label>\r
- <div class="col-sm-7">\r
- {{vm.targetFullServiceUrl}} \r
- \r
- \r
- </div>\r
- \r
- </div> \r
- \r
- </form>\r
- \r
- \r
- </div>\r
- \r
-\r
- </div>\r
- <div class="modal-footer">\r
- <button class="btn" data-dismiss="modal" aria-hidden="true" id="org_openo_msb_route_form_btn_cancel" name_i18n="org_openo_msb_route_ui_i18n"></button>\r
- <button class="btn btn-primary" type="submit" ms-click="$savemsbRoute()" id="org_openo_msb_route_form_btn_save" name_i18n="org_openo_msb_route_ui_i18n"></button>\r
- </div>\r
- </div>\r
-\r
- </div>\r
- </div>\r
-\r
- <div class="row" data-name="route_zone" >\r
-\r
- \r
- <div class="table-responsive">\r
- <table class="table table-striped table-bordered table-hover" id="msbTable">\r
- <thead>\r
- <tr>\r
- <th></th> \r
- <th style="display:none"></th> \r
- <th id="org_openo_msb_route_form_node_no" name_i18n="org_openo_msb_route_ui_i18n"></th> \r
- <th id="org_openo_msb_route_form_servicename" name_i18n="org_openo_msb_route_ui_i18n"></th>\r
- <th id="org_openo_msb_route_form_version" name_i18n="org_openo_msb_route_ui_i18n"></th> \r
- \r
- <th id="org_openo_msb_route_form_url" name_i18n="org_openo_msb_route_ui_i18n"></th> \r
- <th id="org_openo_msb_route_form_protocol" name_i18n="org_openo_msb_route_ui_i18n"></th>\r
- <th id="org_openo_msb_route_form_visualrange" name_i18n="org_openo_msb_route_ui_i18n"></th>\r
- <!--th>状态</th--> \r
- <th id="org_openo_msb_route_form_node_control" name_i18n="org_openo_msb_route_ui_i18n"></th> \r
- </tr>\r
- </thead>\r
- <tbody ms-each-msb="msbRouteArray">\r
- <tr>\r
- <td class="details-control"></td>\r
- <td ms-each-node="msb.nodes" style="display:none">\r
- {{node.ip}}:{{node.port}}:{{node.ttl}}\r
- </td> \r
- <td ms-text="$index+1"></td>\r
- <td ms-text="msb.serviceName"></td>\r
- <td ms-text="msb.version"></td>\r
- \r
- <td>{{msb.url==""?"/":msb.url}}</td> \r
- <td ms-text="msb.protocol"></td>\r
- <td ms-text="routeUtil.showVisualRange(msb.visualRange)"></td>\r
- <!--td ms-html="routeUtil.showStatus(msb.status)"></td--> \r
- <td>\r
- \r
- <a href="#" title="org_openo_msb_route_box_btn_update" name_i18n="org_openo_msb_route_ui_i18n" class="btn btn-default btn-s" ms-click="updatemsbRoute(msb)"><i class="fa fa fa-pencil-square-o"></i></a>\r
- <a href="#" title="org_openo_msb_route_box_btn_delete" name_i18n="org_openo_msb_route_ui_i18n" class="btn btn-default btn-s" ms-click="delmsbRoute(msb.serviceName,msb.version,this)"><i class="fa fa-trash-o"></i></a>\r
- \r
- </td> \r
- </tr> \r
- \r
- </tbody>\r
- </table>\r
- \r
- </div>\r
-\r
- \r
-\r
- \r
-\r
- </div>\r
-\r
- </div>\r
-\r
- </div>\r
-\r
-\r
-\r
- <div class="row-fluid separator" id="upArrawDiv">\r
- <div ms-visible="boxVisible" class="col-xs-12">\r
- <a href="#" ms-click="clickDisplayGraphAlink()"><img src="img/up.png"/></a>\r
- </div>\r
- </div>\r
-\r
- \r
-</div>\r
-\r
-<div class="row-fluid separator">\r
-\r
- <div ms-visible="!boxVisible" class="col-xs-12">\r
- <a href="#" ms-click="clickDisplayGraphAlink()" ><img src="img/down.png"/></a>\r
- </div>\r
-</div>\r
-\r
- <div class="container-fluid" style="margin-top:20px" id="serviceContent">\r
-\r
- <div class="row" style=" margin-top: 15px;">\r
- <div class="col-xs-6 col-md-6 col-sm-6 col-lg-6">\r
- <i class="fa fa-file-text-o fa-fw"></i> \r
- <span class=" titlefont" ms-text="routeTargetTitle"></span>\r
-\r
- </div>\r
- <div class="pull-right" ms-visible="vm.selectedRouteType=='api'">\r
- <button type="button" class="btn btn-default btn-sm" style="padding:3px 8px" ms-click="gotoRestDoc()"><i class="fa fa-link"></i> <span id="org_openo_msb_route_servicecontent_swagger" name_i18n="org_openo_msb_route_ui_i18n"></span></button>\r
- <button type="button" class="btn btn-default btn-sm" style="padding:3px 8px" ms-click="gotoJVM()" ms-visible="vm.selectedRoute.metricsUrl!=''"><i class="fa fa-bar-chart"></i> <span id="org_openo_msb_route_servicecontent_metrics" name_i18n="org_openo_msb_route_ui_i18n"></span></button>\r
- </div>\r
- \r
- </div>\r
- <div class="separator-line"></div>\r
- \r
-\r
- \r
- <iframe src="" width="100%" scrolling="no" marginheight="0" frameborder="0" id="msbSubPage" name="msbSubPage" class="page-mainIframeisWare" ></iframe>\r
- \r
-\r
- \r
- </div>\r
- \r
-\r
-</div>\r
-\r
-<script type="text/javascript" src="js/jquery.i18n/jquery.i18n.properties-1.0.9.js"></script>\r
-\r
-\r
- <script type="text/javascript" src="js/iframeResizer/iframeResizer.min.js"></script>\r
- <script type="text/javascript" src="js/iframeResizer/iframeResizer.contentWindow.min.js"></script>\r
-\r
- <script type="text/javascript" src="js/bootstrap/js/bootstrap.min.js"></script>\r
- <script type="text/javascript" src="js/dataTables/jquery.dataTables.min.js"></script>\r
- <script type="text/javascript" src="js/dataTables/dataTables.bootstrap.min.js"></script>\r
- <script type="text/javascript" src="js/bootbox/bootbox.min.js"></script>\r
- <script src="js/bootstrap-growl.min.js"></script>\r
- <script src="js/jquery-validation/jquery.validate.js"></script>\r
- <script type="text/javascript" src="js/avalon.js"></script>\r
-\r
-\r
-<script src="i18n/loadi18nApp_iui-route_view.js"></script>\r
-\r
-\r
- <script type="text/javascript" src="js/routeController.js"></script>\r
-\r
-\r
-<script type="text/javascript">\r
-\r
-$(function(){\r
-\r
-$('iframe').iFrameResize();\r
- loadPropertiesSideMenu('', 'msb-iui-route-i18n', 'i18n/'); \r
-avalon.scan();\r
-vm.$initRoute();\r
-\r
-\r
-});\r
-\r
-</script>\r
- <script src="js/routeUtil.js"></script>\r
- <script src="js/routeFunc.js"></script>\r
- \r
-</body>\r
+<!--
+
+ Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+
+ Licensed 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.
+
+ Author: Zhaoxing Meng
+ email: meng.zhaoxing1@zte.com.cn
+
+-->
+<!DOCTYPE html>
+<html>
+<head lang="en">
+<meta charset="UTF-8">
+<title id="org_openo_msb_route_title" name_i18n="org_openo_msb_route_ui_i18n"></title>
+<link rel="shortcut icon" href="img/zte_logo_16.gif" />
+<link
+ href="js/fontAwesome/css/font-awesome.min.css"
+ rel="stylesheet" />
+<link
+ href="js/bootstrap/css/bootstrap.min.css"
+ rel="stylesheet" />
+
+
+
+<link href="css/route.css" rel="stylesheet" type="text/css" />
+<link href="css/animate.min.css" rel="stylesheet" type="text/css" />
+<link href="js/dataTables/dataTables.bootstrap.css" rel="stylesheet" type="text/css" />
+
+<style>
+.ms-controller {
+ visibility: hidden
+}
+</style>
+
+ <script type="text/javascript" src="js/jquery/jquery-1.10.2.min.js"></script>
+ <script type="text/javascript">
+ var iuiRootPath="iui";
+ var apiRootPath="api";
+
+ $.ajaxSettings.async = false;
+ $.getJSON("./ext/initUrlRootPath/initUrlRootPath.json",function(json){
+ iuiRootPath=json.iuiRootPath;
+ apiRootPath=json.apiRootPath;
+ });
+
+
+ var apiBasePath="/"+apiRootPath+"/microservices/v1";
+ var iuiBasePath="/"+iuiRootPath+"/microservices";
+
+</script>
+
+
+
+
+</head>
+<body class="ms-controller" ms-controller="routeController">
+
+<div class="navbar" id="routeHead">
+ <div class="navbar-inner container-fluid" id="top-bar">
+ <header class="row-fluid">
+ <h3 class="span12" id="title">
+ <img class="logo" src="img/conductor-logo.png" alt="Logo" id="logo">
+ <small id="org_openo_msb_route_banner_title" name_i18n="org_openo_msb_route_ui_i18n"></small>
+ <button type="button" class="btn btn-default" ms-click="exportServices()" style="float:right;margin-left: 10px; margin-top: 5px;"><i class=" fa fa-external-link"></i> <span id="org_openo_msb_route_btn_export" name_i18n="org_openo_msb_route_ui_i18n"></span></button>
+
+ </h3>
+ </header>
+ </div>
+ </div>
+ <script type="text/javascript">
+ if (self != top) {document.getElementById("routeHead").style.display="none";}
+
+ var currentLang = navigator.language;
+if(!currentLang) {currentLang = navigator.browserLanguage; }
+if(currentLang.toLowerCase() != "zh-cn") {$("#logo").hide(); }
+ </script>
+
+<div style=" background-color: #f1f3fa !important; ">
+
+
+ <div class="row row1 container-fluid" ms-visible="boxVisible">
+
+ <ul class="nav nav-tabs" id="panelTab" style="margin-top: 10px;">
+ <li class="active" ><a href="#apiPanel" data-toggle="tab" id="apiTab"><i class="fa fa-cloud fa-1x"></i> <span id="org_openo_msb_route_tab_api" name_i18n="org_openo_msb_route_ui_i18n"></span> </a></li>
+ <li ><a href="#iuiPanel" data-toggle="tab" id="iuiTab"><i class="fa fa-tv fa-1x"></i> <span id="org_openo_msb_route_tab_iui" name_i18n="org_openo_msb_route_ui_i18n"></span></a></li>
+</ul>
+<div class="tab-content" >
+ <div id="apiPanel" class="tab-pane active">
+ <div class="row" style=" margin-top: 10px;text-align:right; margin-right: 20px;">
+
+ <button ms-visible="!discoverInfo.enabled" class="btn btn-primary" id="app-new-btn" ms-click="$showApiRouteDlg()" >
+ <i class=" fa fa-plus-circle"></i> <span id="org_openo_msb_route_btn_add_api" name_i18n="org_openo_msb_route_ui_i18n"></span>
+ </button>
+
+ </div>
+
+
+<div id="routeDlg" class="modal fade" tabindex="-1" role="dialog"
+ aria-labelledby="myModalLabel" aria-hidden="true" >
+ <div class="modal-dialog">
+ <div class="modal-content Changepasswd">
+ <div class="content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal"
+ aria-hidden="true">×</button>
+ <h3 id="myModalLabel" ms-text="routeDlgInfo.titleName"></h3>
+ </div>
+ <div class="modal-body">
+ <div class="alert alert-info" ms-visible="server_rtn.info_block"></div>
+ <div class="alert alert-danger " ms-visible="server_rtn.warning_block" ms-text="server_rtn.rtn_info"></div>
+
+
+
+
+ <div id="info" class="tab-pane active">
+
+ <form class="form-horizontal" id="routeForm" role="form">
+
+ <div class="tipArea" id="org_openo_msb_route_form_sourceservice" name_i18n="org_openo_msb_route_ui_i18n"></div>
+ <div class="form-group" ms-visible="!discoverInfo.enabled">
+
+ <label class="control-label col-sm-3">
+ <span id="org_openo_msb_route_form_address" name_i18n="org_openo_msb_route_ui_i18n"></span>
+ <span class="required" aria-required="true">*</span>
+ </label>
+
+
+ <div class="col-sm-6" style="padding-right: 5px;">
+ <div class="item-tip" id="org_openo_msb_route_form_host_tip" name_i18n="org_openo_msb_route_ui_i18n"></div>
+ <input type="text" ms-duplex="apiRouteInfo.server" name="server" class="form-control form-tip" ms-attr-disabled="discoverInfo.enabled" style="display:inline-block;" />
+ <span class="help-block"></span>
+ </div>
+ <div class="col-sm-1" style=" padding-left: 0px;" >
+ <a href="#" ms-click="addapiHost()" class="btn btn-default " title="org_openo_msb_route_form_btn_addhost" name_i18n="org_openo_msb_route_ui_i18n"><i class="fa fa-plus-circle"></i></a>
+ </div>
+ </div>
+
+ <div class="form-group">
+ <label class="control-label col-sm-3">
+ <span ms-visible="discoverInfo.enabled" id="org_openo_msb_route_form_address" name_i18n="org_openo_msb_route_ui_i18n"></span>
+ </label>
+ <div class="hostTableDiv col-sm-7">
+ <table class="table table-striped hostTable">
+ <thead>
+ <tr>
+ <th id="org_openo_msb_route_form_node_no" name_i18n="org_openo_msb_route_ui_i18n"></th>
+ <th>IP</th>
+ <th>PORT</th>
+ <th ms-visible="!discoverInfo.enabled" id="org_openo_msb_route_form_node_control" name_i18n="org_openo_msb_route_ui_i18n"></th>
+ </tr>
+ </thead>
+ <tbody ms-each-server="vm.apiRouteInfo.servers">
+ <tr>
+ <td>{{$index+1}}</td>
+ <td ms-text="server.ip"></td>
+ <td ms-text="server.port"></td>
+ <td ms-visible="!discoverInfo.enabled"><a href="#" ms-click="delapiHost(server.ip,server.port)" style="padding: 0px 6px;" class="btn btn-default btn-s"><i class="fa fa-trash-o"></i></a></td>
+ </tr>
+
+
+ </tbody>
+ </table>
+ </div>
+
+ </div>
+
+ <div class="form-group" tyle="margin-bottom: 0;">
+ <label class="control-label col-sm-3">
+ <span id="org_openo_msb_route_form_url" name_i18n="org_openo_msb_route_ui_i18n"></span>
+ <span class="required" aria-required="true">*</span>
+ </label>
+ <div class="col-sm-7">
+
+ <input type="text" ms-duplex="apiRouteInfo.url" name="url" class="form-control" id="form-url" value="/" ms-attr-disabled="discoverInfo.enabled"/>
+ <span class="help-block"></span>
+ </div>
+
+ </div>
+ <div class="tipArea" id="org_openo_msb_route_form_target_tip" name_i18n="org_openo_msb_route_ui_i18n"></div>
+ <div class="form-group">
+ <label class="control-label col-sm-3">
+ <span id="org_openo_msb_route_form_target_service" name_i18n="org_openo_msb_route_ui_i18n"></span>
+
+ </label>
+ <div class="col-sm-7">
+
+ {{vm.targetServiceUrl}}/{{vm.apiRootPath}}/{{vm.apiRouteInfo.serviceName}}/{{vm.apiRouteInfo.version}}
+ <span class="help-block"></span>
+ </div>
+
+ </div>
+ <div class="form-group">
+ <label class="control-label col-sm-3">
+ <span id="org_openo_msb_route_form_servicename" name_i18n="org_openo_msb_route_ui_i18n"></span>
+ <span class="required" aria-required="true">*</span>
+ </label>
+ <div class="col-sm-7">
+ <input type="text" ms-duplex="apiRouteInfo.serviceName" name="serviceName" class="form-control" ms-attr-disabled="discoverInfo.enabled" />
+ <span class="help-block"></span>
+ </div>
+
+ </div>
+
+ <div class="form-group">
+ <label class="control-label col-sm-3">
+ <span id="org_openo_msb_route_form_version" name_i18n="org_openo_msb_route_ui_i18n"></span>
+
+ </label>
+ <div class="col-sm-7">
+ <div class="item-tip" ms-class-item-tip-none ="routeDlgInfo.saveType=='update'" id="org_openo_msb_route_form_version_tip" name_i18n="org_openo_msb_route_ui_i18n"></div>
+ <input type="text" ms-duplex="apiRouteInfo.version" name="version" class="form-control form-tip" ms-attr-disabled="discoverInfo.enabled" />
+ <span class="help-block"></span>
+ </div>
+
+ </div>
+
+
+
+ <div class="form-group">
+ <label class="control-label col-sm-3">
+ <span><a href="javascript:;" class="collapse-box" data-toggle="collapse"
+ data-target="#apiJsonFullurl">
+ <i class="fa fa-plus" id="apiJsonCollapse"></i> <span id="org_openo_msb_route_form_swagger" name_i18n="org_openo_msb_route_ui_i18n"></span>
+ </a></span>
+
+ </label>
+ <div class="col-sm-7">
+ <div class="input-group">
+ <input type="text" class="form-control" ms-if="apiRouteInfo.apiJsonType=='1'" ms-duplex="apiJson.custom" ms-attr-disabled="routeDlgInfo.saveType=='view'"/>
+ <select class="form-control m-b" ms-if="apiRouteInfo.apiJsonType=='0'" ms-each="jsonApiSelectList.selectItems" ms-duplex="apiJson.local" id="apiJsonSelect" ms-attr-disabled="routeDlgInfo.saveType=='view'">
+ <option ms-attr-value='el'>{{el}}</option>
+ </select>
+
+ <div class="input-group-btn">
+ <button class="btn btn-default dropdown-toggle" data-toggle="dropdown" type="button" aria-expanded="false" ms-attr-disabled="routeDlgInfo.saveType=='view'">{{showAPITypeName[apiRouteInfo.apiJsonType]}} <span class="caret"></span></button>
+ <ul class="dropdown-menu pull-right">
+ <li><a ms-click="setAPIType(0)">{{showAPITypeName[0]}}</a></li>
+ <li><a ms-click="setAPIType(1)">{{showAPITypeName[1]}}</a></li>
+ </ul>
+ </div>
+ </div>
+ <span class="help-block"></span>
+ </div>
+
+
+
+
+ </div>
+
+ <div id="apiJsonFullurl" class="form-group collapse in">
+ <label class="control-label col-sm-3"><span id="org_openo_msb_route_form_swagger_address" name_i18n="org_openo_msb_route_ui_i18n"></span></label>
+ <div class="col-sm-9">
+ <div>
+ <i class="fa fa-home fa-fw"></i> <span id="org_openo_msb_route_form_target_address" name_i18n="org_openo_msb_route_ui_i18n"></span>
+ <span ms-if="vm.apiRouteInfo.apiJsonType==0">{{vm.targetServiceUrl}}/iui/microservices/ext/initSwaggerJson/{{vm.apiJson.local}}</span>
+ <span ms-if="vm.apiRouteInfo.apiJsonType==1">{{vm.apiRouteInfo.servers[0].ip+":"+vm.apiRouteInfo.servers[0].port}}{{vm.apiJson.custom}}</span>
+ </div>
+ <div>
+ <i class="fa fa-cloud-upload fa-fw"></i><span id="org_openo_msb_route_form_publish_address" name_i18n="org_openo_msb_route_ui_i18n"></span>
+ <span ms-if="vm.apiRouteInfo.apiJsonType==0">{{vm.targetServiceUrl}}/iui/microservices/ext/initSwaggerJson/{{vm.apiJson.local}}</span>
+ <span ms-if="vm.apiRouteInfo.apiJsonType==1">{{vm.targetServiceUrl}}/apijson/{{vm.apiRouteInfo.serviceName}}/{{vm.apiRouteInfo.version}}</span>
+ </div>
+
+
+ </div>
+ </div>
+
+ <div class="form-group">
+ <label class="control-label col-sm-3">
+ <span><a href="javascript:;" class=" collapse-box" data-toggle="collapse"
+ data-target="#metricsFullurl">
+ <i class="fa fa-plus" id="metricsUrlCollapse"></i> <span id="org_openo_msb_route_form_metrics" name_i18n="org_openo_msb_route_ui_i18n"></span>
+ </a></span>
+ </label>
+ <div class="col-sm-7">
+
+ <input type="text" ms-duplex="apiRouteInfo.metricsUrl" name="metricsUrl" class="form-control" value="/admin/metrics" ms-attr-disabled="routeDlgInfo.saveType=='view'" />
+
+
+ <span class="help-block"></span>
+ </div>
+
+
+
+ </div>
+ <div id="metricsFullurl" class="form-group collapse in">
+ <label class="control-label col-sm-3"><span id="org_openo_msb_route_form_metrics_address" name_i18n="org_openo_msb_route_ui_i18n"></span></label>
+ <div class="col-sm-9">
+ <div>
+ <i class="fa fa-home fa-fw"></i><span id="org_openo_msb_route_form_target_address" name_i18n="org_openo_msb_route_ui_i18n"></span> {{vm.apiRouteInfo.servers[0].ip+":"+vm.apiRouteInfo.servers[0].port}}{{vm.apiRouteInfo.metricsUrl}}</span>
+ </div>
+ <div>
+ <i class="fa fa-cloud-upload fa-fw"></i><span id="org_openo_msb_route_form_publish_address" name_i18n="org_openo_msb_route_ui_i18n"></span> {{vm.targetServiceUrl}}/admin/{{vm.apiRouteInfo.serviceName}}/{{vm.apiRouteInfo.version}}
+ </div>
+
+ </div>
+ </div>
+ </form>
+ </div>
+
+
+
+
+ </div>
+ <div class="modal-footer"
+ ms-visible="routeDlgInfo.saveType!='view'">
+ <button class="btn" data-dismiss="modal" aria-hidden="true" id="org_openo_msb_route_form_btn_cancel" name_i18n="org_openo_msb_route_ui_i18n"></button>
+ <button class="btn btn-primary" type="submit" ms-click="$saveApiRoute()" id="org_openo_msb_route_form_btn_save" name_i18n="org_openo_msb_route_ui_i18n"></button>
+ </div>
+ <div class="modal-footer"
+ ms-visible="routeDlgInfo.saveType=='view'">
+ <button class="btn btn-primary" data-dismiss="modal" aria-hidden="true" id="org_openo_msb_route_form_btn_close" name_i18n="org_openo_msb_route_ui_i18n"></button>
+
+ </div>
+ </div>
+
+ </div>
+ </div>
+ </div>
+
+ <div class="row" data-name="route_zone" >
+
+ <span class="response_throbber" ms-visible="vm.routeLoading"></span>
+
+ <div class="stats_box" ms-each-route="apiRouteArray">
+
+ <div class="routeDiv">
+ <div class="sparkline" ms-click="gotoTarget(route,'api')" data-name="route_click_zone">
+ <i class="fa fa-cloud fa-3x" ms-class-route-valid ="route.status === '1'" ms-class-route-invalid ="route.status === '0'"></i>
+
+ </div>
+ <div class="stat_text" ms-click="gotoTarget(route,'api')" data-name="route_click_zone">
+ <strong ms-text="route.serviceName"></strong>
+ <span><b id="org_openo_msb_route_box_version" name_i18n="org_openo_msb_route_ui_i18n"></b>{{route.version}}</span>
+
+ </div>
+
+ <span ms-visible="!discoverInfo.enabled">
+
+ <a class="btn btn-default" ms-click="updateApiRoute(route,'update')" title="org_openo_msb_route_box_btn_update" name_i18n="org_openo_msb_route_ui_i18n"><i class="fa fa-pencil-square-o" > </i></a>
+ <a class="btn btn-default" ms-click="delApiRoute(route.serviceName,route.version)" ms-visible="route.control !='1'" title="org_openo_msb_route_box_btn_delete" name_i18n="org_openo_msb_route_ui_i18n"><i class="fa fa-trash-o" > </i></a>
+ <a class="btn btn-default" ms-visible="route.status === '1' && route.control !='1'" title="org_openo_msb_route_box_btn_disable" name_i18n="org_openo_msb_route_ui_i18n" ms-click="updateApiRouteStatus(route.serviceName,route.version,'0')"><i class="fa fa-stop" style="color:red;font-size:10px"></i></a>
+ <a class="btn btn-default" ms-visible="route.status === '0' && route.control !='1'" title="org_openo_msb_route_box_btn_able" name_i18n="org_openo_msb_route_ui_i18n" ms-click="updateApiRouteStatus(route.serviceName,route.version,'1')"><i class="fa fa-play" style="color:green;font-size:10px"></i></a>
+ </span>
+ <span ms-visible="discoverInfo.enabled">
+ <a class="btn btn-default" ms-click="updateApiRoute(route,'update')"><i class="fa fa-pencil-square-o" title="org_openo_msb_route_box_btn_update" name_i18n="org_openo_msb_route_ui_i18n"> </i></a>
+ <a class="btn btn-default" ms-click="updateApiRoute(route,'view')"><i class="fa fa-file-text-o" title="org_openo_msb_route_box_btn_view" name_i18n="org_openo_msb_route_ui_i18n"> </i></a> </span>
+
+ </div>
+
+ </div>
+
+ </div>
+
+
+ </div>
+ <div id="iuiPanel" class="tab-pane">
+ <div class="row" style=" margin-top: 10px;text-align:right; margin-right: 20px;">
+ <button ms-visible="!discoverInfo.enabled" class="btn btn-primary" id="app-new-btn" ms-click="$showiuiRouteDlg()" >
+ <i class=" fa fa-plus-circle"></i> <span id="org_openo_msb_route_btn_add_iui" name_i18n="org_openo_msb_route_ui_i18n">
+ </button>
+
+ </div>
+
+ <div id="iuirouteDlg" class="modal fade" tabindex="-1" role="dialog"
+ aria-labelledby="myModalLabel" aria-hidden="true" >
+ <div class="modal-dialog">
+ <div class="modal-content Changepasswd">
+ <div class="content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal"
+ aria-hidden="true">×</button>
+ <h3 id="myModalLabel" ms-text="routeDlgInfo.titleName"></h3>
+ </div>
+ <div class="modal-body">
+ <div class="alert alert-info" ms-visible="server_rtn.info_block"></div>
+ <div class="alert alert-danger " ms-visible="server_rtn.warning_block" ms-text="server_rtn.rtn_info"></div>
+
+ <form class="form-horizontal" id="iuirouteForm" role="form">
+
+ <div class="tipArea" id="org_openo_msb_route_form_sourceservice" name_i18n="org_openo_msb_route_ui_i18n"></div>
+ <div class="form-group" ms-visible="!discoverInfo.enabled">
+
+ <label class="control-label col-sm-3">
+ <span id="org_openo_msb_route_form_address" name_i18n="org_openo_msb_route_ui_i18n"></span>
+ <span class="required" aria-required="true">*</span>
+ </label>
+
+
+ <div class="col-sm-6" style="padding-right: 5px;">
+ <div class="item-tip" id="org_openo_msb_route_form_host_tip" name_i18n="org_openo_msb_route_ui_i18n"></div>
+ <input type="text" ms-duplex="iuiRouteInfo.server" name="iuiserver" class="form-control form-tip" style="display:inline-block;" ms-attr-disabled="discoverInfo.enabled" />
+ <span class="help-block"></span>
+ </div>
+ <div class="col-sm-1" style=" padding-left: 0px;" >
+ <a href="#" ms-click="addiuiHost()" class="btn btn-default " title="org_openo_msb_route_form_btn_addhost" name_i18n="org_openo_msb_route_ui_i18n"><i class="fa fa-plus-circle"></i></a>
+ </div>
+ </div>
+
+ <div class="form-group">
+ <label class="control-label col-sm-3" >
+
+ <span ms-visible="discoverInfo.enabled" id="org_openo_msb_route_form_address" name_i18n="org_openo_msb_route_ui_i18n"></span>
+ </label>
+ <div class="hostTableDiv col-sm-7">
+ <table class="table table-striped hostTable">
+ <thead>
+ <tr>
+ <th id="org_openo_msb_route_form_node_no" name_i18n="org_openo_msb_route_ui_i18n"></th>
+ <th>IP</th>
+ <th>PORT</th>
+ <th ms-visible="routeDlgInfo.saveType!='view'" id="org_openo_msb_route_form_node_control" name_i18n="org_openo_msb_route_ui_i18n"></th>
+ </tr>
+ </thead>
+ <tbody ms-each-server="vm.iuiRouteInfo.servers">
+ <tr>
+ <td>{{$index+1}}</td>
+ <td ms-text="server.ip"></td>
+ <td ms-text="server.port"></td>
+ <td ms-visible="routeDlgInfo.saveType!='view'"><a href="#" ms-click="deliuiHost(server.ip,server.port)" style="padding: 0px 6px;" class="btn btn-default btn-s"><i class="fa fa-trash-o"></i></a></td>
+ </tr>
+
+
+ </tbody>
+ </table>
+ </div>
+
+ </div>
+
+
+ <div class="form-group" tyle="margin-bottom: 0;">
+ <label class="control-label col-sm-3">
+ <span id="org_openo_msb_route_form_url" name_i18n="org_openo_msb_route_ui_i18n"></span>
+ <span class="required" aria-required="true">*</span>
+ </label>
+ <div class="col-sm-7">
+
+ <input type="text" ms-duplex="iuiRouteInfo.url" name="iuiurl" class="form-control" value="/" ms-attr-disabled="discoverInfo.enabled" />
+ <span class="help-block"></span>
+ </div>
+
+ </div>
+ <div class="tipArea" id="org_openo_msb_route_form_target_tip" name_i18n="org_openo_msb_route_ui_i18n"></div>
+ <div class="form-group">
+ <label class="control-label col-sm-3">
+ <span id="org_openo_msb_route_form_target_service" name_i18n="org_openo_msb_route_ui_i18n"></span>
+
+ </label>
+ <div class="col-sm-7">
+
+ {{vm.targetServiceUrl}}/{{vm.iuiRootPath}}/{{vm.iuiRouteInfo.serviceName}}
+ <span class="help-block"></span>
+ </div>
+ <!--i class="fa fa-info-circle fa-lg tip_color" data-toggle="tooltip" data-placement="bottom" title="org_openo_msb_route_form_iui_tip" name_i18n="org_openo_msb_route_ui_i18n" ></i-->
+
+ </div>
+ <div class="form-group">
+ <label class="control-label col-sm-3">
+ <span id="org_openo_msb_route_form_servicename" name_i18n="org_openo_msb_route_ui_i18n"></span>
+ <span class="required" aria-required="true">*</span>
+ </label>
+ <div class="col-sm-7">
+ <input type="text" ms-duplex="iuiRouteInfo.serviceName" name="iuiserviceName" class="form-control" ms-attr-disabled="discoverInfo.enabled" />
+ <span class="help-block"></span>
+ </div>
+
+ </div>
+
+
+
+
+
+
+ </form>
+
+
+ </div>
+
+
+ </div>
+ <div class="modal-footer" ms-visible="routeDlgInfo.saveType!='view'">
+ <button class="btn" data-dismiss="modal" aria-hidden="true" id="org_openo_msb_route_form_btn_cancel" name_i18n="org_openo_msb_route_ui_i18n"></button>
+ <button class="btn btn-primary" type="submit" ms-click="$saveiuiRoute()" id="org_openo_msb_route_form_btn_save" name_i18n="org_openo_msb_route_ui_i18n"></button>
+ </div>
+ <div class="modal-footer"
+ ms-visible="routeDlgInfo.saveType=='view'">
+ <button class="btn btn-primary" data-dismiss="modal" aria-hidden="true" id="org_openo_msb_route_form_btn_close" name_i18n="org_openo_msb_route_ui_i18n"></button>
+
+ </div>
+ </div>
+
+ </div>
+ </div>
+
+ <div class="row" data-name="route_zone" >
+
+ <span class="response_throbber" ms-visible="vm.routeLoading"></span>
+
+ <div class="stats_box" ms-each-route="iuiRouteArray">
+
+ <div class="routeDiv" ms-visible="route.control !='2'">
+ <div class="sparkline" ms-click="gotoTarget(route,'iui')" data-name="route_click_zone">
+ <i class="fa fa-tv fa-3x" ms-class-route-valid ="route.status === '1'" ms-class-route-invalid ="route.status === '0'"></i>
+
+ </div>
+ <div class="stat_text" ms-click="gotoTarget(route,'iui')" data-name="route_click_zone">
+ <strong ms-text="route.serviceName"></strong>
+ <span>{{route.servers[0].ip}}:{{route.servers[0].port}}</span>
+ </div>
+ <span ms-visible="!discoverInfo.enabled">
+
+ <a class="btn btn-default" ms-click="updateiuiRoute(route,'update')"><i class="fa fa-pencil-square-o" title="org_openo_msb_route_box_btn_update" name_i18n="org_openo_msb_route_ui_i18n" > </i></a>
+ <a class="btn btn-default" ms-click="deliuiRoute(route.serviceName)" ms-visible="route.control !='1'"><i class="fa fa-trash-o" title="删除"> </i></a>
+ <a class="btn btn-default" ms-visible="route.status === '1' && route.control !='1'" title="org_openo_msb_route_box_btn_disable" name_i18n="org_openo_msb_route_ui_i18n" ms-click="updateiuiRouteStatus(route.serviceName,'0')"><i class="fa fa-stop" style="color:red;font-size:10px"></i></a>
+ <a class="btn btn-default" ms-visible="route.status === '0' && route.control !='1'" title="org_openo_msb_route_box_btn_able" name_i18n="org_openo_msb_route_ui_i18n" ms-click="updateiuiRouteStatus(route.serviceName,'1')"><i class="fa fa-play" style="color:green;font-size:10px"></i></a>
+ </span>
+ <span ms-visible="discoverInfo.enabled"><a class="btn btn-default" ms-click="updateiuiRoute(route,'view')"><i class="fa fa-file-text-o" title="org_openo_msb_route_box_btn_view" name_i18n="org_openo_msb_route_ui_i18n"> </i></a> </span>
+
+ </div>
+
+ </div>
+
+ </div>
+
+ </div>
+
+ <div id="customPanel" class="tab-pane">
+ <div class="row" style=" margin-top: 10px;text-align:right; margin-right: 20px;">
+ <button ms-visible="!discoverInfo.enabled" class="btn btn-primary" id="app-new-btn" ms-click="$showcustomRouteDlg()" >
+ <i class=" fa fa-plus-circle"></i> <span id="org_openo_msb_route_btn_add_custom" name_i18n="org_openo_msb_route_ui_i18n"></span>
+ </button>
+
+ </div>
+
+ <div id="customrouteDlg" class="modal fade" tabindex="-1" role="dialog"
+ aria-labelledby="myModalLabel" aria-hidden="true" >
+ <div class="modal-dialog">
+ <div class="modal-content Changepasswd">
+ <div class="content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal"
+ aria-hidden="true">×</button>
+ <h3 id="myModalLabel" ms-text="routeDlgInfo.titleName"></h3>
+ </div>
+ <div class="modal-body">
+ <div class="alert alert-info" ms-visible="server_rtn.info_block"></div>
+ <div class="alert alert-danger " ms-visible="server_rtn.warning_block" ms-text="server_rtn.rtn_info"></div>
+
+ <form class="form-horizontal" id="customrouteForm" role="form">
+
+ <div class="tipArea" id="org_openo_msb_route_form_sourceservice" name_i18n="org_openo_msb_route_ui_i18n"></div>
+ <div class="form-group" ms-visible="!discoverInfo.enabled">
+
+ <label class="control-label col-sm-3">
+ <span id="org_openo_msb_route_form_address" name_i18n="org_openo_msb_route_ui_i18n"></span>
+ <span class="required" aria-required="true">*</span>
+ </label>
+
+
+ <div class="col-sm-6" style="padding-right: 5px;">
+ <div class="item-tip" id="org_openo_msb_route_form_host_tip" name_i18n="org_openo_msb_route_ui_i18n"></div>
+ <input type="text" ms-duplex="customRouteInfo.server" name="customserver" class="form-control form-tip" style="display:inline-block;" ms-attr-disabled="discoverInfo.enabled" />
+ <span class="help-block"></span>
+ </div>
+ <div class="col-sm-1" style=" padding-left: 0px;" ms-visible="routeDlgInfo.saveType!='view'">
+ <a href="#" ms-click="addcustomHost()" class="btn btn-default " title="org_openo_msb_route_form_btn_addhost" name_i18n="org_openo_msb_route_ui_i18n"><i class="fa fa-plus-circle"></i></a>
+ </div>
+ </div>
+
+ <div class="form-group">
+ <label class="control-label col-sm-3">
+ <span ms-visible="discoverInfo.enabled" id="org_openo_msb_route_form_address" name_i18n="org_openo_msb_route_ui_i18n"></span>
+ </label>
+ <div class="hostTableDiv col-sm-7">
+ <table class="table table-striped hostTable">
+ <thead>
+ <tr>
+ <th id="org_openo_msb_route_form_node_no" name_i18n="org_openo_msb_route_ui_i18n"></th>
+ <th>IP</th>
+ <th>PORT</th>
+ <th ms-visible="routeDlgInfo.saveType!='view'" id="org_openo_msb_route_form_node_control" name_i18n="org_openo_msb_route_ui_i18n"></th>
+ </tr>
+ </thead>
+ <tbody ms-each-server="vm.customRouteInfo.servers">
+ <tr>
+ <td>{{$index+1}}</td>
+ <td ms-text="server.ip"></td>
+ <td ms-text="server.port"></td>
+ <td ms-visible="routeDlgInfo.saveType!='view'"><a href="#" ms-click="delcustomHost(server.ip,server.port)" style="padding: 0px 6px;" class="btn btn-default btn-s"><i class="fa fa-trash-o"></i></a></td>
+ </tr>
+
+
+ </tbody>
+ </table>
+ </div>
+
+ </div>
+
+
+
+ <div class="form-group" tyle="margin-bottom: 0;">
+ <label class="control-label col-sm-3">
+ <span id="org_openo_msb_route_form_url" name_i18n="org_openo_msb_route_ui_i18n"></span>
+ <span class="required" aria-required="true">*</span>
+ </label>
+ <div class="col-sm-7">
+
+ <input type="text" ms-duplex="customRouteInfo.url" name="customurl" class="form-control" value="/" ms-attr-disabled="discoverInfo.enabled" />
+ <span class="help-block"></span>
+ </div>
+
+ </div>
+
+ <div class="tipArea" id="org_openo_msb_route_form_target_tip" name_i18n="org_openo_msb_route_ui_i18n"></div>
+ <div class="form-group">
+ <label class="control-label col-sm-3">
+ <span id="org_openo_msb_route_form_target_service" name_i18n="org_openo_msb_route_ui_i18n"></span>
+
+ </label>
+ <div class="col-sm-7">
+
+ {{vm.targetServiceUrl}}{{vm.customRouteInfo.serviceName}}
+ <span class="help-block"></span>
+ </div>
+
+
+ </div>
+ <div class="form-group">
+ <label class="control-label col-sm-3">
+ <span id="org_openo_msb_route_form_servicename" name_i18n="org_openo_msb_route_ui_i18n"></span>
+
+ </label>
+ <div class="col-sm-7">
+ <input type="text" ms-duplex="customRouteInfo.serviceName" name="customserviceName" class="form-control" ms-attr-disabled="discoverInfo.enabled" />
+ <span class="help-block"></span>
+ </div>
+
+ </div>
+
+
+ </form>
+
+
+ </div>
+
+
+ </div>
+ <div class="modal-footer" ms-visible="routeDlgInfo.saveType!='view'">
+ <button class="btn" data-dismiss="modal" aria-hidden="true" id="org_openo_msb_route_form_btn_cancel" name_i18n="org_openo_msb_route_ui_i18n"></button>
+ <button class="btn btn-primary" type="submit" ms-click="$savecustomRoute()" id="org_openo_msb_route_form_btn_save" name_i18n="org_openo_msb_route_ui_i18n"></button>
+ </div>
+ <div class="modal-footer"
+ ms-visible="routeDlgInfo.saveType=='view'">
+ <button class="btn btn-primary" data-dismiss="modal" aria-hidden="true" id="org_openo_msb_route_form_btn_close" name_i18n="org_openo_msb_route_ui_i18n"></button>
+
+ </div>
+ </div>
+
+ </div>
+ </div>
+
+ <div class="row" data-name="route_zone" >
+
+ <span class="response_throbber" ms-visible="vm.routeLoading"></span>
+
+
+ <div ms-each-el="customGroupRouteArray">
+ <div class="form-title">
+ <span><a data-toggle="collapse" >{{routeUtil.showGroupName($index,el)}}</a>
+ <span class="label label-info" style="margin-left: 10px;">{{customGroupRouteArray[$index].length}}</span>
+ </span>
+ <div class="panel-tools">
+ <a class="showhide" data-toggle="collapse"><i class="fa fa-chevron-up"></i></a>
+ </div>
+ </div>
+ <div style="width: 100%;" class="collapseContent collapse in">
+ <div class="stats_box" ms-each-elem="el">
+ <div class="routeDiv" ms-visible="elem.control !='2'">
+ <div class="sparkline" data-name="route_click_zone">
+ <i class="fa fa-cogs fa-3x" ms-class-route-valid ="elem.status === '1'" ms-class-route-invalid ="elem.status === '0'"></i>
+
+ </div>
+ <div class="stat_text" data-name="route_click_zone" style="padding: 9px 0px 4px 0;">
+ <strong ms-text="elem.serviceName==''?'/':elem.serviceName" style="height: 35px;word-wrap:break-word;word-break: normal;"></strong>
+ <span>{{elem.servers[0].ip}}:{{elem.servers[0].port}}</span>
+ </div>
+ <span ms-visible="!discoverInfo.enabled">
+
+ <a class="btn btn-default" ms-click="updatecustomRoute(elem,'update')"><i class="fa fa-pencil-square-o" title="org_openo_msb_route_box_btn_update" name_i18n="org_openo_msb_route_ui_i18n" > </i></a>
+ <a class="btn btn-default" ms-click="delcustomRoute(elem.serviceName)" ms-visible="elem.control !='1'"><i class="fa fa-trash-o" title="删除"> </i></a>
+ <a class="btn btn-default" ms-visible="elem.status === '1' && elem.control !='1'" title="org_openo_msb_route_box_btn_disable" name_i18n="org_openo_msb_route_ui_i18n" ms-click="updatecustomRouteStatus(elem.serviceName,'0')"><i class="fa fa-stop" style="color:red;font-size:10px"></i></a>
+ <a class="btn btn-default" ms-visible="elem.status === '0' && elem.control !='1'" title="org_openo_msb_route_box_btn_able" name_i18n="org_openo_msb_route_ui_i18n" ms-click="updatecustomRouteStatus(elem.serviceName,'1')"><i class="fa fa-play" style="color:green;font-size:10px"></i></a>
+ </span>
+ <span ms-visible="discoverInfo.enabled"><a class="btn btn-default" ms-click="updatecustomRoute(elem,'view')"><i class="fa fa-file-text-o" title="org_openo_msb_route_box_btn_view" name_i18n="org_openo_msb_route_ui_i18n"> </i></a> </span>
+
+ </div>
+
+ </div>
+ </div>
+
+ </div>
+
+
+
+ </div>
+
+ </div>
+
+
+ <div id="msbPanel" class="tab-pane">
+ <div class="row" style=" margin-top: 10px;text-align:right; margin-right: 20px;">
+ <button class="btn btn-primary" id="app-new-btn" ms-click="$showmsbRouteDlg()" >
+ <i class=" fa fa-plus-circle"></i> <span id="org_openo_msb_route_btn_add_msb" name_i18n="org_openo_msb_route_ui_i18n"></span>
+ </button>
+
+ </div>
+
+ <div id="msbrouteDlg" class="modal fade" tabindex="-1" role="dialog"
+ aria-labelledby="myModalLabel" aria-hidden="true" >
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal"
+ aria-hidden="true">×</button>
+ <h3 id="myModalLabel" ms-text="routeDlgInfo.titleName"></h3>
+ </div>
+ <div class="modal-body">
+ <div class="alert alert-info" ms-visible="server_rtn.info_block"></div>
+ <div class="alert alert-danger " ms-visible="server_rtn.warning_block" ms-text="server_rtn.rtn_info"></div>
+
+ <form class="form-horizontal" id="msbForm" role="form">
+ <div class="tipArea" id="org_openo_msb_route_msb_info" name_i18n="org_openo_msb_route_ui_i18n"></div>
+ <div class="form-group">
+ <label class="control-label col-sm-3">
+ <span id="org_openo_msb_route_form_servicename" name_i18n="org_openo_msb_route_ui_i18n"></span>
+ <span class="required" aria-required="true">*</span>
+ </label>
+ <div class="col-sm-7">
+ <input type="text" ms-duplex="msbRouteInfo.serviceName" name="serviceName" class="form-control" />
+ <span class="help-block"></span>
+ </div>
+
+ </div>
+
+ <div class="form-group">
+ <label class="control-label col-sm-3">
+ <span id="org_openo_msb_route_form_version" name_i18n="org_openo_msb_route_ui_i18n"></span>
+ </label>
+ <div class="col-sm-7">
+ <div class="item-tip" id="org_openo_msb_route_form_version_tip" name_i18n="org_openo_msb_route_ui_i18n"></div>
+ <input type="text" ms-duplex="msbRouteInfo.version" name="version" class="form-control form-tip" />
+ <span class="help-block"></span>
+ </div>
+
+ </div>
+
+
+
+ <div class="form-group">
+ <label class="control-label col-sm-3">
+ <span id="org_openo_msb_route_form_url" name_i18n="org_openo_msb_route_ui_i18n"></span>
+ </label>
+ <div class="col-sm-7">
+
+ <input type="text" ms-duplex="msbRouteInfo.url" name="url" class="form-control" />
+ <span class="help-block"></span>
+ </div>
+
+ </div>
+
+
+ <div class="form-group">
+ <label class="control-label col-sm-3">
+ <span id="org_openo_msb_route_form_protocol" name_i18n="org_openo_msb_route_ui_i18n"></span>
+ <span class="required" aria-required="true">*</span>
+ </label>
+ <div class="col-sm-7">
+ <select class="form-control m-b" ms-each="$msbProtocol" name="protocol" ms-duplex="msbRouteInfo.protocol" >
+ <option ms-attr-value='el'>{{el}}</option>
+ </select>
+ <span class="help-block"></span>
+ </div>
+
+ </div>
+
+ <div class="form-group">
+ <label class="control-label col-sm-3">
+ <span id="org_openo_msb_route_form_visualrange" name_i18n="org_openo_msb_route_ui_i18n"></span>
+ <span class="required" aria-required="true">*</span>
+ </label>
+ <div class="col-sm-7">
+ <input type="checkbox" ms-duplex="msbRouteInfo.visualRangeArray" value="0" ><span style="margin-right: 20px;" id="org_openo_msb_route_form_intersystem" name_i18n="org_openo_msb_route_ui_i18n" ></span>
+ <input type="checkbox" ms-duplex="msbRouteInfo.visualRangeArray" value="1" ><span style="margin-right: 20px;" id="org_openo_msb_route_form_insystem" name_i18n="org_openo_msb_route_ui_i18n"></span>
+
+ <span class="help-block"></span>
+ </div>
+
+ </div>
+
+ <div class="tipArea" id="org_openo_msb_route_msb_hostlist" name_i18n="org_openo_msb_route_ui_i18n"></div>
+
+ <div class="form-group">
+
+ <label class="control-label col-sm-3">
+ <span id="org_openo_msb_route_form_msb_host" name_i18n="org_openo_msb_route_ui_i18n"></span>
+ <span class="required" aria-required="true">*</span>
+ </label>
+
+
+ <div class="col-sm-4" style="padding-right: 5px;">
+ <div class="item-tip" id="org_openo_msb_route_form_host_tip" name_i18n="org_openo_msb_route_ui_i18n"></div>
+
+ <input type="text" placeholder="" ms-duplex="msbRouteInfo.newHost" class="form-control form-tip" name="newHost" style="display:inline-block;" />
+
+ <span class="help-block"></span>
+ </div>
+ <div class="col-sm-2" style="padding-right: 5px;">
+ <div class="item-tip" id="org_openo_msb_route_form_ttl_tip" name_i18n="org_openo_msb_route_ui_i18n"></div>
+
+ <input type="text" placeholder="" ms-duplex="msbRouteInfo.newttl" class="form-control form-tip" name="newttl" style="display:inline-block;" />
+
+ <span class="help-block"></span>
+ </div>
+ <div class="col-sm-1" style=" padding-left: 0px;">
+ <a href="#" ms-click="addmsbHost()" class="btn btn-default " title="org_openo_msb_route_form_btn_addhost" name_i18n="org_openo_msb_route_ui_i18n"><i class="fa fa-plus-circle"></i></a>
+ </div>
+ </div>
+
+ <div class="form-group">
+ <label class="control-label col-sm-3"></label>
+ <div class="hostTableDiv col-sm-7">
+ <table class="table table-striped hostTable">
+ <thead>
+ <tr>
+ <th id="org_openo_msb_route_form_node_no" name_i18n="org_openo_msb_route_ui_i18n"></th>
+ <th>IP</th>
+ <th>PORT</th>
+ <th>TTL</th>
+ <th id="org_openo_msb_route_form_node_control" name_i18n="org_openo_msb_route_ui_i18n"></th>
+ </tr>
+ </thead>
+ <tbody ms-each-node="vm.msbRouteInfo.nodes">
+ <tr>
+ <td>{{$index+1}}</td>
+ <td ms-text="node.ip"></td>
+ <td ms-text="node.port"></td>
+ <td ms-text="node.ttl"></td>
+ <td><a href="#" title="org_openo_msb_route_form_btn_delhost" name_i18n="org_openo_msb_route_ui_i18n" ms-click="delmsbHost(node.ip,node.port)" style="padding: 0px 6px;" class="btn btn-default btn-s"><i class="fa fa-trash-o"></i></a></td>
+ </tr>
+
+
+ </tbody>
+ </table>
+ </div>
+
+ </div>
+
+ <div class="tipArea" ms-visible="msbRouteInfo.protocol=='REST'||msbRouteInfo.protocol=='UI'" id="org_openo_msb_route_form_target_tip" name_i18n="org_openo_msb_route_ui_i18n"></div>
+ <div class="form-group" ms-visible="msbRouteInfo.protocol=='REST'||msbRouteInfo.protocol=='UI'">
+ <label class="control-label col-sm-3">
+ <span id="org_openo_msb_route_form_target_service" name_i18n="org_openo_msb_route_ui_i18n"></span>
+
+ </label>
+ <div class="col-sm-7">
+ {{vm.targetFullServiceUrl}}
+
+
+ </div>
+
+ </div>
+
+ </form>
+
+
+ </div>
+
+
+ </div>
+ <div class="modal-footer">
+ <button class="btn" data-dismiss="modal" aria-hidden="true" id="org_openo_msb_route_form_btn_cancel" name_i18n="org_openo_msb_route_ui_i18n"></button>
+ <button class="btn btn-primary" type="submit" ms-click="$savemsbRoute()" id="org_openo_msb_route_form_btn_save" name_i18n="org_openo_msb_route_ui_i18n"></button>
+ </div>
+ </div>
+
+ </div>
+ </div>
+
+ <div class="row" data-name="route_zone" >
+
+
+ <div class="table-responsive">
+ <table class="table table-striped table-bordered table-hover" id="msbTable">
+ <thead>
+ <tr>
+ <th></th>
+ <th style="display:none"></th>
+ <th id="org_openo_msb_route_form_node_no" name_i18n="org_openo_msb_route_ui_i18n"></th>
+ <th id="org_openo_msb_route_form_servicename" name_i18n="org_openo_msb_route_ui_i18n"></th>
+ <th id="org_openo_msb_route_form_version" name_i18n="org_openo_msb_route_ui_i18n"></th>
+
+ <th id="org_openo_msb_route_form_url" name_i18n="org_openo_msb_route_ui_i18n"></th>
+ <th id="org_openo_msb_route_form_protocol" name_i18n="org_openo_msb_route_ui_i18n"></th>
+ <th id="org_openo_msb_route_form_visualrange" name_i18n="org_openo_msb_route_ui_i18n"></th>
+ <!--th>状态</th-->
+ <th id="org_openo_msb_route_form_node_control" name_i18n="org_openo_msb_route_ui_i18n"></th>
+ </tr>
+ </thead>
+ <tbody ms-each-msb="msbRouteArray">
+ <tr>
+ <td class="details-control"></td>
+ <td ms-each-node="msb.nodes" style="display:none">
+ {{node.ip}}:{{node.port}}:{{node.ttl}}
+ </td>
+ <td ms-text="$index+1"></td>
+ <td ms-text="msb.serviceName"></td>
+ <td ms-text="msb.version"></td>
+
+ <td>{{msb.url==""?"/":msb.url}}</td>
+ <td ms-text="msb.protocol"></td>
+ <td ms-text="routeUtil.showVisualRange(msb.visualRange)"></td>
+ <!--td ms-html="routeUtil.showStatus(msb.status)"></td-->
+ <td>
+
+ <a href="#" title="org_openo_msb_route_box_btn_update" name_i18n="org_openo_msb_route_ui_i18n" class="btn btn-default btn-s" ms-click="updatemsbRoute(msb)"><i class="fa fa fa-pencil-square-o"></i></a>
+ <a href="#" title="org_openo_msb_route_box_btn_delete" name_i18n="org_openo_msb_route_ui_i18n" class="btn btn-default btn-s" ms-click="delmsbRoute(msb.serviceName,msb.version,this)"><i class="fa fa-trash-o"></i></a>
+
+ </td>
+ </tr>
+
+ </tbody>
+ </table>
+
+ </div>
+
+
+
+
+
+ </div>
+
+ </div>
+
+ </div>
+
+
+
+ <div class="row-fluid separator" id="upArrawDiv">
+ <div ms-visible="boxVisible" class="col-xs-12">
+ <a href="#" ms-click="clickDisplayGraphAlink()"><img src="img/up.png"/></a>
+ </div>
+ </div>
+
+
+</div>
+
+<div class="row-fluid separator">
+
+ <div ms-visible="!boxVisible" class="col-xs-12">
+ <a href="#" ms-click="clickDisplayGraphAlink()" ><img src="img/down.png"/></a>
+ </div>
+</div>
+
+ <div class="container-fluid" style="margin-top:20px" id="serviceContent">
+
+ <div class="row" style=" margin-top: 15px;">
+ <div class="col-xs-6 col-md-6 col-sm-6 col-lg-6">
+ <i class="fa fa-file-text-o fa-fw"></i>
+ <span class=" titlefont" ms-text="routeTargetTitle"></span>
+
+ </div>
+ <div class="pull-right" ms-visible="vm.selectedRouteType=='api'">
+ <button type="button" class="btn btn-default btn-sm" style="padding:3px 8px" ms-click="gotoRestDoc()"><i class="fa fa-link"></i> <span id="org_openo_msb_route_servicecontent_swagger" name_i18n="org_openo_msb_route_ui_i18n"></span></button>
+ <button type="button" class="btn btn-default btn-sm" style="padding:3px 8px" ms-click="gotoJVM()" ms-visible="vm.selectedRoute.metricsUrl!=''"><i class="fa fa-bar-chart"></i> <span id="org_openo_msb_route_servicecontent_metrics" name_i18n="org_openo_msb_route_ui_i18n"></span></button>
+ </div>
+
+ </div>
+ <div class="separator-line"></div>
+
+
+
+ <iframe src="" width="100%" scrolling="no" marginheight="0" frameborder="0" id="msbSubPage" name="msbSubPage" class="page-mainIframeisWare" ></iframe>
+
+
+
+ </div>
+
+
+</div>
+
+<script type="text/javascript" src="js/jquery.i18n/jquery.i18n.properties-1.0.9.js"></script>
+
+
+ <script type="text/javascript" src="js/iframeResizer/iframeResizer.min.js"></script>
+ <script type="text/javascript" src="js/iframeResizer/iframeResizer.contentWindow.min.js"></script>
+
+ <script type="text/javascript" src="js/bootstrap/js/bootstrap.min.js"></script>
+ <script type="text/javascript" src="js/dataTables/jquery.dataTables.min.js"></script>
+ <script type="text/javascript" src="js/dataTables/dataTables.bootstrap.min.js"></script>
+ <script type="text/javascript" src="js/bootbox/bootbox.min.js"></script>
+ <script src="js/bootstrap-growl.min.js"></script>
+ <script src="js/jquery-validation/jquery.validate.js"></script>
+ <script type="text/javascript" src="js/avalon.js"></script>
+
+
+<script src="i18n/loadi18nApp_iui-route_view.js"></script>
+
+
+ <script type="text/javascript" src="js/routeController.js"></script>
+
+
+<script type="text/javascript">
+
+$(function(){
+
+$('iframe').iFrameResize();
+ loadPropertiesSideMenu('', 'msb-iui-route-i18n', 'i18n/');
+avalon.scan();
+vm.$initRoute();
+
+
+});
+
+</script>
+ <script src="js/routeUtil.js"></script>
+ <script src="js/routeFunc.js"></script>
+
+</body>
</html>
\ No newline at end of file
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
/*==================================================
Copyright (c) 2013-2015 司徒正美 and other contributors
http://www.cnblogs.com/rubylouvre/
-/*!
- * Bootstrap v3.1.1 (http://getbootstrap.com)
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-
/*! normalize.css v3.0.0 | MIT License | git.io/normalize */
html {
font-family: sans-serif;
-/*!
- * Bootstrap v3.1.1 (http://getbootstrap.com)
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-
/*! normalize.css v3.0.0 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#999}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-muted{color:#999}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#999}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;white-space:nowrap;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*=col-]{position:static;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:scroll;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}input[type=date]{line-height:34px}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;margin-top:10px;margin-bottom:10px;padding-left:20px}.radio label,.checkbox label{display:inline;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.has-feedback .form-control-feedback{position:absolute;top:25px;right:0;display:block;width:34px;height:34px;line-height:34px;text-align:center}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{float:none;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-control-static{padding-top:7px}@media (min-width:768px){.form-horizontal .control-label{text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#428bca;font-weight:400;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-left:0;padding-right:0}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#999}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle=buttons]>.btn>input[type=radio],[data-toggle=buttons]>.btn>input[type=checkbox]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=radio],.input-group-addon input[type=checkbox]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{float:none;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#428bca;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:gray}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#999;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px;overflow:hidden}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:auto;overflow-y:scroll;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{margin-top:15px;padding:19px 20px 20px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;right:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.5) 0),color-stop(rgba(0,0,0,.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.0001) 0),color-stop(rgba(0,0,0,.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}}@media print{.hidden-print{display:none!important}}
\ No newline at end of file
-/*!
- * Bootstrap v3.1.1 (http://getbootstrap.com)
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-
if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') }
/* ========================================================================
-/*!
- * Bootstrap v3.1.1 (http://getbootstrap.com)
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.isLoading=!1};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",f.resetText||d.data("resetText",d[e]()),d[e](f[b]||this.options[b]),setTimeout(a.proxy(function(){"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},b.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}a&&this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}if(e.hasClass("active"))return this.sliding=!1;var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});return this.$element.trigger(j),j.isDefaultPrevented()?void 0:(this.sliding=!0,f&&this.pause(),this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid.bs.carousel",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")?(e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid.bs.carousel")},0)}).emulateTransitionEnd(1e3*d.css("transition-duration").slice(0,-1))):(d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid.bs.carousel")),f&&this.cycle(),this)};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("collapse in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?void this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);!e&&f.toggle&&"show"==c&&(c=!c),e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(jQuery),+function(a){"use strict";function b(b){a(d).remove(),a(e).each(function(){var d=c(a(this)),e={relatedTarget:this};d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown",e)),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown",e))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;f.toggleClass("open").trigger("shown.bs.dropdown",h),e.focus()}return!1}},f.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var f=c(d),g=f.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&f.find(e).focus(),d.click();var h=" li:not(.divider):visible a",i=f.find("[role=menu]"+h+", [role=listbox]"+h);if(i.length){var j=i.index(i.filter(":focus"));38==b.keyCode&&j>0&&j--,40==b.keyCode&&j<i.length-1&&j++,~j||(j=0),i.eq(j).focus()}}}};var g=a.fn.dropdown;a.fn.dropdown=function(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new f(this)),"string"==typeof b&&d[b].call(c)})},a.fn.dropdown.Constructor=f,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=g,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",e,f.prototype.toggle).on("keydown.bs.dropdown.data-api",e+", [role=menu], [role=listbox]",f.prototype.keydown)}(jQuery),+function(a){"use strict";var b=function(b,c){this.options=c,this.$element=a(b),this.$backdrop=this.isShown=null,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};b.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},b.prototype.toggle=function(a){return this[this.isShown?"hide":"show"](a)},b.prototype.show=function(b){var c=this,d=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(d),this.isShown||d.isDefaultPrevented()||(this.isShown=!0,this.escape(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var d=a.support.transition&&c.$element.hasClass("fade");c.$element.parent().length||c.$element.appendTo(document.body),c.$element.show().scrollTop(0),d&&c.$element[0].offsetWidth,c.$element.addClass("in").attr("aria-hidden",!1),c.enforceFocus();var e=a.Event("shown.bs.modal",{relatedTarget:b});d?c.$element.find(".modal-dialog").one(a.support.transition.end,function(){c.$element.focus().trigger(e)}).emulateTransitionEnd(300):c.$element.focus().trigger(e)}))},b.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one(a.support.transition.end,a.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},b.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.focus()},this))},b.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},b.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.removeBackdrop(),a.$element.trigger("hidden.bs.modal")})},b.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},b.prototype.backdrop=function(b){var c=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var d=a.support.transition&&c;if(this.$backdrop=a('<div class="modal-backdrop '+c+'" />').appendTo(document.body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),d&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;d?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()):b&&b()};var c=a.fn.modal;a.fn.modal=function(c,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},b.DEFAULTS,e.data(),"object"==typeof c&&c);f||e.data("bs.modal",f=new b(this,g)),"string"==typeof c?f[c](d):g.show&&f.show(d)})},a.fn.modal.Constructor=b,a.fn.modal.noConflict=function(){return a.fn.modal=c,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(b){var c=a(this),d=c.attr("href"),e=a(c.attr("data-target")||d&&d.replace(/.*(?=#[^\s]+$)/,"")),f=e.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(d)&&d},e.data(),c.data());c.is("a")&&b.preventDefault(),e.modal(f,this).one("hide",function(){c.is(":visible")&&c.focus()})}),a(document).on("show.bs.modal",".modal",function(){a(document.body).addClass("modal-open")}).on("hidden.bs.modal",".modal",function(){a(document.body).removeClass("modal-open")})}(jQuery),+function(a){"use strict";var b=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};b.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},b.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},b.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},b.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show()},b.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},b.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){if(this.$element.trigger(b),b.isDefaultPrevented())return;var c=this,d=this.tip();this.setContent(),this.options.animation&&d.addClass("fade");var e="function"==typeof this.options.placement?this.options.placement.call(this,d[0],this.$element[0]):this.options.placement,f=/\s?auto?\s?/i,g=f.test(e);g&&(e=e.replace(f,"")||"top"),d.detach().css({top:0,left:0,display:"block"}).addClass(e),this.options.container?d.appendTo(this.options.container):d.insertAfter(this.$element);var h=this.getPosition(),i=d[0].offsetWidth,j=d[0].offsetHeight;if(g){var k=this.$element.parent(),l=e,m=document.documentElement.scrollTop||document.body.scrollTop,n="body"==this.options.container?window.innerWidth:k.outerWidth(),o="body"==this.options.container?window.innerHeight:k.outerHeight(),p="body"==this.options.container?0:k.offset().left;e="bottom"==e&&h.top+h.height+j-m>o?"top":"top"==e&&h.top-m-j<0?"bottom":"right"==e&&h.right+i>n?"left":"left"==e&&h.left-i<p?"right":e,d.removeClass(l).addClass(e)}var q=this.getCalculatedOffset(e,h,i,j);this.applyPlacement(q,e),this.hoverState=null;var r=function(){c.$element.trigger("shown.bs."+c.type)};a.support.transition&&this.$tip.hasClass("fade")?d.one(a.support.transition.end,r).emulateTransitionEnd(150):r()}},b.prototype.applyPlacement=function(b,c){var d,e=this.tip(),f=e[0].offsetWidth,g=e[0].offsetHeight,h=parseInt(e.css("margin-top"),10),i=parseInt(e.css("margin-left"),10);isNaN(h)&&(h=0),isNaN(i)&&(i=0),b.top=b.top+h,b.left=b.left+i,a.offset.setOffset(e[0],a.extend({using:function(a){e.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),e.addClass("in");var j=e[0].offsetWidth,k=e[0].offsetHeight;if("top"==c&&k!=g&&(d=!0,b.top=b.top+g-k),/bottom|top/.test(c)){var l=0;b.left<0&&(l=-2*b.left,b.left=0,e.offset(b),j=e[0].offsetWidth,k=e[0].offsetHeight),this.replaceArrow(l-f+j,j,"left")}else this.replaceArrow(k-g,k,"top");d&&e.offset(b)},b.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},b.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach(),c.$element.trigger("hidden.bs."+c.type)}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d.one(a.support.transition.end,b).emulateTransitionEnd(150):b(),this.hoverState=null,this)},b.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},b.prototype.hasContent=function(){return this.getTitle()},b.prototype.getPosition=function(){var b=this.$element[0];return a.extend({},"function"==typeof b.getBoundingClientRect?b.getBoundingClientRect():{width:b.offsetWidth,height:b.offsetHeight},this.$element.offset())},b.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},b.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},b.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},b.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},b.prototype.enable=function(){this.enabled=!0},b.prototype.disable=function(){this.enabled=!1},b.prototype.toggleEnabled=function(){this.enabled=!this.enabled},b.prototype.toggle=function(b){var c=b?a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type):this;c.tip().hasClass("in")?c.leave(c):c.enter(c)},b.prototype.destroy=function(){clearTimeout(this.timeout),this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var c=a.fn.tooltip;a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof c&&c;(e||"destroy"!=c)&&(e||d.data("bs.tooltip",e=new b(this,f)),"string"==typeof c&&e[c]())})},a.fn.tooltip.Constructor=b,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=c,this}}(jQuery),+function(a){"use strict";var b=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");b.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;(e||"destroy"!=c)&&(e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]())})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(a(c).is("body")?window:c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);{var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})}},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);if(g&&b<=e[0])return g!=(a=f[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parentsUntil(this.options.target,".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=this.pinnedOffset=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(b.RESET).addClass("affix");var a=this.$window.scrollTop(),c=this.$element.offset();return this.pinnedOffset=c.top-a},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"top"==this.affixed&&(e.top+=d),"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top(this.$element)),"function"==typeof h&&(h=f.bottom(this.$element));var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;if(this.affixed!==i){this.unpin&&this.$element.css("top","");var j="affix"+(i?"-"+i:""),k=a.Event(j+".bs.affix");this.$element.trigger(k),k.isDefaultPrevented()||(this.affixed=i,this.unpin="bottom"==i?this.getPinnedOffset():null,this.$element.removeClass(b.RESET).addClass(j).trigger(a.Event(j.replace("affix","affixed"))),"bottom"==i&&this.$element.offset({top:c-h-this.$element.height()}))}}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(jQuery);
\ No newline at end of file
-/* =============================================================
- * bootstrap-typeahead.js v2.3.2
- * http://twitter.github.com/bootstrap/javascript.html#typeahead
- * =============================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed 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.
- * ============================================================ */
-
!function(t){"use strict";var e=function(e,s){this.$element=t(e),this.options=t.extend({},t.fn.typeahead.defaults,s),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.source=this.options.source,this.$menu=t(this.options.menu),this.shown=!1,this.listen()};e.prototype={constructor:e,select:function(){var t=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(t)).change(),this.hide()},updater:function(t){return t},show:function(){var e=t.extend({},this.$element.position(),{height:this.$element[0].offsetHeight});return this.$menu.insertAfter(this.$element).css({top:e.top+e.height,left:e.left}).show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(){var e;return this.query=this.$element.val(),!this.query||this.query.length<this.options.minLength?this.shown?this.hide():this:(e=t.isFunction(this.source)?this.source(this.query,t.proxy(this.process,this)):this.source,e?this.process(e):this)},process:function(e){var s=this;return e=t.grep(e,function(t){return s.matcher(t)}),e=this.sorter(e),e.length?this.render(e.slice(0,this.options.items)).show():this.shown?this.hide():this},matcher:function(t){return~t.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(t){for(var e,s=[],i=[],n=[];e=t.shift();)e.toLowerCase().indexOf(this.query.toLowerCase())?~e.indexOf(this.query)?i.push(e):n.push(e):s.push(e);return s.concat(i,n)},highlighter:function(t){var e=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");return t.replace(new RegExp("("+e+")","ig"),function(t,e){return"<strong>"+e+"</strong>"})},render:function(e){var s=this;return e=t(e).map(function(e,i){return e=t(s.options.item).attr("data-value",i),e.find("a").html(s.highlighter(i)),e[0]}),e.first().addClass("active"),this.$menu.html(e),this},next:function(){var e=this.$menu.find(".active").removeClass("active"),s=e.next();s.length||(s=t(this.$menu.find("li")[0])),s.addClass("active")},prev:function(){var t=this.$menu.find(".active").removeClass("active"),e=t.prev();e.length||(e=this.$menu.find("li").last()),e.addClass("active")},listen:function(){this.$element.on("focus",t.proxy(this.focus,this)).on("blur",t.proxy(this.blur,this)).on("keypress",t.proxy(this.keypress,this)).on("keyup",t.proxy(this.keyup,this)),this.eventSupported("keydown")&&this.$element.on("keydown",t.proxy(this.keydown,this)),this.$menu.on("click",t.proxy(this.click,this)).on("mouseenter","li",t.proxy(this.mouseenter,this)).on("mouseleave","li",t.proxy(this.mouseleave,this))},eventSupported:function(t){var e=t in this.$element;return e||(this.$element.setAttribute(t,"return;"),e="function"==typeof this.$element[t]),e},move:function(t){if(this.shown){switch(t.keyCode){case 9:case 13:case 27:t.preventDefault();break;case 38:t.preventDefault(),this.prev();break;case 40:t.preventDefault(),this.next()}t.stopPropagation()}},keydown:function(e){this.suppressKeyPressRepeat=~t.inArray(e.keyCode,[40,38,9,13,27]),this.move(e)},keypress:function(t){this.suppressKeyPressRepeat||this.move(t)},keyup:function(t){switch(t.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}t.stopPropagation(),t.preventDefault()},focus:function(){this.focused=!0},blur:function(){this.focused=!1,!this.mousedover&&this.shown&&this.hide()},click:function(t){t.stopPropagation(),t.preventDefault(),this.select(),this.$element.focus()},mouseenter:function(e){this.mousedover=!0,this.$menu.find(".active").removeClass("active"),t(e.currentTarget).addClass("active")},mouseleave:function(){this.mousedover=!1,!this.focused&&this.shown&&this.hide()}};var s=t.fn.typeahead;t.fn.typeahead=function(s){return this.each(function(){var i=t(this),n=i.data("typeahead"),h="object"==typeof s&&s;n||i.data("typeahead",n=new e(this,h)),"string"==typeof s&&n[s]()})},t.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>',minLength:1},t.fn.typeahead.Constructor=e,t.fn.typeahead.noConflict=function(){return t.fn.typeahead=s,this},t(document).on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(){var e=t(this);e.data("typeahead")||e.typeahead(e.data())})}(window.jQuery);
\ No newline at end of file
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
div.dataTables_length label {
font-weight: normal;
text-align: left;
-/*!
- * Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome
- * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
*/@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.4.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.4.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.4.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.4.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.4.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.4.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}
-/*! iFrame Resizer (iframeSizer.contentWindow.min.js) - v3.5.3 - 2016-02-23
- * Desc: Include this file in any page being loaded into an iframe
- * to force the iframe to resize to the content size.
- * Requires: iframeResizer.min.js on host page.
- * Copyright: (c) 2016 David J. Bradshaw - dave@bradshaw.net
- * License: MIT
- */
-
!function(a){"use strict";function b(b,c,d){"addEventListener"in a?b.addEventListener(c,d,!1):"attachEvent"in a&&b.attachEvent("on"+c,d)}function c(b,c,d){"removeEventListener"in a?b.removeEventListener(c,d,!1):"detachEvent"in a&&b.detachEvent("on"+c,d)}function d(a){return a.charAt(0).toUpperCase()+a.slice(1)}function e(a){var b,c,d,e=null,f=0,g=function(){f=Fa(),e=null,d=a.apply(b,c),e||(b=c=null)};return function(){var h=Fa();f||(f=h);var i=xa-(h-f);return b=this,c=arguments,0>=i||i>xa?(e&&(clearTimeout(e),e=null),f=h,d=a.apply(b,c),e||(b=c=null)):e||(e=setTimeout(g,i)),d}}function f(a){return ma+"["+oa+"] "+a}function g(b){la&&"object"==typeof a.console&&console.log(f(b))}function h(b){"object"==typeof a.console&&console.warn(f(b))}function i(){j(),g("Initialising iFrame ("+location.href+")"),k(),n(),m("background",W),m("padding",$),A(),s(),t(),o(),C(),u(),ia=B(),N("init","Init message from host page"),Da()}function j(){function a(a){return"true"===a?!0:!1}var b=ha.substr(na).split(":");oa=b[0],X=void 0!==b[1]?Number(b[1]):X,_=void 0!==b[2]?a(b[2]):_,la=void 0!==b[3]?a(b[3]):la,ja=void 0!==b[4]?Number(b[4]):ja,U=void 0!==b[6]?a(b[6]):U,Y=b[7],fa=void 0!==b[8]?b[8]:fa,W=b[9],$=b[10],ua=void 0!==b[11]?Number(b[11]):ua,ia.enable=void 0!==b[12]?a(b[12]):!1,qa=void 0!==b[13]?b[13]:qa,Aa=void 0!==b[14]?b[14]:Aa}function k(){function b(){var b=a.iFrameResizer;g("Reading data from page: "+JSON.stringify(b)),Ca="messageCallback"in b?b.messageCallback:Ca,Da="readyCallback"in b?b.readyCallback:Da,ta="targetOrigin"in b?b.targetOrigin:ta,fa="heightCalculationMethod"in b?b.heightCalculationMethod:fa,Aa="widthCalculationMethod"in b?b.widthCalculationMethod:Aa}"iFrameResizer"in a&&Object===a.iFrameResizer.constructor&&b(),g("TargetOrigin for parent set to: "+ta)}function l(a,b){return-1!==b.indexOf("-")&&(h("Negative CSS value ignored for "+a),b=""),b}function m(a,b){void 0!==b&&""!==b&&"null"!==b&&(document.body.style[a]=b,g("Body "+a+' set to "'+b+'"'))}function n(){void 0===Y&&(Y=X+"px"),m("margin",l("margin",Y))}function o(){document.documentElement.style.height="",document.body.style.height="",g('HTML & body height set to "auto"')}function p(e){function f(){N(e.eventName,e.eventType)}var h={add:function(c){b(a,c,f)},remove:function(b){c(a,b,f)}};e.eventNames&&Array.prototype.map?(e.eventName=e.eventNames[0],e.eventNames.map(h[e.method])):h[e.method](e.eventName),g(d(e.method)+" event listener: "+e.eventType)}function q(a){p({method:a,eventType:"Animation Start",eventNames:["animationstart","webkitAnimationStart"]}),p({method:a,eventType:"Animation Iteration",eventNames:["animationiteration","webkitAnimationIteration"]}),p({method:a,eventType:"Animation End",eventNames:["animationend","webkitAnimationEnd"]}),p({method:a,eventType:"Input",eventName:"input"}),p({method:a,eventType:"Mouse Up",eventName:"mouseup"}),p({method:a,eventType:"Mouse Down",eventName:"mousedown"}),p({method:a,eventType:"Orientation Change",eventName:"orientationchange"}),p({method:a,eventType:"Print",eventName:["afterprint","beforeprint"]}),p({method:a,eventType:"Ready State Change",eventName:"readystatechange"}),p({method:a,eventType:"Touch Start",eventName:"touchstart"}),p({method:a,eventType:"Touch End",eventName:"touchend"}),p({method:a,eventType:"Touch Cancel",eventName:"touchcancel"}),p({method:a,eventType:"Transition Start",eventNames:["transitionstart","webkitTransitionStart","MSTransitionStart","oTransitionStart","otransitionstart"]}),p({method:a,eventType:"Transition Iteration",eventNames:["transitioniteration","webkitTransitionIteration","MSTransitionIteration","oTransitionIteration","otransitioniteration"]}),p({method:a,eventType:"Transition End",eventNames:["transitionend","webkitTransitionEnd","MSTransitionEnd","oTransitionEnd","otransitionend"]}),"child"===qa&&p({method:a,eventType:"IFrame Resized",eventName:"resize"})}function r(a,b,c,d){return b!==a&&(a in c||(h(a+" is not a valid option for "+d+"CalculationMethod."),a=b),g(d+' calculation method set to "'+a+'"')),a}function s(){fa=r(fa,ea,Ga,"height")}function t(){Aa=r(Aa,za,Ha,"width")}function u(){!0===U?(q("add"),F()):g("Auto Resize disabled")}function v(){g("Disable outgoing messages"),ra=!1}function w(){g("Remove event listener: Message"),c(a,"message",S)}function x(){null!==Z&&Z.disconnect()}function y(){q("remove"),x(),clearInterval(ka)}function z(){v(),w(),!0===U&&y()}function A(){var a=document.createElement("div");a.style.clear="both",a.style.display="block",document.body.appendChild(a)}function B(){function c(){return{x:void 0!==a.pageXOffset?a.pageXOffset:document.documentElement.scrollLeft,y:void 0!==a.pageYOffset?a.pageYOffset:document.documentElement.scrollTop}}function d(a){var b=a.getBoundingClientRect(),d=c();return{x:parseInt(b.left,10)+parseInt(d.x,10),y:parseInt(b.top,10)+parseInt(d.y,10)}}function e(a){function b(a){var b=d(a);g("Moving to in page link (#"+c+") at x: "+b.x+" y: "+b.y),R(b.y,b.x,"scrollToOffset")}var c=a.split("#")[1]||a,e=decodeURIComponent(c),f=document.getElementById(e)||document.getElementsByName(e)[0];void 0!==f?b(f):(g("In page link (#"+c+") not found in iFrame, so sending to parent"),R(0,0,"inPageLink","#"+c))}function f(){""!==location.hash&&"#"!==location.hash&&e(location.href)}function i(){function a(a){function c(a){a.preventDefault(),e(this.getAttribute("href"))}"#"!==a.getAttribute("href")&&b(a,"click",c)}Array.prototype.forEach.call(document.querySelectorAll('a[href^="#"]'),a)}function j(){b(a,"hashchange",f)}function k(){setTimeout(f,ba)}function l(){Array.prototype.forEach&&document.querySelectorAll?(g("Setting up location.hash handlers"),i(),j(),k()):h("In page linking not fully supported in this browser! (See README.md for IE8 workaround)")}return ia.enable?l():g("In page linking not enabled"),{findTarget:e}}function C(){g("Enable public methods"),Ba.parentIFrame={autoResize:function(a){return!0===a&&!1===U?(U=!0,u()):!1===a&&!0===U&&(U=!1,y()),U},close:function(){R(0,0,"close"),z()},getId:function(){return oa},getPageInfo:function(a){"function"==typeof a?(Ea=a,R(0,0,"pageInfo")):(Ea=function(){},R(0,0,"pageInfoStop"))},moveToAnchor:function(a){ia.findTarget(a)},reset:function(){Q("parentIFrame.reset")},scrollTo:function(a,b){R(b,a,"scrollTo")},scrollToOffset:function(a,b){R(b,a,"scrollToOffset")},sendMessage:function(a,b){R(0,0,"message",JSON.stringify(a),b)},setHeightCalculationMethod:function(a){fa=a,s()},setWidthCalculationMethod:function(a){Aa=a,t()},setTargetOrigin:function(a){g("Set targetOrigin: "+a),ta=a},size:function(a,b){var c=""+(a?a:"")+(b?","+b:"");N("size","parentIFrame.size("+c+")",a,b)}}}function D(){0!==ja&&(g("setInterval: "+ja+"ms"),ka=setInterval(function(){N("interval","setInterval: "+ja)},Math.abs(ja)))}function E(){function b(a){function b(a){!1===a.complete&&(g("Attach listeners to "+a.src),a.addEventListener("load",f,!1),a.addEventListener("error",h,!1),k.push(a))}"attributes"===a.type&&"src"===a.attributeName?b(a.target):"childList"===a.type&&Array.prototype.forEach.call(a.target.querySelectorAll("img"),b)}function c(a){k.splice(k.indexOf(a),1)}function d(a){g("Remove listeners from "+a.src),a.removeEventListener("load",f,!1),a.removeEventListener("error",h,!1),c(a)}function e(a,b,c){d(a.target),N(b,c+": "+a.target.src,void 0,void 0)}function f(a){e(a,"imageLoad","Image loaded")}function h(a){e(a,"imageLoadFailed","Image load failed")}function i(a){N("mutationObserver","mutationObserver: "+a[0].target+" "+a[0].type),a.forEach(b)}function j(){var a=document.querySelector("body"),b={attributes:!0,attributeOldValue:!1,characterData:!0,characterDataOldValue:!1,childList:!0,subtree:!0};return m=new l(i),g("Create body MutationObserver"),m.observe(a,b),m}var k=[],l=a.MutationObserver||a.WebKitMutationObserver,m=j();return{disconnect:function(){"disconnect"in m&&(g("Disconnect body MutationObserver"),m.disconnect(),k.forEach(d))}}}function F(){var b=0>ja;a.MutationObserver||a.WebKitMutationObserver?b?D():Z=E():(g("MutationObserver not supported in this browser!"),D())}function G(a,b){function c(a){var c=/^\d+(px)?$/i;if(c.test(a))return parseInt(a,V);var d=b.style.left,e=b.runtimeStyle.left;return b.runtimeStyle.left=b.currentStyle.left,b.style.left=a||0,a=b.style.pixelLeft,b.style.left=d,b.runtimeStyle.left=e,a}var d=0;return b=b||document.body,"defaultView"in document&&"getComputedStyle"in document.defaultView?(d=document.defaultView.getComputedStyle(b,null),d=null!==d?d[a]:0):d=c(b.currentStyle[a]),parseInt(d,V)}function H(a){a>xa/2&&(xa=2*a,g("Event throttle increased to "+xa+"ms"))}function I(a,b){for(var c=b.length,e=0,f=0,h=d(a),i=Fa(),j=0;c>j;j++)e=b[j].getBoundingClientRect()[a]+G("margin"+h,b[j]),e>f&&(f=e);return i=Fa()-i,g("Parsed "+c+" HTML elements"),g("Element position calculated in "+i+"ms"),H(i),f}function J(a){return[a.bodyOffset(),a.bodyScroll(),a.documentElementOffset(),a.documentElementScroll()]}function K(a,b){function c(){return h("No tagged elements ("+b+") found on page"),da}var d=document.querySelectorAll("["+b+"]");return 0===d.length?c():I(a,d)}function L(){return document.querySelectorAll("body *")}function M(a,b,c,d){function e(){da=l,ya=m,R(da,ya,a)}function f(){function a(a,b){var c=Math.abs(a-b)<=ua;return!c}return l=void 0!==c?c:Ga[fa](),m=void 0!==d?d:Ha[Aa](),a(da,l)||_&&a(ya,m)}function h(){return!(a in{init:1,interval:1,size:1})}function i(){return fa in pa||_&&Aa in pa}function j(){g("No change in size detected")}function k(){h()&&i()?Q(b):a in{interval:1}||j()}var l,m;f()||"init"===a?(O(),e()):k()}function N(a,b,c,d){function e(){a in{reset:1,resetPage:1,init:1}||g("Trigger event: "+b)}function f(){return va&&a in aa}f()?g("Trigger event cancelled: "+a):(e(),Ia(a,b,c,d))}function O(){va||(va=!0,g("Trigger event lock on")),clearTimeout(wa),wa=setTimeout(function(){va=!1,g("Trigger event lock off"),g("--")},ba)}function P(a){da=Ga[fa](),ya=Ha[Aa](),R(da,ya,a)}function Q(a){var b=fa;fa=ea,g("Reset trigger event: "+a),O(),P("reset"),fa=b}function R(a,b,c,d,e){function f(){void 0===e?e=ta:g("Message targetOrigin: "+e)}function h(){var f=a+":"+b,h=oa+":"+f+":"+c+(void 0!==d?":"+d:"");g("Sending message to host page ("+h+")"),sa.postMessage(ma+h,e)}!0===ra&&(f(),h())}function S(b){function c(){return ma===(""+b.data).substr(0,na)}function d(){ha=b.data,sa=b.source,i(),ca=!1,setTimeout(function(){ga=!1},ba)}function e(){ga?g("Page reset ignored by init"):(g("Page size reset by host page"),P("resetPage"))}function f(){N("resizeParent","Parent window requested size check")}function j(){var a=l();ia.findTarget(a)}function k(){return b.data.split("]")[1].split(":")[0]}function l(){return b.data.substr(b.data.indexOf(":")+1)}function m(){return"iFrameResize"in a}function n(){var a=l();g("MessageCallback called from parent: "+a),Ca(JSON.parse(a)),g(" --")}function o(){var a=l();g("PageInfoFromParent called from parent: "+a),Ea(JSON.parse(a)),g(" --")}function p(){return b.data.split(":")[2]in{"true":1,"false":1}}function q(){switch(k()){case"reset":e();break;case"resize":f();break;case"moveToAnchor":j();break;case"message":n();break;case"pageInfo":o();break;default:m()||p()||h("Unexpected message ("+b.data+")")}}function r(){!1===ca?q():p()?d():g('Ignored message of type "'+k()+'". Received before initialization.')}c()&&r()}function T(){"loading"!==document.readyState&&a.parent.postMessage("[iFrameResizerChild]Ready","*")}var U=!0,V=10,W="",X=0,Y="",Z=null,$="",_=!1,aa={resize:1,click:1},ba=128,ca=!0,da=1,ea="bodyOffset",fa=ea,ga=!0,ha="",ia={},ja=32,ka=null,la=!1,ma="[iFrameSizer]",na=ma.length,oa="",pa={max:1,min:1,bodyScroll:1,documentElementScroll:1},qa="child",ra=!0,sa=a.parent,ta="*",ua=0,va=!1,wa=null,xa=16,ya=1,za="scroll",Aa=za,Ba=a,Ca=function(){h("MessageCallback function not defined")},Da=function(){},Ea=function(){},Fa=Date.now||function(){return(new Date).getTime()},Ga={bodyOffset:function(){return document.body.offsetHeight+G("marginTop")+G("marginBottom")},offset:function(){return Ga.bodyOffset()},bodyScroll:function(){return document.body.scrollHeight},documentElementOffset:function(){return document.documentElement.offsetHeight},documentElementScroll:function(){return document.documentElement.scrollHeight},max:function(){return Math.max.apply(null,J(Ga))},min:function(){return Math.min.apply(null,J(Ga))},grow:function(){return Ga.max()},lowestElement:function(){return Math.max(Ga.bodyOffset(),I("bottom",L()))},taggedElement:function(){return K("bottom","data-iframe-height")}},Ha={bodyScroll:function(){return document.body.scrollWidth},bodyOffset:function(){return document.body.offsetWidth},documentElementScroll:function(){return document.documentElement.scrollWidth},documentElementOffset:function(){return document.documentElement.offsetWidth},scroll:function(){return Math.max(Ha.bodyScroll(),Ha.documentElementScroll())},max:function(){return Math.max.apply(null,J(Ha))},min:function(){return Math.min.apply(null,J(Ha))},rightMostElement:function(){return I("right",L())},taggedElement:function(){return K("right","data-iframe-width")}},Ia=e(M);b(a,"message",S),T()}(window||{});
//# sourceMappingURL=iframeResizer.contentWindow.map
\ No newline at end of file
-/*! iFrame Resizer (iframeSizer.min.js ) - v3.5.3 - 2016-02-23
- * Desc: Force cross domain iframes to size to content.
- * Requires: iframeResizer.contentWindow.min.js to be loaded into the target frame.
- * Copyright: (c) 2016 David J. Bradshaw - dave@bradshaw.net
- * License: MIT
- */
-
!function(a){"use strict";function b(b,c,d){"addEventListener"in a?b.addEventListener(c,d,!1):"attachEvent"in a&&b.attachEvent("on"+c,d)}function c(b,c,d){"removeEventListener"in a?b.removeEventListener(c,d,!1):"detachEvent"in a&&b.detachEvent("on"+c,d)}function d(){var b,c=["moz","webkit","o","ms"];for(b=0;b<c.length&&!N;b+=1)N=a[c[b]+"RequestAnimationFrame"];N||h("setup","RequestAnimationFrame not supported")}function e(b){var c="Host page: "+b;return a.top!==a.self&&(c=a.parentIFrame&&a.parentIFrame.getId?a.parentIFrame.getId()+": "+b:"Nested host page: "+b),c}function f(a){return K+"["+e(a)+"]"}function g(a){return P[a]?P[a].log:G}function h(a,b){k("log",a,b,g(a))}function i(a,b){k("info",a,b,g(a))}function j(a,b){k("warn",a,b,!0)}function k(b,c,d,e){!0===e&&"object"==typeof a.console&&console[b](f(c),d)}function l(d){function e(){function a(){s(V),p(W)}g("Height"),g("Width"),t(a,V,"init")}function f(){var a=U.substr(L).split(":");return{iframe:P[a[0]].iframe,id:a[0],height:a[1],width:a[2],type:a[3]}}function g(a){var b=Number(P[W]["max"+a]),c=Number(P[W]["min"+a]),d=a.toLowerCase(),e=Number(V[d]);h(W,"Checking "+d+" is in range "+c+"-"+b),c>e&&(e=c,h(W,"Set "+d+" to min value")),e>b&&(e=b,h(W,"Set "+d+" to max value")),V[d]=""+e}function k(){function a(){function a(){var a=0,d=!1;for(h(W,"Checking connection is from allowed list of origins: "+c);a<c.length;a++)if(c[a]===b){d=!0;break}return d}function d(){var a=P[W].remoteHost;return h(W,"Checking connection is from: "+a),b===a}return c.constructor===Array?a():d()}var b=d.origin,c=P[W].checkOrigin;if(c&&""+b!="null"&&!a())throw new Error("Unexpected message received from: "+b+" for "+V.iframe.id+". Message was: "+d.data+". This error can be disabled by setting the checkOrigin: false option or by providing of array of trusted domains.");return!0}function l(){return K===(""+U).substr(0,L)&&U.substr(L).split(":")[0]in P}function w(){var a=V.type in{"true":1,"false":1,undefined:1};return a&&h(W,"Ignoring init message from meta parent page"),a}function y(a){return U.substr(U.indexOf(":")+J+a)}function z(a){h(W,"MessageCallback passed: {iframe: "+V.iframe.id+", message: "+a+"}"),N("messageCallback",{iframe:V.iframe,message:JSON.parse(a)}),h(W,"--")}function A(){var b=document.body.getBoundingClientRect(),c=V.iframe.getBoundingClientRect();return JSON.stringify({iframeHeight:c.height,iframeWidth:c.width,clientHeight:Math.max(document.documentElement.clientHeight,a.innerHeight||0),clientWidth:Math.max(document.documentElement.clientWidth,a.innerWidth||0),offsetTop:parseInt(c.top-b.top,10),offsetLeft:parseInt(c.left-b.left,10),scrollTop:a.pageYOffset,scrollLeft:a.pageXOffset})}function B(a,b){function c(){u("Send Page Info","pageInfo:"+A(),a,b)}x(c,32)}function C(){function d(b,c){function d(){P[g]?B(P[g].iframe,g):e()}["scroll","resize"].forEach(function(e){h(g,b+e+" listener for sendPageInfo"),c(a,e,d)})}function e(){d("Remove ",c)}function f(){d("Add ",b)}var g=W;f(),P[g].stopPageInfo=e}function D(){P[W]&&P[W].stopPageInfo&&(P[W].stopPageInfo(),delete P[W].stopPageInfo)}function E(){var a=!0;return null===V.iframe&&(j(W,"IFrame ("+V.id+") not found"),a=!1),a}function F(a){var b=a.getBoundingClientRect();return o(W),{x:Math.floor(Number(b.left)+Number(M.x)),y:Math.floor(Number(b.top)+Number(M.y))}}function G(b){function c(){M=g,H(),h(W,"--")}function d(){return{x:Number(V.width)+f.x,y:Number(V.height)+f.y}}function e(){a.parentIFrame?a.parentIFrame["scrollTo"+(b?"Offset":"")](g.x,g.y):j(W,"Unable to scroll to requested position, window.parentIFrame not found")}var f=b?F(V.iframe):{x:0,y:0},g=d();h(W,"Reposition requested from iFrame (offset x:"+f.x+" y:"+f.y+")"),a.top!==a.self?e():c()}function H(){!1!==N("scrollCallback",M)?p(W):q()}function I(b){function c(){var a=F(g);h(W,"Moving to in page link (#"+e+") at x: "+a.x+" y: "+a.y),M={x:a.x,y:a.y},H(),h(W,"--")}function d(){a.parentIFrame?a.parentIFrame.moveToAnchor(e):h(W,"In page link #"+e+" not found and window.parentIFrame not found")}var e=b.split("#")[1]||"",f=decodeURIComponent(e),g=document.getElementById(f)||document.getElementsByName(f)[0];g?c():a.top!==a.self?d():h(W,"In page link #"+e+" not found")}function N(a,b){return m(W,a,b)}function O(){switch(P[W].firstRun&&T(),V.type){case"close":n(V.iframe);break;case"message":z(y(6));break;case"scrollTo":G(!1);break;case"scrollToOffset":G(!0);break;case"pageInfo":B(P[W].iframe,W),C();break;case"pageInfoStop":D();break;case"inPageLink":I(y(9));break;case"reset":r(V);break;case"init":e(),N("initCallback",V.iframe),N("resizedCallback",V);break;default:e(),N("resizedCallback",V)}}function Q(a){var b=!0;return P[a]||(b=!1,j(V.type+" No settings for "+a+". Message was: "+U)),b}function S(){for(var a in P)u("iFrame requested init",v(a),document.getElementById(a),a)}function T(){P[W].firstRun=!1}var U=d.data,V={},W=null;"[iFrameResizerChild]Ready"===U?S():l()?(V=f(),W=R=V.id,!w()&&Q(W)&&(h(W,"Received: "+U),E()&&k()&&O())):i(W,"Ignored: "+U)}function m(a,b,c){var d=null,e=null;if(P[a]){if(d=P[a][b],"function"!=typeof d)throw new TypeError(b+" on iFrame["+a+"] is not a function");e=d(c)}return e}function n(a){var b=a.id;h(b,"Removing iFrame: "+b),a.parentNode.removeChild(a),m(b,"closedCallback",b),h(b,"--"),delete P[b]}function o(b){null===M&&(M={x:void 0!==a.pageXOffset?a.pageXOffset:document.documentElement.scrollLeft,y:void 0!==a.pageYOffset?a.pageYOffset:document.documentElement.scrollTop},h(b,"Get page position: "+M.x+","+M.y))}function p(b){null!==M&&(a.scrollTo(M.x,M.y),h(b,"Set page position: "+M.x+","+M.y),q())}function q(){M=null}function r(a){function b(){s(a),u("reset","reset",a.iframe,a.id)}h(a.id,"Size reset requested by "+("init"===a.type?"host page":"iFrame")),o(a.id),t(b,a,"reset")}function s(a){function b(b){a.iframe.style[b]=a[b]+"px",h(a.id,"IFrame ("+e+") "+b+" set to "+a[b]+"px")}function c(b){H||"0"!==a[b]||(H=!0,h(e,"Hidden iFrame detected, creating visibility listener"),y())}function d(a){b(a),c(a)}var e=a.iframe.id;P[e]&&(P[e].sizeHeight&&d("height"),P[e].sizeWidth&&d("width"))}function t(a,b,c){c!==b.type&&N?(h(b.id,"Requesting animation frame"),N(a)):a()}function u(a,b,c,d){function e(){var e=P[d].targetOrigin;h(d,"["+a+"] Sending msg to iframe["+d+"] ("+b+") targetOrigin: "+e),c.contentWindow.postMessage(K+b,e)}function f(){i(d,"["+a+"] IFrame("+d+") not found"),P[d]&&delete P[d]}function g(){c&&"contentWindow"in c&&null!==c.contentWindow?e():f()}d=d||c.id,P[d]&&g()}function v(a){return a+":"+P[a].bodyMarginV1+":"+P[a].sizeWidth+":"+P[a].log+":"+P[a].interval+":"+P[a].enablePublicMethods+":"+P[a].autoResize+":"+P[a].bodyMargin+":"+P[a].heightCalculationMethod+":"+P[a].bodyBackground+":"+P[a].bodyPadding+":"+P[a].tolerance+":"+P[a].inPageLinks+":"+P[a].resizeFrom+":"+P[a].widthCalculationMethod}function w(a,c){function d(){function b(b){1/0!==P[w][b]&&0!==P[w][b]&&(a.style[b]=P[w][b]+"px",h(w,"Set "+b+" = "+P[w][b]+"px"))}function c(a){if(P[w]["min"+a]>P[w]["max"+a])throw new Error("Value for min"+a+" can not be greater than max"+a)}c("Height"),c("Width"),b("maxHeight"),b("minHeight"),b("maxWidth"),b("minWidth")}function e(){var a=c&&c.id||S.id+F++;return null!==document.getElementById(a)&&(a+=F++),a}function f(b){return R=b,""===b&&(a.id=b=e(),G=(c||{}).log,R=b,h(b,"Added missing iframe ID: "+b+" ("+a.src+")")),b}function g(){h(w,"IFrame scrolling "+(P[w].scrolling?"enabled":"disabled")+" for "+w),a.style.overflow=!1===P[w].scrolling?"hidden":"auto",a.scrolling=!1===P[w].scrolling?"no":"yes"}function i(){("number"==typeof P[w].bodyMargin||"0"===P[w].bodyMargin)&&(P[w].bodyMarginV1=P[w].bodyMargin,P[w].bodyMargin=""+P[w].bodyMargin+"px")}function k(){var b=P[w].firstRun,c=P[w].heightCalculationMethod in O;!b&&c&&r({iframe:a,height:0,width:0,type:"init"})}function l(){Function.prototype.bind&&(P[w].iframe.iFrameResizer={close:n.bind(null,P[w].iframe),resize:u.bind(null,"Window resize","resize",P[w].iframe),moveToAnchor:function(a){u("Move to anchor","inPageLink:"+a,P[w].iframe,w)},sendMessage:function(a){a=JSON.stringify(a),u("Send Message","message:"+a,P[w].iframe,w)}})}function m(c){function d(){u("iFrame.onload",c,a),k()}b(a,"load",d),u("init",c,a)}function o(a){if("object"!=typeof a)throw new TypeError("Options is not an object")}function p(a){for(var b in S)S.hasOwnProperty(b)&&(P[w][b]=a.hasOwnProperty(b)?a[b]:S[b])}function q(a){return""===a||"file://"===a?"*":a}function s(b){b=b||{},P[w]={firstRun:!0,iframe:a,remoteHost:a.src.split("/").slice(0,3).join("/")},o(b),p(b),P[w].targetOrigin=!0===P[w].checkOrigin?q(P[w].remoteHost):"*"}function t(){return w in P&&"iFrameResizer"in a}var w=f(a.id);t()?j(w,"Ignored iFrame, already setup."):(s(c),g(),d(),i(),m(v(w)),l())}function x(a,b){null===Q&&(Q=setTimeout(function(){Q=null,a()},b))}function y(){function b(){function a(a){function b(b){return"0px"===P[a].iframe.style[b]}function c(a){return null!==a.offsetParent}c(P[a].iframe)&&(b("height")||b("width"))&&u("Visibility change","resize",P[a].iframe,a)}for(var b in P)a(b)}function c(a){h("window","Mutation observed: "+a[0].target+" "+a[0].type),x(b,16)}function d(){var a=document.querySelector("body"),b={attributes:!0,attributeOldValue:!1,characterData:!0,characterDataOldValue:!1,childList:!0,subtree:!0},d=new e(c);d.observe(a,b)}var e=a.MutationObserver||a.WebKitMutationObserver;e&&d()}function z(a){function b(){B("Window "+a,"resize")}h("window","Trigger event: "+a),x(b,16)}function A(){function a(){B("Tab Visable","resize")}"hidden"!==document.visibilityState&&(h("document","Trigger event: Visiblity change"),x(a,16))}function B(a,b){function c(a){return"parent"===P[a].resizeFrom&&P[a].autoResize&&!P[a].firstRun}for(var d in P)c(d)&&u(a,b,document.getElementById(d),d)}function C(){b(a,"message",l),b(a,"resize",function(){z("resize")}),b(document,"visibilitychange",A),b(document,"-webkit-visibilitychange",A),b(a,"focusin",function(){z("focus")}),b(a,"focus",function(){z("focus")})}function D(){function a(a,c){function d(){if(!c.tagName)throw new TypeError("Object is not a valid DOM element");if("IFRAME"!==c.tagName.toUpperCase())throw new TypeError("Expected <IFRAME> tag, found <"+c.tagName+">")}c&&(d(),w(c,a),b.push(c))}var b;return d(),C(),function(c,d){switch(b=[],typeof d){case"undefined":case"string":Array.prototype.forEach.call(document.querySelectorAll(d||"iframe"),a.bind(void 0,c));break;case"object":a(c,d);break;default:throw new TypeError("Unexpected data type ("+typeof d+")")}return b}}function E(a){a.fn.iFrameResize=function(a){return this.filter("iframe").each(function(b,c){w(c,a)}).end()}}var F=0,G=!1,H=!1,I="message",J=I.length,K="[iFrameSizer]",L=K.length,M=null,N=a.requestAnimationFrame,O={max:1,scroll:1,bodyScroll:1,documentElementScroll:1},P={},Q=null,R="Host Page",S={autoResize:!0,bodyBackground:null,bodyMargin:null,bodyMarginV1:8,bodyPadding:null,checkOrigin:!0,inPageLinks:!1,enablePublicMethods:!0,heightCalculationMethod:"bodyOffset",id:"iFrameResizer",interval:32,log:!1,maxHeight:1/0,maxWidth:1/0,minHeight:0,minWidth:0,resizeFrom:"parent",scrolling:!1,sizeHeight:!0,sizeWidth:!1,tolerance:0,widthCalculationMethod:"scroll",closedCallback:function(){},initCallback:function(){},messageCallback:function(){j("MessageCallback function not defined")},resizedCallback:function(){},scrollCallback:function(){return!0}};a.jQuery&&E(jQuery),"function"==typeof define&&define.amd?define([],D):"object"==typeof module&&"object"==typeof module.exports?module.exports=D():a.iFrameResize=a.iFrameResize||D()}(window||{});
//# sourceMappingURL=iframeResizer.map
\ No newline at end of file
-/*!
- * jQuery Validation Plugin v1.13.0
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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
*
- * http://jqueryvalidation.org/
+ * 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.
*
- * Copyright (c) 2014 Jörn Zaefferer
- * Released under the MIT license
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
*/
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
-/*!
- * jQuery Validation Plugin v1.13.0
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
*
- * http://jqueryvalidation.org/
+ * Licensed 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
*
- * Copyright (c) 2014 Jörn Zaefferer
- * Released under the MIT license
+ * 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
*/
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
/******************************************************************************
* jquery.i18n.properties
*
-/*\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
-var table;\r
-var vm = avalon\r
- .define({\r
- $id : "routeController",\r
- targetServiceUrl:"",\r
- targetFullServiceUrl:"",\r
- iuiRootPath:iuiRootPath,\r
- apiRootPath:apiRootPath,\r
- apiIframeUrl:"",\r
- iuiIframeUrl:"",\r
- boxVisible:true,\r
- routeTargetTitle:$.i18n.prop("org_openo_msb_route_content_title"), \r
- server_rtn:{\r
- info_block:false,\r
- warning_block:false,\r
- rtn_info:""\r
- },\r
- showAPIType:"0",\r
- showAPITypeName:[$.i18n.prop("org_openo_msb_route_swagger_type_predefined"),$.i18n.prop("org_openo_msb_route_swagger_type_custominput")],\r
- $msbProtocol :["REST","UI","MQ","FTP","SNMP","TCP","UDP"],\r
- $msbType:["UI","NAF","SAF"],\r
- apiJson:{\r
- local:"",\r
- custom:""\r
- },\r
- setAPIType:function(type){\r
- vm.apiRouteInfo.apiJsonType=type;\r
- if(type==0){\r
- vm.apiJson.local=vm.jsonApiSelectList.selectItems[0];\r
- }\r
-\r
- }, \r
- jsonApiSelectList: {\r
- condName : "type",\r
- component_type : 'select',\r
- selectItems : []\r
- },\r
- \r
- dataTableLanguage: {\r
- "sProcessing": "<img src='../img/loading-spinner-grey.gif'/><span> Loadding...</span>", \r
- "sLengthMenu": $.i18n.prop("org_openo_msb_route-table-sLengthMenu"),\r
- "sZeroRecords": $.i18n.prop("org_openo_msb_route-table-sZeroRecords"),\r
- "sInfo": "<span class='seperator'> </span>" + $.i18n.prop("org_openo_msb_route-table-sInfo"),\r
- "sInfoEmpty": $.i18n.prop("org_openo_msb_route-table-sInfoEmpty"),\r
- "sGroupActions": $.i18n.prop("org_openo_msb_route-table-sGroupActions"),\r
- "sAjaxRequestGeneralError": $.i18n.prop("org_openo_msb_route-table-sAjaxRequestGeneralError"),\r
- "sEmptyTable": $.i18n.prop("org_openo_msb_route-table-sEmptyTable"),\r
- "oPaginate": {\r
- "sPrevious": $.i18n.prop("org_openo_msb_route-table-sPrevious"),\r
- "sNext": $.i18n.prop("org_openo_msb_route-table-sNext"),\r
- "sPage": $.i18n.prop("org_openo_msb_route-table-sPage"),\r
- "sPageOf": $.i18n.prop("org_openo_msb_route-table-sPageOf")\r
- },\r
- "sSearch": $.i18n.prop("org_openo_msb_route-table-search"),\r
- "sInfoFiltered": $.i18n.prop("org_openo_msb_route-table-infofilter") \r
- }, \r
- $apiRouteUrl :apiBasePath+'/apiRoute',\r
- $apiRouteInstanceUrl :apiBasePath+'/apiRoute/{serviceName}/version/{version}', \r
- $apiRouteStatusUrl :apiBasePath+'/apiRoute/{serviceName}/version/{version}/status/{status}',\r
- $apiDocsUrl :apiBasePath+'/apiRoute/apiDocs', \r
- $apiGatewayPortUrl :apiBasePath+'/apiRoute/apiGatewayPort', \r
- $discoverInfoUrl :apiBasePath+'/apiRoute/discoverInfo', \r
- $iuiRouteUrl :apiBasePath+'/iuiRoute',\r
- $iuiRouteInstanceUrl :apiBasePath+'/iuiRoute/{serviceName}',\r
- $iuiRouteStatusUrl :apiBasePath+'/iuiRoute/{serviceName}/status/{status}',\r
- $customRouteUrl :apiBasePath+'/customRoute/all',\r
- $customRouteInstanceUrl :apiBasePath+'/customRoute/instance',\r
- $customRouteStatusUrl :apiBasePath+'/customRoute/status', \r
- $msbRouteUrl:apiBasePath+'/services', \r
- $msbRouteInstanceUrl :apiBasePath+'/services/{serviceName}/version/{version}',\r
- routeLoading:false, \r
- apiRouteArray : [],\r
- apiRouteInfo : {\r
- oldServiceName:"", \r
- serviceName : "",\r
- oldVersion:"", \r
- version : "",\r
- status:"",\r
- url:"",\r
- metricsUrl:"/admin/metrics",\r
- apiJson:"/swagger.json",\r
- apiJsonType:"1",\r
- control:"",\r
- server:"",\r
- servers: []\r
- }, \r
- iuiRouteArray : [],\r
- iuiRouteInfo : { \r
- oldServiceName:"", \r
- serviceName : "",\r
- status:"",\r
- url:"",\r
- server:"",\r
- control:"",\r
- servers: []\r
- }, \r
- customRouteArray : [],\r
- customGroupRouteArray : [],\r
- customRouteInfo : { \r
- oldServiceName:"", \r
- serviceName : "",\r
- status:"",\r
- url:"",\r
- server:"",\r
- control:"",\r
- servers: []\r
- },\r
- msbRouteArray : [],\r
- msbRouteInfo : { \r
- oldServiceName:"", \r
- oldVersion:"", \r
- serviceName : "",\r
- version:"",\r
- status:"0",\r
- nodes:[],\r
- newHost:"",\r
- newttl:0,\r
- url:"",\r
- protocol:"",\r
- visualRange:"",\r
- visualRangeArray:[] \r
- },\r
- discoverInfo:{\r
- ip:"",\r
- port:"",\r
- enabled:false,\r
- deployMode:""\r
- },\r
- selectedRoute:"",\r
- selectedRouteType:"",\r
- routeDlgInfo:{\r
- titleName:"",\r
- saveType:""\r
- }, \r
- $initRoute : function() {\r
- \r
-\r
-\r
- vm.routeLoading=true;\r
-\r
- $.ajax({\r
- "type": 'get',\r
- async: false,\r
- "url": vm.$discoverInfoUrl,\r
- "dataType": "json",\r
- success: function (resp) { \r
- \r
- vm.discoverInfo = (resp==null)?"":resp;\r
- \r
- },\r
- error: function(XMLHttpRequest, textStatus, errorThrown) {\r
- bootbox.alert("get discoverInfo fails:"+textStatus+":"+errorThrown); \r
- }\r
- });\r
-\r
- $.ajax({\r
- "type": 'get',\r
- "url": vm.$apiRouteUrl,\r
- "dataType": "json",\r
- success: function (resp) { \r
- vm.apiRouteArray = (resp==null)?[]:resp; \r
- vm.apiRouteArray.sort(function(a,b){return a.serviceName>b.serviceName?1:-1}); \r
- },\r
- error: function(XMLHttpRequest, textStatus, errorThrown) {\r
- bootbox.alert("get api services fails:"+textStatus+":"+errorThrown); \r
- return;\r
- },\r
- complete:function(){\r
- vm.routeLoading=false;\r
- routeUtil.refreshRoute();\r
- $.ajax({\r
- "type": 'get',\r
- "url": vm.$apiGatewayPortUrl,\r
- "dataType": "text",\r
- success: function (resp) { \r
- \r
- vm.targetServiceUrl=location.hostname+":"+resp;\r
- \r
- },\r
- error: function(XMLHttpRequest, textStatus, errorThrown) {\r
- bootbox.alert("get apiGateway published port fails:"+textStatus+":"+errorThrown); \r
- }\r
- });\r
- }\r
- });\r
-\r
-\r
-\r
- $.ajax({\r
- "type": 'get',\r
- "url": vm.$iuiRouteUrl,\r
- "dataType": "json",\r
- success: function (resp) { \r
- vm.iuiRouteArray = (resp==null)?[]:resp; \r
- vm.iuiRouteArray.sort(function(a,b){return a.serviceName>b.serviceName?1:-1}); \r
- },\r
- error: function(XMLHttpRequest, textStatus, errorThrown) {\r
- bootbox.alert("get iui services fails:"+textStatus+":"+errorThrown); \r
- return;\r
- },\r
- complete:function(){ \r
- routeUtil.refreshRoute(); \r
- }\r
- });\r
-\r
-\r
-\r
- $.ajax({\r
- "type": 'get',\r
- "url": vm.$customRouteUrl,\r
- "dataType": "json",\r
- success: function (resp) { \r
- vm.customRouteArray = (resp==null)?[]:resp; \r
- \r
- if(resp!=null && resp.length>0)\r
- {\r
- routeUtil.groupRoute(resp);\r
- }\r
-\r
- },\r
- error: function(XMLHttpRequest, textStatus, errorThrown) {\r
- bootbox.alert("get custom services fails:"+textStatus+":"+errorThrown); \r
- return;\r
- },\r
- complete:function(){ \r
- routeUtil.refreshRoute(); \r
- }\r
- });\r
-\r
-\r
- $.ajax({\r
- "type": 'get',\r
- "url": vm.$apiDocsUrl,\r
- "dataType": "json",\r
- success: function (resp) { \r
- vm.jsonApiSelectList.selectItems= (resp==null)?[]:resp; \r
- },\r
- error: function(XMLHttpRequest, textStatus, errorThrown) {\r
- bootbox.alert("get local apiDocs fails:"+textStatus+":"+errorThrown); \r
- }\r
- });\r
-\r
-\r
-\r
- vm.initMSBRoute();\r
-\r
-\r
- \r
-\r
- },\r
- initMSBRoute:function(){\r
- vm.initIUIfori18n();\r
-\r
- $.ajax({\r
- "type": 'get',\r
- "url": vm.$msbRouteUrl,\r
- "dataType": "json",\r
- success: function (resp) { \r
- vm.msbRouteArray = (resp==null)?[]:resp; \r
- \r
- vm.msbRouteArray.sort(function(a,b){return a.serviceName>b.serviceName?1:-1}); \r
- \r
- },\r
- error: function(XMLHttpRequest, textStatus, errorThrown) {\r
- bootbox.alert("get msb services fails:"+XMLHttpRequest.responseText); \r
- return;\r
- },\r
- complete:function(){\r
-\r
- table=$('#msbTable').DataTable({\r
- \r
- "oLanguage": vm.dataTableLanguage,\r
- columnDefs: [ {\r
- targets: [ 0,8 ],\r
- "searchable": false,\r
- "bSortable": false,\r
- }], \r
- "order": [[2, 'asc']]\r
- });\r
- \r
- }\r
- });\r
- \r
- \r
- },\r
- \r
- clickDisplayGraphAlink: function () {\r
- vm.boxVisible = !vm.boxVisible;\r
- },\r
- addmsbHost:function(){\r
- if(vm.msbRouteInfo.newHost==""){\r
- vm.server_rtn.warning_block=true;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= $.i18n.prop("org_openo_msb_route_err_host_empty");\r
- return;\r
- }\r
-\r
- if(vm.msbRouteInfo.newttl==""){\r
- vm.server_rtn.warning_block=true;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= $.i18n.prop("org_openo_msb_route_err_ttl_empty");\r
- return;\r
- }\r
-\r
- var reg=/^(([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})$/ \r
- var ip,port; \r
- if(!reg.test(vm.msbRouteInfo.newHost)){ \r
- vm.server_rtn.warning_block=true;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= $.i18n.prop("org_openo_msb_route_err_host_format");\r
- return;\r
- }\r
- else{\r
- \r
- var hosts=vm.msbRouteInfo.newHost.split(":"); \r
- ip=hosts[0];\r
- port=hosts[1];\r
- }\r
-\r
- var reg_ttl=/^\d+$/\r
- \r
- if(!reg_ttl.test(vm.msbRouteInfo.newttl)){ \r
- vm.server_rtn.warning_block=true;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= $.i18n.prop("org_openo_msb_route_err_ttl_format");\r
- return;\r
- } \r
-\r
- \r
-\r
- // determine whether host repeated\r
- for(var i=0;i<vm.msbRouteInfo.nodes.length;i++){\r
- \r
- if(vm.msbRouteInfo.nodes[i].ip==ip && vm.msbRouteInfo.nodes[i].port==port )\r
- {\r
- vm.server_rtn.warning_block=true;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_host_repeat',[vm.msbRouteInfo.newHost]); \r
- return;\r
- }\r
- \r
- }\r
-\r
- vm.msbRouteInfo.nodes.push({"ip":ip,"port":port,"ttl":vm.msbRouteInfo.newttl});\r
- vm.msbRouteInfo.newHost="";\r
- vm.msbRouteInfo.newttl="";\r
- vm.server_rtn.warning_block=false;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= "";\r
-\r
-\r
- },\r
- delmsbHost:function(ip,port){\r
- \r
- bootbox.confirm( $.i18n.prop('org_openo_msb_route_err_host_del',[ip],[port]),function(result){\r
- if(result){\r
- \r
- for(var i=0;i<vm.msbRouteInfo.nodes.length;i++){\r
- if(vm.msbRouteInfo.nodes[i].ip == ip && vm.msbRouteInfo.nodes[i].port == port){\r
- vm.msbRouteInfo.nodes.splice(i, 1);\r
- break;\r
- }\r
- } \r
-\r
- }\r
- \r
- });\r
-\r
- vm.server_rtn.warning_block=false;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= "";\r
-\r
- },\r
- addapiHost:function(){\r
- if(vm.apiRouteInfo.server==""){\r
- vm.server_rtn.warning_block=true;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= $.i18n.prop("org_openo_msb_route_err_host_empty");\r
- return;\r
- }\r
-\r
- var reg=/^(([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})$/ \r
- var ip,port;\r
- if(!reg.test(vm.apiRouteInfo.server)){ \r
- vm.server_rtn.warning_block=true;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= $.i18n.prop("org_openo_msb_route_err_host_format");\r
- return;\r
- }\r
- else{\r
- var hosts=vm.apiRouteInfo.server.split(":")\r
- ip=hosts[0];\r
- port=hosts[1];\r
- }\r
-\r
- // determine whether host repeated\r
- for(var i=0;i<vm.apiRouteInfo.servers.length;i++){\r
- \r
- if(vm.apiRouteInfo.servers[i].ip==ip && vm.apiRouteInfo.servers[i].port==port)\r
- {\r
- vm.server_rtn.warning_block=true;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_host_repeat',[vm.apiRouteInfo.server]); \r
- return;\r
- }\r
- \r
- }\r
- var server={ip:ip,port:port,weight: 0};\r
- vm.apiRouteInfo.servers.push(server);\r
- vm.apiRouteInfo.server="";\r
- vm.server_rtn.warning_block=false;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= "";\r
-\r
-\r
- },\r
- delapiHost:function(ip,port){\r
- \r
- bootbox.confirm( $.i18n.prop('org_openo_msb_route_err_host_del',[ip],[port]),function(result){\r
- if(result){\r
- \r
- for(var i=0;i<vm.apiRouteInfo.servers.length;i++){\r
- if(vm.apiRouteInfo.servers[i].ip == ip && vm.apiRouteInfo.servers[i].port == port ){\r
- vm.apiRouteInfo.servers.splice(i, 1);\r
- break;\r
- }\r
- } \r
-\r
- }\r
- \r
- });\r
-\r
- vm.server_rtn.warning_block=false;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= "";\r
-\r
- },\r
- addcustomHost:function(){\r
- if(vm.customRouteInfo.server==""){\r
- vm.server_rtn.warning_block=true;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= $.i18n.prop("org_openo_msb_route_err_host_empty");\r
- return;\r
- }\r
-\r
- var reg=/^(([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})$/ \r
- var ip,port;\r
- if(!reg.test(vm.customRouteInfo.server)){ \r
- vm.server_rtn.warning_block=true;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= $.i18n.prop("org_openo_msb_route_err_host_format");\r
- return;\r
- }\r
- else{\r
- var hosts=vm.customRouteInfo.server.split(":")\r
- ip=hosts[0];\r
- port=hosts[1];\r
- }\r
-\r
- //判断host是否重复\r
- for(var i=0;i<vm.customRouteInfo.servers.length;i++){\r
- \r
- if(vm.customRouteInfo.servers[i].ip==ip && vm.customRouteInfo.servers[i].port==port)\r
- {\r
- vm.server_rtn.warning_block=true;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_host_repeat',[vm.apiRouteInfo.server]);\r
- return;\r
- }\r
- \r
- }\r
- var server={ip:ip,port:port,weight: 0};\r
- vm.customRouteInfo.servers.push(server);\r
- vm.customRouteInfo.server="";\r
- vm.server_rtn.warning_block=false;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= "";\r
-\r
-\r
- },\r
- delcustomHost:function(ip,port){\r
- \r
- bootbox.confirm( $.i18n.prop('org_openo_msb_route_err_host_del',[ip],[port]),function(result){\r
- if(result){\r
- \r
- for(var i=0;i<vm.customRouteInfo.servers.length;i++){\r
- if(vm.customRouteInfo.servers[i].ip == ip && vm.customRouteInfo.servers[i].port == port ){\r
- vm.customRouteInfo.servers.splice(i, 1);\r
- break;\r
- }\r
- } \r
-\r
- }\r
- \r
- });\r
-\r
- vm.server_rtn.warning_block=false;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= "";\r
-\r
- },\r
- addiuiHost:function(){\r
- if(vm.iuiRouteInfo.server==""){\r
- vm.server_rtn.warning_block=true;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= $.i18n.prop("org_openo_msb_route_err_host_empty");\r
- return;\r
- }\r
-\r
- var reg=/^(([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})$/ \r
- var ip,port;\r
- if(!reg.test(vm.iuiRouteInfo.server)){ \r
- vm.server_rtn.warning_block=true;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= $.i18n.prop("org_openo_msb_route_err_host_format");\r
- return;\r
- }\r
- else{\r
- var hosts=vm.iuiRouteInfo.server.split(":")\r
- ip=hosts[0];\r
- port=hosts[1];\r
- }\r
-\r
- //判断host是否重复\r
- for(var i=0;i<vm.iuiRouteInfo.servers.length;i++){\r
- \r
- if(vm.iuiRouteInfo.servers[i].ip==ip && vm.iuiRouteInfo.servers[i].port==port)\r
- {\r
- vm.server_rtn.warning_block=true;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_host_repeat',[vm.apiRouteInfo.server]);\r
- return;\r
- }\r
- \r
- }\r
- var server={ip:ip,port:port,weight: 0};\r
- vm.iuiRouteInfo.servers.push(server);\r
- vm.iuiRouteInfo.server="";\r
- vm.server_rtn.warning_block=false;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= "";\r
-\r
-\r
- },\r
- deliuiHost:function(ip,port){\r
- \r
- bootbox.confirm($.i18n.prop('org_openo_msb_route_err_host_del',[ip],[port]),function(result){\r
- if(result){\r
- \r
- for(var i=0;i<vm.iuiRouteInfo.servers.length;i++){\r
- if(vm.iuiRouteInfo.servers[i].ip == ip && vm.iuiRouteInfo.servers[i].port == port ){\r
- vm.iuiRouteInfo.servers.splice(i, 1);\r
- break;\r
- }\r
- } \r
-\r
- }\r
- \r
- });\r
-\r
- vm.server_rtn.warning_block=false;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= "";\r
-\r
- },\r
- $showmsbRouteDlg:function() {\r
- vm.msbRouteInfo.serviceName=""; \r
- vm.msbRouteInfo.version="";\r
- vm.msbRouteInfo.url="";\r
- vm.msbRouteInfo.protocol="";\r
- vm.msbRouteInfo.visualRange="";\r
- vm.msbRouteInfo.visualRangeArray=[];\r
- vm.msbRouteInfo.newHost="";\r
- vm.msbRouteInfo.nodes=[]; \r
- vm.msbRouteInfo.status="1"; \r
- \r
-\r
- vm.routeDlgInfo.saveType = "add";\r
- vm.routeDlgInfo.titleName=$.i18n.prop('org_openo_msb_route_title_add_msb');\r
- vm.server_rtn.warning_block=false;\r
- vm.server_rtn.info_block=false;\r
-\r
- \r
-\r
- $(".form-group").each(function () {\r
- $(this).removeClass('has-success');\r
- $(this).removeClass('has-error');\r
- $(this).find(".help-block[id]").remove();\r
- $(this).find(".form-tip").removeClass('form-input-focus');\r
- $(this).find(".item-tip").removeClass('item-tip-focus');\r
- });\r
-\r
- $("#msbrouteDlg").modal("show");\r
- },\r
- $showiuiRouteDlg:function() {\r
-\r
- vm.iuiRouteInfo.serviceName="";\r
- vm.iuiRouteInfo.url="";\r
- vm.iuiRouteInfo.server="";\r
- vm.iuiRouteInfo.servers=[]; \r
- vm.iuiRouteInfo.control="0"; \r
- vm.iuiRouteInfo.status="1"; \r
- \r
-\r
- vm.routeDlgInfo.saveType = "add";\r
- vm.routeDlgInfo.titleName=$.i18n.prop('org_openo_msb_route_title_add_iui');\r
- vm.server_rtn.warning_block=false;\r
- vm.server_rtn.info_block=false;\r
-\r
- //$("input[name='iuioriService']").val("");\r
-\r
- $(".form-group").each(function () {\r
- $(this).removeClass('has-success');\r
- $(this).removeClass('has-error');\r
- $(this).find(".help-block[id]").remove();\r
- $(this).find(".form-tip").removeClass('form-input-focus');\r
- $(this).find(".item-tip").removeClass('item-tip-focus');\r
- });\r
-\r
- $("#iuirouteDlg").modal("show");\r
- },\r
- $showcustomRouteDlg:function() {\r
-\r
- vm.customRouteInfo.serviceName="";\r
- vm.customRouteInfo.url="";\r
- vm.customRouteInfo.server="";\r
- vm.customRouteInfo.servers=[]; \r
- vm.customRouteInfo.control="0"; \r
- vm.customRouteInfo.status="1"; \r
- \r
-\r
- vm.routeDlgInfo.saveType = "add";\r
- vm.routeDlgInfo.titleName=$.i18n.prop('org_openo_msb_route_title_add_custom');\r
- vm.server_rtn.warning_block=false;\r
- vm.server_rtn.info_block=false;\r
-\r
- //$("input[name='customoriService']").val("");\r
-\r
- $(".form-group").each(function () {\r
- $(this).removeClass('has-success');\r
- $(this).removeClass('has-error');\r
- $(this).find(".help-block[id]").remove();\r
- $(this).find(".form-tip").removeClass('form-input-focus');\r
- $(this).find(".item-tip").removeClass('item-tip-focus');\r
- });\r
-\r
- $("#customrouteDlg").modal("show");\r
- },\r
- $showApiRouteDlg : function() {\r
-\r
- $('#apiTab a:first').tab('show');\r
- vm.apiRouteInfo.serviceName="";\r
- vm.apiRouteInfo.version="";\r
- vm.apiRouteInfo.url="";\r
- vm.apiRouteInfo.metricsUrl="/admin/metrics";\r
- vm.apiRouteInfo.control="0";\r
- vm.apiRouteInfo.status="1";\r
- // vm.apiRouteInfo.apiJson="/service/swagger.json";\r
- vm.apiRouteInfo.apiJsonType="1"; \r
- vm.apiRouteInfo.server="";\r
- vm.apiRouteInfo.servers=[]; \r
- \r
- vm.apiJson.custom="/swagger.json";\r
-\r
- //$("input[name='oriService']").val("");\r
-\r
- $('#metricsFullurl').collapse('hide');\r
- $('#apiJsonFullurl').collapse('hide');\r
-\r
- \r
-\r
- vm.routeDlgInfo.saveType = "add";\r
- vm.routeDlgInfo.titleName=$.i18n.prop('org_openo_msb_route_title_add_api');\r
- vm.server_rtn.warning_block=false;\r
- vm.server_rtn.info_block=false;\r
-\r
- $(".form-group").each(function () {\r
- $(this).removeClass('has-success');\r
- $(this).removeClass('has-error');\r
- $(this).find(".help-block[id]").remove();\r
- $(this).find(".form-tip").removeClass('form-input-focus');\r
- $(this).find(".item-tip").removeClass('item-tip-focus');\r
- });\r
-\r
-\r
- $("#routeDlg").modal("show");\r
- },\r
- $saveiuiRoute : function() {\r
-\r
- iuisuccess.hide();\r
- iuierror.hide();\r
- if (iuiform.valid() == false) {\r
- return false;\r
- }\r
-\r
- vm.server_rtn.warning_block=false;\r
- vm.server_rtn.info_block=true;\r
-\r
- vm.iuiRouteInfo.serviceName=$.trim(vm.iuiRouteInfo.serviceName);\r
- \r
- var servers=[];\r
- for(var i=0;i<vm.iuiRouteInfo.servers.length;i++){\r
- var server={ip:vm.iuiRouteInfo.servers[i].ip,port:vm.iuiRouteInfo.servers[i].port,weight: 0};\r
- servers.push(server);\r
- }\r
-\r
-\r
-\r
- var iuiRouteUrl=vm.iuiRouteInfo.url=="/"?"":vm.iuiRouteInfo.url;\r
- var data= JSON.stringify({\r
- "serviceName": vm.iuiRouteInfo.serviceName,\r
- "url": iuiRouteUrl,\r
- "control":vm.iuiRouteInfo.control,\r
- "status":vm.iuiRouteInfo.status,\r
- "servers": servers\r
- });\r
-\r
- if(vm.routeDlgInfo.saveType=="add")\r
- {\r
-\r
- //Determine whether to repeat\r
- for(var i=0;i<vm.iuiRouteArray.length;i++){\r
- \r
- if(vm.iuiRouteArray[i].serviceName==vm.iuiRouteInfo.serviceName)\r
- {\r
- vm.server_rtn.warning_block=true;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_service_repeat',[vm.iuiRouteInfo.serviceName]);\r
- return;\r
- }\r
- \r
- }\r
-\r
- //save service\r
- \r
- \r
- $.ajax({\r
- "type": 'POST',\r
- "url": vm.$iuiRouteUrl,\r
- "data" : data,\r
- "dataType": "json",\r
- "contentType":"application/json",\r
- success: function (resp) { \r
- \r
- vm.iuiRouteArray.push(JSON.parse(data)); \r
- vm.iuiRouteArray.sort(function(a,b){return a.serviceName>b.serviceName?1:-1}); \r
-\r
- routeUtil.refreshRoute(); \r
- $('#iuirouteDlg').modal('hide'); \r
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_iui'),$.i18n.prop('org_openo_msb_route_service_save'),"success"); \r
- },\r
- error: function(XMLHttpRequest, textStatus, errorThrown) {\r
- \r
- vm.server_rtn.warning_block=true;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_service_save')+textStatus+":"+errorThrown; \r
- \r
- }\r
- });\r
- }\r
- else{ //update\r
-\r
- var url= vm.$iuiRouteInstanceUrl;\r
- url=url.replace("{serviceName}",vm.iuiRouteInfo.oldServiceName);\r
-\r
- //Determine whether to repeat\r
- if(vm.iuiRouteInfo.serviceName!=vm.iuiRouteInfo.oldServiceName) //Has been modified service name\r
- {\r
- for(var i=0;i<vm.iuiRouteArray.length;i++){\r
- \r
- if(vm.iuiRouteArray[i].serviceName==vm.iuiRouteInfo.serviceName)\r
- {\r
- vm.server_rtn.warning_block=true;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_service_repeat',[vm.iuiRouteInfo.serviceName]);\r
- return;\r
- }\r
- \r
- }\r
- }\r
-\r
- $.ajax({\r
- "type": 'PUT',\r
- "url": url,\r
- "data" :data,\r
- "dataType": "json",\r
- "contentType":"application/json",\r
- success: function (resp) { \r
- \r
- for(var i=0;i<vm.iuiRouteArray.length;i++){\r
- if(vm.iuiRouteArray[i].serviceName == vm.iuiRouteInfo.oldServiceName)\r
- { \r
- vm.iuiRouteArray[i].serviceName=vm.iuiRouteInfo.serviceName; \r
- vm.iuiRouteArray[i].url=iuiRouteUrl;\r
- vm.iuiRouteArray[i].servers=vm.iuiRouteInfo.servers;\r
- \r
- break;\r
- }\r
- }\r
- \r
-\r
-\r
- $('#iuirouteDlg').modal('hide'); \r
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_iui'),$.i18n.prop('org_openo_msb_route_service_update'),"success"); \r
- \r
-\r
- },\r
- error: function(XMLHttpRequest, textStatus, errorThrown) {\r
- \r
- vm.server_rtn.warning_block=true;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_service_save')+textStatus+":"+errorThrown; \r
- \r
- }\r
- });\r
-\r
- \r
- }\r
- },\r
- $savecustomRoute : function() {\r
-\r
- customsuccess.hide();\r
- customerror.hide();\r
- if (customform.valid() == false) {\r
- return false;\r
- }\r
-\r
- if(vm.customRouteInfo.servers.length==0){\r
- vm.server_rtn.warning_block=true;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_host_leastone');\r
- return;\r
- }\r
-\r
- vm.server_rtn.warning_block=false;\r
- vm.server_rtn.info_block=true;\r
-\r
- vm.customRouteInfo.serviceName=$.trim(vm.customRouteInfo.serviceName);\r
- \r
- var servers=[];\r
- for(var i=0;i<vm.customRouteInfo.servers.length;i++){\r
- var server={ip:vm.customRouteInfo.servers[i].ip,port:vm.customRouteInfo.servers[i].port,weight: 0};\r
- servers.push(server);\r
- }\r
-\r
- var customRouteUrl=vm.customRouteInfo.url=="/"?"":vm.customRouteInfo.url;\r
- var data= JSON.stringify({\r
- "serviceName": vm.customRouteInfo.serviceName,\r
- "url": customRouteUrl,\r
- "control":vm.customRouteInfo.control,\r
- "status":vm.customRouteInfo.status,\r
- "servers": servers\r
- });\r
-\r
- if(vm.routeDlgInfo.saveType=="add")\r
- {\r
-\r
- //Determine whether to repeat\r
- for(var i=0;i<vm.customRouteArray.length;i++){\r
- \r
- if(vm.customRouteArray[i].serviceName==vm.customRouteInfo.serviceName)\r
- {\r
- vm.server_rtn.warning_block=true;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_service_repeat',[vm.customRouteInfo.serviceName]);\r
- return;\r
- }\r
- \r
- }\r
-\r
- //save \r
- \r
- \r
- $.ajax({\r
- "type": 'POST',\r
- "url": vm.$customRouteInstanceUrl,\r
- "data" : data,\r
- "dataType": "json",\r
- "contentType":"application/json",\r
- success: function (resp) { \r
- \r
- vm.customRouteArray.push(JSON.parse(data)); \r
- routeUtil.groupRoute(vm.customRouteArray);\r
-\r
-\r
- routeUtil.refreshRoute(); \r
- $('#customrouteDlg').modal('hide'); \r
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_custom'),$.i18n.prop('org_openo_msb_route_service_save'),"success"); \r
- },\r
- error: function(XMLHttpRequest, textStatus, errorThrown) {\r
- \r
- vm.server_rtn.warning_block=true;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_service_save')+textStatus+":"+errorThrown; \r
- \r
- }\r
- });\r
- }\r
- else{ //update\r
-\r
- //Determine whether to repeat\r
- if(vm.customRouteInfo.serviceName!=vm.customRouteInfo.oldServiceName) //Has been modified service name\r
- {\r
- for(var i=0;i<vm.customRouteArray.length;i++){\r
- \r
- if(vm.customRouteArray[i].serviceName==vm.customRouteInfo.serviceName)\r
- {\r
- vm.server_rtn.warning_block=true;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_service_repeat',[vm.customRouteInfo.serviceName]);\r
- return;\r
- }\r
- \r
- }\r
- }\r
-\r
- var url= vm.$customRouteInstanceUrl+"?serviceName="+vm.customRouteInfo.oldServiceName;\r
- \r
- $.ajax({\r
- "type": 'PUT',\r
- "url": url,\r
- "data" :data,\r
- "dataType": "json",\r
- "contentType":"application/json",\r
- success: function (resp) { \r
- \r
- for(var i=0;i<vm.customRouteArray.length;i++){\r
- if(vm.customRouteArray[i].serviceName == vm.customRouteInfo.oldServiceName)\r
- {\r
- vm.customRouteArray[i].serviceName=vm.customRouteInfo.serviceName; \r
- vm.customRouteArray[i].url=customRouteUrl;\r
- vm.customRouteArray[i].servers=vm.customRouteInfo.servers;\r
- break;\r
- }\r
- }\r
- \r
- routeUtil.groupRoute(vm.customRouteArray);\r
- \r
-\r
-\r
- $('#customrouteDlg').modal('hide'); \r
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_custom'),$.i18n.prop('org_openo_msb_route_service_update'),"success"); \r
- \r
-\r
- },\r
- error: function(XMLHttpRequest, textStatus, errorThrown) {\r
- \r
- vm.server_rtn.warning_block=true;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info=$.i18n.prop('org_openo_msb_route_err_service_save')+textStatus+":"+errorThrown; \r
- \r
- }\r
- });\r
-\r
- \r
- }\r
- },\r
- $saveApiRoute : function() {\r
-\r
- success.hide();\r
- error.hide();\r
- if (form.valid() == false) {\r
- return false;\r
- }\r
-\r
- if(vm.apiRouteInfo.servers.length==0){\r
- vm.server_rtn.warning_block=true;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_host_leastone');\r
- return;\r
- }\r
-\r
- vm.server_rtn.warning_block=false;\r
- vm.server_rtn.info_block=true;\r
-\r
- \r
- var apiRouteUrl=vm.apiRouteInfo.url=="/"?"":vm.apiRouteInfo.url;\r
- var apiJson=vm.apiRouteInfo.apiJsonType=="1"?vm.apiJson.custom:vm.apiJson.local; \r
-\r
- var servers=[];\r
- for(var i=0;i<vm.apiRouteInfo.servers.length;i++){\r
- var server={ip:vm.apiRouteInfo.servers[i].ip,port:vm.apiRouteInfo.servers[i].port,weight: 0};\r
- servers.push(server);\r
- }\r
-\r
-\r
- var data= JSON.stringify({\r
- "serviceName": vm.apiRouteInfo.serviceName,\r
- "version": vm.apiRouteInfo.version,\r
- "url": apiRouteUrl,\r
- "metricsUrl":vm.apiRouteInfo.metricsUrl,\r
- "apiJson": apiJson,\r
- "apiJsonType":vm.apiRouteInfo.apiJsonType,\r
- "control":vm.apiRouteInfo.control,\r
- "status":vm.apiRouteInfo.status,\r
- "servers": servers\r
- \r
- });\r
-\r
- if(vm.routeDlgInfo.saveType=="add")\r
- {\r
-\r
- //Determine whether to repeat\r
- for(var i=0;i<vm.apiRouteArray.length;i++){\r
- \r
- if(vm.apiRouteArray[i].serviceName==vm.apiRouteInfo.serviceName \r
- && vm.apiRouteArray[i].version==vm.apiRouteInfo.version )\r
- {\r
- vm.server_rtn.warning_block=true;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info=$.i18n.prop('org_openo_msb_route_err_api_repeat',[vm.apiRouteInfo.serviceName],[vm.apiRouteInfo.version]);\r
- return;\r
- }\r
- \r
- }\r
-\r
- //save\r
- \r
- \r
- $.ajax({\r
- "type": 'POST',\r
- "url": vm.$apiRouteUrl,\r
- "data" : data,\r
- "dataType": "json",\r
- "contentType":"application/json",\r
- success: function (resp) { \r
- \r
- vm.apiRouteArray.push(JSON.parse(data)); \r
- vm.apiRouteArray.sort(function(a,b){return a.serviceName>b.serviceName?1:-1}); \r
-\r
- routeUtil.refreshRoute(); \r
- $('#routeDlg').modal('hide'); \r
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_api'),$.i18n.prop('org_openo_msb_route_service_save'),"success"); \r
- },\r
- error: function(XMLHttpRequest, textStatus, errorThrown) {\r
- \r
- vm.server_rtn.warning_block=true;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_service_save')+textStatus+":"+errorThrown; \r
- \r
- }\r
- });\r
- }\r
- else{ //update\r
- \r
-\r
- //Determine whether to repeat\r
- if(vm.apiRouteInfo.serviceName!=vm.apiRouteInfo.oldServiceName || \r
- vm.apiRouteInfo.version!=vm.apiRouteInfo.oldVersion) //Has been modified service name\r
- {\r
- for(var i=0;i<vm.apiRouteArray.length;i++){\r
- \r
- if(vm.apiRouteArray[i].serviceName==vm.apiRouteInfo.serviceName \r
- && vm.apiRouteArray[i].version==vm.apiRouteInfo.version )\r
- {\r
- vm.server_rtn.warning_block=true;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_api_repeat',[vm.apiRouteInfo.serviceName],[vm.apiRouteInfo.version]);\r
- return;\r
- }\r
- \r
- }\r
- }\r
-\r
- var url= vm.$apiRouteInstanceUrl;\r
- var version=vm.apiRouteInfo.oldVersion==""?"null":vm.apiRouteInfo.oldVersion;\r
- url=url.replace("{serviceName}",vm.apiRouteInfo.oldServiceName).replace("{version}",version);\r
-\r
-\r
- $.ajax({\r
- "type": 'PUT',\r
- "url": url,\r
- "data" :data,\r
- "dataType": "json",\r
- "contentType":"application/json",\r
- success: function (resp) { \r
- \r
- for(var i=0;i<vm.apiRouteArray.length;i++){\r
- if(vm.apiRouteArray[i].serviceName == vm.apiRouteInfo.oldServiceName && \r
- vm.apiRouteArray[i].version == vm.apiRouteInfo.oldVersion)\r
- {\r
- //vm.apiRouteArray[i] = JSON.parse(data);\r
- vm.apiRouteArray[i].serviceName=vm.apiRouteInfo.serviceName;\r
- vm.apiRouteArray[i].version= vm.apiRouteInfo.version;\r
- vm.apiRouteArray[i].url=apiRouteUrl;\r
- vm.apiRouteArray[i].metricsUrl=vm.apiRouteInfo.metricsUrl;\r
- vm.apiRouteArray[i].apiJson=apiJson;\r
- vm.apiRouteArray[i].apiJsonType=vm.apiRouteInfo.apiJsonType;\r
-\r
- vm.apiRouteArray[i].servers=vm.apiRouteInfo.servers;\r
-\r
- \r
- break;\r
- }\r
- }\r
- \r
-\r
-\r
- $('#routeDlg').modal('hide'); \r
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_api'),$.i18n.prop('org_openo_msb_route_service_update'),"success"); \r
- \r
-\r
- },\r
- error: function(XMLHttpRequest, textStatus, errorThrown) {\r
- \r
- vm.server_rtn.warning_block=true;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_service_save')+textStatus+":"+errorThrown; \r
- \r
- }\r
- });\r
-\r
- \r
- }\r
- },\r
- $savemsbRoute : function() {\r
-\r
- msbsuccess.hide();\r
- msberror.hide();\r
- if (msbform.valid() == false) {\r
- return false;\r
- }\r
-\r
- if(vm.msbRouteInfo.nodes.length==0){\r
- vm.server_rtn.warning_block=true;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info=$.i18n.prop('org_openo_msb_route_err_host_leastone');\r
- return;\r
- }\r
-\r
- if(vm.msbRouteInfo.visualRangeArray.length==0){\r
- vm.server_rtn.warning_block=true;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_visualrange_empty');\r
- return;\r
- }\r
-\r
- vm.server_rtn.warning_block=false;\r
- vm.server_rtn.info_block=true;\r
-\r
- var msbUrl=vm.msbRouteInfo.url=="/"?"":vm.msbRouteInfo.url;\r
- \r
-\r
- var nodes=[];\r
- for(var i=0;i<vm.msbRouteInfo.nodes.length;i++){\r
- var node={ip:vm.msbRouteInfo.nodes[i].ip,port:vm.msbRouteInfo.nodes[i].port,ttl: vm.msbRouteInfo.nodes[i].ttl};\r
- nodes.push(node);\r
- }\r
-\r
- var data= JSON.stringify({\r
- "serviceName": vm.msbRouteInfo.serviceName,\r
- "version": vm.msbRouteInfo.version,\r
- "url": msbUrl, \r
- "nodes": nodes,\r
- "protocol":vm.msbRouteInfo.protocol,\r
- "visualRange":vm.msbRouteInfo.visualRangeArray.join("|")\r
- });\r
-\r
- if(vm.routeDlgInfo.saveType=="add")\r
- {\r
-\r
- //Determine whether to repeat\r
- for(var i=0;i<vm.msbRouteArray.length;i++){\r
- \r
- if(vm.msbRouteArray[i].serviceName==vm.msbRouteInfo.serviceName \r
- && vm.msbRouteArray[i].version==vm.msbRouteInfo.version )\r
- {\r
- vm.server_rtn.warning_block=true;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_api_repeat',[vm.msbRouteInfo.serviceName],[vm.msbRouteInfo.version]);\r
- }\r
- \r
- }\r
-\r
- //save\r
- \r
- \r
- $.ajax({\r
- "type": 'POST',\r
- "url": vm.$msbRouteUrl,\r
- "data" : data,\r
- "dataType": "json",\r
- "contentType":"application/json",\r
- success: function (resp) { \r
- \r
- // vm.msbRouteArray.push(JSON.parse(data)); \r
- table.destroy();\r
- vm.initMSBRoute();\r
-\r
- // table=$('#msbTable').DataTable({\r
- \r
- // "oLanguage": vm.$dataTableLanguage,\r
- // columnDefs: [ {\r
- // targets: [ 7 ],\r
- // "searchable": false,\r
- // "bSortable": false,\r
- // }]\r
- // });\r
- \r
- $('#msbrouteDlg').modal('hide'); \r
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_msb'),$.i18n.prop('org_openo_msb_route_service_save'),"success"); \r
- },\r
- error: function(XMLHttpRequest, textStatus, errorThrown) {\r
- \r
- vm.server_rtn.warning_block=true;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_service_save')+XMLHttpRequest.responseText; \r
- \r
- }\r
- });\r
- }\r
- else{ //update\r
- \r
-\r
- //Determine whether to repeat\r
- if(vm.msbRouteInfo.serviceName!=vm.msbRouteInfo.oldServiceName || \r
- vm.msbRouteInfo.version!=vm.msbRouteInfo.oldVersion) //Has been modified service name or version\r
- {\r
- for(var i=0;i<vm.msbRouteArray.length;i++){\r
- \r
- if(vm.msbRouteArray[i].serviceName==vm.msbRouteInfo.serviceName \r
- && vm.msbRouteArray[i].version==vm.msbRouteInfo.version )\r
- {\r
- vm.server_rtn.warning_block=true;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_api_repeat',[vm.msbRouteInfo.serviceName],[vm.msbRouteInfo.version]);\r
- return;\r
- }\r
- \r
- }\r
- }\r
-\r
- var url= vm.$msbRouteInstanceUrl;\r
- var version=vm.msbRouteInfo.oldVersion==""?"null":vm.msbRouteInfo.oldVersion;\r
- var serviceName2= vm.msbRouteInfo.oldServiceName.replace(/\//g,"*");\r
- url=url.replace("{serviceName}",serviceName2).replace("{version}",version);\r
-\r
-\r
- $.ajax({\r
- "type": 'PUT',\r
- "url": url,\r
- "data" :data,\r
- "dataType": "json",\r
- "contentType":"application/json",\r
- success: function (resp) { \r
- \r
- for(var i=0;i<vm.msbRouteArray.length;i++){\r
- if(vm.msbRouteArray[i].serviceName == vm.msbRouteInfo.oldServiceName && \r
- vm.msbRouteArray[i].version == vm.msbRouteInfo.oldVersion)\r
- {\r
- //vm.apiRouteArray[i] = JSON.parse(data);\r
- vm.msbRouteArray[i].serviceName=vm.msbRouteInfo.serviceName;\r
- vm.msbRouteArray[i].version= vm.msbRouteInfo.version;\r
- vm.msbRouteArray[i].url=msbUrl;\r
- vm.msbRouteArray[i].protocol=vm.msbRouteInfo.protocol;\r
- vm.msbRouteArray[i].visualRange=vm.msbRouteInfo.visualRange;\r
- vm.msbRouteArray[i].visualRangeArray=vm.msbRouteInfo.visualRangeArray;\r
- vm.msbRouteArray[i].nodes=nodes;\r
- \r
- break;\r
- }\r
- }\r
- \r
-\r
-\r
- $('#msbrouteDlg').modal('hide'); \r
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_msb'),$.i18n.prop('org_openo_msb_route_service_update'),"success"); \r
- \r
-\r
- },\r
- error: function(XMLHttpRequest, textStatus, errorThrown) {\r
- \r
- vm.server_rtn.warning_block=true;\r
- vm.server_rtn.info_block=false; \r
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_service_save')+XMLHttpRequest.responseText; \r
- \r
- }\r
- });\r
-\r
- \r
- }\r
- },\r
-\r
- updateApiRouteStatus:function(serviceName,version,status){\r
-\r
- var url= vm.$apiRouteStatusUrl;\r
- var version2=version==""?"null":version;\r
- url=url.replace("{serviceName}",serviceName).replace("{version}",version2).replace("{status}",status);\r
- \r
- $.ajax({\r
- "type": 'PUT',\r
- "url": url,\r
- "dataType": "json",\r
- success: function (resp) { \r
- \r
- \r
- for(var i=0;i<vm.apiRouteArray.length;i++){\r
- if(vm.apiRouteArray[i].serviceName == serviceName && \r
- vm.apiRouteArray[i].version == version){\r
- vm.apiRouteArray[i].status=status;\r
- break;\r
- }\r
- } \r
-\r
- if(status=='1') \r
- {\r
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_api'),$.i18n.prop('org_openo_msb_route_status_enable'),"success");\r
- }\r
- else{\r
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_api'),$.i18n.prop('org_openo_msb_route_status_disable'),"success");\r
- }\r
- \r
-\r
- \r
- },\r
- error: function(XMLHttpRequest, textStatus, errorThrown) {\r
- \r
- bootbox.alert($.i18n.prop('org_openo_msb_route_err_status')+textStatus+":"+errorThrown); \r
- \r
- }\r
- });\r
-\r
- },\r
- updateiuiRouteStatus:function(serviceName,status){\r
-\r
- var url= vm.$iuiRouteStatusUrl;\r
- \r
- url=url.replace("{serviceName}",serviceName).replace("{status}",status);\r
- \r
- $.ajax({\r
- "type": 'PUT',\r
- "url": url,\r
- "dataType": "json",\r
- success: function (resp) { \r
- \r
- \r
- for(var i=0;i<vm.iuiRouteArray.length;i++){\r
- if(vm.iuiRouteArray[i].serviceName == serviceName){\r
- vm.iuiRouteArray[i].status=status;\r
- break;\r
- }\r
- } \r
-\r
- if(status=='1') \r
- {\r
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_iui'),$.i18n.prop('org_openo_msb_route_status_enable'),"success");\r
- }\r
- else{\r
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_iui'),$.i18n.prop('org_openo_msb_route_status_disable'),"success");\r
- }\r
- \r
- \r
- },\r
- error: function(XMLHttpRequest, textStatus, errorThrown) {\r
- \r
- bootbox.alert($.i18n.prop('org_openo_msb_route_err_status')+textStatus+":"+errorThrown); \r
- \r
- }\r
- });\r
-\r
- },\r
- updatecustomRouteStatus:function(serviceName,status){\r
-\r
- \r
- var url= vm.$customRouteStatusUrl+"?serviceName="+serviceName+"&status="+status;\r
-\r
- \r
- $.ajax({\r
- "type": 'PUT',\r
- "url": url,\r
- "dataType": "json",\r
- success: function (resp) { \r
- \r
- \r
- for(var i=0;i<vm.customRouteArray.length;i++){\r
- if(vm.customRouteArray[i].serviceName == serviceName){\r
- vm.customRouteArray[i].status=status;\r
- break;\r
- }\r
- } \r
-\r
-\r
- routeUtil.groupRoute(vm.customRouteArray);\r
-\r
- if(status=='1') \r
- {\r
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_custom'),$.i18n.prop('org_openo_msb_route_status_enable'),"success");\r
- }\r
- else{\r
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_custom'),$.i18n.prop('org_openo_msb_route_status_disable'),"success");\r
- }\r
- \r
-\r
- \r
- },\r
- error: function(XMLHttpRequest, textStatus, errorThrown) {\r
- \r
- bootbox.alert($.i18n.prop('org_openo_msb_route_err_status')+textStatus+":"+errorThrown); \r
- \r
- }\r
- });\r
-\r
- },\r
- updateApiRoute:function(apiRouteInfo,type){\r
- \r
-\r
- \r
-\r
- $('#metricsFullurl').collapse('hide');\r
- $('#apiJsonFullurl').collapse('hide');\r
- $('#apiTab a:first').tab('show');\r
- \r
- vm.apiRouteInfo.serviceName=apiRouteInfo.serviceName;\r
- vm.apiRouteInfo.oldServiceName=apiRouteInfo.serviceName;\r
- vm.apiRouteInfo.version= apiRouteInfo.version;\r
- vm.apiRouteInfo.oldVersion=apiRouteInfo.version;\r
- vm.apiRouteInfo.url=apiRouteInfo.url==""?"/":apiRouteInfo.url;\r
- vm.apiRouteInfo.metricsUrl=apiRouteInfo.metricsUrl;\r
- vm.apiRouteInfo.apiJson=apiRouteInfo.apiJson;\r
- vm.apiRouteInfo.apiJsonType=apiRouteInfo.apiJsonType;\r
- vm.apiRouteInfo.control=apiRouteInfo.control;\r
- vm.apiRouteInfo.status= apiRouteInfo.status;\r
-\r
- if(vm.apiRouteInfo.apiJsonType=="1"){\r
- vm.apiJson.custom=apiRouteInfo.apiJson;\r
- }\r
- else{\r
- vm.apiJson.local=apiRouteInfo.apiJson;\r
- vm.apiJson.custom="/swagger.json";\r
- $("#apiJsonSelect").val(apiRouteInfo.apiJson);\r
- }\r
-\r
- vm.apiRouteInfo.server="";\r
- vm.apiRouteInfo.servers=[];\r
- vm.apiRouteInfo.servers=apiRouteInfo.servers;\r
-\r
- \r
-\r
-\r
- // vm.apiRouteInfo= jQuery.extend({},apiRouteInfo);\r
- \r
- vm.routeDlgInfo.saveType = type;\r
- if(type=='update'){\r
- vm.routeDlgInfo.titleName=$.i18n.prop('org_openo_msb_route_title_edit_api'); \r
- }\r
- else if(type=='view'){\r
- vm.routeDlgInfo.titleName=$.i18n.prop('org_openo_msb_route_title_view_api'); \r
- }\r
- \r
- vm.server_rtn.warning_block=false;\r
- vm.server_rtn.info_block=false;\r
-\r
-\r
- $(".form-group").each(function () {\r
- $(this).removeClass('has-success');\r
- $(this).removeClass('has-error');\r
- $(this).find(".help-block[id]").remove();\r
- $(this).find(".item-tip").addClass("item-tip-focus");\r
- $(this).find(".form-tip").removeClass('form-input-focus');\r
- });\r
-\r
- $("#routeDlg").modal("show");\r
- },\r
- updateiuiRoute:function(iuiRouteInfo,type){\r
- \r
- \r
- vm.iuiRouteInfo.serviceName=iuiRouteInfo.serviceName;\r
- vm.iuiRouteInfo.oldServiceName=iuiRouteInfo.serviceName;\r
- vm.iuiRouteInfo.url=iuiRouteInfo.url==""?"/":iuiRouteInfo.url;\r
- vm.iuiRouteInfo.server="";\r
- vm.iuiRouteInfo.servers=[];\r
- vm.iuiRouteInfo.servers=iuiRouteInfo.servers;\r
- vm.iuiRouteInfo.control=iuiRouteInfo.control;\r
- vm.iuiRouteInfo.status=iuiRouteInfo.status;\r
-\r
-\r
- // vm.apiRouteInfo= jQuery.extend({},apiRouteInfo);\r
- \r
- \r
- vm.routeDlgInfo.saveType = type;\r
- if(type=='update'){\r
- vm.routeDlgInfo.titleName=$.i18n.prop('org_openo_msb_route_title_edit_iui'); \r
- }\r
- else if(type=='view'){\r
- vm.routeDlgInfo.titleName=$.i18n.prop('org_openo_msb_route_title_view_iui'); \r
- }\r
-\r
- vm.server_rtn.warning_block=false;\r
- vm.server_rtn.info_block=false;\r
-\r
-\r
- $(".form-group").each(function () {\r
- $(this).removeClass('has-success');\r
- $(this).removeClass('has-error');\r
- $(this).find(".help-block[id]").remove();\r
- $(this).find(".item-tip").addClass("item-tip-focus");\r
- $(this).find(".form-tip").removeClass('form-input-focus');\r
- });\r
-\r
- $("#iuirouteDlg").modal("show");\r
- },\r
- updatecustomRoute:function(customRouteInfo,type){\r
- \r
- \r
- vm.customRouteInfo.serviceName=customRouteInfo.serviceName;\r
- vm.customRouteInfo.oldServiceName=customRouteInfo.serviceName;\r
- \r
- vm.customRouteInfo.url=customRouteInfo.url==""?"/":customRouteInfo.url;\r
- vm.customRouteInfo.server="";\r
- vm.customRouteInfo.servers=[];\r
- vm.customRouteInfo.servers=customRouteInfo.servers;\r
- vm.customRouteInfo.control=customRouteInfo.control;\r
- vm.customRouteInfo.status=customRouteInfo.status;\r
-\r
- // vm.apiRouteInfo= jQuery.extend({},apiRouteInfo);\r
- \r
- vm.routeDlgInfo.saveType = type;\r
- if(type=='update'){\r
- vm.routeDlgInfo.titleName=$.i18n.prop('org_openo_msb_route_title_edit_custom');\r
- }\r
- else if(type=='view'){\r
- vm.routeDlgInfo.titleName=$.i18n.prop('org_openo_msb_route_title_view_custom');\r
- }\r
- vm.server_rtn.warning_block=false;\r
- vm.server_rtn.info_block=false;\r
-\r
-\r
- $(".form-group").each(function () {\r
- $(this).removeClass('has-success');\r
- $(this).removeClass('has-error');\r
- $(this).find(".help-block[id]").remove();\r
- $(this).find(".item-tip").addClass("item-tip-focus");\r
- $(this).find(".form-tip").removeClass('form-input-focus');\r
- });\r
-\r
- $("#customrouteDlg").modal("show");\r
- },\r
- updatemsbRoute:function(msbRouteInfo){\r
- \r
- vm.msbRouteInfo.serviceName=msbRouteInfo.serviceName;\r
- vm.msbRouteInfo.oldServiceName=msbRouteInfo.serviceName;\r
- vm.msbRouteInfo.version= msbRouteInfo.version;\r
- vm.msbRouteInfo.oldVersion= msbRouteInfo.version\r
- vm.msbRouteInfo.url=msbRouteInfo.url==""?"/":msbRouteInfo.url;\r
- vm.msbRouteInfo.protocol=msbRouteInfo.protocol;\r
- vm.msbRouteInfo.visualRange=msbRouteInfo.visualRange;\r
- vm.msbRouteInfo.visualRangeArray=msbRouteInfo.visualRange.split("|");\r
- vm.msbRouteInfo.nodes=msbRouteInfo.nodes;\r
- vm.msbRouteInfo.newHost="";\r
- vm.msbRouteInfo.newttl="";\r
- \r
- routeUtil.changeTargetServiceUrl();\r
- \r
- vm.routeDlgInfo.saveType = "update";\r
- vm.routeDlgInfo.titleName=$.i18n.prop('org_openo_msb_route_title_edit_msb');\r
- vm.server_rtn.warning_block=false;\r
- vm.server_rtn.info_block=false;\r
-\r
-\r
- $(".form-group").each(function () {\r
- $(this).removeClass('has-success');\r
- $(this).removeClass('has-error');\r
- $(this).find(".help-block[id]").remove();\r
- $(this).find(".item-tip").addClass("item-tip-focus");\r
- $(this).find(".form-tip").removeClass('form-input-focus');\r
- });\r
-\r
- $("#msbrouteDlg").modal("show");\r
- },\r
- delApiRoute:function(serviceName,version){\r
- bootbox.confirm($.i18n.prop('org_openo_msb_route_err_service_del_ask',[serviceName],[version]),function(result){\r
- if(result){\r
- var url= vm.$apiRouteInstanceUrl;\r
- var version2=version==""?"null":version;\r
- url=url.replace("{serviceName}",serviceName).replace("{version}",version2);\r
- \r
- $.ajax({\r
- "type": 'DELETE',\r
- "url": url,\r
- "dataType": "json",\r
- success: function (resp) { \r
- \r
- for(var i=0;i<vm.apiRouteArray.length;i++){\r
- if(vm.apiRouteArray[i].serviceName == serviceName && \r
- vm.apiRouteArray[i].version == version){\r
- vm.apiRouteArray.splice(i, 1);\r
- break;\r
- }\r
- } \r
-\r
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_api'),$.i18n.prop('org_openo_msb_route_service_del_success'),"success");\r
- \r
- },\r
- error: function(XMLHttpRequest, textStatus, errorThrown) {\r
- \r
- bootbox.alert($.i18n.prop('org_openo_msb_route_service_del_fail')+textStatus+":"+errorThrown); \r
- \r
- }\r
- });\r
-\r
-\r
- }\r
- \r
- });\r
- \r
- },\r
- deliuiRoute:function(serviceName){\r
- bootbox.confirm($.i18n.prop('org_openo_msb_route_err_service2_del_ask',[serviceName]),function(result){\r
- if(result){\r
- var url= vm.$iuiRouteInstanceUrl;\r
- \r
- url=url.replace("{serviceName}",serviceName);\r
- \r
- $.ajax({\r
- "type": 'DELETE',\r
- "url": url,\r
- "dataType": "json",\r
- success: function (resp) { \r
- \r
- for(var i=0;i<vm.iuiRouteArray.length;i++){\r
- if(vm.iuiRouteArray[i].serviceName == serviceName){\r
- vm.iuiRouteArray.splice(i, 1);\r
- break;\r
- }\r
- } \r
-\r
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_iui'),$.i18n.prop('org_openo_msb_route_service_del_success'),"success");\r
- \r
- \r
- },\r
- error: function(XMLHttpRequest, textStatus, errorThrown) {\r
- \r
- bootbox.alert($.i18n.prop('org_openo_msb_route_service_del_fail')+textStatus+":"+errorThrown); \r
- \r
- }\r
- });\r
-\r
-\r
- }\r
- \r
- });\r
- \r
- },\r
- delcustomRoute:function(serviceName){\r
- bootbox.confirm($.i18n.prop('org_openo_msb_route_err_service2_del_ask',[serviceName]),function(result){\r
- if(result){\r
- var url= vm.$customRouteInstanceUrl+"?serviceName="+serviceName;\r
- \r
- $.ajax({\r
- "type": 'DELETE',\r
- "url": url,\r
- "dataType": "json",\r
- success: function (resp) { \r
- \r
- for(var i=0;i<vm.customRouteArray.length;i++){\r
- if(vm.customRouteArray[i].serviceName == serviceName){\r
- vm.customRouteArray.splice(i, 1);\r
- break;\r
- }\r
- }\r
-\r
- routeUtil.groupRoute(vm.customRouteArray);\r
- \r
-\r
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_custom'),$.i18n.prop('org_openo_msb_route_service_del_success'),"success");\r
- \r
- },\r
- error: function(XMLHttpRequest, textStatus, errorThrown) {\r
- \r
- bootbox.alert($.i18n.prop('org_openo_msb_route_service_del_fail')+textStatus+":"+errorThrown); \r
- \r
- }\r
- });\r
-\r
-\r
- }\r
- \r
- });\r
- \r
- },\r
- delmsbRoute:function(serviceName,version,obj){\r
- bootbox.confirm($.i18n.prop('org_openo_msb_route_err_service_del_ask',[serviceName],[version]),function(result){\r
- if(result){\r
- var url= vm.$msbRouteInstanceUrl;\r
- var version2=version==""?"null":version;\r
- var serviceName2= serviceName.replace(/\//g,"*");\r
- url=url.replace("{serviceName}",serviceName2).replace("{version}",version2);\r
- \r
- $.ajax({\r
- "type": 'DELETE',\r
- "url": url,\r
- "dataType": "json",\r
- success: function (resp) { \r
- $(obj).parent().parent().addClass('selected');\r
- \r
- for(var i=0;i<vm.msbRouteArray.length;i++){\r
- if(vm.msbRouteArray[i].serviceName == serviceName &&\r
- vm.msbRouteArray[i].version==version ){\r
- vm.msbRouteArray.splice(i, 1);\r
- break;\r
- }\r
- }\r
-\r
- table.row('.selected').remove().draw( false );\r
-\r
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_msb'),$.i18n.prop('org_openo_msb_route_service_del_success'),"success");\r
- \r
- \r
- },\r
- error: function(XMLHttpRequest, textStatus, errorThrown) {\r
- \r
- bootbox.alert($.i18n.prop('org_openo_msb_route_service_del_fail')+XMLHttpRequest.responseText); \r
- \r
- }\r
- \r
- \r
- });\r
-\r
-\r
- }\r
- \r
- });\r
- \r
- },\r
- exportServices:function(){\r
- var url=apiBasePath+"/apiRoute/export";\r
- window.open(url); \r
-\r
- },\r
- gotoTarget:function(route,type){\r
- vm.selectedRoute=route;\r
- vm.selectedRouteType=type;\r
-\r
- if(type=="api")\r
- {\r
- vm.gotoRestDoc(); \r
- }\r
- else if(type=="iui"){\r
- vm.gotoIUI(); \r
- }\r
- \r
- },\r
- gotoRestDoc:function(){\r
- vm.routeTargetTitle=vm.selectedRoute.serviceName+"-"+$.i18n.prop("org_openo_msb_route_content_title"); \r
-\r
- var version=vm.selectedRoute.version==""?"":"/"+vm.selectedRoute.version; \r
-\r
- if(vm.selectedRoute.apiJsonType=="1")\r
- { \r
- \r
- var sourceUrl= "/apijson/"+vm.selectedRoute.serviceName+version;\r
- }\r
- else{\r
- var sourceUrl= iuiBasePath+"/ext/initSwaggerJson/"+vm.selectedRoute.apiJson; \r
- }\r
- //Local json data read from the real API service service address parameter\r
- var url=iuiBasePath+"/api-doc/index.html?url="+sourceUrl+"&api=/api/"+vm.selectedRoute.serviceName+version;\r
-\r
- $('#msbSubPage').attr("src",url); \r
- vm.apiIframeUrl=url; \r
- },\r
- gotoJVM:function(){\r
- vm.routeTargetTitle=vm.selectedRoute.serviceName+"-"+$.i18n.prop('org_openo_msb_route_metric_content_title'); \r
- \r
- var version=vm.selectedRoute.version==""?"":"/"+vm.selectedRoute.version; \r
-\r
- var sourceUrl= "/admin/"+vm.selectedRoute.serviceName+version;\r
- \r
- \r
- var url=iuiBasePath+"/metrics/index.html?url="+sourceUrl;\r
-\r
- $('#msbSubPage').attr("src",url); \r
- },\r
- gotoIUI:function(){\r
- vm.routeTargetTitle=vm.selectedRoute.serviceName+"-"+$.i18n.prop('org_openo_msb_route_iui_content_title'); \r
- var url= "/iui/"+vm.selectedRoute.serviceName+"/";\r
- $('#msbSubPage').attr("src",url); \r
- vm.iuiIframeUrl=url; \r
- },\r
- initIUIfori18n:function(){\r
- vm.routeTargetTitle=$.i18n.prop("org_openo_msb_route_content_title"); \r
- vm.showAPITypeName=[$.i18n.prop("org_openo_msb_route_swagger_type_predefined"),$.i18n.prop("org_openo_msb_route_swagger_type_custominput")];\r
- vm.dataTableLanguage={\r
- "sProcessing": "<img src='../img/loading-spinner-grey.gif'/><span> Loadding...</span>", \r
- "sLengthMenu": $.i18n.prop("org_openo_msb_route-table-sLengthMenu"),\r
- "sZeroRecords": $.i18n.prop("org_openo_msb_route-table-sZeroRecords"),\r
- "sInfo": "<span class='seperator'> </span>" + $.i18n.prop("org_openo_msb_route-table-sInfo"),\r
- "sInfoEmpty": $.i18n.prop("org_openo_msb_route-table-sInfoEmpty"),\r
- "sGroupActions": $.i18n.prop("org_openo_msb_route-table-sGroupActions"),\r
- "sAjaxRequestGeneralError": $.i18n.prop("org_openo_msb_route-table-sAjaxRequestGeneralError"),\r
- "sEmptyTable": $.i18n.prop("org_openo_msb_route-table-sEmptyTable"),\r
- "oPaginate": {\r
- "sPrevious": $.i18n.prop("org_openo_msb_route-table-sPrevious"),\r
- "sNext": $.i18n.prop("org_openo_msb_route-table-sNext"),\r
- "sPage": $.i18n.prop("org_openo_msb_route-table-sPage"),\r
- "sPageOf": $.i18n.prop("org_openo_msb_route-table-sPageOf")\r
- },\r
- "sSearch": $.i18n.prop("org_openo_msb_route-table-search"),\r
- "sInfoFiltered": $.i18n.prop("org_openo_msb_route-table-infofilter") \r
- }; \r
-\r
- }\r
- \r
- \r
-\r
- });\r
-\r
-\r
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
+var table;
+var vm = avalon
+ .define({
+ $id : "routeController",
+ targetServiceUrl:"",
+ targetFullServiceUrl:"",
+ iuiRootPath:iuiRootPath,
+ apiRootPath:apiRootPath,
+ apiIframeUrl:"",
+ iuiIframeUrl:"",
+ boxVisible:true,
+ routeTargetTitle:$.i18n.prop("org_openo_msb_route_content_title"),
+ server_rtn:{
+ info_block:false,
+ warning_block:false,
+ rtn_info:""
+ },
+ showAPIType:"0",
+ showAPITypeName:[$.i18n.prop("org_openo_msb_route_swagger_type_predefined"),$.i18n.prop("org_openo_msb_route_swagger_type_custominput")],
+ $msbProtocol :["REST","UI","MQ","FTP","SNMP","TCP","UDP"],
+ $msbType:["UI","NAF","SAF"],
+ apiJson:{
+ local:"",
+ custom:""
+ },
+ setAPIType:function(type){
+ vm.apiRouteInfo.apiJsonType=type;
+ if(type==0){
+ vm.apiJson.local=vm.jsonApiSelectList.selectItems[0];
+ }
+
+ },
+ jsonApiSelectList: {
+ condName : "type",
+ component_type : 'select',
+ selectItems : []
+ },
+
+ dataTableLanguage: {
+ "sProcessing": "<img src='../img/loading-spinner-grey.gif'/><span> Loadding...</span>",
+ "sLengthMenu": $.i18n.prop("org_openo_msb_route-table-sLengthMenu"),
+ "sZeroRecords": $.i18n.prop("org_openo_msb_route-table-sZeroRecords"),
+ "sInfo": "<span class='seperator'> </span>" + $.i18n.prop("org_openo_msb_route-table-sInfo"),
+ "sInfoEmpty": $.i18n.prop("org_openo_msb_route-table-sInfoEmpty"),
+ "sGroupActions": $.i18n.prop("org_openo_msb_route-table-sGroupActions"),
+ "sAjaxRequestGeneralError": $.i18n.prop("org_openo_msb_route-table-sAjaxRequestGeneralError"),
+ "sEmptyTable": $.i18n.prop("org_openo_msb_route-table-sEmptyTable"),
+ "oPaginate": {
+ "sPrevious": $.i18n.prop("org_openo_msb_route-table-sPrevious"),
+ "sNext": $.i18n.prop("org_openo_msb_route-table-sNext"),
+ "sPage": $.i18n.prop("org_openo_msb_route-table-sPage"),
+ "sPageOf": $.i18n.prop("org_openo_msb_route-table-sPageOf")
+ },
+ "sSearch": $.i18n.prop("org_openo_msb_route-table-search"),
+ "sInfoFiltered": $.i18n.prop("org_openo_msb_route-table-infofilter")
+ },
+ $apiRouteUrl :apiBasePath+'/apiRoute',
+ $apiRouteInstanceUrl :apiBasePath+'/apiRoute/{serviceName}/version/{version}',
+ $apiRouteStatusUrl :apiBasePath+'/apiRoute/{serviceName}/version/{version}/status/{status}',
+ $apiDocsUrl :apiBasePath+'/apiRoute/apiDocs',
+ $apiGatewayPortUrl :apiBasePath+'/apiRoute/apiGatewayPort',
+ $discoverInfoUrl :apiBasePath+'/apiRoute/discoverInfo',
+ $iuiRouteUrl :apiBasePath+'/iuiRoute',
+ $iuiRouteInstanceUrl :apiBasePath+'/iuiRoute/{serviceName}',
+ $iuiRouteStatusUrl :apiBasePath+'/iuiRoute/{serviceName}/status/{status}',
+ $customRouteUrl :apiBasePath+'/customRoute/all',
+ $customRouteInstanceUrl :apiBasePath+'/customRoute/instance',
+ $customRouteStatusUrl :apiBasePath+'/customRoute/status',
+ $msbRouteUrl:apiBasePath+'/services',
+ $msbRouteInstanceUrl :apiBasePath+'/services/{serviceName}/version/{version}',
+ routeLoading:false,
+ apiRouteArray : [],
+ apiRouteInfo : {
+ oldServiceName:"",
+ serviceName : "",
+ oldVersion:"",
+ version : "",
+ status:"",
+ url:"",
+ metricsUrl:"/admin/metrics",
+ apiJson:"/swagger.json",
+ apiJsonType:"1",
+ control:"",
+ server:"",
+ servers: []
+ },
+ iuiRouteArray : [],
+ iuiRouteInfo : {
+ oldServiceName:"",
+ serviceName : "",
+ status:"",
+ url:"",
+ server:"",
+ control:"",
+ servers: []
+ },
+ customRouteArray : [],
+ customGroupRouteArray : [],
+ customRouteInfo : {
+ oldServiceName:"",
+ serviceName : "",
+ status:"",
+ url:"",
+ server:"",
+ control:"",
+ servers: []
+ },
+ msbRouteArray : [],
+ msbRouteInfo : {
+ oldServiceName:"",
+ oldVersion:"",
+ serviceName : "",
+ version:"",
+ status:"0",
+ nodes:[],
+ newHost:"",
+ newttl:0,
+ url:"",
+ protocol:"",
+ visualRange:"",
+ visualRangeArray:[]
+ },
+ discoverInfo:{
+ ip:"",
+ port:"",
+ enabled:false,
+ deployMode:""
+ },
+ selectedRoute:"",
+ selectedRouteType:"",
+ routeDlgInfo:{
+ titleName:"",
+ saveType:""
+ },
+ $initRoute : function() {
+
+
+
+ vm.routeLoading=true;
+
+ $.ajax({
+ "type": 'get',
+ async: false,
+ "url": vm.$discoverInfoUrl,
+ "dataType": "json",
+ success: function (resp) {
+
+ vm.discoverInfo = (resp==null)?"":resp;
+
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+ bootbox.alert("get discoverInfo fails:"+textStatus+":"+errorThrown);
+ }
+ });
+
+ $.ajax({
+ "type": 'get',
+ "url": vm.$apiRouteUrl,
+ "dataType": "json",
+ success: function (resp) {
+ vm.apiRouteArray = (resp==null)?[]:resp;
+ vm.apiRouteArray.sort(function(a,b){return a.serviceName>b.serviceName?1:-1});
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+ bootbox.alert("get api services fails:"+textStatus+":"+errorThrown);
+ return;
+ },
+ complete:function(){
+ vm.routeLoading=false;
+ routeUtil.refreshRoute();
+ $.ajax({
+ "type": 'get',
+ "url": vm.$apiGatewayPortUrl,
+ "dataType": "text",
+ success: function (resp) {
+
+ vm.targetServiceUrl=location.hostname+":"+resp;
+
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+ bootbox.alert("get apiGateway published port fails:"+textStatus+":"+errorThrown);
+ }
+ });
+ }
+ });
+
+
+
+ $.ajax({
+ "type": 'get',
+ "url": vm.$iuiRouteUrl,
+ "dataType": "json",
+ success: function (resp) {
+ vm.iuiRouteArray = (resp==null)?[]:resp;
+ vm.iuiRouteArray.sort(function(a,b){return a.serviceName>b.serviceName?1:-1});
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+ bootbox.alert("get iui services fails:"+textStatus+":"+errorThrown);
+ return;
+ },
+ complete:function(){
+ routeUtil.refreshRoute();
+ }
+ });
+
+
+
+ $.ajax({
+ "type": 'get',
+ "url": vm.$customRouteUrl,
+ "dataType": "json",
+ success: function (resp) {
+ vm.customRouteArray = (resp==null)?[]:resp;
+
+ if(resp!=null && resp.length>0)
+ {
+ routeUtil.groupRoute(resp);
+ }
+
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+ bootbox.alert("get custom services fails:"+textStatus+":"+errorThrown);
+ return;
+ },
+ complete:function(){
+ routeUtil.refreshRoute();
+ }
+ });
+
+
+ $.ajax({
+ "type": 'get',
+ "url": vm.$apiDocsUrl,
+ "dataType": "json",
+ success: function (resp) {
+ vm.jsonApiSelectList.selectItems= (resp==null)?[]:resp;
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+ bootbox.alert("get local apiDocs fails:"+textStatus+":"+errorThrown);
+ }
+ });
+
+
+
+ vm.initMSBRoute();
+
+
+
+
+ },
+ initMSBRoute:function(){
+ vm.initIUIfori18n();
+
+ $.ajax({
+ "type": 'get',
+ "url": vm.$msbRouteUrl,
+ "dataType": "json",
+ success: function (resp) {
+ vm.msbRouteArray = (resp==null)?[]:resp;
+
+ vm.msbRouteArray.sort(function(a,b){return a.serviceName>b.serviceName?1:-1});
+
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+ bootbox.alert("get msb services fails:"+XMLHttpRequest.responseText);
+ return;
+ },
+ complete:function(){
+
+ table=$('#msbTable').DataTable({
+
+ "oLanguage": vm.dataTableLanguage,
+ columnDefs: [ {
+ targets: [ 0,8 ],
+ "searchable": false,
+ "bSortable": false,
+ }],
+ "order": [[2, 'asc']]
+ });
+
+ }
+ });
+
+
+ },
+
+ clickDisplayGraphAlink: function () {
+ vm.boxVisible = !vm.boxVisible;
+ },
+ addmsbHost:function(){
+ if(vm.msbRouteInfo.newHost==""){
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop("org_openo_msb_route_err_host_empty");
+ return;
+ }
+
+ if(vm.msbRouteInfo.newttl==""){
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop("org_openo_msb_route_err_ttl_empty");
+ return;
+ }
+
+ var reg=/^(([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})$/
+ var ip,port;
+ if(!reg.test(vm.msbRouteInfo.newHost)){
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop("org_openo_msb_route_err_host_format");
+ return;
+ }
+ else{
+
+ var hosts=vm.msbRouteInfo.newHost.split(":");
+ ip=hosts[0];
+ port=hosts[1];
+ }
+
+ var reg_ttl=/^\d+$/
+
+ if(!reg_ttl.test(vm.msbRouteInfo.newttl)){
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop("org_openo_msb_route_err_ttl_format");
+ return;
+ }
+
+
+
+ // determine whether host repeated
+ for(var i=0;i<vm.msbRouteInfo.nodes.length;i++){
+
+ if(vm.msbRouteInfo.nodes[i].ip==ip && vm.msbRouteInfo.nodes[i].port==port )
+ {
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_host_repeat',[vm.msbRouteInfo.newHost]);
+ return;
+ }
+
+ }
+
+ vm.msbRouteInfo.nodes.push({"ip":ip,"port":port,"ttl":vm.msbRouteInfo.newttl});
+ vm.msbRouteInfo.newHost="";
+ vm.msbRouteInfo.newttl="";
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= "";
+
+
+ },
+ delmsbHost:function(ip,port){
+
+ bootbox.confirm( $.i18n.prop('org_openo_msb_route_err_host_del',[ip],[port]),function(result){
+ if(result){
+
+ for(var i=0;i<vm.msbRouteInfo.nodes.length;i++){
+ if(vm.msbRouteInfo.nodes[i].ip == ip && vm.msbRouteInfo.nodes[i].port == port){
+ vm.msbRouteInfo.nodes.splice(i, 1);
+ break;
+ }
+ }
+
+ }
+
+ });
+
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= "";
+
+ },
+ addapiHost:function(){
+ if(vm.apiRouteInfo.server==""){
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop("org_openo_msb_route_err_host_empty");
+ return;
+ }
+
+ var reg=/^(([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})$/
+ var ip,port;
+ if(!reg.test(vm.apiRouteInfo.server)){
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop("org_openo_msb_route_err_host_format");
+ return;
+ }
+ else{
+ var hosts=vm.apiRouteInfo.server.split(":")
+ ip=hosts[0];
+ port=hosts[1];
+ }
+
+ // determine whether host repeated
+ for(var i=0;i<vm.apiRouteInfo.servers.length;i++){
+
+ if(vm.apiRouteInfo.servers[i].ip==ip && vm.apiRouteInfo.servers[i].port==port)
+ {
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_host_repeat',[vm.apiRouteInfo.server]);
+ return;
+ }
+
+ }
+ var server={ip:ip,port:port,weight: 0};
+ vm.apiRouteInfo.servers.push(server);
+ vm.apiRouteInfo.server="";
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= "";
+
+
+ },
+ delapiHost:function(ip,port){
+
+ bootbox.confirm( $.i18n.prop('org_openo_msb_route_err_host_del',[ip],[port]),function(result){
+ if(result){
+
+ for(var i=0;i<vm.apiRouteInfo.servers.length;i++){
+ if(vm.apiRouteInfo.servers[i].ip == ip && vm.apiRouteInfo.servers[i].port == port ){
+ vm.apiRouteInfo.servers.splice(i, 1);
+ break;
+ }
+ }
+
+ }
+
+ });
+
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= "";
+
+ },
+ addcustomHost:function(){
+ if(vm.customRouteInfo.server==""){
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop("org_openo_msb_route_err_host_empty");
+ return;
+ }
+
+ var reg=/^(([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})$/
+ var ip,port;
+ if(!reg.test(vm.customRouteInfo.server)){
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop("org_openo_msb_route_err_host_format");
+ return;
+ }
+ else{
+ var hosts=vm.customRouteInfo.server.split(":")
+ ip=hosts[0];
+ port=hosts[1];
+ }
+
+ //判断host是否重复
+ for(var i=0;i<vm.customRouteInfo.servers.length;i++){
+
+ if(vm.customRouteInfo.servers[i].ip==ip && vm.customRouteInfo.servers[i].port==port)
+ {
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_host_repeat',[vm.apiRouteInfo.server]);
+ return;
+ }
+
+ }
+ var server={ip:ip,port:port,weight: 0};
+ vm.customRouteInfo.servers.push(server);
+ vm.customRouteInfo.server="";
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= "";
+
+
+ },
+ delcustomHost:function(ip,port){
+
+ bootbox.confirm( $.i18n.prop('org_openo_msb_route_err_host_del',[ip],[port]),function(result){
+ if(result){
+
+ for(var i=0;i<vm.customRouteInfo.servers.length;i++){
+ if(vm.customRouteInfo.servers[i].ip == ip && vm.customRouteInfo.servers[i].port == port ){
+ vm.customRouteInfo.servers.splice(i, 1);
+ break;
+ }
+ }
+
+ }
+
+ });
+
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= "";
+
+ },
+ addiuiHost:function(){
+ if(vm.iuiRouteInfo.server==""){
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop("org_openo_msb_route_err_host_empty");
+ return;
+ }
+
+ var reg=/^(([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})$/
+ var ip,port;
+ if(!reg.test(vm.iuiRouteInfo.server)){
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop("org_openo_msb_route_err_host_format");
+ return;
+ }
+ else{
+ var hosts=vm.iuiRouteInfo.server.split(":")
+ ip=hosts[0];
+ port=hosts[1];
+ }
+
+ //判断host是否重复
+ for(var i=0;i<vm.iuiRouteInfo.servers.length;i++){
+
+ if(vm.iuiRouteInfo.servers[i].ip==ip && vm.iuiRouteInfo.servers[i].port==port)
+ {
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_host_repeat',[vm.apiRouteInfo.server]);
+ return;
+ }
+
+ }
+ var server={ip:ip,port:port,weight: 0};
+ vm.iuiRouteInfo.servers.push(server);
+ vm.iuiRouteInfo.server="";
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= "";
+
+
+ },
+ deliuiHost:function(ip,port){
+
+ bootbox.confirm($.i18n.prop('org_openo_msb_route_err_host_del',[ip],[port]),function(result){
+ if(result){
+
+ for(var i=0;i<vm.iuiRouteInfo.servers.length;i++){
+ if(vm.iuiRouteInfo.servers[i].ip == ip && vm.iuiRouteInfo.servers[i].port == port ){
+ vm.iuiRouteInfo.servers.splice(i, 1);
+ break;
+ }
+ }
+
+ }
+
+ });
+
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= "";
+
+ },
+ $showmsbRouteDlg:function() {
+ vm.msbRouteInfo.serviceName="";
+ vm.msbRouteInfo.version="";
+ vm.msbRouteInfo.url="";
+ vm.msbRouteInfo.protocol="";
+ vm.msbRouteInfo.visualRange="";
+ vm.msbRouteInfo.visualRangeArray=[];
+ vm.msbRouteInfo.newHost="";
+ vm.msbRouteInfo.nodes=[];
+ vm.msbRouteInfo.status="1";
+
+
+ vm.routeDlgInfo.saveType = "add";
+ vm.routeDlgInfo.titleName=$.i18n.prop('org_openo_msb_route_title_add_msb');
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=false;
+
+
+
+ $(".form-group").each(function () {
+ $(this).removeClass('has-success');
+ $(this).removeClass('has-error');
+ $(this).find(".help-block[id]").remove();
+ $(this).find(".form-tip").removeClass('form-input-focus');
+ $(this).find(".item-tip").removeClass('item-tip-focus');
+ });
+
+ $("#msbrouteDlg").modal("show");
+ },
+ $showiuiRouteDlg:function() {
+
+ vm.iuiRouteInfo.serviceName="";
+ vm.iuiRouteInfo.url="";
+ vm.iuiRouteInfo.server="";
+ vm.iuiRouteInfo.servers=[];
+ vm.iuiRouteInfo.control="0";
+ vm.iuiRouteInfo.status="1";
+
+
+ vm.routeDlgInfo.saveType = "add";
+ vm.routeDlgInfo.titleName=$.i18n.prop('org_openo_msb_route_title_add_iui');
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=false;
+
+ //$("input[name='iuioriService']").val("");
+
+ $(".form-group").each(function () {
+ $(this).removeClass('has-success');
+ $(this).removeClass('has-error');
+ $(this).find(".help-block[id]").remove();
+ $(this).find(".form-tip").removeClass('form-input-focus');
+ $(this).find(".item-tip").removeClass('item-tip-focus');
+ });
+
+ $("#iuirouteDlg").modal("show");
+ },
+ $showcustomRouteDlg:function() {
+
+ vm.customRouteInfo.serviceName="";
+ vm.customRouteInfo.url="";
+ vm.customRouteInfo.server="";
+ vm.customRouteInfo.servers=[];
+ vm.customRouteInfo.control="0";
+ vm.customRouteInfo.status="1";
+
+
+ vm.routeDlgInfo.saveType = "add";
+ vm.routeDlgInfo.titleName=$.i18n.prop('org_openo_msb_route_title_add_custom');
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=false;
+
+ //$("input[name='customoriService']").val("");
+
+ $(".form-group").each(function () {
+ $(this).removeClass('has-success');
+ $(this).removeClass('has-error');
+ $(this).find(".help-block[id]").remove();
+ $(this).find(".form-tip").removeClass('form-input-focus');
+ $(this).find(".item-tip").removeClass('item-tip-focus');
+ });
+
+ $("#customrouteDlg").modal("show");
+ },
+ $showApiRouteDlg : function() {
+
+ $('#apiTab a:first').tab('show');
+ vm.apiRouteInfo.serviceName="";
+ vm.apiRouteInfo.version="";
+ vm.apiRouteInfo.url="";
+ vm.apiRouteInfo.metricsUrl="/admin/metrics";
+ vm.apiRouteInfo.control="0";
+ vm.apiRouteInfo.status="1";
+ // vm.apiRouteInfo.apiJson="/service/swagger.json";
+ vm.apiRouteInfo.apiJsonType="1";
+ vm.apiRouteInfo.server="";
+ vm.apiRouteInfo.servers=[];
+
+ vm.apiJson.custom="/swagger.json";
+
+ //$("input[name='oriService']").val("");
+
+ $('#metricsFullurl').collapse('hide');
+ $('#apiJsonFullurl').collapse('hide');
+
+
+
+ vm.routeDlgInfo.saveType = "add";
+ vm.routeDlgInfo.titleName=$.i18n.prop('org_openo_msb_route_title_add_api');
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=false;
+
+ $(".form-group").each(function () {
+ $(this).removeClass('has-success');
+ $(this).removeClass('has-error');
+ $(this).find(".help-block[id]").remove();
+ $(this).find(".form-tip").removeClass('form-input-focus');
+ $(this).find(".item-tip").removeClass('item-tip-focus');
+ });
+
+
+ $("#routeDlg").modal("show");
+ },
+ $saveiuiRoute : function() {
+
+ iuisuccess.hide();
+ iuierror.hide();
+ if (iuiform.valid() == false) {
+ return false;
+ }
+
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=true;
+
+ vm.iuiRouteInfo.serviceName=$.trim(vm.iuiRouteInfo.serviceName);
+
+ var servers=[];
+ for(var i=0;i<vm.iuiRouteInfo.servers.length;i++){
+ var server={ip:vm.iuiRouteInfo.servers[i].ip,port:vm.iuiRouteInfo.servers[i].port,weight: 0};
+ servers.push(server);
+ }
+
+
+
+ var iuiRouteUrl=vm.iuiRouteInfo.url=="/"?"":vm.iuiRouteInfo.url;
+ var data= JSON.stringify({
+ "serviceName": vm.iuiRouteInfo.serviceName,
+ "url": iuiRouteUrl,
+ "control":vm.iuiRouteInfo.control,
+ "status":vm.iuiRouteInfo.status,
+ "servers": servers
+ });
+
+ if(vm.routeDlgInfo.saveType=="add")
+ {
+
+ //Determine whether to repeat
+ for(var i=0;i<vm.iuiRouteArray.length;i++){
+
+ if(vm.iuiRouteArray[i].serviceName==vm.iuiRouteInfo.serviceName)
+ {
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_service_repeat',[vm.iuiRouteInfo.serviceName]);
+ return;
+ }
+
+ }
+
+ //save service
+
+
+ $.ajax({
+ "type": 'POST',
+ "url": vm.$iuiRouteUrl,
+ "data" : data,
+ "dataType": "json",
+ "contentType":"application/json",
+ success: function (resp) {
+
+ vm.iuiRouteArray.push(JSON.parse(data));
+ vm.iuiRouteArray.sort(function(a,b){return a.serviceName>b.serviceName?1:-1});
+
+ routeUtil.refreshRoute();
+ $('#iuirouteDlg').modal('hide');
+ routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_iui'),$.i18n.prop('org_openo_msb_route_service_save'),"success");
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_service_save')+textStatus+":"+errorThrown;
+
+ }
+ });
+ }
+ else{ //update
+
+ var url= vm.$iuiRouteInstanceUrl;
+ url=url.replace("{serviceName}",vm.iuiRouteInfo.oldServiceName);
+
+ //Determine whether to repeat
+ if(vm.iuiRouteInfo.serviceName!=vm.iuiRouteInfo.oldServiceName) //Has been modified service name
+ {
+ for(var i=0;i<vm.iuiRouteArray.length;i++){
+
+ if(vm.iuiRouteArray[i].serviceName==vm.iuiRouteInfo.serviceName)
+ {
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_service_repeat',[vm.iuiRouteInfo.serviceName]);
+ return;
+ }
+
+ }
+ }
+
+ $.ajax({
+ "type": 'PUT',
+ "url": url,
+ "data" :data,
+ "dataType": "json",
+ "contentType":"application/json",
+ success: function (resp) {
+
+ for(var i=0;i<vm.iuiRouteArray.length;i++){
+ if(vm.iuiRouteArray[i].serviceName == vm.iuiRouteInfo.oldServiceName)
+ {
+ vm.iuiRouteArray[i].serviceName=vm.iuiRouteInfo.serviceName;
+ vm.iuiRouteArray[i].url=iuiRouteUrl;
+ vm.iuiRouteArray[i].servers=vm.iuiRouteInfo.servers;
+
+ break;
+ }
+ }
+
+
+
+ $('#iuirouteDlg').modal('hide');
+ routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_iui'),$.i18n.prop('org_openo_msb_route_service_update'),"success");
+
+
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_service_save')+textStatus+":"+errorThrown;
+
+ }
+ });
+
+
+ }
+ },
+ $savecustomRoute : function() {
+
+ customsuccess.hide();
+ customerror.hide();
+ if (customform.valid() == false) {
+ return false;
+ }
+
+ if(vm.customRouteInfo.servers.length==0){
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_host_leastone');
+ return;
+ }
+
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=true;
+
+ vm.customRouteInfo.serviceName=$.trim(vm.customRouteInfo.serviceName);
+
+ var servers=[];
+ for(var i=0;i<vm.customRouteInfo.servers.length;i++){
+ var server={ip:vm.customRouteInfo.servers[i].ip,port:vm.customRouteInfo.servers[i].port,weight: 0};
+ servers.push(server);
+ }
+
+ var customRouteUrl=vm.customRouteInfo.url=="/"?"":vm.customRouteInfo.url;
+ var data= JSON.stringify({
+ "serviceName": vm.customRouteInfo.serviceName,
+ "url": customRouteUrl,
+ "control":vm.customRouteInfo.control,
+ "status":vm.customRouteInfo.status,
+ "servers": servers
+ });
+
+ if(vm.routeDlgInfo.saveType=="add")
+ {
+
+ //Determine whether to repeat
+ for(var i=0;i<vm.customRouteArray.length;i++){
+
+ if(vm.customRouteArray[i].serviceName==vm.customRouteInfo.serviceName)
+ {
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_service_repeat',[vm.customRouteInfo.serviceName]);
+ return;
+ }
+
+ }
+
+ //save
+
+
+ $.ajax({
+ "type": 'POST',
+ "url": vm.$customRouteInstanceUrl,
+ "data" : data,
+ "dataType": "json",
+ "contentType":"application/json",
+ success: function (resp) {
+
+ vm.customRouteArray.push(JSON.parse(data));
+ routeUtil.groupRoute(vm.customRouteArray);
+
+
+ routeUtil.refreshRoute();
+ $('#customrouteDlg').modal('hide');
+ routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_custom'),$.i18n.prop('org_openo_msb_route_service_save'),"success");
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_service_save')+textStatus+":"+errorThrown;
+
+ }
+ });
+ }
+ else{ //update
+
+ //Determine whether to repeat
+ if(vm.customRouteInfo.serviceName!=vm.customRouteInfo.oldServiceName) //Has been modified service name
+ {
+ for(var i=0;i<vm.customRouteArray.length;i++){
+
+ if(vm.customRouteArray[i].serviceName==vm.customRouteInfo.serviceName)
+ {
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_service_repeat',[vm.customRouteInfo.serviceName]);
+ return;
+ }
+
+ }
+ }
+
+ var url= vm.$customRouteInstanceUrl+"?serviceName="+vm.customRouteInfo.oldServiceName;
+
+ $.ajax({
+ "type": 'PUT',
+ "url": url,
+ "data" :data,
+ "dataType": "json",
+ "contentType":"application/json",
+ success: function (resp) {
+
+ for(var i=0;i<vm.customRouteArray.length;i++){
+ if(vm.customRouteArray[i].serviceName == vm.customRouteInfo.oldServiceName)
+ {
+ vm.customRouteArray[i].serviceName=vm.customRouteInfo.serviceName;
+ vm.customRouteArray[i].url=customRouteUrl;
+ vm.customRouteArray[i].servers=vm.customRouteInfo.servers;
+ break;
+ }
+ }
+
+ routeUtil.groupRoute(vm.customRouteArray);
+
+
+
+ $('#customrouteDlg').modal('hide');
+ routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_custom'),$.i18n.prop('org_openo_msb_route_service_update'),"success");
+
+
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info=$.i18n.prop('org_openo_msb_route_err_service_save')+textStatus+":"+errorThrown;
+
+ }
+ });
+
+
+ }
+ },
+ $saveApiRoute : function() {
+
+ success.hide();
+ error.hide();
+ if (form.valid() == false) {
+ return false;
+ }
+
+ if(vm.apiRouteInfo.servers.length==0){
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_host_leastone');
+ return;
+ }
+
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=true;
+
+
+ var apiRouteUrl=vm.apiRouteInfo.url=="/"?"":vm.apiRouteInfo.url;
+ var apiJson=vm.apiRouteInfo.apiJsonType=="1"?vm.apiJson.custom:vm.apiJson.local;
+
+ var servers=[];
+ for(var i=0;i<vm.apiRouteInfo.servers.length;i++){
+ var server={ip:vm.apiRouteInfo.servers[i].ip,port:vm.apiRouteInfo.servers[i].port,weight: 0};
+ servers.push(server);
+ }
+
+
+ var data= JSON.stringify({
+ "serviceName": vm.apiRouteInfo.serviceName,
+ "version": vm.apiRouteInfo.version,
+ "url": apiRouteUrl,
+ "metricsUrl":vm.apiRouteInfo.metricsUrl,
+ "apiJson": apiJson,
+ "apiJsonType":vm.apiRouteInfo.apiJsonType,
+ "control":vm.apiRouteInfo.control,
+ "status":vm.apiRouteInfo.status,
+ "servers": servers
+
+ });
+
+ if(vm.routeDlgInfo.saveType=="add")
+ {
+
+ //Determine whether to repeat
+ for(var i=0;i<vm.apiRouteArray.length;i++){
+
+ if(vm.apiRouteArray[i].serviceName==vm.apiRouteInfo.serviceName
+ && vm.apiRouteArray[i].version==vm.apiRouteInfo.version )
+ {
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info=$.i18n.prop('org_openo_msb_route_err_api_repeat',[vm.apiRouteInfo.serviceName],[vm.apiRouteInfo.version]);
+ return;
+ }
+
+ }
+
+ //save
+
+
+ $.ajax({
+ "type": 'POST',
+ "url": vm.$apiRouteUrl,
+ "data" : data,
+ "dataType": "json",
+ "contentType":"application/json",
+ success: function (resp) {
+
+ vm.apiRouteArray.push(JSON.parse(data));
+ vm.apiRouteArray.sort(function(a,b){return a.serviceName>b.serviceName?1:-1});
+
+ routeUtil.refreshRoute();
+ $('#routeDlg').modal('hide');
+ routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_api'),$.i18n.prop('org_openo_msb_route_service_save'),"success");
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_service_save')+textStatus+":"+errorThrown;
+
+ }
+ });
+ }
+ else{ //update
+
+
+ //Determine whether to repeat
+ if(vm.apiRouteInfo.serviceName!=vm.apiRouteInfo.oldServiceName ||
+ vm.apiRouteInfo.version!=vm.apiRouteInfo.oldVersion) //Has been modified service name
+ {
+ for(var i=0;i<vm.apiRouteArray.length;i++){
+
+ if(vm.apiRouteArray[i].serviceName==vm.apiRouteInfo.serviceName
+ && vm.apiRouteArray[i].version==vm.apiRouteInfo.version )
+ {
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_api_repeat',[vm.apiRouteInfo.serviceName],[vm.apiRouteInfo.version]);
+ return;
+ }
+
+ }
+ }
+
+ var url= vm.$apiRouteInstanceUrl;
+ var version=vm.apiRouteInfo.oldVersion==""?"null":vm.apiRouteInfo.oldVersion;
+ url=url.replace("{serviceName}",vm.apiRouteInfo.oldServiceName).replace("{version}",version);
+
+
+ $.ajax({
+ "type": 'PUT',
+ "url": url,
+ "data" :data,
+ "dataType": "json",
+ "contentType":"application/json",
+ success: function (resp) {
+
+ for(var i=0;i<vm.apiRouteArray.length;i++){
+ if(vm.apiRouteArray[i].serviceName == vm.apiRouteInfo.oldServiceName &&
+ vm.apiRouteArray[i].version == vm.apiRouteInfo.oldVersion)
+ {
+ //vm.apiRouteArray[i] = JSON.parse(data);
+ vm.apiRouteArray[i].serviceName=vm.apiRouteInfo.serviceName;
+ vm.apiRouteArray[i].version= vm.apiRouteInfo.version;
+ vm.apiRouteArray[i].url=apiRouteUrl;
+ vm.apiRouteArray[i].metricsUrl=vm.apiRouteInfo.metricsUrl;
+ vm.apiRouteArray[i].apiJson=apiJson;
+ vm.apiRouteArray[i].apiJsonType=vm.apiRouteInfo.apiJsonType;
+
+ vm.apiRouteArray[i].servers=vm.apiRouteInfo.servers;
+
+
+ break;
+ }
+ }
+
+
+
+ $('#routeDlg').modal('hide');
+ routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_api'),$.i18n.prop('org_openo_msb_route_service_update'),"success");
+
+
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_service_save')+textStatus+":"+errorThrown;
+
+ }
+ });
+
+
+ }
+ },
+ $savemsbRoute : function() {
+
+ msbsuccess.hide();
+ msberror.hide();
+ if (msbform.valid() == false) {
+ return false;
+ }
+
+ if(vm.msbRouteInfo.nodes.length==0){
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info=$.i18n.prop('org_openo_msb_route_err_host_leastone');
+ return;
+ }
+
+ if(vm.msbRouteInfo.visualRangeArray.length==0){
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_visualrange_empty');
+ return;
+ }
+
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=true;
+
+ var msbUrl=vm.msbRouteInfo.url=="/"?"":vm.msbRouteInfo.url;
+
+
+ var nodes=[];
+ for(var i=0;i<vm.msbRouteInfo.nodes.length;i++){
+ var node={ip:vm.msbRouteInfo.nodes[i].ip,port:vm.msbRouteInfo.nodes[i].port,ttl: vm.msbRouteInfo.nodes[i].ttl};
+ nodes.push(node);
+ }
+
+ var data= JSON.stringify({
+ "serviceName": vm.msbRouteInfo.serviceName,
+ "version": vm.msbRouteInfo.version,
+ "url": msbUrl,
+ "nodes": nodes,
+ "protocol":vm.msbRouteInfo.protocol,
+ "visualRange":vm.msbRouteInfo.visualRangeArray.join("|")
+ });
+
+ if(vm.routeDlgInfo.saveType=="add")
+ {
+
+ //Determine whether to repeat
+ for(var i=0;i<vm.msbRouteArray.length;i++){
+
+ if(vm.msbRouteArray[i].serviceName==vm.msbRouteInfo.serviceName
+ && vm.msbRouteArray[i].version==vm.msbRouteInfo.version )
+ {
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_api_repeat',[vm.msbRouteInfo.serviceName],[vm.msbRouteInfo.version]);
+ }
+
+ }
+
+ //save
+
+
+ $.ajax({
+ "type": 'POST',
+ "url": vm.$msbRouteUrl,
+ "data" : data,
+ "dataType": "json",
+ "contentType":"application/json",
+ success: function (resp) {
+
+ // vm.msbRouteArray.push(JSON.parse(data));
+ table.destroy();
+ vm.initMSBRoute();
+
+ // table=$('#msbTable').DataTable({
+
+ // "oLanguage": vm.$dataTableLanguage,
+ // columnDefs: [ {
+ // targets: [ 7 ],
+ // "searchable": false,
+ // "bSortable": false,
+ // }]
+ // });
+
+ $('#msbrouteDlg').modal('hide');
+ routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_msb'),$.i18n.prop('org_openo_msb_route_service_save'),"success");
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_service_save')+XMLHttpRequest.responseText;
+
+ }
+ });
+ }
+ else{ //update
+
+
+ //Determine whether to repeat
+ if(vm.msbRouteInfo.serviceName!=vm.msbRouteInfo.oldServiceName ||
+ vm.msbRouteInfo.version!=vm.msbRouteInfo.oldVersion) //Has been modified service name or version
+ {
+ for(var i=0;i<vm.msbRouteArray.length;i++){
+
+ if(vm.msbRouteArray[i].serviceName==vm.msbRouteInfo.serviceName
+ && vm.msbRouteArray[i].version==vm.msbRouteInfo.version )
+ {
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_api_repeat',[vm.msbRouteInfo.serviceName],[vm.msbRouteInfo.version]);
+ return;
+ }
+
+ }
+ }
+
+ var url= vm.$msbRouteInstanceUrl;
+ var version=vm.msbRouteInfo.oldVersion==""?"null":vm.msbRouteInfo.oldVersion;
+ var serviceName2= vm.msbRouteInfo.oldServiceName.replace(/\//g,"*");
+ url=url.replace("{serviceName}",serviceName2).replace("{version}",version);
+
+
+ $.ajax({
+ "type": 'PUT',
+ "url": url,
+ "data" :data,
+ "dataType": "json",
+ "contentType":"application/json",
+ success: function (resp) {
+
+ for(var i=0;i<vm.msbRouteArray.length;i++){
+ if(vm.msbRouteArray[i].serviceName == vm.msbRouteInfo.oldServiceName &&
+ vm.msbRouteArray[i].version == vm.msbRouteInfo.oldVersion)
+ {
+ //vm.apiRouteArray[i] = JSON.parse(data);
+ vm.msbRouteArray[i].serviceName=vm.msbRouteInfo.serviceName;
+ vm.msbRouteArray[i].version= vm.msbRouteInfo.version;
+ vm.msbRouteArray[i].url=msbUrl;
+ vm.msbRouteArray[i].protocol=vm.msbRouteInfo.protocol;
+ vm.msbRouteArray[i].visualRange=vm.msbRouteInfo.visualRange;
+ vm.msbRouteArray[i].visualRangeArray=vm.msbRouteInfo.visualRangeArray;
+ vm.msbRouteArray[i].nodes=nodes;
+
+ break;
+ }
+ }
+
+
+
+ $('#msbrouteDlg').modal('hide');
+ routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_msb'),$.i18n.prop('org_openo_msb_route_service_update'),"success");
+
+
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_service_save')+XMLHttpRequest.responseText;
+
+ }
+ });
+
+
+ }
+ },
+
+ updateApiRouteStatus:function(serviceName,version,status){
+
+ var url= vm.$apiRouteStatusUrl;
+ var version2=version==""?"null":version;
+ url=url.replace("{serviceName}",serviceName).replace("{version}",version2).replace("{status}",status);
+
+ $.ajax({
+ "type": 'PUT',
+ "url": url,
+ "dataType": "json",
+ success: function (resp) {
+
+
+ for(var i=0;i<vm.apiRouteArray.length;i++){
+ if(vm.apiRouteArray[i].serviceName == serviceName &&
+ vm.apiRouteArray[i].version == version){
+ vm.apiRouteArray[i].status=status;
+ break;
+ }
+ }
+
+ if(status=='1')
+ {
+ routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_api'),$.i18n.prop('org_openo_msb_route_status_enable'),"success");
+ }
+ else{
+ routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_api'),$.i18n.prop('org_openo_msb_route_status_disable'),"success");
+ }
+
+
+
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+
+ bootbox.alert($.i18n.prop('org_openo_msb_route_err_status')+textStatus+":"+errorThrown);
+
+ }
+ });
+
+ },
+ updateiuiRouteStatus:function(serviceName,status){
+
+ var url= vm.$iuiRouteStatusUrl;
+
+ url=url.replace("{serviceName}",serviceName).replace("{status}",status);
+
+ $.ajax({
+ "type": 'PUT',
+ "url": url,
+ "dataType": "json",
+ success: function (resp) {
+
+
+ for(var i=0;i<vm.iuiRouteArray.length;i++){
+ if(vm.iuiRouteArray[i].serviceName == serviceName){
+ vm.iuiRouteArray[i].status=status;
+ break;
+ }
+ }
+
+ if(status=='1')
+ {
+ routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_iui'),$.i18n.prop('org_openo_msb_route_status_enable'),"success");
+ }
+ else{
+ routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_iui'),$.i18n.prop('org_openo_msb_route_status_disable'),"success");
+ }
+
+
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+
+ bootbox.alert($.i18n.prop('org_openo_msb_route_err_status')+textStatus+":"+errorThrown);
+
+ }
+ });
+
+ },
+ updatecustomRouteStatus:function(serviceName,status){
+
+
+ var url= vm.$customRouteStatusUrl+"?serviceName="+serviceName+"&status="+status;
+
+
+ $.ajax({
+ "type": 'PUT',
+ "url": url,
+ "dataType": "json",
+ success: function (resp) {
+
+
+ for(var i=0;i<vm.customRouteArray.length;i++){
+ if(vm.customRouteArray[i].serviceName == serviceName){
+ vm.customRouteArray[i].status=status;
+ break;
+ }
+ }
+
+
+ routeUtil.groupRoute(vm.customRouteArray);
+
+ if(status=='1')
+ {
+ routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_custom'),$.i18n.prop('org_openo_msb_route_status_enable'),"success");
+ }
+ else{
+ routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_custom'),$.i18n.prop('org_openo_msb_route_status_disable'),"success");
+ }
+
+
+
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+
+ bootbox.alert($.i18n.prop('org_openo_msb_route_err_status')+textStatus+":"+errorThrown);
+
+ }
+ });
+
+ },
+ updateApiRoute:function(apiRouteInfo,type){
+
+
+
+
+ $('#metricsFullurl').collapse('hide');
+ $('#apiJsonFullurl').collapse('hide');
+ $('#apiTab a:first').tab('show');
+
+ vm.apiRouteInfo.serviceName=apiRouteInfo.serviceName;
+ vm.apiRouteInfo.oldServiceName=apiRouteInfo.serviceName;
+ vm.apiRouteInfo.version= apiRouteInfo.version;
+ vm.apiRouteInfo.oldVersion=apiRouteInfo.version;
+ vm.apiRouteInfo.url=apiRouteInfo.url==""?"/":apiRouteInfo.url;
+ vm.apiRouteInfo.metricsUrl=apiRouteInfo.metricsUrl;
+ vm.apiRouteInfo.apiJson=apiRouteInfo.apiJson;
+ vm.apiRouteInfo.apiJsonType=apiRouteInfo.apiJsonType;
+ vm.apiRouteInfo.control=apiRouteInfo.control;
+ vm.apiRouteInfo.status= apiRouteInfo.status;
+
+ if(vm.apiRouteInfo.apiJsonType=="1"){
+ vm.apiJson.custom=apiRouteInfo.apiJson;
+ }
+ else{
+ vm.apiJson.local=apiRouteInfo.apiJson;
+ vm.apiJson.custom="/swagger.json";
+ $("#apiJsonSelect").val(apiRouteInfo.apiJson);
+ }
+
+ vm.apiRouteInfo.server="";
+ vm.apiRouteInfo.servers=[];
+ vm.apiRouteInfo.servers=apiRouteInfo.servers;
+
+
+
+
+ // vm.apiRouteInfo= jQuery.extend({},apiRouteInfo);
+
+ vm.routeDlgInfo.saveType = type;
+ if(type=='update'){
+ vm.routeDlgInfo.titleName=$.i18n.prop('org_openo_msb_route_title_edit_api');
+ }
+ else if(type=='view'){
+ vm.routeDlgInfo.titleName=$.i18n.prop('org_openo_msb_route_title_view_api');
+ }
+
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=false;
+
+
+ $(".form-group").each(function () {
+ $(this).removeClass('has-success');
+ $(this).removeClass('has-error');
+ $(this).find(".help-block[id]").remove();
+ $(this).find(".item-tip").addClass("item-tip-focus");
+ $(this).find(".form-tip").removeClass('form-input-focus');
+ });
+
+ $("#routeDlg").modal("show");
+ },
+ updateiuiRoute:function(iuiRouteInfo,type){
+
+
+ vm.iuiRouteInfo.serviceName=iuiRouteInfo.serviceName;
+ vm.iuiRouteInfo.oldServiceName=iuiRouteInfo.serviceName;
+ vm.iuiRouteInfo.url=iuiRouteInfo.url==""?"/":iuiRouteInfo.url;
+ vm.iuiRouteInfo.server="";
+ vm.iuiRouteInfo.servers=[];
+ vm.iuiRouteInfo.servers=iuiRouteInfo.servers;
+ vm.iuiRouteInfo.control=iuiRouteInfo.control;
+ vm.iuiRouteInfo.status=iuiRouteInfo.status;
+
+
+ // vm.apiRouteInfo= jQuery.extend({},apiRouteInfo);
+
+
+ vm.routeDlgInfo.saveType = type;
+ if(type=='update'){
+ vm.routeDlgInfo.titleName=$.i18n.prop('org_openo_msb_route_title_edit_iui');
+ }
+ else if(type=='view'){
+ vm.routeDlgInfo.titleName=$.i18n.prop('org_openo_msb_route_title_view_iui');
+ }
+
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=false;
+
+
+ $(".form-group").each(function () {
+ $(this).removeClass('has-success');
+ $(this).removeClass('has-error');
+ $(this).find(".help-block[id]").remove();
+ $(this).find(".item-tip").addClass("item-tip-focus");
+ $(this).find(".form-tip").removeClass('form-input-focus');
+ });
+
+ $("#iuirouteDlg").modal("show");
+ },
+ updatecustomRoute:function(customRouteInfo,type){
+
+
+ vm.customRouteInfo.serviceName=customRouteInfo.serviceName;
+ vm.customRouteInfo.oldServiceName=customRouteInfo.serviceName;
+
+ vm.customRouteInfo.url=customRouteInfo.url==""?"/":customRouteInfo.url;
+ vm.customRouteInfo.server="";
+ vm.customRouteInfo.servers=[];
+ vm.customRouteInfo.servers=customRouteInfo.servers;
+ vm.customRouteInfo.control=customRouteInfo.control;
+ vm.customRouteInfo.status=customRouteInfo.status;
+
+ // vm.apiRouteInfo= jQuery.extend({},apiRouteInfo);
+
+ vm.routeDlgInfo.saveType = type;
+ if(type=='update'){
+ vm.routeDlgInfo.titleName=$.i18n.prop('org_openo_msb_route_title_edit_custom');
+ }
+ else if(type=='view'){
+ vm.routeDlgInfo.titleName=$.i18n.prop('org_openo_msb_route_title_view_custom');
+ }
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=false;
+
+
+ $(".form-group").each(function () {
+ $(this).removeClass('has-success');
+ $(this).removeClass('has-error');
+ $(this).find(".help-block[id]").remove();
+ $(this).find(".item-tip").addClass("item-tip-focus");
+ $(this).find(".form-tip").removeClass('form-input-focus');
+ });
+
+ $("#customrouteDlg").modal("show");
+ },
+ updatemsbRoute:function(msbRouteInfo){
+
+ vm.msbRouteInfo.serviceName=msbRouteInfo.serviceName;
+ vm.msbRouteInfo.oldServiceName=msbRouteInfo.serviceName;
+ vm.msbRouteInfo.version= msbRouteInfo.version;
+ vm.msbRouteInfo.oldVersion= msbRouteInfo.version
+ vm.msbRouteInfo.url=msbRouteInfo.url==""?"/":msbRouteInfo.url;
+ vm.msbRouteInfo.protocol=msbRouteInfo.protocol;
+ vm.msbRouteInfo.visualRange=msbRouteInfo.visualRange;
+ vm.msbRouteInfo.visualRangeArray=msbRouteInfo.visualRange.split("|");
+ vm.msbRouteInfo.nodes=msbRouteInfo.nodes;
+ vm.msbRouteInfo.newHost="";
+ vm.msbRouteInfo.newttl="";
+
+ routeUtil.changeTargetServiceUrl();
+
+ vm.routeDlgInfo.saveType = "update";
+ vm.routeDlgInfo.titleName=$.i18n.prop('org_openo_msb_route_title_edit_msb');
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=false;
+
+
+ $(".form-group").each(function () {
+ $(this).removeClass('has-success');
+ $(this).removeClass('has-error');
+ $(this).find(".help-block[id]").remove();
+ $(this).find(".item-tip").addClass("item-tip-focus");
+ $(this).find(".form-tip").removeClass('form-input-focus');
+ });
+
+ $("#msbrouteDlg").modal("show");
+ },
+ delApiRoute:function(serviceName,version){
+ bootbox.confirm($.i18n.prop('org_openo_msb_route_err_service_del_ask',[serviceName],[version]),function(result){
+ if(result){
+ var url= vm.$apiRouteInstanceUrl;
+ var version2=version==""?"null":version;
+ url=url.replace("{serviceName}",serviceName).replace("{version}",version2);
+
+ $.ajax({
+ "type": 'DELETE',
+ "url": url,
+ "dataType": "json",
+ success: function (resp) {
+
+ for(var i=0;i<vm.apiRouteArray.length;i++){
+ if(vm.apiRouteArray[i].serviceName == serviceName &&
+ vm.apiRouteArray[i].version == version){
+ vm.apiRouteArray.splice(i, 1);
+ break;
+ }
+ }
+
+ routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_api'),$.i18n.prop('org_openo_msb_route_service_del_success'),"success");
+
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+
+ bootbox.alert($.i18n.prop('org_openo_msb_route_service_del_fail')+textStatus+":"+errorThrown);
+
+ }
+ });
+
+
+ }
+
+ });
+
+ },
+ deliuiRoute:function(serviceName){
+ bootbox.confirm($.i18n.prop('org_openo_msb_route_err_service2_del_ask',[serviceName]),function(result){
+ if(result){
+ var url= vm.$iuiRouteInstanceUrl;
+
+ url=url.replace("{serviceName}",serviceName);
+
+ $.ajax({
+ "type": 'DELETE',
+ "url": url,
+ "dataType": "json",
+ success: function (resp) {
+
+ for(var i=0;i<vm.iuiRouteArray.length;i++){
+ if(vm.iuiRouteArray[i].serviceName == serviceName){
+ vm.iuiRouteArray.splice(i, 1);
+ break;
+ }
+ }
+
+ routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_iui'),$.i18n.prop('org_openo_msb_route_service_del_success'),"success");
+
+
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+
+ bootbox.alert($.i18n.prop('org_openo_msb_route_service_del_fail')+textStatus+":"+errorThrown);
+
+ }
+ });
+
+
+ }
+
+ });
+
+ },
+ delcustomRoute:function(serviceName){
+ bootbox.confirm($.i18n.prop('org_openo_msb_route_err_service2_del_ask',[serviceName]),function(result){
+ if(result){
+ var url= vm.$customRouteInstanceUrl+"?serviceName="+serviceName;
+
+ $.ajax({
+ "type": 'DELETE',
+ "url": url,
+ "dataType": "json",
+ success: function (resp) {
+
+ for(var i=0;i<vm.customRouteArray.length;i++){
+ if(vm.customRouteArray[i].serviceName == serviceName){
+ vm.customRouteArray.splice(i, 1);
+ break;
+ }
+ }
+
+ routeUtil.groupRoute(vm.customRouteArray);
+
+
+ routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_custom'),$.i18n.prop('org_openo_msb_route_service_del_success'),"success");
+
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+
+ bootbox.alert($.i18n.prop('org_openo_msb_route_service_del_fail')+textStatus+":"+errorThrown);
+
+ }
+ });
+
+
+ }
+
+ });
+
+ },
+ delmsbRoute:function(serviceName,version,obj){
+ bootbox.confirm($.i18n.prop('org_openo_msb_route_err_service_del_ask',[serviceName],[version]),function(result){
+ if(result){
+ var url= vm.$msbRouteInstanceUrl;
+ var version2=version==""?"null":version;
+ var serviceName2= serviceName.replace(/\//g,"*");
+ url=url.replace("{serviceName}",serviceName2).replace("{version}",version2);
+
+ $.ajax({
+ "type": 'DELETE',
+ "url": url,
+ "dataType": "json",
+ success: function (resp) {
+ $(obj).parent().parent().addClass('selected');
+
+ for(var i=0;i<vm.msbRouteArray.length;i++){
+ if(vm.msbRouteArray[i].serviceName == serviceName &&
+ vm.msbRouteArray[i].version==version ){
+ vm.msbRouteArray.splice(i, 1);
+ break;
+ }
+ }
+
+ table.row('.selected').remove().draw( false );
+
+ routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_msb'),$.i18n.prop('org_openo_msb_route_service_del_success'),"success");
+
+
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+
+ bootbox.alert($.i18n.prop('org_openo_msb_route_service_del_fail')+XMLHttpRequest.responseText);
+
+ }
+
+
+ });
+
+
+ }
+
+ });
+
+ },
+ exportServices:function(){
+ var url=apiBasePath+"/apiRoute/export";
+ window.open(url);
+
+ },
+ gotoTarget:function(route,type){
+ vm.selectedRoute=route;
+ vm.selectedRouteType=type;
+
+ if(type=="api")
+ {
+ vm.gotoRestDoc();
+ }
+ else if(type=="iui"){
+ vm.gotoIUI();
+ }
+
+ },
+ gotoRestDoc:function(){
+ vm.routeTargetTitle=vm.selectedRoute.serviceName+"-"+$.i18n.prop("org_openo_msb_route_content_title");
+
+ var version=vm.selectedRoute.version==""?"":"/"+vm.selectedRoute.version;
+
+ if(vm.selectedRoute.apiJsonType=="1")
+ {
+
+ var sourceUrl= "/apijson/"+vm.selectedRoute.serviceName+version;
+ }
+ else{
+ var sourceUrl= iuiBasePath+"/ext/initSwaggerJson/"+vm.selectedRoute.apiJson;
+ }
+ //Local json data read from the real API service service address parameter
+ var url=iuiBasePath+"/api-doc/index.html?url="+sourceUrl+"&api=/api/"+vm.selectedRoute.serviceName+version;
+
+ $('#msbSubPage').attr("src",url);
+ vm.apiIframeUrl=url;
+ },
+ gotoJVM:function(){
+ vm.routeTargetTitle=vm.selectedRoute.serviceName+"-"+$.i18n.prop('org_openo_msb_route_metric_content_title');
+
+ var version=vm.selectedRoute.version==""?"":"/"+vm.selectedRoute.version;
+
+ var sourceUrl= "/admin/"+vm.selectedRoute.serviceName+version;
+
+
+ var url=iuiBasePath+"/metrics/index.html?url="+sourceUrl;
+
+ $('#msbSubPage').attr("src",url);
+ },
+ gotoIUI:function(){
+ vm.routeTargetTitle=vm.selectedRoute.serviceName+"-"+$.i18n.prop('org_openo_msb_route_iui_content_title');
+ var url= "/iui/"+vm.selectedRoute.serviceName+"/";
+ $('#msbSubPage').attr("src",url);
+ vm.iuiIframeUrl=url;
+ },
+ initIUIfori18n:function(){
+ vm.routeTargetTitle=$.i18n.prop("org_openo_msb_route_content_title");
+ vm.showAPITypeName=[$.i18n.prop("org_openo_msb_route_swagger_type_predefined"),$.i18n.prop("org_openo_msb_route_swagger_type_custominput")];
+ vm.dataTableLanguage={
+ "sProcessing": "<img src='../img/loading-spinner-grey.gif'/><span> Loadding...</span>",
+ "sLengthMenu": $.i18n.prop("org_openo_msb_route-table-sLengthMenu"),
+ "sZeroRecords": $.i18n.prop("org_openo_msb_route-table-sZeroRecords"),
+ "sInfo": "<span class='seperator'> </span>" + $.i18n.prop("org_openo_msb_route-table-sInfo"),
+ "sInfoEmpty": $.i18n.prop("org_openo_msb_route-table-sInfoEmpty"),
+ "sGroupActions": $.i18n.prop("org_openo_msb_route-table-sGroupActions"),
+ "sAjaxRequestGeneralError": $.i18n.prop("org_openo_msb_route-table-sAjaxRequestGeneralError"),
+ "sEmptyTable": $.i18n.prop("org_openo_msb_route-table-sEmptyTable"),
+ "oPaginate": {
+ "sPrevious": $.i18n.prop("org_openo_msb_route-table-sPrevious"),
+ "sNext": $.i18n.prop("org_openo_msb_route-table-sNext"),
+ "sPage": $.i18n.prop("org_openo_msb_route-table-sPage"),
+ "sPageOf": $.i18n.prop("org_openo_msb_route-table-sPageOf")
+ },
+ "sSearch": $.i18n.prop("org_openo_msb_route-table-search"),
+ "sInfoFiltered": $.i18n.prop("org_openo_msb_route-table-infofilter")
+ };
+
+ }
+
+
+
+ });
+
+
-/*\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
-$(function(){\r
-\r
- $('#msbTable tbody').on('click', 'td.details-control', function () {\r
- var tr = $(this).closest('tr');\r
- var row = table.row( tr );\r
- if ( row.child.isShown() ) {\r
- // This row is already open - close it\r
- row.child.hide();\r
- tr.removeClass('shown');\r
- }\r
- else {\r
- // Open this row\r
- var nodes=row.data()[1].match(/\d+.\d+.\d+.\d+:\d+:(-)?\d+/g) \r
- \r
- row.child( routeUtil.formatDetail(nodes) ).show();\r
- tr.addClass('shown');\r
- }\r
- } );\r
-\r
- $('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {\r
- //Get the name of the TAB has been activated\r
- var activeTab = $(e.target).text(); \r
- if(this.id=="customTab" || this.id=="msbTab"){\r
- $("#serviceContent").hide();\r
- $("#upArrawDiv").hide();\r
- }\r
- else{\r
- $("#serviceContent").show();\r
- $("#upArrawDiv").show();\r
- $('#msbSubPage').attr("src","");\r
- $(".stats_box .routeDiv").removeClass("active");\r
- vm.selectedRouteType="";\r
- vm.routeTargetTitle=$.i18n.prop("org_openo_msb_route_content_title");\r
- \r
- }\r
- });\r
-\r
-\r
- $("[data-toggle='tooltip']").tooltip();\r
-\r
- $('#metricsFullurl').on('show.bs.collapse', function () {\r
- $('#metricsUrlCollapse').removeClass('fa-plus').addClass('fa-minus');\r
- \r
- });\r
- \r
- $('#metricsFullurl').on('hide.bs.collapse', function () {\r
- $('#metricsUrlCollapse').removeClass('fa-minus').addClass('fa-plus');\r
- });\r
-\r
- $('#apiJsonFullurl').on('show.bs.collapse', function () {\r
- $('#apiJsonCollapse').removeClass('fa-plus').addClass('fa-minus');\r
- \r
- });\r
- \r
- $('#apiJsonFullurl').on('hide.bs.collapse', function () {\r
- $('#apiJsonCollapse').removeClass('fa-minus').addClass('fa-plus');\r
- });\r
-\r
-\r
-\r
- $(".form-tip").blur(function(){\r
- if($.trim($(this).val())==""){\r
- $(this).removeClass("form-input-focus");\r
- $(this).prev().removeClass("item-tip-focus");\r
- }});\r
-\r
-$(".form-tip").focus(function(){\r
- if(!$(this).hasClass("form-input-focus")){\r
- $(this).addClass("form-input-focus");\r
- $(this).prev().addClass("item-tip-focus");\r
- }});\r
-\r
-$(".item-tip").click(function(){\r
- $(this).next().focus();\r
-});\r
-\r
-\r
-\r
-$("input[name='version']").blur(function(){\r
- $(this).val($(this).val().toLowerCase());\r
- routeUtil.changeTargetServiceUrl();\r
-});\r
-\r
-\r
-$("input[name='url']").blur(function(){\r
-\r
-routeUtil.changeTargetServiceUrl();\r
-\r
-});\r
-$("input[name='serviceName']").blur(function(){\r
-\r
-routeUtil.changeTargetServiceUrl();\r
-\r
-});\r
-\r
-\r
-\r
-$("select[name='protocol']").change(function(){\r
-\r
-routeUtil.changeTargetServiceUrl();\r
-\r
-});\r
-\r
-/*\r
-\r
-$("input[name='oriService']").blur(function(){\r
- var oriService=$.trim($(this).val());\r
- if(oriService==""){\r
- $("input[name='serviceName']").val("");\r
- $("input[name='version']").val("");\r
- $("input[name='server']").val("");\r
- $("input[name='url']").val("");\r
- return;\r
- }\r
- \r
- \r
-\r
- var reg=/^(|http:\/\/)(([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})\/.*$/ \r
- var reg_standard_match=/^(.*:\d{1,5})\/api\/(.*)\/(v.*)$/ \r
- var reg_unstandard_match=/^(.*:\d{1,5})(\/.*)$/ \r
- if(reg.test(oriService)){ \r
- if(reg_standard_match.test(oriService)){ \r
- //标准api\r
- var group = oriService.match(reg_standard_match);\r
- $("input[name='serviceName']").val(group[2]); \r
- $("input[name='server']").val(group[1].replace("http://",""));\r
-\r
-\r
- var version=group[3];\r
- var reg_endName_match=/^(.*?)\/.*$/\r
- if(reg_endName_match.test(version)){\r
- version = version.match(reg_endName_match)[1];\r
- }\r
- $("input[name='version']").val(version);\r
- $("input[name='url']").val("/api/"+group[2]+"/"+version);\r
-\r
- if(!$("input[name='version']").hasClass("form-input-focus")){\r
- $("input[name='version']").addClass("form-input-focus");\r
- $("input[name='version']").prev().addClass("item-tip-focus");\r
- }\r
- \r
- \r
-\r
- }\r
- else{\r
- //非标准api\r
- var group = oriService.match(reg_unstandard_match);\r
- var reg_endName_match=/^(.*?)\/$/\r
- var url=group[2];\r
- if(url!="/" && reg_endName_match.test(url)){\r
- url = url.match(reg_endName_match)[1];\r
- }\r
-\r
-\r
- $("input[name='serviceName']").val("");\r
- $("input[name='version']").val("");\r
- $("input[name='server']").val(group[1].replace("http://",""));\r
- $("input[name='url']").val(url);\r
- }\r
-\r
- if(!$("input[name='server']").hasClass("form-input-focus")){\r
- $("input[name='server']").addClass("form-input-focus");\r
- $("input[name='server']").prev().addClass("item-tip-focus");\r
- }\r
- }\r
- \r
- \r
-});\r
-\r
-\r
-$("input[name='iuioriService']").blur(function(){\r
- var oriService=$.trim($(this).val());\r
- if(oriService==""){\r
- $("input[name='iuiserviceName']").val("");\r
- $("input[name='iuiserver']").val("");\r
- $("input[name='iuiurl']").val("");\r
- return;\r
- }\r
- \r
- \r
-\r
- var reg=/^(|http:\/\/)(([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})\/.*$/ \r
- var reg_standard_match=/^(.*:\d{1,5})\/iui\/(.*|.*\/)$/ \r
- var reg_unstandard_match=/^(.*:\d{1,5})(\/.*)$/ \r
- if(reg.test(oriService)){ \r
- if(reg_standard_match.test(oriService)){ \r
- //标准api\r
- var group = oriService.match(reg_standard_match);\r
-\r
- \r
- $("input[name='iuiserver']").val(group[1].replace("http://",""));\r
- \r
-\r
- var serviceName=group[2];\r
- var reg_endName_match=/^(.*?)\/.*$/\r
- if(reg_endName_match.test(serviceName)){\r
- serviceName = serviceName.match(reg_endName_match)[1];\r
- }\r
- $("input[name='iuiserviceName']").val(serviceName);\r
- $("input[name='iuiurl']").val("/iui/"+serviceName);\r
- \r
- }\r
- else{\r
- //非标准api\r
- var group = oriService.match(reg_unstandard_match);\r
- \r
- var reg_endName_match=/^(.*?)\/$/\r
- var url=group[2];\r
- if(url!="/" && reg_endName_match.test(url)){\r
- url = url.match(reg_endName_match)[1];\r
- }\r
- $("input[name='iuiserver']").val(group[1].replace("http://",""));\r
- $("input[name='iuiurl']").val(url);\r
- }\r
-\r
- if(!$("input[name='iuiserver']").hasClass("form-input-focus")){\r
- $("input[name='iuiserver']").addClass("form-input-focus");\r
- $("input[name='iuiserver']").prev().addClass("item-tip-focus");\r
- }\r
- }\r
- \r
- \r
-});\r
-\r
-$("input[name='customoriService']").blur(function(){\r
- var oriService=$.trim($(this).val());\r
- if(oriService==""){\r
- $("input[name='customserviceName']").val("");\r
- $("input[name='customserver']").val("");\r
- $("input[name='customurl']").val("");\r
- return;\r
- }\r
- \r
- \r
-\r
- var reg=/^(|http:\/\/)(([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})\/.*$/ \r
- \r
- var reg_unstandard_match=/^(.*:\d{1,5})(\/.*)$/ \r
- if(reg.test(oriService)){ \r
- \r
-\r
- var group = oriService.match(reg_unstandard_match);\r
- \r
- var reg_endName_match=/^(.*?)\/$/\r
- var url=group[2];\r
- if(url!="/" && reg_endName_match.test(url)){\r
- url = url.match(reg_endName_match)[1];\r
- }\r
- $("input[name='customserver']").val(group[1].replace("http://",""));\r
- $("input[name='customurl']").val(url);\r
- $("input[name='customserviceName']").val(url);\r
- \r
-\r
- if(!$("input[name='customserver']").hasClass("form-input-focus")){\r
- $("input[name='customserver']").addClass("form-input-focus");\r
- $("input[name='customserver']").prev().addClass("item-tip-focus");\r
- }\r
- }\r
- \r
- \r
-});\r
-\r
-*/\r
-\r
- jQuery.validator.addMethod("ip", function(value, element) { \r
- return this.optional(element) || /^(([-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})$/.test(value); \r
- }, $.i18n.prop('org_openo_msb_route_validator_ip_format'));\r
-\r
-\r
-\r
- jQuery.validator.addMethod("url_head", function(value, element) { \r
- return this.optional(element) || /^\/.+((?!\/).)$/i.test(value) || /^\/$/i.test(value); \r
- }, $.i18n.prop('org_openo_msb_route_validator_url_head_format'));\r
-\r
-\r
-jQuery.validator.addMethod("url_head_only", function(value, element) { \r
- return this.optional(element) || /^\/.*$/i.test(value); \r
- }, $.i18n.prop('org_openo_msb_route_validator_url_head_only_format'));\r
- \r
- jQuery.validator.addMethod("version", function(value, element) { \r
- return this.optional(element) || /^v\d+(\.\d+)?$/i.test(value); \r
- }, $.i18n.prop('org_openo_msb_route_form_version_tip'));\r
-\r
- jQuery.validator.addMethod("service_url", function(value, element) { \r
- return this.optional(element) || /^(|http:\/\/)(([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})\/.*$/.test(value); \r
- }, $.i18n.prop('org_openo_msb_route_validator_url_format'));\r
-\r
- jQuery.validator.addMethod("url_line", function(value, element) { \r
- return this.optional(element) || /^((?!\/).)*$/.test(value); \r
- }, $.i18n.prop('org_openo_msb_route_validator_url_line_format'));\r
-\r
- jQuery.validator.addMethod("content", function(value, element) { \r
- return this.optional(element) || /^([0-9a-zA-Z]|-|_)*$/i.test(value); \r
- }, $.i18n.prop('org_openo_msb_route_validator_content_format'));\r
-\r
- jQuery.validator.addMethod("custom_content", function(value, element) { \r
- return this.optional(element) || /^([0-9a-zA-Z]|-|_|\/)*$/i.test(value); \r
- }, $.i18n.prop('org_openo_msb_route_validator_content_format'));\r
-\r
-\r
- });\r
-\r
- var form = $('#routeForm');\r
- var error = $('.alert-danger', form);\r
- var success = $('.alert-success', form);\r
-\r
- var iuiform = $('#iuirouteForm');\r
- var iuierror = $('.alert-danger', iuiform);\r
- var iuisuccess = $('.alert-success', iuiform);\r
-\r
-\r
- var customform = $('#customrouteForm');\r
- var customerror = $('.alert-danger', customform);\r
- var customsuccess = $('.alert-success', customform);\r
-\r
- var msbform = $('#msbForm');\r
- var msberror = $('.alert-danger', msbform);\r
- var msbsuccess = $('.alert-success', msbform);\r
-\r
-\r
- form.validate({\r
- doNotHideMessage: true, //this option enables to show the error/success messages on tab switch.\r
- errorElement: 'span', //default input error message container\r
- errorClass: 'help-block', // default input error message class\r
- focusInvalid: false, // do not focus the last invalid input\r
- rules: { \r
- /* oriService:{\r
- service_url:true,\r
- maxlength:100\r
- },*/\r
- serviceName:{\r
- required: true,\r
- url_line:true,\r
- content:true,\r
- maxlength:50\r
- },\r
- version:{\r
- // required: true,\r
- maxlength:50,\r
- version:true\r
- },\r
- url:{\r
- required: true,\r
- url_head:true,\r
- maxlength:50\r
- },\r
- metricsUrl:{\r
- url_head:true,\r
- maxlength:50\r
- },\r
- server:{\r
- ip:true,\r
- maxlength:50\r
- }\r
- },\r
- messages: { \r
- serviceName:{\r
- required: "Please enter the service name"\r
- }, \r
- url:{\r
- required: "Please enter the URL address"\r
- \r
- }, \r
- server:{\r
- required:"Please enter the Host address"\r
- \r
- },\r
-\r
- },\r
- errorPlacement: function (error, element) { // render error placement for each input type\r
- error.insertAfter(element); // for other inputs, just perform default behavior\r
- },\r
-\r
- invalidHandler: function (event, validator) { //display error alert on form submit \r
- success.hide();\r
- error.show();\r
- //ZteFrameWork.scrollTo(error, -200);\r
- },\r
-\r
- highlight: function (element) { // hightlight error inputs\r
- $(element)\r
- .closest('.form-group').removeClass('has-success').addClass('has-error'); // set error class to the control group\r
- },\r
-\r
- unhighlight: function (element) { // revert the change done by hightlight\r
- $(element)\r
- .closest('.form-group').removeClass('has-error'); // set error class to the control group\r
- },\r
-\r
- success: function (label) {\r
- label\r
- .addClass('valid') // mark the current input as valid and display OK icon\r
- .closest('.form-group').removeClass('has-error'); // set success class to the control group\r
- },\r
- submitHandler: function (form) {\r
- success.show();\r
- error.hide();\r
- //add here some ajax code to submit your form or just call form.submit() if you want to submit the form without ajax\r
- }\r
-\r
- });\r
-\r
- iuiform.validate({\r
- doNotHideMessage: true, //this option enables to show the error/success messages on tab switch.\r
- errorElement: 'span', //default input error message container\r
- errorClass: 'help-block', // default input error message class\r
- focusInvalid: false, // do not focus the last invalid input\r
- rules: { \r
- /*iuioriService:{\r
- service_url:true,\r
- maxlength:100\r
- },*/\r
- iuiserviceName:{\r
- required: true,\r
- url_line:true,\r
- maxlength:50,\r
- content:true\r
- }, \r
- iuiurl:{\r
- required: true,\r
- url_head:true,\r
- maxlength:50\r
- },\r
- iuiserver:{\r
- ip:true,\r
- maxlength:50\r
- }\r
- },\r
- messages: { \r
- iuiserviceName:{\r
- required: "Please enter the service name"\r
- },\r
- iuiurl:{\r
- required:"Please enter the URL address"\r
- \r
- },\r
- iuiserver:{\r
- required: "Please enter the Host address"\r
- },\r
-\r
- },\r
- errorPlacement: function (iuierror, element) { // render error placement for each input type\r
- iuierror.insertAfter(element); // for other inputs, just perform default behavior\r
- },\r
-\r
- invalidHandler: function (event, validator) { //display error alert on form submit \r
- iuisuccess.hide();\r
- iuierror.show();\r
- //ZteFrameWork.scrollTo(error, -200);\r
- },\r
-\r
- highlight: function (element) { // hightlight error inputs\r
- $(element)\r
- .closest('.form-group').removeClass('has-success').addClass('has-error'); // set error class to the control group\r
- },\r
-\r
- unhighlight: function (element) { // revert the change done by hightlight\r
- $(element)\r
- .closest('.form-group').removeClass('has-error'); // set error class to the control group\r
- },\r
-\r
- success: function (label) {\r
- label\r
- .addClass('valid') // mark the current input as valid and display OK icon\r
- .closest('.form-group').removeClass('has-error'); // set success class to the control group\r
- },\r
- submitHandler: function (form) {\r
- iuisuccess.show();\r
- iuierror.hide();\r
- //add here some ajax code to submit your form or just call form.submit() if you want to submit the form without ajax\r
- }\r
-\r
- });\r
-\r
- customform.validate({\r
- doNotHideMessage: true, //this option enables to show the error/success messages on tab switch.\r
- errorElement: 'span', //default input error message container\r
- errorClass: 'help-block', // default input error message class\r
- focusInvalid: false, // do not focus the last invalid input\r
- rules: { \r
- /*customoriService:{\r
- service_url:true,\r
- maxlength:100\r
- },*/\r
- customserviceName:{\r
- required: false,\r
- url_head:true,\r
- maxlength:100,\r
- custom_content:true\r
- }, \r
- customurl:{\r
- required: true,\r
- url_head:true,\r
- maxlength:50\r
- },\r
- customserver:{\r
- ip:true,\r
- maxlength:50\r
- }\r
- },\r
- messages: { \r
- customserviceName:{\r
- required: "Please enter the service name"\r
- }, \r
- customurl:{\r
- required: "Please enter the URL address"\r
- \r
- }\r
-\r
- },\r
- errorPlacement: function (customerror, element) { // render error placement for each input type\r
- customerror.insertAfter(element); // for other inputs, just perform default behavior\r
- },\r
-\r
- invalidHandler: function (event, validator) { //display error alert on form submit \r
- customsuccess.hide();\r
- customerror.show();\r
- //ZteFrameWork.scrollTo(error, -200);\r
- },\r
-\r
- highlight: function (element) { // hightlight error inputs\r
- $(element)\r
- .closest('.form-group').removeClass('has-success').addClass('has-error'); // set error class to the control group\r
- },\r
-\r
- unhighlight: function (element) { // revert the change done by hightlight\r
- $(element)\r
- .closest('.form-group').removeClass('has-error'); // set error class to the control group\r
- },\r
-\r
- success: function (label) {\r
- label\r
- .addClass('valid') // mark the current input as valid and display OK icon\r
- .closest('.form-group').removeClass('has-error'); // set success class to the control group\r
- },\r
- submitHandler: function (form) {\r
- customsuccess.show();\r
- customerror.hide();\r
- //add here some ajax code to submit your form or just call form.submit() if you want to submit the form without ajax\r
- }\r
-\r
- });\r
-\r
-\r
- msbform.validate({\r
- doNotHideMessage: true, //this option enables to show the error/success messages on tab switch.\r
- errorElement: 'span', //default input error message container\r
- errorClass: 'help-block', // default input error message class\r
- focusInvalid: false, // do not focus the last invalid input\r
- rules: { \r
- \r
- serviceName:{\r
- required: true,\r
- // url_line:true,\r
- custom_content:true,\r
- maxlength:50\r
- },\r
- version:{\r
- maxlength:50,\r
- version:true\r
- },\r
- url:{\r
- url_head:true,\r
- maxlength:50\r
- },\r
- newHost:{\r
- ip:true,\r
- maxlength:50\r
- },\r
- newttl:{\r
- digits:true,\r
- min:0\r
- },\r
- protocol:{\r
- required: true\r
- },\r
- type:{\r
- required: true\r
- }\r
- },\r
- messages: { \r
- serviceName:{\r
- required: "Please enter the service name"\r
- },\r
- protocol:{\r
- required: "Please select a service protocol"\r
- }, \r
- type:{\r
- required: "Please select a service type"\r
- \r
- },\r
- newttl:{\r
- digits:"Please enter an integer",\r
- min: "Not a negative" \r
- }\r
-\r
- },\r
- errorPlacement: function (msberror, element) { // render error placement for each input type\r
- msberror.insertAfter(element); // for other inputs, just perform default behavior\r
- },\r
-\r
- invalidHandler: function (event, validator) { //display error alert on form submit \r
- msbsuccess.hide();\r
- msberror.show();\r
- //ZteFrameWork.scrollTo(error, -200);\r
- },\r
-\r
- highlight: function (element) { // hightlight error inputs\r
- $(element)\r
- .closest('.form-group').removeClass('has-success').addClass('has-error'); // set error class to the control group\r
- },\r
-\r
- unhighlight: function (element) { // revert the change done by hightlight\r
- $(element)\r
- .closest('.form-group').removeClass('has-error'); // set error class to the control group\r
- },\r
-\r
- success: function (label) {\r
- label\r
- .addClass('valid') // mark the current input as valid and display OK icon\r
- .closest('.form-group').removeClass('has-error'); // set success class to the control group\r
- },\r
- submitHandler: function (form) {\r
- msbsuccess.show();\r
- msberror.hide();\r
- //add here some ajax code to submit your form or just call form.submit() if you want to submit the form without ajax\r
- }\r
-\r
- });\r
-\r
-\r
+/*
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
+ */
+$(function(){
+
+ $('#msbTable tbody').on('click', 'td.details-control', function () {
+ var tr = $(this).closest('tr');
+ var row = table.row( tr );
+ if ( row.child.isShown() ) {
+ // This row is already open - close it
+ row.child.hide();
+ tr.removeClass('shown');
+ }
+ else {
+ // Open this row
+ var nodes=row.data()[1].match(/\d+.\d+.\d+.\d+:\d+:(-)?\d+/g)
+
+ row.child( routeUtil.formatDetail(nodes) ).show();
+ tr.addClass('shown');
+ }
+ } );
+
+ $('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
+ //Get the name of the TAB has been activated
+ var activeTab = $(e.target).text();
+ if(this.id=="customTab" || this.id=="msbTab"){
+ $("#serviceContent").hide();
+ $("#upArrawDiv").hide();
+ }
+ else{
+ $("#serviceContent").show();
+ $("#upArrawDiv").show();
+ $('#msbSubPage').attr("src","");
+ $(".stats_box .routeDiv").removeClass("active");
+ vm.selectedRouteType="";
+ vm.routeTargetTitle=$.i18n.prop("org_openo_msb_route_content_title");
+
+ }
+ });
+
+
+ $("[data-toggle='tooltip']").tooltip();
+
+ $('#metricsFullurl').on('show.bs.collapse', function () {
+ $('#metricsUrlCollapse').removeClass('fa-plus').addClass('fa-minus');
+
+ });
+
+ $('#metricsFullurl').on('hide.bs.collapse', function () {
+ $('#metricsUrlCollapse').removeClass('fa-minus').addClass('fa-plus');
+ });
+
+ $('#apiJsonFullurl').on('show.bs.collapse', function () {
+ $('#apiJsonCollapse').removeClass('fa-plus').addClass('fa-minus');
+
+ });
+
+ $('#apiJsonFullurl').on('hide.bs.collapse', function () {
+ $('#apiJsonCollapse').removeClass('fa-minus').addClass('fa-plus');
+ });
+
+
+
+ $(".form-tip").blur(function(){
+ if($.trim($(this).val())==""){
+ $(this).removeClass("form-input-focus");
+ $(this).prev().removeClass("item-tip-focus");
+ }});
+
+$(".form-tip").focus(function(){
+ if(!$(this).hasClass("form-input-focus")){
+ $(this).addClass("form-input-focus");
+ $(this).prev().addClass("item-tip-focus");
+ }});
+
+$(".item-tip").click(function(){
+ $(this).next().focus();
+});
+
+
+
+$("input[name='version']").blur(function(){
+ $(this).val($(this).val().toLowerCase());
+ routeUtil.changeTargetServiceUrl();
+});
+
+
+$("input[name='url']").blur(function(){
+
+routeUtil.changeTargetServiceUrl();
+
+});
+$("input[name='serviceName']").blur(function(){
+
+routeUtil.changeTargetServiceUrl();
+
+});
+
+
+
+$("select[name='protocol']").change(function(){
+
+routeUtil.changeTargetServiceUrl();
+
+});
+
+/*
+
+$("input[name='oriService']").blur(function(){
+ var oriService=$.trim($(this).val());
+ if(oriService==""){
+ $("input[name='serviceName']").val("");
+ $("input[name='version']").val("");
+ $("input[name='server']").val("");
+ $("input[name='url']").val("");
+ return;
+ }
+
+
+
+ var reg=/^(|http:\/\/)(([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})\/.*$/
+ var reg_standard_match=/^(.*:\d{1,5})\/api\/(.*)\/(v.*)$/
+ var reg_unstandard_match=/^(.*:\d{1,5})(\/.*)$/
+ if(reg.test(oriService)){
+ if(reg_standard_match.test(oriService)){
+ //标准api
+ var group = oriService.match(reg_standard_match);
+ $("input[name='serviceName']").val(group[2]);
+ $("input[name='server']").val(group[1].replace("http://",""));
+
+
+ var version=group[3];
+ var reg_endName_match=/^(.*?)\/.*$/
+ if(reg_endName_match.test(version)){
+ version = version.match(reg_endName_match)[1];
+ }
+ $("input[name='version']").val(version);
+ $("input[name='url']").val("/api/"+group[2]+"/"+version);
+
+ if(!$("input[name='version']").hasClass("form-input-focus")){
+ $("input[name='version']").addClass("form-input-focus");
+ $("input[name='version']").prev().addClass("item-tip-focus");
+ }
+
+
+
+ }
+ else{
+ //非标准api
+ var group = oriService.match(reg_unstandard_match);
+ var reg_endName_match=/^(.*?)\/$/
+ var url=group[2];
+ if(url!="/" && reg_endName_match.test(url)){
+ url = url.match(reg_endName_match)[1];
+ }
+
+
+ $("input[name='serviceName']").val("");
+ $("input[name='version']").val("");
+ $("input[name='server']").val(group[1].replace("http://",""));
+ $("input[name='url']").val(url);
+ }
+
+ if(!$("input[name='server']").hasClass("form-input-focus")){
+ $("input[name='server']").addClass("form-input-focus");
+ $("input[name='server']").prev().addClass("item-tip-focus");
+ }
+ }
+
+
+});
+
+
+$("input[name='iuioriService']").blur(function(){
+ var oriService=$.trim($(this).val());
+ if(oriService==""){
+ $("input[name='iuiserviceName']").val("");
+ $("input[name='iuiserver']").val("");
+ $("input[name='iuiurl']").val("");
+ return;
+ }
+
+
+
+ var reg=/^(|http:\/\/)(([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})\/.*$/
+ var reg_standard_match=/^(.*:\d{1,5})\/iui\/(.*|.*\/)$/
+ var reg_unstandard_match=/^(.*:\d{1,5})(\/.*)$/
+ if(reg.test(oriService)){
+ if(reg_standard_match.test(oriService)){
+ //标准api
+ var group = oriService.match(reg_standard_match);
+
+
+ $("input[name='iuiserver']").val(group[1].replace("http://",""));
+
+
+ var serviceName=group[2];
+ var reg_endName_match=/^(.*?)\/.*$/
+ if(reg_endName_match.test(serviceName)){
+ serviceName = serviceName.match(reg_endName_match)[1];
+ }
+ $("input[name='iuiserviceName']").val(serviceName);
+ $("input[name='iuiurl']").val("/iui/"+serviceName);
+
+ }
+ else{
+ //非标准api
+ var group = oriService.match(reg_unstandard_match);
+
+ var reg_endName_match=/^(.*?)\/$/
+ var url=group[2];
+ if(url!="/" && reg_endName_match.test(url)){
+ url = url.match(reg_endName_match)[1];
+ }
+ $("input[name='iuiserver']").val(group[1].replace("http://",""));
+ $("input[name='iuiurl']").val(url);
+ }
+
+ if(!$("input[name='iuiserver']").hasClass("form-input-focus")){
+ $("input[name='iuiserver']").addClass("form-input-focus");
+ $("input[name='iuiserver']").prev().addClass("item-tip-focus");
+ }
+ }
+
+
+});
+
+$("input[name='customoriService']").blur(function(){
+ var oriService=$.trim($(this).val());
+ if(oriService==""){
+ $("input[name='customserviceName']").val("");
+ $("input[name='customserver']").val("");
+ $("input[name='customurl']").val("");
+ return;
+ }
+
+
+
+ var reg=/^(|http:\/\/)(([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})\/.*$/
+
+ var reg_unstandard_match=/^(.*:\d{1,5})(\/.*)$/
+ if(reg.test(oriService)){
+
+
+ var group = oriService.match(reg_unstandard_match);
+
+ var reg_endName_match=/^(.*?)\/$/
+ var url=group[2];
+ if(url!="/" && reg_endName_match.test(url)){
+ url = url.match(reg_endName_match)[1];
+ }
+ $("input[name='customserver']").val(group[1].replace("http://",""));
+ $("input[name='customurl']").val(url);
+ $("input[name='customserviceName']").val(url);
+
+
+ if(!$("input[name='customserver']").hasClass("form-input-focus")){
+ $("input[name='customserver']").addClass("form-input-focus");
+ $("input[name='customserver']").prev().addClass("item-tip-focus");
+ }
+ }
+
+
+});
+
+*/
+
+ jQuery.validator.addMethod("ip", function(value, element) {
+ return this.optional(element) || /^(([-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})$/.test(value);
+ }, $.i18n.prop('org_openo_msb_route_validator_ip_format'));
+
+
+
+ jQuery.validator.addMethod("url_head", function(value, element) {
+ return this.optional(element) || /^\/.+((?!\/).)$/i.test(value) || /^\/$/i.test(value);
+ }, $.i18n.prop('org_openo_msb_route_validator_url_head_format'));
+
+
+jQuery.validator.addMethod("url_head_only", function(value, element) {
+ return this.optional(element) || /^\/.*$/i.test(value);
+ }, $.i18n.prop('org_openo_msb_route_validator_url_head_only_format'));
+
+ jQuery.validator.addMethod("version", function(value, element) {
+ return this.optional(element) || /^v\d+(\.\d+)?$/i.test(value);
+ }, $.i18n.prop('org_openo_msb_route_form_version_tip'));
+
+ jQuery.validator.addMethod("service_url", function(value, element) {
+ return this.optional(element) || /^(|http:\/\/)(([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})\/.*$/.test(value);
+ }, $.i18n.prop('org_openo_msb_route_validator_url_format'));
+
+ jQuery.validator.addMethod("url_line", function(value, element) {
+ return this.optional(element) || /^((?!\/).)*$/.test(value);
+ }, $.i18n.prop('org_openo_msb_route_validator_url_line_format'));
+
+ jQuery.validator.addMethod("content", function(value, element) {
+ return this.optional(element) || /^([0-9a-zA-Z]|-|_)*$/i.test(value);
+ }, $.i18n.prop('org_openo_msb_route_validator_content_format'));
+
+ jQuery.validator.addMethod("custom_content", function(value, element) {
+ return this.optional(element) || /^([0-9a-zA-Z]|-|_|\/)*$/i.test(value);
+ }, $.i18n.prop('org_openo_msb_route_validator_content_format'));
+
+
+ });
+
+ var form = $('#routeForm');
+ var error = $('.alert-danger', form);
+ var success = $('.alert-success', form);
+
+ var iuiform = $('#iuirouteForm');
+ var iuierror = $('.alert-danger', iuiform);
+ var iuisuccess = $('.alert-success', iuiform);
+
+
+ var customform = $('#customrouteForm');
+ var customerror = $('.alert-danger', customform);
+ var customsuccess = $('.alert-success', customform);
+
+ var msbform = $('#msbForm');
+ var msberror = $('.alert-danger', msbform);
+ var msbsuccess = $('.alert-success', msbform);
+
+
+ form.validate({
+ doNotHideMessage: true, //this option enables to show the error/success messages on tab switch.
+ errorElement: 'span', //default input error message container
+ errorClass: 'help-block', // default input error message class
+ focusInvalid: false, // do not focus the last invalid input
+ rules: {
+ /* oriService:{
+ service_url:true,
+ maxlength:100
+ },*/
+ serviceName:{
+ required: true,
+ url_line:true,
+ content:true,
+ maxlength:50
+ },
+ version:{
+ // required: true,
+ maxlength:50,
+ version:true
+ },
+ url:{
+ required: true,
+ url_head:true,
+ maxlength:50
+ },
+ metricsUrl:{
+ url_head:true,
+ maxlength:50
+ },
+ server:{
+ ip:true,
+ maxlength:50
+ }
+ },
+ messages: {
+ serviceName:{
+ required: "Please enter the service name"
+ },
+ url:{
+ required: "Please enter the URL address"
+
+ },
+ server:{
+ required:"Please enter the Host address"
+
+ },
+
+ },
+ errorPlacement: function (error, element) { // render error placement for each input type
+ error.insertAfter(element); // for other inputs, just perform default behavior
+ },
+
+ invalidHandler: function (event, validator) { //display error alert on form submit
+ success.hide();
+ error.show();
+ //ZteFrameWork.scrollTo(error, -200);
+ },
+
+ highlight: function (element) { // hightlight error inputs
+ $(element)
+ .closest('.form-group').removeClass('has-success').addClass('has-error'); // set error class to the control group
+ },
+
+ unhighlight: function (element) { // revert the change done by hightlight
+ $(element)
+ .closest('.form-group').removeClass('has-error'); // set error class to the control group
+ },
+
+ success: function (label) {
+ label
+ .addClass('valid') // mark the current input as valid and display OK icon
+ .closest('.form-group').removeClass('has-error'); // set success class to the control group
+ },
+ submitHandler: function (form) {
+ success.show();
+ error.hide();
+ //add here some ajax code to submit your form or just call form.submit() if you want to submit the form without ajax
+ }
+
+ });
+
+ iuiform.validate({
+ doNotHideMessage: true, //this option enables to show the error/success messages on tab switch.
+ errorElement: 'span', //default input error message container
+ errorClass: 'help-block', // default input error message class
+ focusInvalid: false, // do not focus the last invalid input
+ rules: {
+ /*iuioriService:{
+ service_url:true,
+ maxlength:100
+ },*/
+ iuiserviceName:{
+ required: true,
+ url_line:true,
+ maxlength:50,
+ content:true
+ },
+ iuiurl:{
+ required: true,
+ url_head:true,
+ maxlength:50
+ },
+ iuiserver:{
+ ip:true,
+ maxlength:50
+ }
+ },
+ messages: {
+ iuiserviceName:{
+ required: "Please enter the service name"
+ },
+ iuiurl:{
+ required:"Please enter the URL address"
+
+ },
+ iuiserver:{
+ required: "Please enter the Host address"
+ },
+
+ },
+ errorPlacement: function (iuierror, element) { // render error placement for each input type
+ iuierror.insertAfter(element); // for other inputs, just perform default behavior
+ },
+
+ invalidHandler: function (event, validator) { //display error alert on form submit
+ iuisuccess.hide();
+ iuierror.show();
+ //ZteFrameWork.scrollTo(error, -200);
+ },
+
+ highlight: function (element) { // hightlight error inputs
+ $(element)
+ .closest('.form-group').removeClass('has-success').addClass('has-error'); // set error class to the control group
+ },
+
+ unhighlight: function (element) { // revert the change done by hightlight
+ $(element)
+ .closest('.form-group').removeClass('has-error'); // set error class to the control group
+ },
+
+ success: function (label) {
+ label
+ .addClass('valid') // mark the current input as valid and display OK icon
+ .closest('.form-group').removeClass('has-error'); // set success class to the control group
+ },
+ submitHandler: function (form) {
+ iuisuccess.show();
+ iuierror.hide();
+ //add here some ajax code to submit your form or just call form.submit() if you want to submit the form without ajax
+ }
+
+ });
+
+ customform.validate({
+ doNotHideMessage: true, //this option enables to show the error/success messages on tab switch.
+ errorElement: 'span', //default input error message container
+ errorClass: 'help-block', // default input error message class
+ focusInvalid: false, // do not focus the last invalid input
+ rules: {
+ /*customoriService:{
+ service_url:true,
+ maxlength:100
+ },*/
+ customserviceName:{
+ required: false,
+ url_head:true,
+ maxlength:100,
+ custom_content:true
+ },
+ customurl:{
+ required: true,
+ url_head:true,
+ maxlength:50
+ },
+ customserver:{
+ ip:true,
+ maxlength:50
+ }
+ },
+ messages: {
+ customserviceName:{
+ required: "Please enter the service name"
+ },
+ customurl:{
+ required: "Please enter the URL address"
+
+ }
+
+ },
+ errorPlacement: function (customerror, element) { // render error placement for each input type
+ customerror.insertAfter(element); // for other inputs, just perform default behavior
+ },
+
+ invalidHandler: function (event, validator) { //display error alert on form submit
+ customsuccess.hide();
+ customerror.show();
+ //ZteFrameWork.scrollTo(error, -200);
+ },
+
+ highlight: function (element) { // hightlight error inputs
+ $(element)
+ .closest('.form-group').removeClass('has-success').addClass('has-error'); // set error class to the control group
+ },
+
+ unhighlight: function (element) { // revert the change done by hightlight
+ $(element)
+ .closest('.form-group').removeClass('has-error'); // set error class to the control group
+ },
+
+ success: function (label) {
+ label
+ .addClass('valid') // mark the current input as valid and display OK icon
+ .closest('.form-group').removeClass('has-error'); // set success class to the control group
+ },
+ submitHandler: function (form) {
+ customsuccess.show();
+ customerror.hide();
+ //add here some ajax code to submit your form or just call form.submit() if you want to submit the form without ajax
+ }
+
+ });
+
+
+ msbform.validate({
+ doNotHideMessage: true, //this option enables to show the error/success messages on tab switch.
+ errorElement: 'span', //default input error message container
+ errorClass: 'help-block', // default input error message class
+ focusInvalid: false, // do not focus the last invalid input
+ rules: {
+
+ serviceName:{
+ required: true,
+ // url_line:true,
+ custom_content:true,
+ maxlength:50
+ },
+ version:{
+ maxlength:50,
+ version:true
+ },
+ url:{
+ url_head:true,
+ maxlength:50
+ },
+ newHost:{
+ ip:true,
+ maxlength:50
+ },
+ newttl:{
+ digits:true,
+ min:0
+ },
+ protocol:{
+ required: true
+ },
+ type:{
+ required: true
+ }
+ },
+ messages: {
+ serviceName:{
+ required: "Please enter the service name"
+ },
+ protocol:{
+ required: "Please select a service protocol"
+ },
+ type:{
+ required: "Please select a service type"
+
+ },
+ newttl:{
+ digits:"Please enter an integer",
+ min: "Not a negative"
+ }
+
+ },
+ errorPlacement: function (msberror, element) { // render error placement for each input type
+ msberror.insertAfter(element); // for other inputs, just perform default behavior
+ },
+
+ invalidHandler: function (event, validator) { //display error alert on form submit
+ msbsuccess.hide();
+ msberror.show();
+ //ZteFrameWork.scrollTo(error, -200);
+ },
+
+ highlight: function (element) { // hightlight error inputs
+ $(element)
+ .closest('.form-group').removeClass('has-success').addClass('has-error'); // set error class to the control group
+ },
+
+ unhighlight: function (element) { // revert the change done by hightlight
+ $(element)
+ .closest('.form-group').removeClass('has-error'); // set error class to the control group
+ },
+
+ success: function (label) {
+ label
+ .addClass('valid') // mark the current input as valid and display OK icon
+ .closest('.form-group').removeClass('has-error'); // set success class to the control group
+ },
+ submitHandler: function (form) {
+ msbsuccess.show();
+ msberror.hide();
+ //add here some ajax code to submit your form or just call form.submit() if you want to submit the form without ajax
+ }
+
+ });
+
+
/*
- * Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
*
* Licensed 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
+ * 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.
+ *
+ * Author: Zhaoxing Meng
+ * email: meng.zhaoxing1@zte.com.cn
*/
var routeUtil = {};
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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
-package org.openo.msb.wrapper;\r
-\r
-import org.junit.After;\r
-import org.junit.Assert;\r
-import org.junit.Before;\r
-import org.junit.BeforeClass;\r
-import org.junit.Test;\r
-import org.openo.msb.api.ApiRouteInfo;\r
-import org.openo.msb.api.RouteServer;\r
-import org.openo.msb.api.exception.ExtendedInternalServerErrorException;\r
-import org.openo.msb.api.exception.ExtendedNotFoundException;\r
-\r
-public class ApiRouteServiceWrapperTest {\r
- private static ApiRouteServiceWrapper apiRouteServiceWrapper;\r
- \r
- @BeforeClass\r
- public static void setUpBeforeClass() throws Exception {\r
- apiRouteServiceWrapper=ApiRouteServiceWrapper.getInstance();\r
- }\r
- \r
- @Before\r
- public void setUp() {\r
- ApiRouteInfo apiRouteInfo=new ApiRouteInfo();\r
- apiRouteInfo.setServiceName("testForJunit");\r
- apiRouteInfo.setVersion("v1");\r
- apiRouteInfo.setUrl("/api/test/v1");\r
- RouteServer[] servers=new RouteServer[]{new RouteServer("127.0.0.1","80")};\r
- apiRouteInfo.setServers(servers);\r
- try {\r
- apiRouteServiceWrapper.saveApiRouteInstance(apiRouteInfo, "");\r
- }\r
- catch(ExtendedInternalServerErrorException e){\r
- }\r
- catch (Exception e){\r
- Assert.fail("Exception" + e.getMessage());\r
- }\r
- \r
- }\r
- \r
- @After\r
- public void tearDown() { \r
- try {\r
- apiRouteServiceWrapper.deleteApiRoute("testForJunit", "v1", "*", ""); \r
- } \r
- catch(ExtendedInternalServerErrorException e){\r
- \r
- }catch (Exception e) {\r
- Assert.fail("Exception" + e.getMessage());\r
- }\r
- }\r
- \r
- @Test\r
- public void testGetAllApiRouteInstances(){\r
- try {\r
- ApiRouteInfo[] apiRouteInfoList=apiRouteServiceWrapper.getAllApiRouteInstances();\r
- Assert.assertTrue(apiRouteInfoList.length >= 0);\r
- }\r
- catch(ExtendedInternalServerErrorException e){\r
- \r
- }\r
- catch(Exception e){\r
- Assert.fail("Exception" + e.getMessage());\r
- }\r
- \r
- }\r
- \r
- @Test\r
- public void testGetApiRouteInstance_not_exist(){\r
- ApiRouteInfo apiRouteInfo = null;\r
- try {\r
- apiRouteInfo=apiRouteServiceWrapper.getApiRouteInstance("testForJunit", "v2");\r
- Assert.assertNotNull(apiRouteInfo);\r
- }\r
- catch(ExtendedInternalServerErrorException e){\r
- \r
- }\r
- catch(ExtendedNotFoundException e){\r
- Assert.assertNull(apiRouteInfo);\r
- }\r
- \r
- }\r
- \r
- @Test\r
- public void testGetApiRouteInstance_exist(){\r
- try {\r
- ApiRouteInfo apiRouteInfo=apiRouteServiceWrapper.getApiRouteInstance("testForJunit", "v1");\r
- Assert.assertNotNull(apiRouteInfo);\r
- }\r
- catch(ExtendedInternalServerErrorException e){\r
- \r
- }\r
- catch(Exception e){\r
- Assert.fail("Exception" + e.getMessage());\r
- }\r
- \r
- }\r
- \r
- @Test\r
- public void testUpdateApiRouteInstance(){\r
- try {\r
- \r
- ApiRouteInfo apiRouteInfo=new ApiRouteInfo();\r
- apiRouteInfo.setServiceName("testForJunit");\r
- apiRouteInfo.setVersion("v1");\r
- apiRouteInfo.setUrl("/api/test_update/v1");\r
- RouteServer[] servers=new RouteServer[]{new RouteServer("127.0.0.1","80")};\r
- apiRouteInfo.setServers(servers);\r
- \r
- ApiRouteInfo new_apiRouteInfo= apiRouteServiceWrapper.updateApiRouteInstance("testForJunit", "v1", apiRouteInfo, "");\r
- Assert.assertEquals("/api/test_update/v1", new_apiRouteInfo.getUrl());\r
- }\r
- catch(ExtendedInternalServerErrorException e){\r
- \r
- }\r
- catch(Exception e){\r
- Assert.assertEquals("Get Jedis from pool failed!",e.getMessage());\r
- \r
-// Assert.fail("Exception" + e.getMessage());\r
- \r
- }\r
- }\r
- \r
- @Test\r
- public void testUpdateApiRouteStatus(){\r
- try { \r
- ApiRouteInfo new_apiRouteInfo= apiRouteServiceWrapper.updateApiRouteStatus("testForJunit", "v1", "0");\r
- Assert.assertEquals("0",new_apiRouteInfo.getStatus());\r
- }\r
- catch(ExtendedInternalServerErrorException e){\r
- \r
- }catch(Exception e){\r
- Assert.fail("Exception" + e.getMessage());\r
- \r
- }\r
- }\r
- \r
- @Test\r
- public void testGetApiGatewayPort(){\r
- try { \r
- String port= apiRouteServiceWrapper.getApiGatewayPort();\r
- Assert.assertEquals("10080",port);\r
- }catch(Exception e){\r
- Assert.fail("Exception" + e.getMessage());\r
- \r
- }\r
- }\r
- \r
- \r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.wrapper;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openo.msb.api.ApiRouteInfo;
+import org.openo.msb.api.RouteServer;
+import org.openo.msb.api.exception.ExtendedInternalServerErrorException;
+import org.openo.msb.api.exception.ExtendedNotFoundException;
+
+public class ApiRouteServiceWrapperTest {
+ private static ApiRouteServiceWrapper apiRouteServiceWrapper;
+
+ @BeforeClass
+ public static void setUpBeforeClass() throws Exception {
+ apiRouteServiceWrapper=ApiRouteServiceWrapper.getInstance();
+ }
+
+ @Before
+ public void setUp() {
+ ApiRouteInfo apiRouteInfo=new ApiRouteInfo();
+ apiRouteInfo.setServiceName("testForJunit");
+ apiRouteInfo.setVersion("v1");
+ apiRouteInfo.setUrl("/api/test/v1");
+ RouteServer[] servers=new RouteServer[]{new RouteServer("127.0.0.1","80")};
+ apiRouteInfo.setServers(servers);
+ try {
+ apiRouteServiceWrapper.saveApiRouteInstance(apiRouteInfo, "");
+ }
+ catch(ExtendedInternalServerErrorException e){
+ }
+ catch (Exception e){
+ Assert.fail("Exception" + e.getMessage());
+ }
+
+ }
+
+ @After
+ public void tearDown() {
+ try {
+ apiRouteServiceWrapper.deleteApiRoute("testForJunit", "v1", "*", "");
+ }
+ catch(ExtendedInternalServerErrorException e){
+
+ }catch (Exception e) {
+ Assert.fail("Exception" + e.getMessage());
+ }
+ }
+
+ @Test
+ public void testGetAllApiRouteInstances(){
+ try {
+ ApiRouteInfo[] apiRouteInfoList=apiRouteServiceWrapper.getAllApiRouteInstances();
+ Assert.assertTrue(apiRouteInfoList.length >= 0);
+ }
+ catch(ExtendedInternalServerErrorException e){
+
+ }
+ catch(Exception e){
+ Assert.fail("Exception" + e.getMessage());
+ }
+
+ }
+
+ @Test
+ public void testGetApiRouteInstance_not_exist(){
+ ApiRouteInfo apiRouteInfo = null;
+ try {
+ apiRouteInfo=apiRouteServiceWrapper.getApiRouteInstance("testForJunit", "v2");
+ Assert.assertNotNull(apiRouteInfo);
+ }
+ catch(ExtendedInternalServerErrorException e){
+
+ }
+ catch(ExtendedNotFoundException e){
+ Assert.assertNull(apiRouteInfo);
+ }
+
+ }
+
+ @Test
+ public void testGetApiRouteInstance_exist(){
+ try {
+ ApiRouteInfo apiRouteInfo=apiRouteServiceWrapper.getApiRouteInstance("testForJunit", "v1");
+ Assert.assertNotNull(apiRouteInfo);
+ }
+ catch(ExtendedInternalServerErrorException e){
+
+ }
+ catch(Exception e){
+ Assert.fail("Exception" + e.getMessage());
+ }
+
+ }
+
+ @Test
+ public void testUpdateApiRouteInstance(){
+ try {
+
+ ApiRouteInfo apiRouteInfo=new ApiRouteInfo();
+ apiRouteInfo.setServiceName("testForJunit");
+ apiRouteInfo.setVersion("v1");
+ apiRouteInfo.setUrl("/api/test_update/v1");
+ RouteServer[] servers=new RouteServer[]{new RouteServer("127.0.0.1","80")};
+ apiRouteInfo.setServers(servers);
+
+ ApiRouteInfo new_apiRouteInfo= apiRouteServiceWrapper.updateApiRouteInstance("testForJunit", "v1", apiRouteInfo, "");
+ Assert.assertEquals("/api/test_update/v1", new_apiRouteInfo.getUrl());
+ }
+ catch(ExtendedInternalServerErrorException e){
+
+ }
+ catch(Exception e){
+ Assert.assertEquals("Get Jedis from pool failed!",e.getMessage());
+
+// Assert.fail("Exception" + e.getMessage());
+
+ }
+ }
+
+ @Test
+ public void testUpdateApiRouteStatus(){
+ try {
+ ApiRouteInfo new_apiRouteInfo= apiRouteServiceWrapper.updateApiRouteStatus("testForJunit", "v1", "0");
+ Assert.assertEquals("0",new_apiRouteInfo.getStatus());
+ }
+ catch(ExtendedInternalServerErrorException e){
+
+ }catch(Exception e){
+ Assert.fail("Exception" + e.getMessage());
+
+ }
+ }
+
+ @Test
+ public void testGetApiGatewayPort(){
+ try {
+ String port= apiRouteServiceWrapper.getApiGatewayPort();
+ Assert.assertEquals("10080",port);
+ }catch(Exception e){
+ Assert.fail("Exception" + e.getMessage());
+
+ }
+ }
+
+
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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
-package org.openo.msb.wrapper;\r
-\r
-import org.junit.After;\r
-import org.junit.Assert;\r
-import org.junit.Before;\r
-import org.junit.BeforeClass;\r
-import org.junit.Test;\r
-import org.openo.msb.api.CustomRouteInfo;\r
-import org.openo.msb.api.RouteServer;\r
-import org.openo.msb.api.exception.ExtendedInternalServerErrorException;\r
-import org.openo.msb.api.exception.ExtendedNotFoundException;\r
-\r
-public class CustomRouteServiceWrapperTest {\r
-\r
- private static CustomRouteServiceWrapper customRouteServiceWrapper;\r
- \r
- @BeforeClass\r
- public static void setUpBeforeClass() throws Exception {\r
- customRouteServiceWrapper=CustomRouteServiceWrapper.getInstance();\r
- }\r
- \r
- @Before\r
- public void setUp() {\r
- CustomRouteInfo customRouteInfo=new CustomRouteInfo();\r
- customRouteInfo.setServiceName("/testForJunit");\r
- customRouteInfo.setUrl("/test");\r
- RouteServer[] servers=new RouteServer[]{new RouteServer("127.0.0.1","80")};\r
- customRouteInfo.setServers(servers);\r
- try {\r
- customRouteServiceWrapper.saveCustomRouteInstance(customRouteInfo,"");\r
- }\r
- catch(ExtendedInternalServerErrorException e){\r
- }\r
- catch(Exception e){\r
- Assert.fail("Exception" + e.getMessage());\r
- }\r
- \r
- }\r
- \r
- @After\r
- public void tearDown() { \r
- try {\r
- customRouteServiceWrapper.deleteCustomRoute("/testForJunit", "*",""); \r
- } \r
- catch(ExtendedInternalServerErrorException e){\r
- }catch (Exception e) {\r
- Assert.fail("Exception" + e.getMessage());\r
- }\r
- }\r
- \r
- @Test\r
- public void testGetAllCustomRouteInstances(){\r
- try {\r
- CustomRouteInfo[] customRouteInfoList=customRouteServiceWrapper.getAllCustomRouteInstances();\r
- Assert.assertTrue(customRouteInfoList.length >= 0);\r
- }catch(ExtendedInternalServerErrorException e){\r
- }\r
- catch(Exception e){\r
- Assert.fail("Exception" + e.getMessage());\r
- }\r
- \r
- }\r
- \r
- @Test\r
- public void testGetCustomRouteInstance_not_exist(){\r
- CustomRouteInfo customRouteInfo = null;\r
- try {\r
- customRouteInfo=customRouteServiceWrapper.getCustomRouteInstance("/testForJunit2");\r
- Assert.assertNotNull(customRouteInfo);\r
- }catch(ExtendedInternalServerErrorException e){\r
- }\r
- catch(ExtendedNotFoundException e){\r
- Assert.assertNull(customRouteInfo);\r
- }\r
- \r
- }\r
- \r
- @Test\r
- public void testGetCustomRouteInstance_exist(){\r
- try {\r
- CustomRouteInfo customRouteInfo=customRouteServiceWrapper.getCustomRouteInstance("/testForJunit");\r
- Assert.assertNotNull(customRouteInfo);\r
- }catch(ExtendedInternalServerErrorException e){\r
- }\r
- catch(Exception e){\r
- Assert.fail("Exception" + e.getMessage());\r
- }\r
- \r
- }\r
- \r
- @Test\r
- public void testUpdateCustomRouteInstance(){\r
- try {\r
- \r
- CustomRouteInfo customRouteInfo=new CustomRouteInfo();\r
- customRouteInfo.setServiceName("/testForJunit");\r
- customRouteInfo.setUrl("/test_update");\r
- RouteServer[] servers=new RouteServer[]{new RouteServer("127.0.0.1","80")};\r
- customRouteInfo.setServers(servers);\r
- \r
- CustomRouteInfo new_customRouteInfo= customRouteServiceWrapper.updateCustomRouteInstance("/testForJunit", customRouteInfo,"");\r
- Assert.assertEquals("/test_update", new_customRouteInfo.getUrl());\r
- }catch(ExtendedInternalServerErrorException e){\r
- }\r
- catch(Exception e){\r
- Assert.fail("Exception" + e.getMessage());\r
- \r
- }\r
- }\r
- \r
- @Test\r
- public void testUpdateCustomRouteStatus(){\r
- try { \r
- CustomRouteInfo new_CustomRouteInfo= customRouteServiceWrapper.updateCustomRouteStatus("/testForJunit", "0");\r
- Assert.assertEquals("0",new_CustomRouteInfo.getStatus());\r
- }catch(ExtendedInternalServerErrorException e){\r
- }catch(Exception e){\r
- Assert.fail("Exception" + e.getMessage());\r
- \r
- }\r
- }\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.wrapper;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openo.msb.api.CustomRouteInfo;
+import org.openo.msb.api.RouteServer;
+import org.openo.msb.api.exception.ExtendedInternalServerErrorException;
+import org.openo.msb.api.exception.ExtendedNotFoundException;
+
+public class CustomRouteServiceWrapperTest {
+
+ private static CustomRouteServiceWrapper customRouteServiceWrapper;
+
+ @BeforeClass
+ public static void setUpBeforeClass() throws Exception {
+ customRouteServiceWrapper=CustomRouteServiceWrapper.getInstance();
+ }
+
+ @Before
+ public void setUp() {
+ CustomRouteInfo customRouteInfo=new CustomRouteInfo();
+ customRouteInfo.setServiceName("/testForJunit");
+ customRouteInfo.setUrl("/test");
+ RouteServer[] servers=new RouteServer[]{new RouteServer("127.0.0.1","80")};
+ customRouteInfo.setServers(servers);
+ try {
+ customRouteServiceWrapper.saveCustomRouteInstance(customRouteInfo,"");
+ }
+ catch(ExtendedInternalServerErrorException e){
+ }
+ catch(Exception e){
+ Assert.fail("Exception" + e.getMessage());
+ }
+
+ }
+
+ @After
+ public void tearDown() {
+ try {
+ customRouteServiceWrapper.deleteCustomRoute("/testForJunit", "*","");
+ }
+ catch(ExtendedInternalServerErrorException e){
+ }catch (Exception e) {
+ Assert.fail("Exception" + e.getMessage());
+ }
+ }
+
+ @Test
+ public void testGetAllCustomRouteInstances(){
+ try {
+ CustomRouteInfo[] customRouteInfoList=customRouteServiceWrapper.getAllCustomRouteInstances();
+ Assert.assertTrue(customRouteInfoList.length >= 0);
+ }catch(ExtendedInternalServerErrorException e){
+ }
+ catch(Exception e){
+ Assert.fail("Exception" + e.getMessage());
+ }
+
+ }
+
+ @Test
+ public void testGetCustomRouteInstance_not_exist(){
+ CustomRouteInfo customRouteInfo = null;
+ try {
+ customRouteInfo=customRouteServiceWrapper.getCustomRouteInstance("/testForJunit2");
+ Assert.assertNotNull(customRouteInfo);
+ }catch(ExtendedInternalServerErrorException e){
+ }
+ catch(ExtendedNotFoundException e){
+ Assert.assertNull(customRouteInfo);
+ }
+
+ }
+
+ @Test
+ public void testGetCustomRouteInstance_exist(){
+ try {
+ CustomRouteInfo customRouteInfo=customRouteServiceWrapper.getCustomRouteInstance("/testForJunit");
+ Assert.assertNotNull(customRouteInfo);
+ }catch(ExtendedInternalServerErrorException e){
+ }
+ catch(Exception e){
+ Assert.fail("Exception" + e.getMessage());
+ }
+
+ }
+
+ @Test
+ public void testUpdateCustomRouteInstance(){
+ try {
+
+ CustomRouteInfo customRouteInfo=new CustomRouteInfo();
+ customRouteInfo.setServiceName("/testForJunit");
+ customRouteInfo.setUrl("/test_update");
+ RouteServer[] servers=new RouteServer[]{new RouteServer("127.0.0.1","80")};
+ customRouteInfo.setServers(servers);
+
+ CustomRouteInfo new_customRouteInfo= customRouteServiceWrapper.updateCustomRouteInstance("/testForJunit", customRouteInfo,"");
+ Assert.assertEquals("/test_update", new_customRouteInfo.getUrl());
+ }catch(ExtendedInternalServerErrorException e){
+ }
+ catch(Exception e){
+ Assert.fail("Exception" + e.getMessage());
+
+ }
+ }
+
+ @Test
+ public void testUpdateCustomRouteStatus(){
+ try {
+ CustomRouteInfo new_CustomRouteInfo= customRouteServiceWrapper.updateCustomRouteStatus("/testForJunit", "0");
+ Assert.assertEquals("0",new_CustomRouteInfo.getStatus());
+ }catch(ExtendedInternalServerErrorException e){
+ }catch(Exception e){
+ Assert.fail("Exception" + e.getMessage());
+
+ }
+ }
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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
-package org.openo.msb.wrapper;\r
-\r
-import org.junit.After;\r
-import org.junit.Assert;\r
-import org.junit.Before;\r
-import org.junit.BeforeClass;\r
-import org.junit.Test;\r
-import org.openo.msb.api.IuiRouteInfo;\r
-import org.openo.msb.api.RouteServer;\r
-import org.openo.msb.api.exception.ExtendedInternalServerErrorException;\r
-import org.openo.msb.api.exception.ExtendedNotFoundException;\r
-\r
-public class IuiRouteServiceWrapperTest {\r
- private static IuiRouteServiceWrapper iuiRouteServiceWrapper;\r
- \r
- @BeforeClass\r
- public static void setUpBeforeClass() throws Exception {\r
- iuiRouteServiceWrapper=IuiRouteServiceWrapper.getInstance();\r
- }\r
- \r
- @Before\r
- public void setUp() {\r
- IuiRouteInfo iuiRouteInfo=new IuiRouteInfo();\r
- iuiRouteInfo.setServiceName("testForJunit");\r
- iuiRouteInfo.setUrl("/iui/test");\r
- RouteServer[] servers=new RouteServer[]{new RouteServer("127.0.0.1","80")};\r
- iuiRouteInfo.setServers(servers);\r
- try {\r
- iuiRouteServiceWrapper.saveIuiRouteInstance(iuiRouteInfo);\r
- }catch(ExtendedInternalServerErrorException e){\r
- }\r
- catch(Exception e){\r
- Assert.fail("Exception" + e.getMessage());\r
- }\r
- \r
- }\r
- \r
- @After\r
- public void tearDown() { \r
- try {\r
- iuiRouteServiceWrapper.deleteIuiRoute("testForJunit", "*"); \r
- }catch(ExtendedInternalServerErrorException e){\r
- } catch (Exception e) {\r
- Assert.fail("Exception" + e.getMessage());\r
- }\r
- }\r
- \r
- @Test\r
- public void testGetAllIuiRouteInstances(){\r
- try {\r
- IuiRouteInfo[] iuiRouteInfoList=iuiRouteServiceWrapper.getAllIuiRouteInstances();\r
- Assert.assertTrue(iuiRouteInfoList.length >= 0);\r
- }catch(ExtendedInternalServerErrorException e){\r
- }\r
- catch(Exception e){\r
- Assert.fail("Exception" + e.getMessage());\r
- }\r
- \r
- }\r
- \r
- @Test\r
- public void testGetIuiRouteInstance_not_exist(){\r
- IuiRouteInfo iuiRouteInfo = null;\r
- try {\r
- iuiRouteInfo=iuiRouteServiceWrapper.getIuiRouteInstance("testForJunit2");\r
- Assert.assertNotNull(iuiRouteInfo);\r
- }catch(ExtendedInternalServerErrorException e){\r
- }\r
- catch(ExtendedNotFoundException e){\r
- Assert.assertNull(iuiRouteInfo);\r
- }\r
- \r
- }\r
- \r
- @Test\r
- public void testGetIuiRouteInstance_exist(){\r
- try {\r
- IuiRouteInfo iuiRouteInfo=iuiRouteServiceWrapper.getIuiRouteInstance("testForJunit");\r
- Assert.assertNotNull(iuiRouteInfo);\r
- }catch(ExtendedInternalServerErrorException e){\r
- }\r
- catch(Exception e){\r
- Assert.fail("Exception" + e.getMessage());\r
- }\r
- \r
- }\r
- \r
- @Test\r
- public void testUpdateIuiRouteInstance(){\r
- try {\r
- \r
- IuiRouteInfo iuiRouteInfo=new IuiRouteInfo();\r
- iuiRouteInfo.setServiceName("testForJunit");\r
- iuiRouteInfo.setUrl("/iui/test_update");\r
- RouteServer[] servers=new RouteServer[]{new RouteServer("127.0.0.1","80")};\r
- iuiRouteInfo.setServers(servers);\r
- \r
- IuiRouteInfo new_iuiRouteInfo= iuiRouteServiceWrapper.updateIuiRouteInstance("testForJunit", iuiRouteInfo);\r
- Assert.assertEquals("/iui/test_update", new_iuiRouteInfo.getUrl());\r
- }catch(ExtendedInternalServerErrorException e){\r
- }\r
- catch(Exception e){\r
- Assert.fail("Exception" + e.getMessage());\r
- \r
- }\r
- }\r
- \r
- @Test\r
- public void testUpdateIuiRouteStatus(){\r
- try { \r
- IuiRouteInfo new_iuiRouteInfo= iuiRouteServiceWrapper.updateIuiRouteStatus("testForJunit", "0");\r
- Assert.assertEquals("0",new_iuiRouteInfo.getStatus());\r
- }catch(ExtendedInternalServerErrorException e){\r
- }catch(Exception e){\r
- Assert.fail("Exception" + e.getMessage());\r
- \r
- }\r
- }\r
- \r
- \r
- \r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.wrapper;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openo.msb.api.IuiRouteInfo;
+import org.openo.msb.api.RouteServer;
+import org.openo.msb.api.exception.ExtendedInternalServerErrorException;
+import org.openo.msb.api.exception.ExtendedNotFoundException;
+
+public class IuiRouteServiceWrapperTest {
+ private static IuiRouteServiceWrapper iuiRouteServiceWrapper;
+
+ @BeforeClass
+ public static void setUpBeforeClass() throws Exception {
+ iuiRouteServiceWrapper=IuiRouteServiceWrapper.getInstance();
+ }
+
+ @Before
+ public void setUp() {
+ IuiRouteInfo iuiRouteInfo=new IuiRouteInfo();
+ iuiRouteInfo.setServiceName("testForJunit");
+ iuiRouteInfo.setUrl("/iui/test");
+ RouteServer[] servers=new RouteServer[]{new RouteServer("127.0.0.1","80")};
+ iuiRouteInfo.setServers(servers);
+ try {
+ iuiRouteServiceWrapper.saveIuiRouteInstance(iuiRouteInfo);
+ }catch(ExtendedInternalServerErrorException e){
+ }
+ catch(Exception e){
+ Assert.fail("Exception" + e.getMessage());
+ }
+
+ }
+
+ @After
+ public void tearDown() {
+ try {
+ iuiRouteServiceWrapper.deleteIuiRoute("testForJunit", "*");
+ }catch(ExtendedInternalServerErrorException e){
+ } catch (Exception e) {
+ Assert.fail("Exception" + e.getMessage());
+ }
+ }
+
+ @Test
+ public void testGetAllIuiRouteInstances(){
+ try {
+ IuiRouteInfo[] iuiRouteInfoList=iuiRouteServiceWrapper.getAllIuiRouteInstances();
+ Assert.assertTrue(iuiRouteInfoList.length >= 0);
+ }catch(ExtendedInternalServerErrorException e){
+ }
+ catch(Exception e){
+ Assert.fail("Exception" + e.getMessage());
+ }
+
+ }
+
+ @Test
+ public void testGetIuiRouteInstance_not_exist(){
+ IuiRouteInfo iuiRouteInfo = null;
+ try {
+ iuiRouteInfo=iuiRouteServiceWrapper.getIuiRouteInstance("testForJunit2");
+ Assert.assertNotNull(iuiRouteInfo);
+ }catch(ExtendedInternalServerErrorException e){
+ }
+ catch(ExtendedNotFoundException e){
+ Assert.assertNull(iuiRouteInfo);
+ }
+
+ }
+
+ @Test
+ public void testGetIuiRouteInstance_exist(){
+ try {
+ IuiRouteInfo iuiRouteInfo=iuiRouteServiceWrapper.getIuiRouteInstance("testForJunit");
+ Assert.assertNotNull(iuiRouteInfo);
+ }catch(ExtendedInternalServerErrorException e){
+ }
+ catch(Exception e){
+ Assert.fail("Exception" + e.getMessage());
+ }
+
+ }
+
+ @Test
+ public void testUpdateIuiRouteInstance(){
+ try {
+
+ IuiRouteInfo iuiRouteInfo=new IuiRouteInfo();
+ iuiRouteInfo.setServiceName("testForJunit");
+ iuiRouteInfo.setUrl("/iui/test_update");
+ RouteServer[] servers=new RouteServer[]{new RouteServer("127.0.0.1","80")};
+ iuiRouteInfo.setServers(servers);
+
+ IuiRouteInfo new_iuiRouteInfo= iuiRouteServiceWrapper.updateIuiRouteInstance("testForJunit", iuiRouteInfo);
+ Assert.assertEquals("/iui/test_update", new_iuiRouteInfo.getUrl());
+ }catch(ExtendedInternalServerErrorException e){
+ }
+ catch(Exception e){
+ Assert.fail("Exception" + e.getMessage());
+
+ }
+ }
+
+ @Test
+ public void testUpdateIuiRouteStatus(){
+ try {
+ IuiRouteInfo new_iuiRouteInfo= iuiRouteServiceWrapper.updateIuiRouteStatus("testForJunit", "0");
+ Assert.assertEquals("0",new_iuiRouteInfo.getStatus());
+ }catch(ExtendedInternalServerErrorException e){
+ }catch(Exception e){
+ Assert.fail("Exception" + e.getMessage());
+
+ }
+ }
+
+
+
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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
-package org.openo.msb.wrapper;\r
-\r
-import java.util.HashSet;\r
-import java.util.Set;\r
-\r
-import org.junit.After;\r
-import org.junit.Assert;\r
-import org.junit.Before;\r
-import org.junit.BeforeClass;\r
-import org.junit.Test;\r
-import org.openo.msb.api.MicroServiceFullInfo;\r
-import org.openo.msb.api.MicroServiceInfo;\r
-import org.openo.msb.api.Node;\r
-import org.openo.msb.api.exception.ExtendedInternalServerErrorException;\r
-import org.openo.msb.api.exception.ExtendedNotFoundException;\r
-\r
-public class MicroServiceWrapperTest {\r
- private static MicroServiceWrapper microServiceWrapper;\r
- \r
- @BeforeClass\r
- public static void setUpBeforeClass() throws Exception {\r
- microServiceWrapper=microServiceWrapper.getInstance();\r
- }\r
- \r
- @Before\r
- public void setUp() {\r
- MicroServiceInfo microServiceInfo=new MicroServiceInfo();\r
- microServiceInfo.setServiceName("testForJunit");\r
- microServiceInfo.setVersion("v1");\r
- microServiceInfo.setUrl("/api/test/v1");\r
- microServiceInfo.setProtocol("REST");\r
- microServiceInfo.setVisualRange("0");\r
- Set<Node> nodes=new HashSet<Node>();\r
- nodes.add(new Node("127.0.0.1","8080",0));\r
- microServiceInfo.setNodes(nodes);\r
- try {\r
- microServiceWrapper.saveMicroServiceInstance(microServiceInfo,true,"","");\r
- }catch(ExtendedInternalServerErrorException e){\r
- }\r
- catch(Exception e){\r
- Assert.fail("Exception" + e.getMessage());\r
- }\r
- \r
- }\r
- \r
- @After\r
- public void tearDown() { \r
- try {\r
- microServiceWrapper.deleteMicroService("testForJunit", "v1", ""); \r
- }catch(ExtendedInternalServerErrorException e){\r
- } catch (Exception e) {\r
- Assert.fail("Exception" + e.getMessage());\r
- }\r
- }\r
- \r
- @Test\r
- public void testGetAllMicroServiceInstances(){\r
- try {\r
- MicroServiceFullInfo[] MicroServiceInfoList=microServiceWrapper.getAllMicroServiceInstances();\r
- Assert.assertTrue(MicroServiceInfoList.length >= 0);\r
- }catch(ExtendedInternalServerErrorException e){\r
- }\r
- catch(Exception e){\r
- Assert.fail("Exception" + e.getMessage());\r
- }\r
- \r
- }\r
- \r
- @Test\r
- public void testGetMicroServiceInstance_not_exist(){\r
- MicroServiceFullInfo microServiceInfo = null;\r
- try {\r
- microServiceInfo=microServiceWrapper.getMicroServiceInstance("testForJunit", "v2","");\r
- Assert.assertNotNull(microServiceInfo);\r
- }catch(ExtendedInternalServerErrorException e){\r
- }\r
- catch(ExtendedNotFoundException e){\r
- Assert.assertNull(microServiceInfo);\r
- }\r
- \r
- }\r
- \r
- @Test\r
- public void testGetMicroServiceInstance_exist(){\r
- try {\r
- MicroServiceFullInfo microServiceInfo=microServiceWrapper.getMicroServiceInstance("testForJunit", "v1","");\r
- Assert.assertNotNull(microServiceInfo);\r
- }catch(ExtendedInternalServerErrorException e){\r
- }\r
- catch(Exception e){\r
- Assert.fail("Exception" + e.getMessage());\r
- }\r
- \r
- }\r
- \r
- @Test\r
- public void testUpdateMicroServiceInstance(){\r
- try {\r
- \r
- MicroServiceInfo microServiceInfo=new MicroServiceInfo();\r
- microServiceInfo.setServiceName("testForJunit");\r
- microServiceInfo.setVersion("v1");\r
- microServiceInfo.setUrl("/api/test2/v1");\r
- microServiceInfo.setProtocol("REST");\r
- microServiceInfo.setVisualRange("0");\r
- Set<Node> nodes=new HashSet<Node>();\r
- nodes.add(new Node("127.0.0.1","8080",0));\r
- microServiceInfo.setNodes(nodes);\r
- \r
- MicroServiceFullInfo new_MicroServiceInfo= microServiceWrapper.updateMicroServiceInstance("testForJunit", "v1", microServiceInfo);\r
- Assert.assertEquals("/api/test2/v1", new_MicroServiceInfo.getUrl());\r
- }catch(ExtendedInternalServerErrorException e){\r
- }\r
- catch(Exception e){\r
- Assert.fail("Exception" + e.getMessage());\r
- \r
- }\r
- }\r
- \r
- @Test\r
- public void testUpdateMicroServiceStatus(){\r
- try { \r
- MicroServiceFullInfo new_MicroServiceInfo= microServiceWrapper.updateMicroServiceStatus("testForJunit", "v1", "0");\r
- Assert.assertEquals("0",new_MicroServiceInfo.getStatus());\r
- }catch(ExtendedInternalServerErrorException e){\r
- }catch(Exception e){\r
- Assert.fail("Exception" + e.getMessage());\r
- \r
- }\r
- }\r
- \r
- \r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.wrapper;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openo.msb.api.MicroServiceFullInfo;
+import org.openo.msb.api.MicroServiceInfo;
+import org.openo.msb.api.Node;
+import org.openo.msb.api.exception.ExtendedInternalServerErrorException;
+import org.openo.msb.api.exception.ExtendedNotFoundException;
+
+public class MicroServiceWrapperTest {
+ private static MicroServiceWrapper microServiceWrapper;
+
+ @BeforeClass
+ public static void setUpBeforeClass() throws Exception {
+ microServiceWrapper=microServiceWrapper.getInstance();
+ }
+
+ @Before
+ public void setUp() {
+ MicroServiceInfo microServiceInfo=new MicroServiceInfo();
+ microServiceInfo.setServiceName("testForJunit");
+ microServiceInfo.setVersion("v1");
+ microServiceInfo.setUrl("/api/test/v1");
+ microServiceInfo.setProtocol("REST");
+ microServiceInfo.setVisualRange("0");
+ Set<Node> nodes=new HashSet<Node>();
+ nodes.add(new Node("127.0.0.1","8080",0));
+ microServiceInfo.setNodes(nodes);
+ try {
+ microServiceWrapper.saveMicroServiceInstance(microServiceInfo,true,"","");
+ }catch(ExtendedInternalServerErrorException e){
+ }
+ catch(Exception e){
+ Assert.fail("Exception" + e.getMessage());
+ }
+
+ }
+
+ @After
+ public void tearDown() {
+ try {
+ microServiceWrapper.deleteMicroService("testForJunit", "v1", "");
+ }catch(ExtendedInternalServerErrorException e){
+ } catch (Exception e) {
+ Assert.fail("Exception" + e.getMessage());
+ }
+ }
+
+ @Test
+ public void testGetAllMicroServiceInstances(){
+ try {
+ MicroServiceFullInfo[] MicroServiceInfoList=microServiceWrapper.getAllMicroServiceInstances();
+ Assert.assertTrue(MicroServiceInfoList.length >= 0);
+ }catch(ExtendedInternalServerErrorException e){
+ }
+ catch(Exception e){
+ Assert.fail("Exception" + e.getMessage());
+ }
+
+ }
+
+ @Test
+ public void testGetMicroServiceInstance_not_exist(){
+ MicroServiceFullInfo microServiceInfo = null;
+ try {
+ microServiceInfo=microServiceWrapper.getMicroServiceInstance("testForJunit", "v2","");
+ Assert.assertNotNull(microServiceInfo);
+ }catch(ExtendedInternalServerErrorException e){
+ }
+ catch(ExtendedNotFoundException e){
+ Assert.assertNull(microServiceInfo);
+ }
+
+ }
+
+ @Test
+ public void testGetMicroServiceInstance_exist(){
+ try {
+ MicroServiceFullInfo microServiceInfo=microServiceWrapper.getMicroServiceInstance("testForJunit", "v1","");
+ Assert.assertNotNull(microServiceInfo);
+ }catch(ExtendedInternalServerErrorException e){
+ }
+ catch(Exception e){
+ Assert.fail("Exception" + e.getMessage());
+ }
+
+ }
+
+ @Test
+ public void testUpdateMicroServiceInstance(){
+ try {
+
+ MicroServiceInfo microServiceInfo=new MicroServiceInfo();
+ microServiceInfo.setServiceName("testForJunit");
+ microServiceInfo.setVersion("v1");
+ microServiceInfo.setUrl("/api/test2/v1");
+ microServiceInfo.setProtocol("REST");
+ microServiceInfo.setVisualRange("0");
+ Set<Node> nodes=new HashSet<Node>();
+ nodes.add(new Node("127.0.0.1","8080",0));
+ microServiceInfo.setNodes(nodes);
+
+ MicroServiceFullInfo new_MicroServiceInfo= microServiceWrapper.updateMicroServiceInstance("testForJunit", "v1", microServiceInfo);
+ Assert.assertEquals("/api/test2/v1", new_MicroServiceInfo.getUrl());
+ }catch(ExtendedInternalServerErrorException e){
+ }
+ catch(Exception e){
+ Assert.fail("Exception" + e.getMessage());
+
+ }
+ }
+
+ @Test
+ public void testUpdateMicroServiceStatus(){
+ try {
+ MicroServiceFullInfo new_MicroServiceInfo= microServiceWrapper.updateMicroServiceStatus("testForJunit", "v1", "0");
+ Assert.assertEquals("0",new_MicroServiceInfo.getStatus());
+ }catch(ExtendedInternalServerErrorException e){
+ }catch(Exception e){
+ Assert.fail("Exception" + e.getMessage());
+
+ }
+ }
+
+
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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
-package org.openo.msb.wrapper.util;\r
-\r
-import org.junit.Assert;\r
-import org.junit.Test;\r
-import org.openo.msb.api.RouteServer;\r
-\r
-\r
-public class JacksonJsonUtilTest {\r
- @Test\r
- public void testBeanToJson(){\r
- try{\r
- RouteServer server=new RouteServer("127.0.0.1","80");\r
- String json=JacksonJsonUtil.beanToJson(server);\r
- Assert.assertEquals("{\"ip\":\"127.0.0.1\",\"port\":\"80\",\"weight\":0}",json);\r
- }\r
- catch(Exception e){\r
- Assert.fail("Exception" + e.getMessage());\r
- }\r
- }\r
- \r
- @Test\r
- public void testJsonToBean(){\r
- try{\r
- String json="{\"ip\":\"127.0.0.1\",\"port\":\"80\",\"weight\":0}";\r
- RouteServer server=(RouteServer) JacksonJsonUtil.jsonToBean(json, RouteServer.class);\r
- Assert.assertEquals("127.0.0.1",server.getIp());\r
- Assert.assertEquals("80",server.getPort());\r
- }\r
- catch(Exception e){\r
- Assert.fail("Exception" + e.getMessage());\r
- }\r
- }\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.wrapper.util;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openo.msb.api.RouteServer;
+
+
+public class JacksonJsonUtilTest {
+ @Test
+ public void testBeanToJson(){
+ try{
+ RouteServer server=new RouteServer("127.0.0.1","80");
+ String json=JacksonJsonUtil.beanToJson(server);
+ Assert.assertEquals("{\"ip\":\"127.0.0.1\",\"port\":\"80\",\"weight\":0}",json);
+ }
+ catch(Exception e){
+ Assert.fail("Exception" + e.getMessage());
+ }
+ }
+
+ @Test
+ public void testJsonToBean(){
+ try{
+ String json="{\"ip\":\"127.0.0.1\",\"port\":\"80\",\"weight\":0}";
+ RouteServer server=(RouteServer) JacksonJsonUtil.jsonToBean(json, RouteServer.class);
+ Assert.assertEquals("127.0.0.1",server.getIp());
+ Assert.assertEquals("80",server.getPort());
+ }
+ catch(Exception e){
+ Assert.fail("Exception" + e.getMessage());
+ }
+ }
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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
-package org.openo.msb.wrapper.util;\r
-\r
-import org.junit.Assert;\r
-\r
-import org.junit.Test;\r
-\r
-public class RegExpTestUtilTest {\r
-\r
- @Test\r
- public void testHostRegExpTest(){\r
- boolean result=RegExpTestUtil.hostRegExpTest("127.0.0.1:8080");\r
- Assert.assertTrue(result);\r
- \r
- boolean err_result=RegExpTestUtil.hostRegExpTest("0.0.0.1:89");\r
- Assert.assertFalse(err_result);\r
- }\r
- \r
- @Test\r
- public void testIpRegExpTest(){\r
- boolean result=RegExpTestUtil.ipRegExpTest("127.0.0.1");\r
- Assert.assertTrue(result);\r
- \r
- boolean err_result=RegExpTestUtil.ipRegExpTest("127.0.0.1.5");\r
- Assert.assertFalse(err_result);\r
- }\r
- \r
- @Test\r
- public void testPortRegExpTest(){\r
- boolean result=RegExpTestUtil.portRegExpTest("80");\r
- Assert.assertTrue(result);\r
- \r
- boolean err_result=RegExpTestUtil.portRegExpTest("898989");\r
- Assert.assertFalse(err_result);\r
- }\r
- \r
- @Test\r
- public void testVersionRegExpTest(){\r
- boolean result=RegExpTestUtil.versionRegExpTest("v1");\r
- Assert.assertTrue(result);\r
- \r
- boolean err_result=RegExpTestUtil.versionRegExpTest("23");\r
- Assert.assertFalse(err_result);\r
- }\r
- \r
- @Test\r
- public void testurlRegExpTest(){\r
- boolean result=RegExpTestUtil.urlRegExpTest("/test");\r
- Assert.assertTrue(result);\r
- \r
- boolean err_result=RegExpTestUtil.urlRegExpTest("test");\r
- Assert.assertFalse(err_result);\r
- }\r
- \r
- @Test\r
- public void testapiRouteUrlRegExpTest(){\r
- boolean result=RegExpTestUtil.apiRouteUrlRegExpTest("/api/test/v1");\r
- Assert.assertTrue(result);\r
- \r
- boolean err_result=RegExpTestUtil.apiRouteUrlRegExpTest("/test");\r
- Assert.assertFalse(err_result);\r
- }\r
- \r
- @Test\r
- public void testiuiRouteUrlRegExpTest(){\r
- boolean result=RegExpTestUtil.iuiRouteUrlRegExpTest("/iui/test");\r
- Assert.assertTrue(result);\r
- \r
- boolean err_result=RegExpTestUtil.iuiRouteUrlRegExpTest("/test");\r
- Assert.assertFalse(err_result);\r
- }\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.wrapper.util;
+
+import org.junit.Assert;
+
+import org.junit.Test;
+
+public class RegExpTestUtilTest {
+
+ @Test
+ public void testHostRegExpTest(){
+ boolean result=RegExpTestUtil.hostRegExpTest("127.0.0.1:8080");
+ Assert.assertTrue(result);
+
+ boolean err_result=RegExpTestUtil.hostRegExpTest("0.0.0.1:89");
+ Assert.assertFalse(err_result);
+ }
+
+ @Test
+ public void testIpRegExpTest(){
+ boolean result=RegExpTestUtil.ipRegExpTest("127.0.0.1");
+ Assert.assertTrue(result);
+
+ boolean err_result=RegExpTestUtil.ipRegExpTest("127.0.0.1.5");
+ Assert.assertFalse(err_result);
+ }
+
+ @Test
+ public void testPortRegExpTest(){
+ boolean result=RegExpTestUtil.portRegExpTest("80");
+ Assert.assertTrue(result);
+
+ boolean err_result=RegExpTestUtil.portRegExpTest("898989");
+ Assert.assertFalse(err_result);
+ }
+
+ @Test
+ public void testVersionRegExpTest(){
+ boolean result=RegExpTestUtil.versionRegExpTest("v1");
+ Assert.assertTrue(result);
+
+ boolean err_result=RegExpTestUtil.versionRegExpTest("23");
+ Assert.assertFalse(err_result);
+ }
+
+ @Test
+ public void testurlRegExpTest(){
+ boolean result=RegExpTestUtil.urlRegExpTest("/test");
+ Assert.assertTrue(result);
+
+ boolean err_result=RegExpTestUtil.urlRegExpTest("test");
+ Assert.assertFalse(err_result);
+ }
+
+ @Test
+ public void testapiRouteUrlRegExpTest(){
+ boolean result=RegExpTestUtil.apiRouteUrlRegExpTest("/api/test/v1");
+ Assert.assertTrue(result);
+
+ boolean err_result=RegExpTestUtil.apiRouteUrlRegExpTest("/test");
+ Assert.assertFalse(err_result);
+ }
+
+ @Test
+ public void testiuiRouteUrlRegExpTest(){
+ boolean result=RegExpTestUtil.iuiRouteUrlRegExpTest("/iui/test");
+ Assert.assertTrue(result);
+
+ boolean err_result=RegExpTestUtil.iuiRouteUrlRegExpTest("/test");
+ Assert.assertFalse(err_result);
+ }
+}
-/**\r
- * Copyright 2016 ZTE, Inc. and others.\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
-package org.openo.msb.wrapper.util;\r
-\r
-import org.apache.commons.lang3.StringUtils;\r
-import org.junit.Assert;\r
-import org.junit.Test;\r
-\r
-public class RouteUtilTest {\r
- \r
- @Test\r
- public void testGetPrefixedKey(){\r
- String path=RouteUtil.getPrefixedKey("","test","v1");\r
- Assert.assertEquals("msb:routing:test:v1",path);\r
- }\r
- \r
- @Test\r
- public void testConcat(){\r
- Object[] str1=new String[]{"test1","test2"}; \r
- Object[] str2=new String[]{"test3"}; \r
- Object[] str3=RouteUtil.concat(str1, str2);\r
- \r
- Assert.assertEquals(3,str3.length);\r
- }\r
- \r
- @Test\r
- public void testContainStr(){\r
- String value="1";\r
- String array[]={"1","2"};\r
- boolean result=RouteUtil.contain(array, value);\r
- Assert.assertTrue(result);\r
- }\r
- \r
- @Test\r
- public void testContainArray(){\r
- String value[]={"0"};\r
- String array[]={"1","2"};\r
- boolean result=RouteUtil.contain(array, value);\r
- Assert.assertFalse(result);\r
- \r
- }\r
- \r
- @Test\r
- public void testShow(){\r
- String array[]={"1","2"};\r
- String result=RouteUtil.show(array);\r
- Assert.assertEquals("1|2",result);\r
- \r
- }\r
-\r
-}\r
+/**
+ * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ *
+ * Licensed 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.openo.msb.wrapper.util;
+
+import org.apache.commons.lang3.StringUtils;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class RouteUtilTest {
+
+ @Test
+ public void testGetPrefixedKey(){
+ String path=RouteUtil.getPrefixedKey("","test","v1");
+ Assert.assertEquals("msb:routing:test:v1",path);
+ }
+
+ @Test
+ public void testConcat(){
+ Object[] str1=new String[]{"test1","test2"};
+ Object[] str2=new String[]{"test3"};
+ Object[] str3=RouteUtil.concat(str1, str2);
+
+ Assert.assertEquals(3,str3.length);
+ }
+
+ @Test
+ public void testContainStr(){
+ String value="1";
+ String array[]={"1","2"};
+ boolean result=RouteUtil.contain(array, value);
+ Assert.assertTrue(result);
+ }
+
+ @Test
+ public void testContainArray(){
+ String value[]={"0"};
+ String array[]={"1","2"};
+ boolean result=RouteUtil.contain(array, value);
+ Assert.assertFalse(result);
+
+ }
+
+ @Test
+ public void testShow(){
+ String array[]={"1","2"};
+ String result=RouteUtil.show(array);
+ Assert.assertEquals("1|2",result);
+
+ }
+
+}
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
+ Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
Licensed 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
+ 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,
See the License for the specific language governing permissions and
limitations under the License.
+ Author: Zhaoxing Meng
+ email: meng.zhaoxing1@zte.com.cn
+
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
-<service>\r
- <id>msb_apiroute</id>\r
- <name>msb_apiroute</name>\r
- <description>This service runs apiroute.</description>\r
- <workingdirectory>%BASE%</workingdirectory>\r
- <env name="JAVA_HOME" value="c:\jdk"/>\r
- <env name="RUNHOME" value="%BASE%"/>\r
- <executable>java</executable>\r
- <arguments>-jar "apiroute-service.jar" server "conf/apiroute.yml"</arguments>\r
- <stopexecutable>stop.bat</stopexecutable>\r
- <logmode>rotate</logmode>\r
- <!-- stopparentprocessfirst>true</stopparentprocessfirst -->\r
+<!--
+
+ Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+
+ Licensed 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.
+
+ Author: Zhaoxing Meng
+ email: meng.zhaoxing1@zte.com.cn
+
+-->
+<service>
+ <id>msb_apiroute</id>
+ <name>msb_apiroute</name>
+ <description>This service runs apiroute.</description>
+ <workingdirectory>%BASE%</workingdirectory>
+ <env name="JAVA_HOME" value="c:\jdk"/>
+ <env name="RUNHOME" value="%BASE%"/>
+ <executable>java</executable>
+ <arguments>-jar "apiroute-service.jar" server "conf/apiroute.yml"</arguments>
+ <stopexecutable>stop.bat</stopexecutable>
+ <logmode>rotate</logmode>
+ <!-- stopparentprocessfirst>true</stopparentprocessfirst -->
</service>
\ No newline at end of file
-defaultWorkspace: ../apiroute-works\r
-\r
-defaultName: ${DW_DEFAULT_NAME:-Stranger}\r
-\r
-propertiesName: redis.properties\r
-propertiesDir: conf\r
-\r
-# use the discover config if you want to monitor a discover service and register microservices change\r
-discoverInfo:\r
- ip: 127.0.0.1\r
- port: 10081\r
- enabled: false\r
-\r
-consulInfo:\r
- ip: 127.0.0.1\r
- port: 8500\r
- \r
-# use the simple server factory if you only want to run on a single port\r
-server:\r
- type: simple\r
- rootPath: '/api/microservices/v1/*'\r
- applicationContextPath: /\r
- adminContextPath: /admin\r
- connector:\r
- type: http\r
- port: 8086\r
-\r
-# Logging settings.\r
-logging:\r
-\r
- # The default level of all loggers. Can be OFF, ERROR, WARN, INFO, DEBUG, TRACE, or ALL.\r
- level: ALL\r
-\r
- # Logger-specific levels.\r
- loggers:\r
-\r
- # Sets the level for 'com.example.app' to DEBUG.\r
- com.example: DEBUG\r
-\r
- appenders:\r
- - type: console\r
- threshold: INFO\r
- timeZone: UTC\r
- logFormat: "%-6level [%d{HH:mm:ss.SSS}] [%t] %logger{5} - %X{code} %msg %n"\r
- - type: file\r
- threshold: INFO\r
- logFormat: "%-6level [%d{HH:mm:ss.SSS}] [%t] %logger{5} - %X{code} %msg %n"\r
- currentLogFilename: ../apiroute-works/logs/application.log\r
- archivedLogFilenamePattern: ../apiroute-works/logs/application-%d{yyyy-MM-dd}-%i.log.gz\r
- archivedFileCount: 7\r
- timeZone: UTC\r
-\r
+#
+# Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+#
+# Licensed 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.
+#
+# Author: Zhaoxing Meng
+# email: meng.zhaoxing1@zte.com.cn
+#
+
+defaultWorkspace: ../apiroute-works
+
+defaultName: ${DW_DEFAULT_NAME:-Stranger}
+
+propertiesName: redis.properties
+propertiesDir: conf
+
+# use the discover config if you want to monitor a discover service and register microservices change
+discoverInfo:
+ ip: 127.0.0.1
+ port: 10081
+ enabled: false
+
+consulInfo:
+ ip: 127.0.0.1
+ port: 8500
+
+# use the simple server factory if you only want to run on a single port
+server:
+ type: simple
+ rootPath: '/api/microservices/v1/*'
+ applicationContextPath: /
+ adminContextPath: /admin
+ connector:
+ type: http
+ port: 8086
+
+# Logging settings.
+logging:
+
+ # The default level of all loggers. Can be OFF, ERROR, WARN, INFO, DEBUG, TRACE, or ALL.
+ level: ALL
+
+ # Logger-specific levels.
+ loggers:
+
+ # Sets the level for 'com.example.app' to DEBUG.
+ com.example: DEBUG
+
+ appenders:
+ - type: console
+ threshold: INFO
+ timeZone: UTC
+ logFormat: "%-6level [%d{HH:mm:ss.SSS}] [%t] %logger{5} - %X{code} %msg %n"
+ - type: file
+ threshold: INFO
+ logFormat: "%-6level [%d{HH:mm:ss.SSS}] [%t] %logger{5} - %X{code} %msg %n"
+ currentLogFilename: ../apiroute-works/logs/application.log
+ archivedLogFilenamePattern: ../apiroute-works/logs/application-%d{yyyy-MM-dd}-%i.log.gz
+ archivedFileCount: 7
+ timeZone: UTC
+
-[{\r
- "serviceName" : "microservices",\r
- "version" : "v1",\r
- "url" : "/api/microservices/v1",\r
- "apiJson" : "/api/microservices/v1/swagger.json",\r
- "apiJsonType" : "1",\r
- "metricsUrl" : "/admin/metrics",\r
- "control" : "1",\r
- "status" : "1",\r
- "servers" : [{\r
- "ip" : "127.0.0.1",\r
- "port" : "8086",\r
- "weight" : 0\r
- }\r
- ]\r
- },\r
-{\r
- "serviceName" : "microservices",\r
- "url" : "/iui/microservices",\r
- "control" : "1",\r
- "status" : "1",\r
- "servers" : [{\r
- "ip" : "127.0.0.1",\r
- "port" : "8086",\r
- "weight" : 0\r
- }\r
- ]\r
- }\r
-]\r
+[{
+ "serviceName" : "microservices",
+ "version" : "v1",
+ "url" : "/api/microservices/v1",
+ "apiJson" : "/api/microservices/v1/swagger.json",
+ "apiJsonType" : "1",
+ "metricsUrl" : "/admin/metrics",
+ "control" : "1",
+ "status" : "1",
+ "servers" : [{
+ "ip" : "127.0.0.1",
+ "port" : "8086",
+ "weight" : 0
+ }
+ ]
+ },
+{
+ "serviceName" : "microservices",
+ "url" : "/iui/microservices",
+ "control" : "1",
+ "status" : "1",
+ "servers" : [{
+ "ip" : "127.0.0.1",
+ "port" : "8086",
+ "weight" : 0
+ }
+ ]
+ }
+]
-########################## initialize default routeInfo to redis ##########################\r
-\r
-#when msb is starting, it will automatically read all json files under this folder, and initializes to redis. \r
-#If the routeInfo is exist, it will be ignored, otherwise it will be saved.\r
-\r
-\r
-# JSON File content must be routeInfo format array like below examples:\r
-\r
-# optional:\r
-# apiJsonType: 1:user-defined json type 0:pre-defined json type\r
-# control: 0:default 1:readonly 2:hidden\r
-# status: 0:disabled 1:enabled \r
-# Tip£ºcontrol¡¢status¡¢weight are non-mandatory \r
-\r
-[\r
-##########################apiRoute example##########################\r
-\r
-{\r
- "serviceName" : "microservices",\r
- "version" : "v1",\r
- "url" : "/api/microservices/v1",\r
- "apiJson" : "/api/microservices/v1/swagger.json",\r
- "apiJsonType" : "1",\r
- "metricsUrl" : "/admin/metrics",\r
- "control" : "1",\r
- "status" : "1",\r
- "servers" : [{\r
- "ip" : "127.0.0.1",\r
- "port" : "8086",\r
- "weight" : 0\r
- }\r
- ]\r
- },\r
- \r
-##########################iuiRoute example##########################\r
- \r
-{\r
- "serviceName" : "microservices",\r
- "url" : "/iui/microservices",\r
- "control" : "1",\r
- "status" : "1",\r
- "servers" : [{\r
- "ip" : "127.0.0.1",\r
- "port" : "8086",\r
- "weight" : 0\r
- }\r
- ]\r
- },\r
- \r
-##########################customRoute example########################## \r
- {\r
- "serviceName" : "/test",\r
- "url" : "/test",\r
- "control" : "0",\r
- "status" : "1",\r
- "servers" : [{\r
- "ip" : "10.74.56.36",\r
- "port" : "8989",\r
- "weight" : 0\r
- }\r
- ]\r
- }\r
+====
+ Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+
+ Licensed 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.
+
+ Author: Zhaoxing Meng
+ email: meng.zhaoxing1@zte.com.cn
+====
+
+########################## initialize default routeInfo to redis ##########################
+
+#when msb is starting, it will automatically read all json files under this folder, and initializes to redis.
+#If the routeInfo is exist, it will be ignored, otherwise it will be saved.
+
+
+# JSON File content must be routeInfo format array like below examples:
+
+# optional:
+# apiJsonType: 1:user-defined json type 0:pre-defined json type
+# control: 0:default 1:readonly 2:hidden
+# status: 0:disabled 1:enabled
+# Tip��control��status��weight are non-mandatory
+
+[
+##########################apiRoute example##########################
+
+{
+ "serviceName" : "microservices",
+ "version" : "v1",
+ "url" : "/api/microservices/v1",
+ "apiJson" : "/api/microservices/v1/swagger.json",
+ "apiJsonType" : "1",
+ "metricsUrl" : "/admin/metrics",
+ "control" : "1",
+ "status" : "1",
+ "servers" : [{
+ "ip" : "127.0.0.1",
+ "port" : "8086",
+ "weight" : 0
+ }
+ ]
+ },
+
+##########################iuiRoute example##########################
+
+{
+ "serviceName" : "microservices",
+ "url" : "/iui/microservices",
+ "control" : "1",
+ "status" : "1",
+ "servers" : [{
+ "ip" : "127.0.0.1",
+ "port" : "8086",
+ "weight" : 0
+ }
+ ]
+ },
+
+##########################customRoute example##########################
+ {
+ "serviceName" : "/test",
+ "url" : "/test",
+ "control" : "0",
+ "status" : "1",
+ "servers" : [{
+ "ip" : "10.74.56.36",
+ "port" : "8989",
+ "weight" : 0
+ }
+ ]
+ }
]
\ No newline at end of file
-{\r
- "iuiRootPath" : "iui",\r
- "apiRootPath" : "api"\r
-}\r
+{
+ "iuiRootPath" : "openoui",
+ "apiRootPath" : "openoapi"
+}
-{\r
- "visualRange" : "0,1"\r
-}\r
+{
+ "visualRange" : "0,1"
+}
-########################## initialize default visualRange Matches from msdiscover to redis ##########################\r
-\r
-\r
-visualRange:·þÎñµÄ¿É¼û·¶Î§ ϵͳ¼ä:0 ϵͳÄÚ:1 \r
-\r
-#when msb is starting, it will automatically read this json file named "initVisualRangeMatches.json"\r
-\r
-#when msdiscover will sysn datas to apiGateway,only visualRange Matches will be save to redis. \r
-\r
-\r
-\r
-# JSON File content must be format array like below examples:\r
-\r
+====
+ Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+
+ Licensed 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.
+
+ Author: Zhaoxing Meng
+ email: meng.zhaoxing1@zte.com.cn
+====
+
+########################## initialize default visualRange Matches from msdiscover to redis ##########################
+
+
+visualRange:����Ŀɼ���Χ ϵͳ��:0 ϵͳ��:1
+
+#when msb is starting, it will automatically read this json file named "initVisualRangeMatches.json"
+
+#when msdiscover will sysn datas to apiGateway,only visualRange Matches will be save to redis.
+
+
+
+# JSON File content must be format array like below examples:
+
0 or 1 or 0,1
\ No newline at end of file
-@REM\r
-@REM Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)\r
-@REM\r
-@REM Licensed under the Apache License, Version 2.0 (the "License");\r
-@REM you may not use this file except in compliance with the License.\r
-@REM You may obtain a copy of the License at\r
-@REM\r
-@REM http://www.apache.org/licenses/LICENSE-2.0\r
-@REM\r
-@REM Unless required by applicable law or agreed to in writing, software\r
-@REM distributed under the License is distributed on an "AS IS" BASIS,\r
-@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-@REM See the License for the specific language governing permissions and\r
-@REM limitations under the License.\r
-@REM\r
-echo %1 | findstr %2 | findstr %3>NUL\r
-echo ERRORLEVEL=%ERRORLEVEL%\r
-IF ERRORLEVEL 1 goto findend\r
-for /f "tokens=1" %%a in (%1) do ( \r
- echo kill %1\r
- taskkill /F /pid %%a\r
-)\r
+@REM
+@REM Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+@REM
+@REM Licensed under the Apache License, Version 2.0 (the "License");
+@REM you may not use this file except in compliance with the License.
+@REM You may obtain a copy of the License at
+@REM
+@REM http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing, software
+@REM distributed under the License is distributed on an "AS IS" BASIS,
+@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@REM See the License for the specific language governing permissions and
+@REM limitations under the License.
+@REM
+@REM Author: Zhaoxing Meng
+@REM email: meng.zhaoxing1@zte.com.cn
+@REM
+
+echo %1 | findstr %2 | findstr %3>NUL
+echo ERRORLEVEL=%ERRORLEVEL%
+IF ERRORLEVEL 1 goto findend
+for /f "tokens=1" %%a in (%1) do (
+ echo kill %1
+ taskkill /F /pid %%a
+)
:findend
\ No newline at end of file
@REM
-@REM Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+@REM Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
@REM
@REM Licensed under the Apache License, Version 2.0 (the "License");
@REM you may not use this file except in compliance with the License.
@REM You may obtain a copy of the License at
@REM
-@REM http://www.apache.org/licenses/LICENSE-2.0
+@REM http://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing, software
@REM distributed under the License is distributed on an "AS IS" BASIS,
@REM See the License for the specific language governing permissions and
@REM limitations under the License.
@REM
+@REM Author: Zhaoxing Meng
+@REM email: meng.zhaoxing1@zte.com.cn
+@REM
+
@echo off
title apiroute-service
#!/bin/bash
#
-# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+# Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
#
# Licensed 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
+# 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,
# See the License for the specific language governing permissions and
# limitations under the License.
#
+# Author: Zhaoxing Meng
+# email: meng.zhaoxing1@zte.com.cn
+#
#JAVA_HOME="/home/conductortest/jdk1.7/jdk/linux"
@REM
-@REM Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+@REM Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
@REM
@REM Licensed under the Apache License, Version 2.0 (the "License");
@REM you may not use this file except in compliance with the License.
@REM You may obtain a copy of the License at
@REM
-@REM http://www.apache.org/licenses/LICENSE-2.0
+@REM http://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing, software
@REM distributed under the License is distributed on an "AS IS" BASIS,
@REM See the License for the specific language governing permissions and
@REM limitations under the License.
@REM
+@REM Author: Zhaoxing Meng
+@REM email: meng.zhaoxing1@zte.com.cn
+@REM
+
@echo off
title stopping apiroute-service
#!/bin/bash
#
-# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+# Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
#
# Licensed 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
+# 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,
# See the License for the specific language governing permissions and
# limitations under the License.
#
+# Author: Zhaoxing Meng
+# email: meng.zhaoxing1@zte.com.cn
+#
DIRNAME=`dirname $0`
HOME=`cd $DIRNAME/; pwd`
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
+ Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
Licensed 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
+ 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,
See the License for the specific language governing permissions and
limitations under the License.
+ Author: Zhaoxing Meng
+ email: meng.zhaoxing1@zte.com.cn
+
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
+ Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
Licensed 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
+ 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,
See the License for the specific language governing permissions and
limitations under the License.
+ Author: Zhaoxing Meng
+ email: meng.zhaoxing1@zte.com.cn
+
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
+ Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
Licensed 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
+ 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,
See the License for the specific language governing permissions and
limitations under the License.
+ Author: Zhaoxing Meng
+ email: meng.zhaoxing1@zte.com.cn
+
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
-@REM\r
-@REM Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)\r
-@REM\r
-@REM Licensed under the Apache License, Version 2.0 (the "License");\r
-@REM you may not use this file except in compliance with the License.\r
-@REM You may obtain a copy of the License at\r
-@REM\r
-@REM http://www.apache.org/licenses/LICENSE-2.0\r
-@REM\r
-@REM Unless required by applicable law or agreed to in writing, software\r
-@REM distributed under the License is distributed on an "AS IS" BASIS,\r
-@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-@REM See the License for the specific language governing permissions and\r
-@REM limitations under the License.\r
-@REM\r
-@echo off\r
-title msb install services\r
-\r
-set RUNHOME=%~dp0\r
-\r
-echo ### install redis\r
-cd "%RUNHOME%\redis"\r
-redisService.exe install\r
-\r
-echo ### install apiroute\r
-cd "%RUNHOME%\apiroute"\r
-apirouteService.exe install\r
-\r
-echo ### install openresty\r
-cd "%RUNHOME%\openresty\nginx"\r
-openrestyService.exe install\r
-\r
-:finalend\r
+@REM
+@REM Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+@REM
+@REM Licensed under the Apache License, Version 2.0 (the "License");
+@REM you may not use this file except in compliance with the License.
+@REM You may obtain a copy of the License at
+@REM
+@REM http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing, software
+@REM distributed under the License is distributed on an "AS IS" BASIS,
+@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@REM See the License for the specific language governing permissions and
+@REM limitations under the License.
+@REM
+@REM Author: Zhaoxing Meng
+@REM email: meng.zhaoxing1@zte.com.cn
+@REM
+
+@echo off
+title msb install services
+
+set RUNHOME=%~dp0
+
+echo ### install redis
+cd "%RUNHOME%\redis"
+redisService.exe install
+
+echo ### install apiroute
+cd "%RUNHOME%\apiroute"
+apirouteService.exe install
+
+echo ### install openresty
+cd "%RUNHOME%\openresty\nginx"
+openrestyService.exe install
+
+:finalend
cd "%RUNHOME%"
\ No newline at end of file
-@REM\r
-@REM Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)\r
-@REM\r
-@REM Licensed under the Apache License, Version 2.0 (the "License");\r
-@REM you may not use this file except in compliance with the License.\r
-@REM You may obtain a copy of the License at\r
-@REM\r
-@REM http://www.apache.org/licenses/LICENSE-2.0\r
-@REM\r
-@REM Unless required by applicable law or agreed to in writing, software\r
-@REM distributed under the License is distributed on an "AS IS" BASIS,\r
-@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-@REM See the License for the specific language governing permissions and\r
-@REM limitations under the License.\r
-@REM\r
-@echo off\r
-title msb restart services\r
-\r
-set RUNHOME=%~dp0\r
-\r
-echo ### restart redis\r
-cd "%RUNHOME%\redis"\r
-redisService.exe restart\r
-\r
-echo ### restart apiroute\r
-cd "%RUNHOME%\apiroute"\r
-apirouteService.exe restart\r
-\r
-echo ### restart openresty\r
-cd "%RUNHOME%\openresty\nginx"\r
-openrestyService.exe restart\r
-\r
-:finalend\r
+@REM
+@REM Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+@REM
+@REM Licensed under the Apache License, Version 2.0 (the "License");
+@REM you may not use this file except in compliance with the License.
+@REM You may obtain a copy of the License at
+@REM
+@REM http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing, software
+@REM distributed under the License is distributed on an "AS IS" BASIS,
+@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@REM See the License for the specific language governing permissions and
+@REM limitations under the License.
+@REM
+@REM Author: Zhaoxing Meng
+@REM email: meng.zhaoxing1@zte.com.cn
+@REM
+
+@echo off
+title msb restart services
+
+set RUNHOME=%~dp0
+
+echo ### restart redis
+cd "%RUNHOME%\redis"
+redisService.exe restart
+
+echo ### restart apiroute
+cd "%RUNHOME%\apiroute"
+apirouteService.exe restart
+
+echo ### restart openresty
+cd "%RUNHOME%\openresty\nginx"
+openrestyService.exe restart
+
+:finalend
cd "%RUNHOME%"
\ No newline at end of file
-@REM\r
-@REM Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)\r
-@REM\r
-@REM Licensed under the Apache License, Version 2.0 (the "License");\r
-@REM you may not use this file except in compliance with the License.\r
-@REM You may obtain a copy of the License at\r
-@REM\r
-@REM http://www.apache.org/licenses/LICENSE-2.0\r
-@REM\r
-@REM Unless required by applicable law or agreed to in writing, software\r
-@REM distributed under the License is distributed on an "AS IS" BASIS,\r
-@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-@REM See the License for the specific language governing permissions and\r
-@REM limitations under the License.\r
-@REM\r
-@echo off\r
-title msb status services\r
-\r
-set RUNHOME=%~dp0\r
-\r
-echo ### status redis\r
-cd "%RUNHOME%\redis"\r
-redisService.exe status\r
-\r
-echo ### status apiroute\r
-cd "%RUNHOME%\apiroute"\r
-apirouteService.exe status\r
-\r
-echo ### status openresty\r
-cd "%RUNHOME%\openresty\nginx"\r
-openrestyService.exe status\r
-\r
-:finalend\r
+@REM
+@REM Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+@REM
+@REM Licensed under the Apache License, Version 2.0 (the "License");
+@REM you may not use this file except in compliance with the License.
+@REM You may obtain a copy of the License at
+@REM
+@REM http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing, software
+@REM distributed under the License is distributed on an "AS IS" BASIS,
+@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@REM See the License for the specific language governing permissions and
+@REM limitations under the License.
+@REM
+@REM Author: Zhaoxing Meng
+@REM email: meng.zhaoxing1@zte.com.cn
+@REM
+
+@echo off
+title msb status services
+
+set RUNHOME=%~dp0
+
+echo ### status redis
+cd "%RUNHOME%\redis"
+redisService.exe status
+
+echo ### status apiroute
+cd "%RUNHOME%\apiroute"
+apirouteService.exe status
+
+echo ### status openresty
+cd "%RUNHOME%\openresty\nginx"
+openrestyService.exe status
+
+:finalend
cd "%RUNHOME%"
\ No newline at end of file
-@REM\r
-@REM Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)\r
-@REM\r
-@REM Licensed under the Apache License, Version 2.0 (the "License");\r
-@REM you may not use this file except in compliance with the License.\r
-@REM You may obtain a copy of the License at\r
-@REM\r
-@REM http://www.apache.org/licenses/LICENSE-2.0\r
-@REM\r
-@REM Unless required by applicable law or agreed to in writing, software\r
-@REM distributed under the License is distributed on an "AS IS" BASIS,\r
-@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-@REM See the License for the specific language governing permissions and\r
-@REM limitations under the License.\r
-@REM\r
-@echo off\r
-title msb uninstall services\r
-\r
-set RUNHOME=%~dp0\r
-\r
-echo ### uninstall redis\r
-cd "%RUNHOME%\redis"\r
-redisService.exe stop\r
-redisService.exe uninstall\r
-\r
-echo ### uninstall apiroute\r
-cd "%RUNHOME%\apiroute"\r
-apirouteService.exe stop\r
-apirouteService.exe uninstall\r
-\r
-echo ### uninstall openresty\r
-cd "%RUNHOME%\openresty\nginx"\r
-openrestyService.exe stop\r
-openrestyService.exe uninstall\r
-\r
-:finalend\r
+@REM
+@REM Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+@REM
+@REM Licensed under the Apache License, Version 2.0 (the "License");
+@REM you may not use this file except in compliance with the License.
+@REM You may obtain a copy of the License at
+@REM
+@REM http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing, software
+@REM distributed under the License is distributed on an "AS IS" BASIS,
+@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@REM See the License for the specific language governing permissions and
+@REM limitations under the License.
+@REM
+@REM Author: Zhaoxing Meng
+@REM email: meng.zhaoxing1@zte.com.cn
+@REM
+
+@echo off
+title msb uninstall services
+
+set RUNHOME=%~dp0
+
+echo ### uninstall redis
+cd "%RUNHOME%\redis"
+redisService.exe stop
+redisService.exe uninstall
+
+echo ### uninstall apiroute
+cd "%RUNHOME%\apiroute"
+apirouteService.exe stop
+apirouteService.exe uninstall
+
+echo ### uninstall openresty
+cd "%RUNHOME%\openresty\nginx"
+openrestyService.exe stop
+openrestyService.exe uninstall
+
+:finalend
cd "%RUNHOME%"
\ No newline at end of file
@REM
-@REM Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+@REM Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
@REM
@REM Licensed under the Apache License, Version 2.0 (the "License");
@REM you may not use this file except in compliance with the License.
@REM You may obtain a copy of the License at
@REM
-@REM http://www.apache.org/licenses/LICENSE-2.0
+@REM http://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing, software
@REM distributed under the License is distributed on an "AS IS" BASIS,
@REM See the License for the specific language governing permissions and
@REM limitations under the License.
@REM
+@REM Author: Zhaoxing Meng
+@REM email: meng.zhaoxing1@zte.com.cn
+@REM
+
@echo off
title stopping msb
#!/bin/sh
#
-# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+# Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
#
# Licensed 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
+# 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,
# See the License for the specific language governing permissions and
# limitations under the License.
#
+# Author: Zhaoxing Meng
+# email: meng.zhaoxing1@zte.com.cn
+#
+
DIRNAME=`dirname $0`
RUNHOME=`cd $DIRNAME/; pwd`
echo @RUNHOME@ $RUNHOME
@REM
-@REM Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+@REM Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
@REM
@REM Licensed under the Apache License, Version 2.0 (the "License");
@REM you may not use this file except in compliance with the License.
@REM You may obtain a copy of the License at
@REM
-@REM http://www.apache.org/licenses/LICENSE-2.0
+@REM http://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing, software
@REM distributed under the License is distributed on an "AS IS" BASIS,
@REM See the License for the specific language governing permissions and
@REM limitations under the License.
@REM
+@REM Author: Zhaoxing Meng
+@REM email: meng.zhaoxing1@zte.com.cn
+@REM
+
@echo off
title msb
#!/bin/sh
#
-# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+# Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
#
# Licensed 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
+# 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,
# See the License for the specific language governing permissions and
# limitations under the License.
#
+# Author: Zhaoxing Meng
+# email: meng.zhaoxing1@zte.com.cn
+#
+
DIRNAME=`dirname $0`
RUNHOME=`cd $DIRNAME/; pwd`
echo @RUNHOME@ $RUNHOME
+++ /dev/null
-#!/bin/sh
-#
-# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
-#
-# Licensed 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.
-#
-DIRNAME=`dirname $0`
-RUNHOME=`cd $DIRNAME/; pwd`
-echo @RUNHOME@ $RUNHOME
-
-echo "### Starting redis...";
-cd ./redis
-./run.sh
-cd $RUNHOME
-
-echo "\n\n### Starting openresty...";
-cd ./openresty
-./run.sh
-cd $RUNHOME
-
-echo "\n\n### Starting apiroute..."
-cd ./apiroute
-./run.sh
+++ /dev/null
-FROM java:8-alpine\r
-ADD msb-standalone-1.0.0-SNAPSHOT-linux64.tar.gz /opt/application\r
-WORKDIR /opt/application\r
-EXPOSE 10080\r
-ENTRYPOINT exec $PWD/startup4docker.sh
\ No newline at end of file
-<?xml version="1.0" encoding="UTF-8"?>\r
-<!--\r
-\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
-\r
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">\r
- <parent>\r
- <groupId>org.openo.common-services.microservice-bus</groupId>\r
- <artifactId>msb-core-parent</artifactId>\r
- <version>1.0.0-SNAPSHOT</version>\r
- </parent>\r
-\r
-\r
- <modelVersion>4.0.0</modelVersion>\r
- <artifactId>openresty-ext</artifactId>\r
- <version>1.0.0-SNAPSHOT</version>\r
- <name>openo/msb/msb-core/openresty-ext</name>\r
- <packaging>pom</packaging>\r
-\r
- <properties>\r
- <outputdir>target/assembly</outputdir>\r
- <packageid>openresty-ext</packageid>\r
- </properties>\r
-\r
- <build>\r
- <plugins>\r
- <plugin>\r
- <artifactId>maven-resources-plugin</artifactId>\r
- <configuration>\r
- <includeEmptyDirs>true</includeEmptyDirs>\r
- </configuration>\r
- <executions>\r
- <execution>\r
- <id>copy-resources</id>\r
- <phase>process-resources</phase>\r
- <goals>\r
- <goal>copy-resources</goal>\r
- </goals>\r
- <configuration>\r
- <outputDirectory>${outputdir}</outputDirectory>\r
- <resources>\r
- <resource>\r
- <directory>src/assembly/resources/</directory>\r
- <filtering>false</filtering>\r
- <includes>\r
- <include>**/*</include>\r
- </includes>\r
- </resource>\r
- </resources>\r
- <overwrite>true</overwrite>\r
- </configuration>\r
- </execution>\r
- </executions>\r
- </plugin>\r
-\r
- <plugin>\r
- <groupId>org.apache.maven.plugins</groupId>\r
- <artifactId>maven-antrun-plugin</artifactId>\r
- <executions>\r
- <execution>\r
- <id>distribution</id>\r
- <phase>package</phase>\r
- <goals>\r
- <goal>run</goal>\r
- </goals>\r
- <configuration>\r
- <target name="distribution">\r
- <zip destfile="target/${packageid}-${project.version}.zip" update="true">\r
- <zipfileset dir="target/assembly/" includes="**"/>\r
- </zip>\r
- <attachartifact file="target/${packageid}-${project.version}.zip" type="zip"/>\r
- </target>\r
- </configuration>\r
- </execution>\r
- </executions>\r
- </plugin>\r
-\r
- </plugins>\r
- </build>\r
-\r
-\r
-</project>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+
+ Licensed 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.
+
+ Author: Zhaoxing Meng
+ email: meng.zhaoxing1@zte.com.cn
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <groupId>org.openo.common-services.microservice-bus</groupId>
+ <artifactId>msb-core-parent</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </parent>
+
+
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>openresty-ext</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <name>openo/msb/msb-core/openresty-ext</name>
+ <packaging>pom</packaging>
+
+ <properties>
+ <outputdir>target/assembly</outputdir>
+ <packageid>openresty-ext</packageid>
+ </properties>
+
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-resources-plugin</artifactId>
+ <configuration>
+ <includeEmptyDirs>true</includeEmptyDirs>
+ </configuration>
+ <executions>
+ <execution>
+ <id>copy-resources</id>
+ <phase>process-resources</phase>
+ <goals>
+ <goal>copy-resources</goal>
+ </goals>
+ <configuration>
+ <outputDirectory>${outputdir}</outputDirectory>
+ <resources>
+ <resource>
+ <directory>src/assembly/resources/</directory>
+ <filtering>false</filtering>
+ <includes>
+ <include>**/*</include>
+ </includes>
+ </resource>
+ </resources>
+ <overwrite>true</overwrite>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>distribution</id>
+ <phase>package</phase>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ <configuration>
+ <target name="distribution">
+ <zip destfile="target/${packageid}-${project.version}.zip" update="true">
+ <zipfileset dir="target/assembly/" includes="**"/>
+ </zip>
+ <attachartifact file="target/${packageid}-${project.version}.zip" type="zip"/>
+ </target>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+
+ </plugins>
+ </build>
+
+
+</project>
+#
+# Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+#
+# Licensed 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.
+#
+# Author: Zhaoxing Meng
+# email: meng.zhaoxing1@zte.com.cn
+#
+
#user xfs xfs;
worker_processes 1;
}
http {
- include mime.types;
-
- upstream iui {
- server 127.0.0.1:8202;
- }
-
- upstream nsoc {
- server 127.0.0.1:8203;
- }
-
- upstream roc {
- server 127.0.0.1:8204;
- }
-
- upstream umc {
- server 127.0.0.1:8205;
- }
-
- upstream ssh {
- server 127.0.0.1:8209;
- }
-
- upstream yamlparser {
- server 127.0.0.1:8210;
- }
-
- upstream dac {
- server 127.0.0.1:8206;
- }
-
- upstream cmcc {
- server 127.0.0.1:8207;
- }
-
- upstream tacker {
- server 127.0.0.1:8208;
- }
-
- upstream winery {
- server 127.0.0.1:8080;
- }
-
- upstream etsi {
- server 127.0.0.1:8211;
- }
-
- upstream openstackadapter {
- server 127.0.0.1:8217;
- }
-
- upstream vimadapter {
- server 127.0.0.1:8218;
- }
-
- upstream odlsdn {
- server 127.0.0.1:8216;
- }
-
# Basic Settings
default_type application/octet-stream;
sendfile on;
proxy_send_timeout 120s;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header Host $host:$server_port;
+ proxy_set_header Host $host;
proxy_buffers 4 32k;
#set the nginx_cache parameter
- #proxy_cache_path temp/proxy_cache levels=1:2 keys_zone=nginx_cache:10m inactive=1d max_size=100m;
+ proxy_cache_path temp/proxy_cache levels=1:2 keys_zone=nginx_cache:1024m inactive=1d max_size=10g;
# Logging
access_log off;
# Lua settings
lua_package_path "$prefix/../lualib/?.lua;;";
- lua_package_cpath "$prefix/../lualib/?.so;;";
lua_shared_dict ceryx 10M;
lua_code_cache on;
-
- server {
- listen 80;
- default_type text/html;
-
- location = / {
- rewrite ^ /iui/framework redirect;
- }
-
- location = /openo {
- rewrite ^ /iui/framework redirect;
- }
-
- location = /iui/openo {
- rewrite ^ /iui/framework redirect;
- }
-
- location = /iui/framework/login.html {
- access_by_lua_file luaext/iui_auth.lua;
- proxy_pass http://iui;
- }
-
- location = /api/uiframe/v1/login {
- rewrite ^ /api/umcsm/v1/login break;
- proxy_pass http://umc;
- header_filter_by_lua_file luaext/login.lua;
- }
-
- location = /api/uiframe/v1/loginOut {
- access_by_lua_file luaext/logout.lua;
- rewrite ^ /api/umcsm/v1/loginOut break;
- proxy_pass http://umc;
- }
-
- location = /api/hsif/v1/authentication {
- access_by_lua_file luaext/make_authed.lua;
- }
-
- location /iui {
- access_by_lua_file luaext/iui_auth.lua;
- proxy_pass http://iui;
- }
-
- location ~ ^/api/(?:vim|nsoc)/v1 {
- access_by_lua_file luaext/auth.lua;
- proxy_pass http://nsoc;
- }
-
- location = /api/nsoc/v1/vnfgrantinfo {
- rewrite ^ /api/vim/v1/vnfgrantinfo break;
- access_by_lua_file luaext/auth.lua;
- proxy_pass http://nsoc;
- }
-
- location /api/nsocnotification/v1 {
- rewrite ^/api/nsocnotification/v1/(.*) /nsocnotification/v1/$1 break;
- access_by_lua_file luaext/auth.lua;
- proxy_pass http://nsoc;
- }
-
- location ~ ^/api/(?:roc|rocnotification)/v1 {
- access_by_lua_file luaext/auth.lua;
- proxy_pass http://roc;
- }
-
- location /api/uiframe/v1 {
- rewrite ^/api/uiframe/v1/(.*) /api/umcsm/v1/$1 break;
- access_by_lua_file luaext/iui_auth.lua;
- proxy_pass http://umc;
- }
-
- location ~ ^/api/umc(?:pm|fm|drill|sm|monitor)/v1 {
- access_by_lua_file luaext/auth.lua;
- proxy_pass http://umc;
- }
-
- location ~ ^/api/ssh/v1 {
- proxy_pass http://ssh;
- }
-
- location ~ ^/api/yamlparser/v1 {
- proxy_pass http://yamlparser;
- }
-
- location ~ ^/api/(?:dac|dacnotification)/v1 {
- access_by_lua_file luaext/auth.lua;
- proxy_pass http://dac;
- }
-
- location /api/cmccia/v1 {
- access_by_lua_file luaext/auth.lua;
- proxy_pass http://cmcc;
- }
-
- location /api/tackeria/v1 {
- access_by_lua_file luaext/auth.lua;
- proxy_pass http://tacker;
- }
- location /winery {
- access_by_lua_file luaext/auth.lua;
- proxy_pass http://winery;
- }
-
- location = /api/microservices/v1/apiRoute {
- access_by_lua_file luaext/auth.lua;
- content_by_lua_file luaext/serviceaccess.lua;
- }
-
- location /api/umcswagger/v1 {
- rewrite ^/api/umcswagger/v1/(.*) /api/$1 break;
- access_by_lua_file luaext/auth.lua;
- proxy_pass http://umc;
- }
-
- location /api/etsiia/v1 {
- access_by_lua_file luaext/auth.lua;
- proxy_pass http://etsi;
- }
+ # see https://github.com/openresty/lua-resty-core
+ #init_by_lua '
+ # require "resty.core"
+ #';
- location /api/odlsdnia/v1 {
- access_by_lua_file luaext/auth.lua;
- proxy_pass http://odlsdn;
- }
- }
+ # Includes
+ include mime.types;
+ include ../sites-enabled/*.conf;
}
+++ /dev/null
-local cache = ngx.shared.ceryx
-local client_ip = ngx.var.remote_addr
-local host = ngx.var.host
-if client_ip == '127.0.0.1' or client_ip == host or client_ip == ngx.var.server_addr then
- return
-end
-local succ, err, forcible = cache:replace(client_ip, "place_holder", 3600)
-if not succ then
- if err == 'not found' then
- ngx.log(ngx.WARN, "access record not found for "..client_ip)
- ngx.exit(401)
- else
- ngx.log(ngx.WARN, err)
- end
-end
\ No newline at end of file
--- /dev/null
+--[[
+
+ Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+
+ Licensed 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.
+
+ Author: Zhaoxing Meng
+ email: meng.zhaoxing1@zte.com.cn
+
+]]
+-- put red into the connection pool of size 100,
+-- with 10 seconds max idle time
+local function close_redis(red)
+ if not red then
+ return
+ end
+ --release connection to the pool
+ local pool_max_idle_time = 10000
+ local pool_size = 100
+ local ok, err = red:set_keepalive(pool_max_idle_time, pool_size)
+ if not ok then
+ ngx.log(ngx.ERR, "set keepalive error:", err)
+ end
+ return
+end
+
+local function query_ipurl_updatecache(red,key)
+ local keyprefix = "msb:routing:custom:"..key
+
+
+ local infokey=keyprefix..":info"
+ -- first of all check whether the status is 1(enabled)
+ local status = red:hget(infokey,"status")
+ if not (status=="1") then
+ ngx.log(ngx.WARN, key.."is disabled.status=", status)
+ return nil
+ end
+
+ -- Try to get url for key
+ local url, err = red:hget(infokey,"url")
+ ngx.log(ngx.WARN, "==url:", url)
+ if not url or url == ngx.null then
+ return nil
+ end
+
+ -- Try to get ip:port for key
+ local serverkey=keyprefix..":lb:server1"
+ local server, err = red:hget(serverkey,"ip")..":"..red:hget(serverkey,"port")
+ ngx.log(ngx.WARN, "==server:", server)
+ if not server or server == ngx.null then
+ return nil
+ end
+
+ -- get the local cache
+ local cache = ngx.shared.ceryx
+ local uri = ngx.var.uri
+ -- Save found key to local cache for 5 seconds
+ cache:set("custom:key:"..uri,key,5)
+ cache:set("custom:server:"..uri,server,5)
+ cache:set("custom:url:"..uri,url,5)
+
+ ngx.var.key = key
+ ngx.var.server = server
+ ngx.var.url = url
+ return true
+end
+
+local function query_allkeys_updatecache(red)
+ -- Try to get all keys start with "msb:routing:custom:"
+ local allkeys, err = red:keys("msb:routing:custom:*")
+ if not allkeys or allkeys == ngx.null then
+ ngx.log(ngx.ERR,err)
+ return ""
+ end
+ --把所有键值处理后放到集合中,去除重复
+ local key_set={}
+ for key, value in ipairs(allkeys) do
+ name = string.gsub(string.gsub(string.gsub(value,"msb:routing:custom:",""),":info",""),":lb:server1","")
+ key_set[name]=true
+ end
+ --取出所有的�?放到table中准备排�?
+ local key_table = {}
+ local index = 1
+ for key,_ in pairs(key_set) do
+ --为了避免效率问题,暂时不用table.insert()
+ --table.insert(key_table,key)
+ key_table[index] = key
+ index = index + 1
+ end
+ --对所有键进行倒序排序,用于实现最长前缀匹配
+ table.sort(key_table, function (a, b)
+ return a > b
+ end)
+
+ local servicenames = ""
+ local delimiter = "<>"
+ for i=1,#key_table do
+ servicenames=servicenames..key_table[i]..delimiter
+ end
+
+ -- get the local cache
+ local cache = ngx.shared.ceryx
+ -- Save all keys to local cache for 30 seconds(0.5 minutes)
+ cache:set("customrouter:allkeys", servicenames, 30)
+ return servicenames;
+end
+
+local function query_router_info()
+ local uri = ngx.var.uri
+ ngx.log(ngx.WARN, "==uri:", uri)
+
+ -- Check if key exists in local cache
+ local cache = ngx.shared.ceryx
+ local key, flags = cache:get("custom:key:"..uri)
+ local server, flags = cache:get("custom:server:"..uri)
+ local url, flags = cache:get("custom:url:"..uri)
+ if key and server and url then
+ ngx.var.key = key
+ ngx.var.server = server
+ ngx.var.url = url
+ ngx.log(ngx.WARN, "==using custom cache:", key.."&&"..server.."&&"..url)
+ return
+ end
+
+ local redis = require "resty.redis"
+ local red = redis:new()
+ red:set_timeout(1000) -- 1000 ms
+ local redis_host = "127.0.0.1"
+ local redis_port = 6379
+ local res, err = red:connect(redis_host, redis_port)
+
+ -- Return if could not connect to Redis
+ if not res then
+ ngx.log(ngx.ERR, "connect to redis error:", err)
+ return
+ end
+
+ -- Check if all servicenames exists in local cache
+ local servicenames, flags = cache:get("customrouter:allkeys")
+ if servicenames then
+ ngx.log(ngx.WARN,"==get all keys from cache:",servicenames)
+ else
+ servicenames = query_allkeys_updatecache(red)
+ end
+
+ local delimiter = "<>"
+ -- '.-' 表示最短匹�?
+ for key in string.gmatch(servicenames,"(.-)"..delimiter) do
+ ngx.log(ngx.WARN, "==key_table key:", key)
+ local from, to, err = ngx.re.find(uri, "^"..key.."(/(.*))?$", "jo")
+ --判断key是否为输入uri�?前缀"
+ if from then
+ ngx.log(ngx.WARN,"Matched! start-end:",from,"-",to)
+ local result = query_ipurl_updatecache(red,key)
+ if result then
+ break
+ end
+ else
+ ngx.log(ngx.WARN,"not Matched")
+ if err then
+ ngx.log(ngx.WARN,"ngx.re.find throw error: ",err)
+ return
+ end
+ end
+ end
+
+ return close_redis(red)
+end
+
+local function rewrite_router_url()
+ local server=ngx.var.server
+ if server=="fallback" then
+ ngx.status = ngx.HTTP_NOT_FOUND
+ ngx.exit(ngx.status)
+ end
+ local url=ngx.var.url
+ local key=ngx.var.key
+ local rewriteduri = ngx.re.sub(ngx.var.uri, "^"..key.."(.*)", url.."$1", "o")
+ ngx.log(ngx.WARN, "==rewrited uri:", rewriteduri)
+ ngx.req.set_uri(rewriteduri)
+end
+
+query_router_info()
+rewrite_router_url()
\ No newline at end of file
+++ /dev/null
-local cache = ngx.shared.ceryx
-local client_ip = ngx.var.remote_addr
-local uri = ngx.var.uri
-if uri == "/iui/framework/login.html" then
- local value, flags = cache:get(client_ip)
- if not value then
- return
- else
- ngx.redirect("/iui/framework/main-page.html")
- end
-end
-
-local referer = ngx.var.http_referer
-local refererList = {
- "/iui/framework/login.html",
- "/iui/framework/css/login.css",
- "/iui/component/thirdparty/font%-awesome/css/font%-awesome.min.css",
- "/iui/framework/css/style%-custom.css"
-}
-local function referer_matches(t, r)
- for k,_ in pairs(t) do
- if string.match(r, t[k]) then
- return true
- end
- end
- return false
-end
-
-if referer and referer_matches(refererList, referer) then
- return
-end
-
-local succ, err, forcible = cache:replace(client_ip, "place_holder", 3600)
-if not succ then
- if err == 'not found' then
- ngx.log(ngx.WARN, "access record not found for "..client_ip..",redirect to login page")
- ngx.redirect("/iui/framework/login.html")
- else
- ngx.log(ngx.WARN, err)
- end
-end
\ No newline at end of file
+++ /dev/null
-local h = ngx.resp.get_headers()
-if h["openoauth"] and h["openoauth"] == "true" then
- local cache = ngx.shared.ceryx
- local client_ip = ngx.var.remote_addr
- local succ, err, forcible = cache:set(client_ip, "place_holder", 3600)
- if not succ then
- ngx.log(ngx.WARN, err)
- end
-end
\ No newline at end of file
+++ /dev/null
-local cache = ngx.shared.ceryx
-local client_ip = ngx.var.remote_addr
-local succ, err, forcible = cache:delete(client_ip)
-if not succ then
- ngx.log(ngx.WARN, err)
-end
\ No newline at end of file
+++ /dev/null
-function ipValidator(ip)\r
- local chunks = {ip:match("(%d+)%.(%d+)%.(%d+)%.(%d+)")}\r
- if #chunks == 4 then\r
- for _,v in pairs(chunks) do\r
- if tonumber(v) > 255 then return R.STRING end\r
- end\r
- return true\r
- end\r
- local chunks = {ip:match(("([a-fA-F0-9]*):"):rep(8):gsub(":$","$"))}\r
- if #chunks == 8 then\r
- for _,v in pairs(chunks) do\r
- if #v > 0 and tonumber(v, 16) > 65535 then return R.STRING end\r
- end\r
- return true\r
- end\r
- return false\r
-end \r
-\r
-if ngx.req.get_method() == "POST" then\r
- ngx.req.read_body()\r
- local body = ngx.req.get_body_data() \r
- local json = require('cjson')\r
- local tab = json.decode(body)\r
- local ip = tab["passIp"]\r
- if not ip then\r
- ngx.log(ngx.WARN, "ip is nil.")\r
- ngx.exit(500)\r
- end\r
- if ipValidator(ip) then\r
- local cache = ngx.shared.ceryx\r
- local succ, err, forcible = cache:set(ip, "place_holder", 3600)\r
- if not succ then\r
- ngx.log(ngx.WARN, err)\r
- ngx.exit(500)\r
- end\r
- else\r
- ngx.log(ngx.WARN, "not a valid ip.")\r
- ngx.exit(500)\r
- end \r
- ngx.exit(201)\r
-else\r
- ngx.log(ngx.WARN, "not a POST request.")\r
- ngx.exit(500)\r
-end
\ No newline at end of file
--- /dev/null
+--[[
+
+ Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+
+ Licensed 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.
+
+ Author: Zhaoxing Meng
+ email: meng.zhaoxing1@zte.com.cn
+
+]]
+-- put red into the connection pool of size 100,
+-- with 10 seconds max idle time
+local function close_redis(red)
+ if not red then
+ return
+ end
+ --release connection to the pool
+ local pool_max_idle_time = 10000
+ local pool_size = 100
+ local ok, err = red:set_keepalive(pool_max_idle_time, pool_size)
+ if not ok then
+ ngx.log(ngx.ERR, "set keepalive error:", err)
+ end
+ return
+end
+
+local function rewrite_admin_url()
+ local apiserver=ngx.var.apiserver
+ if apiserver=="fallback" then
+ ngx.status = ngx.HTTP_NOT_FOUND
+ ngx.exit(ngx.status)
+ end
+ local adminurl=ngx.var.adminurl
+ local uri = ngx.re.sub(ngx.var.uri, "^/admin/([^/]+)(/[Vv][^/]*)?(.*)", adminurl.."$3", "o")
+ ngx.req.set_uri(uri)
+end
+
+local function query_admin_info()
+ local apiserver = ngx.var.apiserver
+ local apiname = ngx.var.apiname
+ local apiversion = ngx.var.apiversion
+ apiversion=string.sub(apiversion,2,string.len(apiversion))
+
+ -- Check if key exists in local cache
+ local cache = ngx.shared.ceryx
+ local server, flags = cache:get("server:admin:"..apiname..":"..apiversion)
+ local url, flags = cache:get("url:admin:"..apiname..":"..apiversion)
+ if server and url then
+ ngx.var.apiserver = server
+ ngx.var.adminurl = url
+ ngx.log(ngx.WARN, "==using admin cache:", server.."&&"..url)
+ return
+ end
+
+ local redis = require "resty.redis"
+ local red = redis:new()
+ red:set_timeout(1000) -- 1000 ms
+ local redis_host = "127.0.0.1"
+ local redis_port = 6379
+ local res, err = red:connect(redis_host, redis_port)
+
+ -- Return if could not connect to Redis
+ if not res then
+ ngx.log(ngx.ERR, "connect to redis error:", err)
+ return
+ end
+
+ -- Construct Redis key
+ local prefix = "msb"
+ local keyprefix = prefix..":routing:api:"..apiname..":"..apiversion
+
+
+ -- Try to get ip:port for apiname
+ local serverkey=keyprefix..":lb:server1"
+ local server, err = red:hget(serverkey,"ip")..":"..red:hget(serverkey,"port")
+ ngx.log(ngx.WARN, "==adminserver:", server)
+ if not server or server == ngx.null then
+ return close_redis(red)
+ end
+
+ -- Try to get admin url for apiname
+ local infokey=keyprefix..":info"
+ local url, err = red:hget(infokey,"metricsUrl")
+ ngx.log(ngx.WARN, "==adminurl:", url)
+ if not url or url == ngx.null then
+ return close_redis(red)
+ end
+
+ -- Save found key to local cache for 5 seconds
+ cache:set("server:admin:"..apiname..":"..apiversion, server, 5)
+ cache:set("url:admin:"..apiname..":"..apiversion, url, 5)
+
+ ngx.log(ngx.WARN, "==admin result:", server.."&&"..url)
+ ngx.var.apiserver = server
+ ngx.var.adminurl = url
+
+ return close_redis(red)
+end
+query_admin_info()
+rewrite_admin_url()
\ No newline at end of file
--- /dev/null
+--[[
+
+ Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+
+ Licensed 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.
+
+ Author: Zhaoxing Meng
+ email: meng.zhaoxing1@zte.com.cn
+
+]]
+-- put red into the connection pool of size 100,
+-- with 10 seconds max idle time
+local function close_redis(red)
+ if not red then
+ return
+ end
+ --release connection to the pool
+ local pool_max_idle_time = 10000
+ local pool_size = 100
+ local ok, err = red:set_keepalive(pool_max_idle_time, pool_size)
+ if not ok then
+ ngx.log(ngx.ERR, "set keepalive error:", err)
+ end
+ return
+end
+
+local function rewrite_apijson_url()
+ local apiserver=ngx.var.apiserver
+ if apiserver=="fallback" then
+ ngx.status = ngx.HTTP_NOT_FOUND
+ ngx.exit(ngx.status)
+ end
+ local apijsonurl=ngx.var.apijsonurl
+ local uri = ngx.re.sub(ngx.var.uri, "^/apijson/([^/]+)(/[Vv][^/]*)?(.*)", apijsonurl.."$3", "o")
+ ngx.req.set_uri(uri)
+end
+
+local function query_apijson_info()
+ local apiserver = ngx.var.apiserver
+ local apiname = ngx.var.apiname
+ local apiversion = ngx.var.apiversion
+ apiversion=string.sub(apiversion,2,string.len(apiversion))
+
+ -- Check if key exists in local cache
+ local cache = ngx.shared.ceryx
+ local server, flags = cache:get("server:apijson:"..apiname..":"..apiversion)
+ local url, flags = cache:get("url:apijson:"..apiname..":"..apiversion)
+ if server and url then
+ ngx.var.apiserver = server
+ ngx.var.apijsonurl = url
+ ngx.log(ngx.WARN, "==using apijson cache:", server.."&&"..url)
+ return
+ end
+
+ local redis = require "resty.redis"
+ local red = redis:new()
+ red:set_timeout(1000) -- 1000 ms
+ local redis_host = "127.0.0.1"
+ local redis_port = 6379
+ local res, err = red:connect(redis_host, redis_port)
+
+ -- Return if could not connect to Redis
+ if not res then
+ ngx.log(ngx.ERR, "connect to redis error:", err)
+ return
+ end
+
+ -- Construct Redis key
+ local prefix = "msb"
+ local keyprefix = prefix..":routing:api:"..apiname..":"..apiversion
+
+
+ -- Try to get ip:port for apiname
+ local serverkey=keyprefix..":lb:server1"
+ local server, err = red:hget(serverkey,"ip")..":"..red:hget(serverkey,"port")
+ ngx.log(ngx.WARN, "==apijsonserver:", server)
+ if not server or server == ngx.null then
+ return close_redis(red)
+ end
+
+ -- Try to get apijson url for apiname
+ local infokey=keyprefix..":info"
+ local url, err = red:hget(infokey,"apijson")
+ ngx.log(ngx.WARN, "==apijsonurl:", url)
+ if not url or url == ngx.null then
+ return close_redis(red)
+ end
+
+ -- Save found key to local cache for 5 seconds
+ cache:set("server:apijson:"..apiname..":"..apiversion, server, 5)
+ cache:set("url:apijson:"..apiname..":"..apiversion, url, 5)
+
+ ngx.log(ngx.WARN, "==apijson result:", server.."&&"..url)
+ ngx.var.apiserver = server
+ ngx.var.apijsonurl = url
+
+ return close_redis(red)
+end
+query_apijson_info()
+rewrite_apijson_url()
\ No newline at end of file
--- /dev/null
+--[[
+
+ Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+
+ Licensed 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.
+
+ Author: Zhaoxing Meng
+ email: meng.zhaoxing1@zte.com.cn
+
+]]
+-- put red into the connection pool of size 100,
+-- with 10 seconds max idle time
+local function close_redis(red)
+ if not red then
+ return
+ end
+ --release connection to the pool
+ local pool_max_idle_time = 10000
+ local pool_size = 100
+ local ok, err = red:set_keepalive(pool_max_idle_time, pool_size)
+ if not ok then
+ ngx.log(ngx.ERR, "set keepalive error:", err)
+ end
+ return
+end
+
+local function rewrite_api_url()
+ local apiserver=ngx.var.apiserver
+ if apiserver=="fallback" then
+ ngx.status = ngx.HTTP_NOT_FOUND
+ ngx.exit(ngx.status)
+ end
+ local apiurl=ngx.var.apiurl
+ local uri = ngx.re.sub(ngx.var.uri, "^/openoapi/([^/]+)(/[Vv][^/]*)?(.*)", apiurl.."$3", "o")
+ ngx.req.set_uri(uri)
+end
+
+local function query_api_info()
+ local apiserver = ngx.var.apiserver
+ local apiname = ngx.var.apiname
+ local apiversion = ngx.var.apiversion
+ apiversion=string.sub(apiversion,2,string.len(apiversion))
+
+ -- Check if key exists in local cache
+ local cache = ngx.shared.ceryx
+ local server, flags = cache:get("server:api:"..apiname..":"..apiversion)
+ local url, flags = cache:get("url:api:"..apiname..":"..apiversion)
+ if server and url then
+ ngx.var.apiserver = server
+ ngx.var.apiurl = url
+ ngx.log(ngx.WARN, "==using api cache:", server.."&&"..url)
+ return
+ end
+
+ local redis = require "resty.redis"
+ local red = redis:new()
+ red:set_timeout(1000) -- 1000 ms
+ local redis_host = "127.0.0.1"
+ local redis_port = 6379
+ local res, err = red:connect(redis_host, redis_port)
+
+ -- Return if could not connect to Redis
+ if not res then
+ ngx.log(ngx.ERR, "connect to redis error:", err)
+ return
+ end
+
+ -- Construct Redis key
+ local prefix = "msb"
+ local keyprefix = prefix..":routing:api:"..apiname..":"..apiversion
+
+ local infokey=keyprefix..":info"
+ -- first of all check whether the status is 1(enabled)
+ local status = red:hget(infokey,"status")
+ if not (status=="1") then
+ ngx.log(ngx.WARN, keyprefix.."is disabled.status=", status)
+ return close_redis(red)
+ end
+
+ -- Try to get url for apiname
+ local url, err = red:hget(infokey,"url")
+ ngx.log(ngx.WARN, "==url:", url)
+ if not url or url == ngx.null then
+ return close_redis(red)
+ end
+
+ -- Try to get ip:port for apiname
+ local serverkey=keyprefix..":lb:server1"
+ local server, err = red:hget(serverkey,"ip")..":"..red:hget(serverkey,"port")
+ ngx.log(ngx.WARN, "==server:", server)
+ if not server or server == ngx.null then
+ return close_redis(red)
+ end
+
+
+ -- Save found key to local cache for 5 seconds
+ cache:set("server:api:"..apiname..":"..apiversion, server, 5)
+ cache:set("url:api:"..apiname..":"..apiversion, url, 5)
+
+ ngx.log(ngx.WARN, "==api result:", server.."&&"..url)
+ ngx.var.apiserver = server
+ ngx.var.apiurl = url
+
+ return close_redis(red)
+end
+query_api_info()
+rewrite_api_url()
\ No newline at end of file
--- /dev/null
+--[[
+
+ Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+
+ Licensed 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.
+
+ Author: Zhaoxing Meng
+ email: meng.zhaoxing1@zte.com.cn
+
+]]
+-- put red into the connection pool of size 100,
+-- with 10 seconds max idle time
+local function close_redis(red)
+ if not red then
+ return
+ end
+ --release connection to the pool
+ local pool_max_idle_time = 10000
+ local pool_size = 100
+ local ok, err = red:set_keepalive(pool_max_idle_time, pool_size)
+ if not ok then
+ ngx.log(ngx.ERR, "set keepalive error:", err)
+ end
+ return
+end
+
+local function rewrite_iui_url()
+ local iuiserver=ngx.var.iuiserver
+ if iuiserver=="fallback" then
+ ngx.status = ngx.HTTP_NOT_FOUND
+ ngx.exit(ngx.status)
+ end
+ local iuiurl=ngx.var.iuiurl
+ local uri = ngx.re.sub(ngx.var.uri, "^/openoui/([^/]+)(.*)", iuiurl.."$2", "o")
+ ngx.req.set_uri(uri)
+end
+
+local function query_iui_info()
+ local iuiserver = ngx.var.iuiserver
+ local iuiname = ngx.var.iuiname
+
+ -- Check if key exists in local cache
+ local cache = ngx.shared.ceryx
+ local server, flags = cache:get("server:iui:"..iuiname)
+ local url, flags = cache:get("url:iui:"..iuiname)
+ if server and url then
+ ngx.var.iuiserver = server
+ ngx.var.iuiurl = url
+ ngx.log(ngx.WARN, "==using iui cache:", server.."&&"..url)
+ return
+ end
+
+ local redis = require "resty.redis"
+ local red = redis:new()
+ red:set_timeout(1000) -- 1000 ms
+ local redis_host = "127.0.0.1"
+ local redis_port = 6379
+ local res, err = red:connect(redis_host, redis_port)
+
+ -- Return if could not connect to Redis
+ if not res then
+ ngx.log(ngx.ERR, "connect to redis error:", err)
+ return
+ end
+
+ -- Construct Redis key
+ local prefix = "msb"
+ local keyprefix = prefix..":routing:iui:"..iuiname
+
+ local infokey=keyprefix..":info"
+ -- first of all check whether the status is 1(enabled)
+ local status = red:hget(infokey,"status")
+ if not (status=="1") then
+ ngx.log(ngx.WARN, keyprefix.."is disabled.status=", status)
+ return close_redis(red)
+ end
+
+ -- Try to get url for iuiname
+ local url, err = red:hget(infokey,"url")
+ ngx.log(ngx.WARN, "==url:", url)
+ if not url or url == ngx.null then
+ return close_redis(red)
+ end
+
+ -- Try to get ip:port for iuiname
+ local serverkey=keyprefix..":lb:server1"
+ local server, err = red:hget(serverkey,"ip")..":"..red:hget(serverkey,"port")
+ ngx.log(ngx.WARN, "==server:", server)
+ if not server or server == ngx.null then
+ return close_redis(red)
+ end
+
+
+ -- Save found key to local cache for 5 seconds
+ cache:set("server:iui:"..iuiname, server, 5)
+ cache:set("url:iui:"..iuiname, url, 5)
+
+ ngx.log(ngx.WARN, "==iui result:", server.."&&"..url)
+ ngx.var.iuiserver = server
+ ngx.var.iuiurl = url
+
+ return close_redis(red)
+end
+query_iui_info()
+rewrite_iui_url()
\ No newline at end of file
+++ /dev/null
-if ngx.req.get_method() == "GET" then\r
- local services = {\r
- {serviceName="odlsdnia",apiJson="/api/odlsdnia/v1/swagger.json"},\r
- {serviceName="roc",apiJson="/api/roc/v1/swagger.json"},\r
- {serviceName="tackeria",apiJson="/api/tackeria/v1/swagger.json"},\r
- {serviceName="etsi",apiJson="/api/etsiia/v1/swagger.json"}\r
- }\r
- local cjson = require "cjson"\r
- local jsonData = cjson.encode(services)\r
- jsonData = string.gsub(jsonData,"\\/","/")\r
- ngx.print(jsonData)\r
-else\r
- ngx.log(ngx.WARN, "not a GET request.")\r
- ngx.exit(500)\r
-end
\ No newline at end of file
--- /dev/null
+--[[
+
+ Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+
+ Licensed 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.
+
+ Author: Zhaoxing Meng
+ email: meng.zhaoxing1@zte.com.cn
+
+]]
+local from, to, err = ngx.re.find(ngx.var.uri, "\\.(gif|jpg|jpeg|png|bmp|ico)$", "jo")
+--Based on the request file type to determine whether to cache
+if from then
+ --use cache
+ return 0
+else
+ --do not use cache
+ return 1
+end
\ No newline at end of file
--- /dev/null
+#
+# Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+#
+# Licensed 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.
+#
+# Author: Zhaoxing Meng
+# email: meng.zhaoxing1@zte.com.cn
+#
+
+server {
+ listen 80;
+ default_type text/html;
+ add_header X-Cache-Status $upstream_cache_status;
+
+ location = /openoui/microservices {
+ rewrite /openoui/microservices /openoui/microservices/index.html redirect;
+ }
+
+ location / {
+ set $server "fallback";
+ set $url "";
+ set $key "";
+
+ # Lua files
+ rewrite_by_lua_file luaext/customrouter.lua;
+
+ proxy_pass http://$server;
+ }
+ location ~ ^/api/(.*) {
+ rewrite ^/api/(.*) /openoapi/$1 last;
+ }
+ location ~ ^/iui/(.*) {
+ rewrite ^/iui/(.*) /openoui/$1 last;
+ }
+ location ~ ^/openoapi/([^/]+)(/[Vv][^/]*)?(.*) {
+ set $apiname $1;
+ set $apiversion $2;
+ set $apiserver "fallback";
+ set $apiurl "";
+
+ # Lua files
+ rewrite_by_lua_file luaext/openoapirouter.lua;
+
+ proxy_pass http://$apiserver;
+ }
+
+ location ~ ^/openoui/([^/]+)(.*) {
+ location ~* ^/iui/([^/]+)(.*)\.(?:png|jpg|jpeg|js|css|html|gif|ico|bmp|woff)$ {
+ set $iuiname $1;
+ set $iuiparam $2;
+ set $iuiserver "fallback";
+ set $iuiurl "";
+
+ # Lua files
+ rewrite_by_lua_file luaext/openouirouter.lua;
+
+ proxy_cache nginx_cache;
+ proxy_cache_key $host$uri$is_args$args;
+ proxy_cache_valid 200 304 12h ;
+ proxy_cache_valid 301 302 1m ;
+ proxy_cache_valid any 1m ;
+ expires 12h;
+
+ proxy_pass http://$iuiserver;
+ }
+ set $iuiname $1;
+ set $iuiparam $2;
+ set $iuiserver "fallback";
+ set $iuiurl "";
+
+ # Lua files
+ rewrite_by_lua_file luaext/openouirouter.lua;
+
+ proxy_pass http://$iuiserver;
+ }
+
+ location ~ ^/admin/([^/]+)(/[Vv][^/]*)?(.*) {
+ set $apiname $1;
+ set $apiversion $2;
+ set $apiserver "fallback";
+ set $adminurl "";
+
+ # Lua files
+ rewrite_by_lua_file luaext/openoadminrouter.lua;
+
+ proxy_pass http://$apiserver;
+ }
+
+ location ~ ^/apijson/([^/]+)(/[Vv][^/]*)?(.*) {
+ location ~* ^/apijson/([^/]+)(/[v][^/]*)?(.*)\.(?:png|jpg|jpeg|js|css|html|gif|ico|bmp|woff)$ {
+ set $apiname $1;
+ set $apiversion $2;
+ set $apiserver "fallback";
+ set $apijsonurl "";
+
+ # Lua files
+ rewrite_by_lua_file luaext/openoapijsonrouter.lua;
+
+ proxy_cache nginx_cache;
+ proxy_cache_key $host$uri$is_args$args;
+ proxy_cache_valid 200 304 12h ;
+ proxy_cache_valid 301 302 1m ;
+ proxy_cache_valid any 1m ;
+ expires 12h;
+
+ proxy_pass http://$apiserver;
+ }
+ set $apiname $1;
+ set $apiversion $2;
+ set $apiserver "fallback";
+ set $apijsonurl "";
+
+ # Lua files
+ rewrite_by_lua_file luaext/openoapijsonrouter.lua;
+
+ proxy_pass http://$apiserver;
+ }
+
+ location ~* \.(?:png|jpg|jpeg|js|css|html|gif|ico|bmp|woff)$ {
+ set $server "fallback";
+ set $url "";
+ set $key "";
+
+ # Lua files
+ rewrite_by_lua_file luaext/customrouter.lua;
+
+ proxy_cache nginx_cache;
+ proxy_cache_key $host$uri$is_args$args;
+ proxy_cache_valid 200 304 12h ;
+ proxy_cache_valid 301 302 1m ;
+ proxy_cache_valid any 1m ;
+ expires 12h;
+
+ proxy_pass http://$server;
+ }
+
+ location = /favicon.ico {
+ log_not_found off;
+ }
+}
\ No newline at end of file
#!/bin/sh
#
-# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+# Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
#
# Licensed 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
+# 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,
# See the License for the specific language governing permissions and
# limitations under the License.
#
+# Author: Zhaoxing Meng
+# email: meng.zhaoxing1@zte.com.cn
+#
DIRNAME=`dirname $0`
HOME=`cd $DIRNAME/nginx; pwd`
-@REM\r
-@REM Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)\r
-@REM\r
-@REM Licensed under the Apache License, Version 2.0 (the "License");\r
-@REM you may not use this file except in compliance with the License.\r
-@REM You may obtain a copy of the License at\r
-@REM\r
-@REM http://www.apache.org/licenses/LICENSE-2.0\r
-@REM\r
-@REM Unless required by applicable law or agreed to in writing, software\r
-@REM distributed under the License is distributed on an "AS IS" BASIS,\r
-@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-@REM See the License for the specific language governing permissions and\r
-@REM limitations under the License.\r
-@REM\r
-\r
-@echo off\r
-title openresty-server\r
-@if not "%ECHO%" == "" echo %ECHO%\r
-@if "%OS%" == "Windows_NT" setlocal\r
-\r
-set DIRNAME=.\r
-\r
-if "%OS%" == "Windows_NT" set DIRNAME=%~dp0%\r
-\r
-set ARGS=\r
-:loop\r
-if [%1] == [] goto endloop\r
- set ARGS=%ARGS% %1\r
- shift\r
- goto loop\r
-:endloop\r
-\r
-set HOME=%DIRNAME%nginx\r
-set _NGINXCMD=%HOME%\nginx.exe\r
-\r
-echo =========== openresty config info ============================================\r
-echo HOME=%HOME%\r
-echo _NGINXCMD=%_NGINXCMD%\r
-echo ===============================================================================\r
-\r
-cd /d "%HOME%"\r
-echo @WORK_DIR@%HOME%\r
-echo @C_CMD@ "%_NGINXCMD%"\r
-%_NGINXCMD%\r
-IF ERRORLEVEL 1 goto showerror\r
-exit\r
-:showerror\r
-echo WARNING: Error occurred during startup or Server abnormally stopped by way of killing the process,Please check!\r
-echo After checking, press any key to close \r
-pause\r
+@REM
+@REM Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+@REM
+@REM Licensed under the Apache License, Version 2.0 (the "License");
+@REM you may not use this file except in compliance with the License.
+@REM You may obtain a copy of the License at
+@REM
+@REM http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing, software
+@REM distributed under the License is distributed on an "AS IS" BASIS,
+@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@REM See the License for the specific language governing permissions and
+@REM limitations under the License.
+@REM
+@REM Author: Zhaoxing Meng
+@REM email: meng.zhaoxing1@zte.com.cn
+@REM
+
+@echo off
+title openresty-server
+@if not "%ECHO%" == "" echo %ECHO%
+@if "%OS%" == "Windows_NT" setlocal
+
+set DIRNAME=.
+
+if "%OS%" == "Windows_NT" set DIRNAME=%~dp0%
+
+set ARGS=
+:loop
+if [%1] == [] goto endloop
+ set ARGS=%ARGS% %1
+ shift
+ goto loop
+:endloop
+
+set HOME=%DIRNAME%nginx
+set _NGINXCMD=%HOME%\nginx.exe
+
+echo =========== openresty config info ============================================
+echo HOME=%HOME%
+echo _NGINXCMD=%_NGINXCMD%
+echo ===============================================================================
+
+cd /d "%HOME%"
+echo @WORK_DIR@%HOME%
+echo @C_CMD@ "%_NGINXCMD%"
+%_NGINXCMD%
+IF ERRORLEVEL 1 goto showerror
+exit
+:showerror
+echo WARNING: Error occurred during startup or Server abnormally stopped by way of killing the process,Please check!
+echo After checking, press any key to close
+pause
exit
\ No newline at end of file
#!/bin/sh
#
-# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+# Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
#
# Licensed 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
+# 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,
# See the License for the specific language governing permissions and
# limitations under the License.
#
+# Author: Zhaoxing Meng
+# email: meng.zhaoxing1@zte.com.cn
+#
DIRNAME=`dirname $0`
HOME=`cd $DIRNAME/nginx; pwd`
+++ /dev/null
-#!/bin/sh
-#
-# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
-#
-# Licensed 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.
-#
-DIRNAME=`dirname $0`
-HOME=`cd $DIRNAME/nginx; pwd`
-_NGINXCMD="$HOME/sbin/nginx"
-
-echo =========== create symbolic link for libluajit-5.1.so.2 ========================================
-LUAJIT_HOME=`cd $DIRNAME/luajit; pwd`
-LUAJIT_FILENAME="$LUAJIT_HOME/lib/libluajit-5.1.so.2"
-LN_TARGET_FILE='/lib/libluajit-5.1.so.2'
-LN_TARGET_FILE64='/lib64/libluajit-5.1.so.2'
-ln -s -f $LUAJIT_FILENAME $LN_TARGET_FILE
-ln -s -f $LUAJIT_FILENAME $LN_TARGET_FILE64
-echo ===============================================================================
-
-echo =========== openresty config info =============================================
-echo HOME=$HOME
-echo _NGINXCMD=$_NGINXCMD
-echo ===============================================================================
-cd $HOME; pwd
-
-echo @WORK_DIR@ $HOME
-echo @C_CMD@ $_NGINXCMD -p $HOME/
-$_NGINXCMD -p $HOME/ -g "daemon off;"
-
-@REM\r
-@REM Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)\r
-@REM\r
-@REM Licensed under the Apache License, Version 2.0 (the "License");\r
-@REM you may not use this file except in compliance with the License.\r
-@REM You may obtain a copy of the License at\r
-@REM\r
-@REM http://www.apache.org/licenses/LICENSE-2.0\r
-@REM\r
-@REM Unless required by applicable law or agreed to in writing, software\r
-@REM distributed under the License is distributed on an "AS IS" BASIS,\r
-@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-@REM See the License for the specific language governing permissions and\r
-@REM limitations under the License.\r
-@REM\r
-\r
-@echo off\r
-title close openresty-server\r
-@if not "%ECHO%" == "" echo %ECHO%\r
-@if "%OS%" == "Windows_NT" setlocal\r
-\r
-set DIRNAME=.\r
-\r
-if "%OS%" == "Windows_NT" set DIRNAME=%~dp0%\r
-\r
-set ARGS=\r
-:loop\r
-if [%1] == [] goto endloop\r
- set ARGS=%ARGS% %1\r
- shift\r
- goto loop\r
-:endloop\r
-\r
-set HOME=%DIRNAME%nginx\r
-set _NGINXCMD=%HOME%\nginx.exe\r
-\r
-\r
-echo =========== openresty config info ============================================\r
-echo HOME=%HOME%\r
-echo _NGINXCMD=%_NGINXCMD%\r
-echo ===============================================================================\r
-\r
-\r
-cd /d "%HOME%"\r
-echo @WORK_DIR@%HOME%\r
-echo @C_CMD@ "%_NGINXCMD% -s stop"\r
-\r
-%_NGINXCMD% -s stop\r
-echo closing signal has been sent,stopping in background,WAIT...\r
-timeout /t 5 /nobreak > nul\r
-exit\r
+@REM
+@REM Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+@REM
+@REM Licensed under the Apache License, Version 2.0 (the "License");
+@REM you may not use this file except in compliance with the License.
+@REM You may obtain a copy of the License at
+@REM
+@REM http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing, software
+@REM distributed under the License is distributed on an "AS IS" BASIS,
+@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@REM See the License for the specific language governing permissions and
+@REM limitations under the License.
+@REM
+@REM Author: Zhaoxing Meng
+@REM email: meng.zhaoxing1@zte.com.cn
+@REM
+
+@echo off
+title close openresty-server
+@if not "%ECHO%" == "" echo %ECHO%
+@if "%OS%" == "Windows_NT" setlocal
+
+set DIRNAME=.
+
+if "%OS%" == "Windows_NT" set DIRNAME=%~dp0%
+
+set ARGS=
+:loop
+if [%1] == [] goto endloop
+ set ARGS=%ARGS% %1
+ shift
+ goto loop
+:endloop
+
+set HOME=%DIRNAME%nginx
+set _NGINXCMD=%HOME%\nginx.exe
+
+
+echo =========== openresty config info ============================================
+echo HOME=%HOME%
+echo _NGINXCMD=%_NGINXCMD%
+echo ===============================================================================
+
+
+cd /d "%HOME%"
+echo @WORK_DIR@%HOME%
+echo @C_CMD@ "%_NGINXCMD% -s stop"
+
+%_NGINXCMD% -s stop
+echo closing signal has been sent,stopping in background,WAIT...
+timeout /t 5 /nobreak > nul
+exit
#!/bin/bash
#
-# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+# Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
#
# Licensed 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
+# 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,
# See the License for the specific language governing permissions and
# limitations under the License.
#
+# Author: Zhaoxing Meng
+# email: meng.zhaoxing1@zte.com.cn
+#
+
DIRNAME=`dirname $0`
HOME=`cd $DIRNAME/nginx; pwd`
_NGINXCMD="$HOME/sbin/nginx"
-<?xml version="1.0" encoding="UTF-8"?>\r
-<!--\r
-\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
-\r
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">\r
- <parent>\r
- <groupId>org.openo.common-services.microservice-bus</groupId>\r
- <artifactId>msb-core-parent</artifactId>\r
- <version>1.0.0-SNAPSHOT</version>\r
- </parent>\r
-\r
-\r
- <modelVersion>4.0.0</modelVersion>\r
- <artifactId>openresty</artifactId>\r
- <version>1.0.0-SNAPSHOT</version>\r
- <name>openo/msb/msb-core/openresty</name>\r
- <packaging>pom</packaging>\r
-\r
- <properties>\r
- <openresty.linux64.version>openresty-1.9.15.1-linux64</openresty.linux64.version>\r
- <openresty.win64.version>openresty-1.9.14.1001-win64</openresty.win64.version>\r
- </properties>\r
- <build>\r
- <plugins>\r
- <plugin>\r
- <groupId>org.codehaus.mojo</groupId>\r
- <artifactId>build-helper-maven-plugin</artifactId>\r
- <executions>\r
- <execution>\r
- <id>attach-artifacts-linux64</id>\r
- <phase>package</phase>\r
- <goals>\r
- <goal>attach-artifact</goal>\r
- </goals>\r
- <configuration>\r
- <artifacts>\r
- <artifact>\r
- <file>src/assembly/resources/${openresty.linux64.version}.tar.gz</file>\r
- <classifier>linux64</classifier>\r
- <type>tar.gz</type>\r
- </artifact>\r
- </artifacts>\r
- </configuration>\r
- </execution>\r
- <execution>\r
- <id>attach-artifacts-win64</id>\r
- <phase>package</phase>\r
- <goals>\r
- <goal>attach-artifact</goal>\r
- </goals>\r
- <configuration>\r
- <artifacts>\r
- <artifact>\r
- <file>src/assembly/resources/${openresty.win64.version}.zip</file>\r
- <classifier>win64</classifier>\r
- <type>zip</type>\r
- </artifact>\r
- </artifacts>\r
- </configuration>\r
- </execution>\r
- </executions>\r
- </plugin>\r
- </plugins>\r
- </build>\r
-\r
-</project>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+
+ Licensed 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.
+
+ Author: Zhaoxing Meng
+ email: meng.zhaoxing1@zte.com.cn
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <groupId>org.openo.common-services.microservice-bus</groupId>
+ <artifactId>msb-core-parent</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </parent>
+
+
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>openresty</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <name>openo/msb/msb-core/openresty</name>
+ <packaging>pom</packaging>
+
+ <properties>
+ <openresty.linux64.version>openresty-1.9.15.1-linux64</openresty.linux64.version>
+ <openresty.win64.version>openresty-1.9.14.1001-win64</openresty.win64.version>
+ </properties>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>attach-artifacts-linux64</id>
+ <phase>package</phase>
+ <goals>
+ <goal>attach-artifact</goal>
+ </goals>
+ <configuration>
+ <artifacts>
+ <artifact>
+ <file>src/assembly/resources/${openresty.linux64.version}.tar.gz</file>
+ <classifier>linux64</classifier>
+ <type>tar.gz</type>
+ </artifact>
+ </artifacts>
+ </configuration>
+ </execution>
+ <execution>
+ <id>attach-artifacts-win64</id>
+ <phase>package</phase>
+ <goals>
+ <goal>attach-artifact</goal>
+ </goals>
+ <configuration>
+ <artifacts>
+ <artifact>
+ <file>src/assembly/resources/${openresty.win64.version}.zip</file>
+ <classifier>win64</classifier>
+ <type>zip</type>
+ </artifact>
+ </artifacts>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
-<?xml version="1.0" encoding="UTF-8"?>\r
-<!--\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
-\r
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">\r
- <parent>\r
- <groupId>org.openo.common-services.microservice-bus</groupId>\r
- <artifactId>msb-core-root</artifactId>\r
- <version>1.0.0-SNAPSHOT</version>\r
- </parent>\r
-\r
- <modelVersion>4.0.0</modelVersion>\r
- <artifactId>msb-core-parent</artifactId>\r
- <version>1.0.0-SNAPSHOT</version>\r
- <name>openo/msb/msb-core-parent</name>\r
- <packaging>pom</packaging>\r
- <modules>\r
- <module>openresty</module>\r
- <module>openresty-ext</module>\r
- <module>redis</module>\r
- <module>redis-ext</module>\r
- <module>apiroute</module>\r
- <module>distributions</module>\r
- </modules>\r
-\r
-</project>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+
+ Licensed 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.
+
+ Author: Zhaoxing Meng
+ email: meng.zhaoxing1@zte.com.cn
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <groupId>org.openo.common-services.microservice-bus</groupId>
+ <artifactId>msb-core-root</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>msb-core-parent</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <name>openo/msb/msb-core-parent</name>
+ <packaging>pom</packaging>
+ <modules>
+ <module>openresty</module>
+ <module>openresty-ext</module>
+ <module>redis</module>
+ <module>redis-ext</module>
+ <module>apiroute</module>
+ <module>distributions</module>
+ </modules>
+</project>
-<?xml version="1.0" encoding="UTF-8"?>\r
-<!--\r
-\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
-\r
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">\r
- <parent>\r
- <groupId>org.openo.common-services.microservice-bus</groupId>\r
- <artifactId>msb-core-parent</artifactId>\r
- <version>1.0.0-SNAPSHOT</version>\r
- </parent>\r
-\r
-\r
- <modelVersion>4.0.0</modelVersion>\r
- <artifactId>redis-ext</artifactId>\r
- <version>1.0.0-SNAPSHOT</version>\r
- <name>openo/msb/msb-core/redis-ext</name>\r
- <packaging>pom</packaging>\r
-\r
- <properties>\r
- <outputdir>target/assembly</outputdir>\r
- <packageid>redis-ext</packageid>\r
- </properties>\r
-\r
- <build>\r
- <plugins>\r
- <plugin>\r
- <artifactId>maven-resources-plugin</artifactId>\r
- <configuration>\r
- <includeEmptyDirs>true</includeEmptyDirs>\r
- </configuration>\r
- <executions>\r
- <execution>\r
- <id>copy-resources</id>\r
- <phase>process-resources</phase>\r
- <goals>\r
- <goal>copy-resources</goal>\r
- </goals>\r
- <configuration>\r
- <outputDirectory>${outputdir}</outputDirectory>\r
- <resources>\r
- <resource>\r
- <directory>src/assembly/resources/</directory>\r
- <filtering>false</filtering>\r
- <includes>\r
- <include>**/*</include>\r
- </includes>\r
- </resource>\r
- </resources>\r
- <overwrite>true</overwrite>\r
- </configuration>\r
- </execution>\r
- </executions>\r
- </plugin>\r
-\r
- <plugin>\r
- <groupId>org.apache.maven.plugins</groupId>\r
- <artifactId>maven-antrun-plugin</artifactId>\r
- <executions>\r
- <execution>\r
- <id>distribution</id>\r
- <phase>package</phase>\r
- <goals>\r
- <goal>run</goal>\r
- </goals>\r
- <configuration>\r
- <target name="distribution">\r
- <zip destfile="target/${packageid}-${project.version}.zip" update="true">\r
- <zipfileset dir="target/assembly/" includes="**"/>\r
- </zip>\r
- <attachartifact file="target/${packageid}-${project.version}.zip" type="zip"/>\r
- </target>\r
- </configuration>\r
- </execution>\r
- </executions>\r
- </plugin>\r
-\r
- </plugins>\r
- </build>\r
-\r
-\r
-</project>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+
+ Licensed 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.
+
+ Author: Zhaoxing Meng
+ email: meng.zhaoxing1@zte.com.cn
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <groupId>org.openo.common-services.microservice-bus</groupId>
+ <artifactId>msb-core-parent</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </parent>
+
+
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>redis-ext</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <name>openo/msb/msb-core/redis-ext</name>
+ <packaging>pom</packaging>
+
+ <properties>
+ <outputdir>target/assembly</outputdir>
+ <packageid>redis-ext</packageid>
+ </properties>
+
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-resources-plugin</artifactId>
+ <configuration>
+ <includeEmptyDirs>true</includeEmptyDirs>
+ </configuration>
+ <executions>
+ <execution>
+ <id>copy-resources</id>
+ <phase>process-resources</phase>
+ <goals>
+ <goal>copy-resources</goal>
+ </goals>
+ <configuration>
+ <outputDirectory>${outputdir}</outputDirectory>
+ <resources>
+ <resource>
+ <directory>src/assembly/resources/</directory>
+ <filtering>false</filtering>
+ <includes>
+ <include>**/*</include>
+ </includes>
+ </resource>
+ </resources>
+ <overwrite>true</overwrite>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>distribution</id>
+ <phase>package</phase>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ <configuration>
+ <target name="distribution">
+ <zip destfile="target/${packageid}-${project.version}.zip" update="true">
+ <zipfileset dir="target/assembly/" includes="**"/>
+ </zip>
+ <attachartifact file="target/${packageid}-${project.version}.zip" type="zip"/>
+ </target>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+
+ </plugins>
+ </build>
+
+
+</project>
-@REM\r
-@REM Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)\r
-@REM\r
-@REM Licensed under the Apache License, Version 2.0 (the "License");\r
-@REM you may not use this file except in compliance with the License.\r
-@REM You may obtain a copy of the License at\r
-@REM\r
-@REM http://www.apache.org/licenses/LICENSE-2.0\r
-@REM\r
-@REM Unless required by applicable law or agreed to in writing, software\r
-@REM distributed under the License is distributed on an "AS IS" BASIS,\r
-@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-@REM See the License for the specific language governing permissions and\r
-@REM limitations under the License.\r
-@REM\r
-@echo off\r
-title close redis-server\r
-@if not "%ECHO%" == "" echo %ECHO%\r
-@if "%OS%" == "Windows_NT" setlocal\r
-\r
-set DIRNAME=.\r
-\r
-if "%OS%" == "Windows_NT" set DIRNAME=%~dp0%\r
-\r
-set HOME=%DIRNAME%\r
-set _REDISCLIENT=%DIRNAME%redis-cli.exe\r
-\r
-\r
-echo ================Redis config info =============================================\r
-echo Redis_HOME=$HOME\r
-echo TIP:This shell script rewrite the AOF file in the background!\r
-echo ===============================================================================\r
-\r
-\r
-cd /d "%HOME%"\r
-echo @WORK_DIR@%HOME%\r
-echo @C_CMD@ "%_REDISCLIENT% -p 6379 BGREWRITEAOF"\r
-%_REDISCLIENT% -p 6379 BGREWRITEAOF\r
-echo closing signal has been sent,stopping in background,WAIT...\r
-timeout /t 2 /nobreak > nul \r
-exit\r
+@REM
+@REM Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+@REM
+@REM Licensed under the Apache License, Version 2.0 (the "License");
+@REM you may not use this file except in compliance with the License.
+@REM You may obtain a copy of the License at
+@REM
+@REM http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing, software
+@REM distributed under the License is distributed on an "AS IS" BASIS,
+@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@REM See the License for the specific language governing permissions and
+@REM limitations under the License.
+@REM
+@REM Author: Zhaoxing Meng
+@REM email: meng.zhaoxing1@zte.com.cn
+@REM
+
+@echo off
+title close redis-server
+@if not "%ECHO%" == "" echo %ECHO%
+@if "%OS%" == "Windows_NT" setlocal
+
+set DIRNAME=.
+
+if "%OS%" == "Windows_NT" set DIRNAME=%~dp0%
+
+set HOME=%DIRNAME%
+set _REDISCLIENT=%DIRNAME%redis-cli.exe
+
+
+echo ================Redis config info =============================================
+echo Redis_HOME=$HOME
+echo TIP:This shell script rewrite the AOF file in the background!
+echo ===============================================================================
+
+
+cd /d "%HOME%"
+echo @WORK_DIR@%HOME%
+echo @C_CMD@ "%_REDISCLIENT% -p 6379 BGREWRITEAOF"
+%_REDISCLIENT% -p 6379 BGREWRITEAOF
+echo closing signal has been sent,stopping in background,WAIT...
+timeout /t 2 /nobreak > nul
+exit
#!/bin/sh
#
-# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+# Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
#
# Licensed 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
+# 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,
# See the License for the specific language governing permissions and
# limitations under the License.
#
+# Author: Zhaoxing Meng
+# email: meng.zhaoxing1@zte.com.cn
+#
+
DIRNAME=`dirname $0`
HOME=`cd $DIRNAME/; pwd`
_REDISCLIENT="$HOME/redis-cli"
-<service>\r
- <id>msb_redis</id>\r
- <name>msb_redis</name>\r
- <description>This service runs redis.</description>\r
- <workingdirectory>%BASE%</workingdirectory>\r
- <env name="RUNHOME" value="%BASE%"/>\r
- <executable>redis-server.exe</executable>\r
- <arguments>redis.conf</arguments>\r
- <stopexecutable>redis-cli.exe</stopexecutable>\r
- <stopargument>shutdown</stopargument>\r
- <logmode>rotate</logmode>\r
- <!-- stopparentprocessfirst>true</stopparentprocessfirst -->\r
+<!--
+
+ Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+
+ Licensed 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.
+
+ Author: Zhaoxing Meng
+ email: meng.zhaoxing1@zte.com.cn
+
+-->
+<service>
+ <id>msb_redis</id>
+ <name>msb_redis</name>
+ <description>This service runs redis.</description>
+ <workingdirectory>%BASE%</workingdirectory>
+ <env name="RUNHOME" value="%BASE%"/>
+ <executable>redis-server.exe</executable>
+ <arguments>redis.conf</arguments>
+ <stopexecutable>redis-cli.exe</stopexecutable>
+ <stopargument>shutdown</stopargument>
+ <logmode>rotate</logmode>
+ <!-- stopparentprocessfirst>true</stopparentprocessfirst -->
</service>
\ No newline at end of file
-@REM\r
-@REM Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)\r
-@REM\r
-@REM Licensed under the Apache License, Version 2.0 (the "License");\r
-@REM you may not use this file except in compliance with the License.\r
-@REM You may obtain a copy of the License at\r
-@REM\r
-@REM http://www.apache.org/licenses/LICENSE-2.0\r
-@REM\r
-@REM Unless required by applicable law or agreed to in writing, software\r
-@REM distributed under the License is distributed on an "AS IS" BASIS,\r
-@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-@REM See the License for the specific language governing permissions and\r
-@REM limitations under the License.\r
-@REM\r
-@echo off\r
-title redis-server\r
-@if not "%ECHO%" == "" echo %ECHO%\r
-@if "%OS%" == "Windows_NT" setlocal\r
-\r
-set DIRNAME=.\r
-\r
-if "%OS%" == "Windows_NT" set DIRNAME=%~dp0%\r
-\r
-set HOME=%DIRNAME%\r
-set _REDISCMD=%DIRNAME%redis-server.exe\r
-set _REDISCONF=%DIRNAME%redis.conf\r
-\r
-\r
-echo ================Redis config info =============================================\r
-echo Redis_HOME=%HOME%\r
-echo config file=$_REDISCONF\r
-echo Help:use $_REDISCMD --help for help\r
-echo ===============================================================================\r
-\r
-\r
-cd /d "%HOME%"\r
-echo @WORK_DIR@%HOME%\r
-echo @C_CMD@ "%_REDISCMD% %_REDISCONF%"\r
-%_REDISCMD% %_REDISCONF%\r
-IF ERRORLEVEL 1 goto showerror\r
-exit\r
-:showerror\r
-echo WARNING: Error occurred during startup or Server abnormally stopped by way of killing the process,Please check!\r
-echo After checking, press any key to close \r
-pause\r
-exit\r
+@REM
+@REM Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+@REM
+@REM Licensed under the Apache License, Version 2.0 (the "License");
+@REM you may not use this file except in compliance with the License.
+@REM You may obtain a copy of the License at
+@REM
+@REM http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing, software
+@REM distributed under the License is distributed on an "AS IS" BASIS,
+@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@REM See the License for the specific language governing permissions and
+@REM limitations under the License.
+@REM
+@REM Author: Zhaoxing Meng
+@REM email: meng.zhaoxing1@zte.com.cn
+@REM
+
+@echo off
+title redis-server
+@if not "%ECHO%" == "" echo %ECHO%
+@if "%OS%" == "Windows_NT" setlocal
+
+set DIRNAME=.
+
+if "%OS%" == "Windows_NT" set DIRNAME=%~dp0%
+
+set HOME=%DIRNAME%
+set _REDISCMD=%DIRNAME%redis-server.exe
+set _REDISCONF=%DIRNAME%redis.conf
+
+
+echo ================Redis config info =============================================
+echo Redis_HOME=%HOME%
+echo config file=$_REDISCONF
+echo Help:use $_REDISCMD --help for help
+echo ===============================================================================
+
+
+cd /d "%HOME%"
+echo @WORK_DIR@%HOME%
+echo @C_CMD@ "%_REDISCMD% %_REDISCONF%"
+%_REDISCMD% %_REDISCONF%
+IF ERRORLEVEL 1 goto showerror
+exit
+:showerror
+echo WARNING: Error occurred during startup or Server abnormally stopped by way of killing the process,Please check!
+echo After checking, press any key to close
+pause
+exit
#!/bin/sh
#
-# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+# Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
#
# Licensed 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
+# 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,
# See the License for the specific language governing permissions and
# limitations under the License.
#
+# Author: Zhaoxing Meng
+# email: meng.zhaoxing1@zte.com.cn
+#
+
DIRNAME=`dirname $0`
HOME=`cd $DIRNAME/; pwd`
_REDISCMD="$HOME/redis-server"
+++ /dev/null
-#!/bin/sh
-#
-# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
-#
-# Licensed 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.
-#
-DIRNAME=`dirname $0`
-HOME=`cd $DIRNAME/; pwd`
-_REDISCMD="$HOME/redis-server"
-_REDISCONF="$HOME/redis.conf"
-
-echo =========== Redis config info =============================================
-echo Redis_HOME=$HOME
-echo config file=$_REDISCONF
-echo Help:use $_REDISCMD --help for help
-echo ===============================================================================
-cd $HOME; pwd
-
-echo @C_CMD@ $_REDISCMD $_REDISCONF --daemonize no
-$_REDISCMD $_REDISCONF --daemonize no
-@REM\r
-@REM Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)\r
-@REM\r
-@REM Licensed under the Apache License, Version 2.0 (the "License");\r
-@REM you may not use this file except in compliance with the License.\r
-@REM You may obtain a copy of the License at\r
-@REM\r
-@REM http://www.apache.org/licenses/LICENSE-2.0\r
-@REM\r
-@REM Unless required by applicable law or agreed to in writing, software\r
-@REM distributed under the License is distributed on an "AS IS" BASIS,\r
-@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-@REM See the License for the specific language governing permissions and\r
-@REM limitations under the License.\r
-@REM\r
-@echo off\r
-title close redis-server\r
-@if not "%ECHO%" == "" echo %ECHO%\r
-@if "%OS%" == "Windows_NT" setlocal\r
-\r
-set DIRNAME=.\r
-\r
-if "%OS%" == "Windows_NT" set DIRNAME=%~dp0%\r
-\r
-set HOME=%DIRNAME%\r
-set _REDISCLIENT=%DIRNAME%redis-cli.exe\r
-\r
-\r
-echo ================Redis config info =============================================\r
-echo Redis_HOME=$HOME\r
-echo TIP:This shell script close the Redis instance listening on 6379!\r
-echo ===============================================================================\r
-\r
-\r
-cd /d "%HOME%"\r
-echo @WORK_DIR@%HOME%\r
-echo @C_CMD@ "%_REDISCLIENT% -p 6379 shutdown"\r
-%_REDISCLIENT% -p 6379 shutdown\r
-echo closing signal has been sent,stopping in background,WAIT...\r
-timeout /t 2 /nobreak > nul \r
-exit\r
+@REM
+@REM Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+@REM
+@REM Licensed under the Apache License, Version 2.0 (the "License");
+@REM you may not use this file except in compliance with the License.
+@REM You may obtain a copy of the License at
+@REM
+@REM http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing, software
+@REM distributed under the License is distributed on an "AS IS" BASIS,
+@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@REM See the License for the specific language governing permissions and
+@REM limitations under the License.
+@REM
+@REM Author: Zhaoxing Meng
+@REM email: meng.zhaoxing1@zte.com.cn
+@REM
+
+@echo off
+title close redis-server
+@if not "%ECHO%" == "" echo %ECHO%
+@if "%OS%" == "Windows_NT" setlocal
+
+set DIRNAME=.
+
+if "%OS%" == "Windows_NT" set DIRNAME=%~dp0%
+
+set HOME=%DIRNAME%
+set _REDISCLIENT=%DIRNAME%redis-cli.exe
+
+
+echo ================Redis config info =============================================
+echo Redis_HOME=$HOME
+echo TIP:This shell script close the Redis instance listening on 6379!
+echo ===============================================================================
+
+
+cd /d "%HOME%"
+echo @WORK_DIR@%HOME%
+echo @C_CMD@ "%_REDISCLIENT% -p 6379 shutdown"
+%_REDISCLIENT% -p 6379 shutdown
+echo closing signal has been sent,stopping in background,WAIT...
+timeout /t 2 /nobreak > nul
+exit
#!/bin/sh
#
-# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+# Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
#
# Licensed 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
+# 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,
# See the License for the specific language governing permissions and
# limitations under the License.
#
+# Author: Zhaoxing Meng
+# email: meng.zhaoxing1@zte.com.cn
+#
+
DIRNAME=`dirname $0`
HOME=`cd $DIRNAME/; pwd`
_REDISCLIENT="$HOME/redis-cli"
-<?xml version="1.0" encoding="UTF-8"?>\r
-<!--\r
-\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
-\r
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">\r
- <parent>\r
- <groupId>org.openo.common-services.microservice-bus</groupId>\r
- <artifactId>msb-core-parent</artifactId>\r
- <version>1.0.0-SNAPSHOT</version>\r
- </parent>\r
-\r
-\r
- <modelVersion>4.0.0</modelVersion>\r
- <artifactId>redis</artifactId>\r
- <version>1.0.0-SNAPSHOT</version>\r
- <name>openo/msb/msb-core/redis</name>\r
- <packaging>pom</packaging>\r
-\r
- <properties>\r
- <redis.linux64.version>redis-3.2.1-linux64</redis.linux64.version>\r
- <redis.win64.version>redis-3.2.100-win64</redis.win64.version>\r
- </properties>\r
- <build>\r
- <plugins>\r
- <plugin>\r
- <groupId>org.codehaus.mojo</groupId>\r
- <artifactId>build-helper-maven-plugin</artifactId>\r
- <executions>\r
- <execution>\r
- <id>attach-artifacts-linux64</id>\r
- <phase>package</phase>\r
- <goals>\r
- <goal>attach-artifact</goal>\r
- </goals>\r
- <configuration>\r
- <artifacts>\r
- <artifact>\r
- <file>src/assembly/resources/${redis.linux64.version}.tar.gz</file>\r
- <classifier>linux64</classifier>\r
- <type>tar.gz</type>\r
- </artifact>\r
- </artifacts>\r
- </configuration>\r
- </execution>\r
- <execution>\r
- <id>attach-artifacts-win64</id>\r
- <phase>package</phase>\r
- <goals>\r
- <goal>attach-artifact</goal>\r
- </goals>\r
- <configuration>\r
- <artifacts>\r
- <artifact>\r
- <file>src/assembly/resources/${redis.win64.version}.zip</file>\r
- <classifier>win64</classifier>\r
- <type>zip</type>\r
- </artifact>\r
- </artifacts>\r
- </configuration>\r
- </execution>\r
- </executions>\r
- </plugin>\r
- </plugins>\r
- </build>\r
-\r
-</project>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+
+ Licensed 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.
+
+ Author: Zhaoxing Meng
+ email: meng.zhaoxing1@zte.com.cn
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <groupId>org.openo.common-services.microservice-bus</groupId>
+ <artifactId>msb-core-parent</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </parent>
+
+
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>redis</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <name>openo/msb/msb-core/redis</name>
+ <packaging>pom</packaging>
+
+ <properties>
+ <redis.linux64.version>redis-3.2.1-linux64</redis.linux64.version>
+ <redis.win64.version>redis-3.2.100-win64</redis.win64.version>
+ </properties>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>attach-artifacts-linux64</id>
+ <phase>package</phase>
+ <goals>
+ <goal>attach-artifact</goal>
+ </goals>
+ <configuration>
+ <artifacts>
+ <artifact>
+ <file>src/assembly/resources/${redis.linux64.version}.tar.gz</file>
+ <classifier>linux64</classifier>
+ <type>tar.gz</type>
+ </artifact>
+ </artifacts>
+ </configuration>
+ </execution>
+ <execution>
+ <id>attach-artifacts-win64</id>
+ <phase>package</phase>
+ <goals>
+ <goal>attach-artifact</goal>
+ </goals>
+ <configuration>
+ <artifacts>
+ <artifact>
+ <file>src/assembly/resources/${redis.win64.version}.zip</file>
+ <classifier>win64</classifier>
+ <type>zip</type>
+ </artifact>
+ </artifacts>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
-modeldesign-parent\r
-============\r
-\r
-Root Pom of Project modeldesign\r
-\r
-**modeldesignparent-lite is descripe the maven repo and maven plugin .**\r
-\r
-**modeldesignparent is the parent pom of the this project ,which descripe the dependency Management of the thirdparty Supporting Libraries**\r
-\r
-you can use the following section to reference it .\r
-\r
-~~~\r
- <groupId>org.openo.orchestrator.modeldesignparent</groupId>\r
- <artifactId>modeldesignparent</artifactId>\r
- <version>1.0.0</version>\r
-~~~\r
-\r
+modeldesign-parent
+============
+
+Root Pom of Project modeldesign
+
+**modeldesignparent-lite is descripe the maven repo and maven plugin .**
+
+**modeldesignparent is the parent pom of the this project ,which descripe the dependency Management of the thirdparty Supporting Libraries**
+
+you can use the following section to reference it .
+
+~~~
+ <groupId>org.openo.orchestrator.modeldesignparent</groupId>
+ <artifactId>modeldesignparent</artifactId>
+ <version>1.0.0</version>
+~~~
+
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
+ Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
Licensed 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
+ 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,
See the License for the specific language governing permissions and
limitations under the License.
+ Author: Zhaoxing Meng
+ email: meng.zhaoxing1@zte.com.cn
+
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
</plugin>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
- <version>${failsafe.version}</version>
+ <version>2.19.1</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
+ Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
Licensed 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
+ 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,
See the License for the specific language governing permissions and
limitations under the License.
+ Author: Zhaoxing Meng
+ email: meng.zhaoxing1@zte.com.cn
+
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<targetJdk>1.8</targetJdk>
</configuration>
</plugin>
-
- <plugin>
- <groupId>com.mycila</groupId>
- <artifactId>license-maven-plugin</artifactId>
- <version>2.3</version>
- <configuration>
- <includes>
- <include>**\*.java</include>
- </includes>
- </configuration>
- </plugin>
</plugins>
</build>
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
+ Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
Licensed 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
+ 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,
See the License for the specific language governing permissions and
limitations under the License.
+ Author: Zhaoxing Meng
+ email: meng.zhaoxing1@zte.com.cn
+
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
-<?xml version="1.0" encoding="UTF-8"?>\r
-<!--\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
-\r
- <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">\r
-\r
- <modelVersion>4.0.0</modelVersion>\r
-\r
- <parent>\r
- <groupId>org.openo.common-services.microservice-bus</groupId>\r
- <artifactId>msbparent</artifactId>\r
- <version>1.0.0-SNAPSHOT</version>\r
- <relativePath>msb-parent/msbparent</relativePath>\r
- </parent>\r
-\r
-\r
- <artifactId>msb-core-root</artifactId>\r
- <version>1.0.0-SNAPSHOT</version>\r
- <name>openo/msb/msb-core-root</name>\r
- <packaging>pom</packaging>\r
-\r
- <modules>\r
- <module>msb-parent</module>\r
- <module>msb-core</module>\r
- </modules>\r
-\r
- </project>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+
+ Licensed 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.
+
+ Author: Zhaoxing Meng
+ email: meng.zhaoxing1@zte.com.cn
+
+-->
+ <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.openo.common-services.microservice-bus</groupId>
+ <artifactId>msbparent</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <relativePath>msb-parent/msbparent</relativePath>
+ </parent>
+
+
+ <artifactId>msb-core-root</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <name>openo/msb/msb-core-root</name>
+ <packaging>pom</packaging>
+
+ <modules>
+ <module>msb-parent</module>
+ <module>msb-core</module>
+ </modules>
+
+ </project>