From b69d850757a7a8c4ff9a368df004a3cfaaf9f1e4 Mon Sep 17 00:00:00 2001 From: Zhaoxing Date: Thu, 8 Sep 2016 23:20:06 +0800 Subject: [PATCH] Issue-id: OCS-9 Change-Id: I73c18bdda656c43687810930338f9a949ed08848 Signed-off-by: Zhaoxing --- doc/java-license-header.txt | 13 - doc/license-format.sh | 1 - msb-core/apiroute/apiroute-service/pom.xml | 19 +- .../src/main/java/org/openo/msb/ApiRouteApp.java | 1099 +++--- .../main/java/org/openo/msb/ApiRouteAppConfig.java | 2 +- .../main/java/org/openo/msb/ConsulClientApp.java | 903 +++-- .../main/java/org/openo/msb/api/ApiRouteInfo.java | 272 +- .../main/java/org/openo/msb/api/ConsulInfo.java | 74 +- .../org/openo/msb/api/CustomDateSerializer.java | 76 +- .../java/org/openo/msb/api/CustomRouteInfo.java | 204 +- .../main/java/org/openo/msb/api/DiscoverInfo.java | 98 +- .../main/java/org/openo/msb/api/IuiRouteInfo.java | 204 +- .../main/java/org/openo/msb/api/MetricsInfo.java | 382 +- .../org/openo/msb/api/MicroServiceFullInfo.java | 86 +- .../java/org/openo/msb/api/MicroServiceInfo.java | 76 +- .../src/main/java/org/openo/msb/api/Node.java | 150 +- .../src/main/java/org/openo/msb/api/NodeInfo.java | 148 +- .../main/java/org/openo/msb/api/RouteServer.java | 136 +- .../src/main/java/org/openo/msb/api/Service.java | 208 +- .../java/org/openo/msb/api/ServiceAccessInfo.java | 176 +- .../ExtendedInternalServerErrorException.java | 56 +- .../api/exception/ExtendedNotFoundException.java | 56 +- .../exception/ExtendedNotSupportedException.java | 54 +- .../org/openo/msb/health/ApiRouteHealthCheck.java | 2 +- .../org/openo/msb/resources/ApiRouteResource.java | 466 +-- .../openo/msb/resources/CustomRouteResource.java | 304 +- .../org/openo/msb/resources/IuiRouteResource.java | 309 +- .../org/openo/msb/resources/MetricsResource.java | 97 +- .../openo/msb/resources/MicroServiceResource.java | 493 ++- .../openo/msb/resources/ServiceAccessResource.java | 129 +- .../openo/msb/wrapper/ApiRouteServiceWrapper.java | 1306 +++---- .../msb/wrapper/CustomRouteServiceWrapper.java | 948 ++--- .../openo/msb/wrapper/IuiRouteServiceWrapper.java | 906 ++--- .../openo/msb/wrapper/MetricsServiceWrapper.java | 183 +- .../org/openo/msb/wrapper/MicroServiceWrapper.java | 1071 +++--- .../openo/msb/wrapper/ServiceAccessWrapper.java | 341 +- .../openo/msb/wrapper/consul/CatalogClient.java | 2 +- .../java/org/openo/msb/wrapper/consul/Consul.java | 2 +- .../openo/msb/wrapper/consul/ConsulException.java | 2 +- .../org/openo/msb/wrapper/consul/HealthClient.java | 2 +- .../consul/async/ConsulResponseCallback.java | 2 +- .../msb/wrapper/consul/cache/CatalogCache.java | 139 +- .../msb/wrapper/consul/cache/ConsulCache.java | 2 +- .../msb/wrapper/consul/cache/ConsulCache4Map.java | 515 ++- .../msb/wrapper/consul/cache/HealthCache.java | 137 +- .../msb/wrapper/consul/cache/ServiceCache.java | 99 +- .../msb/wrapper/consul/model/ConsulResponse.java | 2 +- .../wrapper/consul/model/catalog/CatalogNode.java | 2 +- .../consul/model/catalog/CatalogService.java | 2 +- .../consul/model/catalog/ImmutableCatalogNode.java | 611 ++-- .../model/catalog/ImmutableCatalogService.java | 1251 ++++--- .../wrapper/consul/model/catalog/ServiceInfo.java | 125 +- .../wrapper/consul/model/health/ImmutableNode.java | 531 ++- .../consul/model/health/ImmutableService.java | 955 +++-- .../msb/wrapper/consul/model/health/Node.java | 2 +- .../msb/wrapper/consul/model/health/Service.java | 2 +- .../wrapper/consul/model/health/ServiceHealth.java | 2 +- .../msb/wrapper/consul/option/CatalogOptions.java | 2 +- .../msb/wrapper/consul/option/ConsistencyMode.java | 2 +- .../consul/option/ImmutableCatalogOptions.java | 501 ++- .../consul/option/ImmutableQueryOptions.java | 1061 +++--- .../openo/msb/wrapper/consul/option/Options.java | 2 +- .../msb/wrapper/consul/option/ParamAdder.java | 2 +- .../msb/wrapper/consul/option/QueryOptions.java | 2 +- .../consul/util/Base64EncodingDeserializer.java | 2 +- .../openo/msb/wrapper/consul/util/ClientUtil.java | 2 +- .../org/openo/msb/wrapper/consul/util/Jackson.java | 2 +- .../consul/util/ObjectMapperContextResolver.java | 2 +- .../wrapper/consul/util/SecondsDeserializer.java | 2 +- .../msb/wrapper/consul/util/SecondsSerializer.java | 2 +- .../consul/util/UnsignedLongDeserializer.java | 2 +- .../IMicroServiceChangeListener.java | 64 +- .../MicroServiceChangeListener.java | 611 ++-- .../java/org/openo/msb/wrapper/util/FileUtil.java | 131 +- .../openo/msb/wrapper/util/JacksonJsonUtil.java | 239 +- .../java/org/openo/msb/wrapper/util/JedisUtil.java | 439 ++- .../org/openo/msb/wrapper/util/MetricsUtil.java | 47 +- .../org/openo/msb/wrapper/util/MicroServiceDB.java | 845 +++-- .../openo/msb/wrapper/util/MicroServiceUtil.java | 191 +- .../org/openo/msb/wrapper/util/RegExpTestUtil.java | 176 +- .../java/org/openo/msb/wrapper/util/RouteUtil.java | 269 +- .../src/main/resources/api-doc/WEB-INF/web.xml | 32 +- .../src/main/resources/api-doc/css/reset.css | 18 + .../src/main/resources/api-doc/css/screen.css | 18 + .../src/main/resources/api-doc/css/typography.css | 18 + .../src/main/resources/api-doc/index.html | 239 +- .../iframeResizer.contentWindow.min.js | 8 - .../api-doc/js/iframeResizer/iframeResizer.min.js | 7 - .../src/main/resources/api-doc/lib/backbone-min.js | 18 + .../main/resources/api-doc/lib/handlebars-2.0.0.js | 18 + .../resources/api-doc/lib/highlight.7.3.pack.js | 18 + .../resources/api-doc/lib/jquery.ba-bbq.min.js | 8 - .../src/main/resources/api-doc/lib/marked.js | 22 +- .../src/main/resources/api-doc/lib/shred.bundle.js | 18 + .../main/resources/api-doc/lib/shred/content.js | 19 +- .../main/resources/api-doc/lib/swagger-client.js | 18 + .../main/resources/api-doc/lib/swagger-oauth.js | 18 + .../main/resources/api-doc/lib/underscore-min.js | 18 + .../src/main/resources/api-doc/o2c.html | 20 + .../src/main/resources/api-doc/swagger-ui.js | 18 + .../apiroute-service/src/main/resources/banner.txt | 19 + .../src/main/resources/iui-metrics/css/metrics.css | 9 +- .../i18n/loadi18nApp_iui-metrics_view.js | 7 +- .../i18n/msb-iui-metrics-i18n-en-US.properties | 7 +- .../i18n/msb-iui-metrics-i18n-zh-CN.properties | 7 +- .../src/main/resources/iui-metrics/index.html | 513 +-- .../src/main/resources/iui-metrics/js/avalon.js | 18 + .../iui-metrics/js/bootstrap/css/bootstrap-dt.css | 6 - .../iui-metrics/js/bootstrap/css/bootstrap.min.css | 6 - .../iui-metrics/js/bootstrap/js/bootstrap.js | 6 - .../iui-metrics/js/bootstrap/js/bootstrap.min.js | 5 - .../js/bootstrap/js/bootstrap2-typeahead.min.js | 19 - .../js/dataTables/dataTables.bootstrap.css | 18 + .../iui-metrics/js/echarts/echarts-all.js | 18 + .../js/fontAwesome/css/font-awesome.min.css | 3 - .../iframeResizer.contentWindow.min.js | 8 - .../js/iframeResizer/iframeResizer.min.js | 7 - .../js/jquery.i18n/jquery.i18n.properties-1.0.9.js | 18 + .../main/resources/iui-metrics/js/metricsChart.js | 7 +- .../resources/iui-metrics/js/metricsController.js | 458 +-- .../main/resources/iui-metrics/js/metricsUtil.js | 8 +- .../src/main/resources/iui-route/css/newRoute.css | 543 +-- .../src/main/resources/iui-route/css/route.css | 1287 +++---- .../src/main/resources/iui-route/default.html | 283 +- .../iui-route/i18n/loadi18nApp_iui-route_view.js | 7 +- .../i18n/msb-iui-route-i18n-en-US.properties | 8 +- .../i18n/msb-iui-route-i18n-zh-CN.properties | 8 +- .../src/main/resources/iui-route/index.html | 2077 +++++------ .../src/main/resources/iui-route/js/avalon.js | 18 + .../iui-route/js/bootstrap/css/bootstrap-dt.css | 6 - .../iui-route/js/bootstrap/css/bootstrap.min.css | 6 - .../iui-route/js/bootstrap/js/bootstrap.js | 6 - .../iui-route/js/bootstrap/js/bootstrap.min.js | 5 - .../js/bootstrap/js/bootstrap2-typeahead.min.js | 19 - .../js/dataTables/dataTables.bootstrap.css | 18 + .../js/fontAwesome/css/font-awesome.min.css | 3 - .../iframeResizer.contentWindow.min.js | 8 - .../js/iframeResizer/iframeResizer.min.js | 7 - .../js/jquery-validation/additional-methods.js | 20 +- .../js/jquery-validation/jquery.validate.js | 20 +- .../jquery-validation/localization/messages_ar.js | 18 + .../jquery-validation/localization/messages_bg.js | 18 + .../jquery-validation/localization/messages_ca.js | 18 + .../jquery-validation/localization/messages_cs.js | 18 + .../jquery-validation/localization/messages_da.js | 18 + .../jquery-validation/localization/messages_de.js | 18 + .../jquery-validation/localization/messages_el.js | 18 + .../jquery-validation/localization/messages_es.js | 18 + .../localization/messages_es_AR.js | 18 + .../jquery-validation/localization/messages_et.js | 18 + .../jquery-validation/localization/messages_eu.js | 18 + .../jquery-validation/localization/messages_fa.js | 18 + .../jquery-validation/localization/messages_fi.js | 18 + .../jquery-validation/localization/messages_fr.js | 18 + .../jquery-validation/localization/messages_gl.js | 18 + .../jquery-validation/localization/messages_he.js | 18 + .../jquery-validation/localization/messages_hr.js | 18 + .../jquery-validation/localization/messages_hu.js | 18 + .../jquery-validation/localization/messages_id.js | 18 + .../jquery-validation/localization/messages_is.js | 18 + .../jquery-validation/localization/messages_it.js | 18 + .../jquery-validation/localization/messages_ja.js | 18 + .../jquery-validation/localization/messages_ka.js | 18 + .../jquery-validation/localization/messages_kk.js | 18 + .../jquery-validation/localization/messages_ko.js | 18 + .../jquery-validation/localization/messages_lt.js | 18 + .../jquery-validation/localization/messages_lv.js | 18 + .../jquery-validation/localization/messages_my.js | 18 + .../jquery-validation/localization/messages_nl.js | 18 + .../jquery-validation/localization/messages_no.js | 18 + .../jquery-validation/localization/messages_pl.js | 18 + .../localization/messages_pt_BR.js | 18 + .../localization/messages_pt_PT.js | 18 + .../jquery-validation/localization/messages_ro.js | 18 + .../jquery-validation/localization/messages_ru.js | 18 + .../jquery-validation/localization/messages_si.js | 18 + .../jquery-validation/localization/messages_sk.js | 18 + .../jquery-validation/localization/messages_sl.js | 18 + .../jquery-validation/localization/messages_sr.js | 18 + .../localization/messages_sr_lat.js | 18 + .../jquery-validation/localization/messages_sv.js | 18 + .../jquery-validation/localization/messages_th.js | 18 + .../jquery-validation/localization/messages_tj.js | 18 + .../jquery-validation/localization/messages_tr.js | 18 + .../jquery-validation/localization/messages_uk.js | 18 + .../jquery-validation/localization/messages_vi.js | 18 + .../jquery-validation/localization/messages_zh.js | 18 + .../localization/messages_zh_TW.js | 18 + .../jquery-validation/localization/methods_de.js | 18 + .../localization/methods_es_CL.js | 18 + .../jquery-validation/localization/methods_fi.js | 18 + .../jquery-validation/localization/methods_nl.js | 18 + .../jquery-validation/localization/methods_pt.js | 18 + .../js/jquery.i18n/jquery.i18n.properties-1.0.9.js | 18 + .../main/resources/iui-route/js/routeController.js | 3649 ++++++++++---------- .../src/main/resources/iui-route/js/routeFunc.js | 1295 +++---- .../src/main/resources/iui-route/js/routeUtil.js | 7 +- .../msb/wrapper/ApiRouteServiceWrapperTest.java | 328 +- .../msb/wrapper/CustomRouteServiceWrapperTest.java | 274 +- .../msb/wrapper/IuiRouteServiceWrapperTest.java | 274 +- .../openo/msb/wrapper/MicroServiceWrapperTest.java | 296 +- .../msb/wrapper/util/JacksonJsonUtilTest.java | 96 +- .../openo/msb/wrapper/util/RegExpTestUtilTest.java | 172 +- .../org/openo/msb/wrapper/util/RouteUtilTest.java | 128 +- msb-core/apiroute/apiroute-standalone/pom.xml | 8 +- .../assembly/resource/apiroute/apirouteService.xml | 44 +- .../assembly/resource/apiroute/conf/apiroute.yml | 123 +- .../resource/apiroute/ext/initServices/msb.json | 58 +- .../resource/apiroute/ext/initServices/readme.txt | 143 +- .../ext/initUrlRootPath/initUrlRootPath.json | 8 +- .../initVisualRange/initVisualRangeMatches.json | 6 +- .../apiroute/ext/initVisualRange/readme.txt | 45 +- .../resource/apiroute/find_kill_process.bat | 48 +- .../src/assembly/resource/apiroute/run.bat | 8 +- .../src/assembly/resource/apiroute/run.sh | 7 +- .../src/assembly/resource/apiroute/stop.bat | 8 +- .../src/assembly/resource/apiroute/stop.sh | 7 +- msb-core/apiroute/pom.xml | 8 +- msb-core/distributions/pom.xml | 8 +- msb-core/distributions/standalone/pom.xml | 8 +- .../src/assembly/resource/servicesInstall.bat | 70 +- .../src/assembly/resource/servicesRestart.bat | 70 +- .../src/assembly/resource/servicesStatus.bat | 70 +- .../src/assembly/resource/servicesUninstall.bat | 76 +- .../standalone/src/assembly/resource/shutdown.bat | 8 +- .../standalone/src/assembly/resource/shutdown.sh | 8 +- .../standalone/src/assembly/resource/startup.bat | 8 +- .../standalone/src/assembly/resource/startup.sh | 8 +- .../src/assembly/resource/startup4docker.sh | 33 - .../standalone/src/main/docker/Dockerfile | 5 - msb-core/openresty-ext/pom.xml | 194 +- .../resources/openresty/nginx/conf/nginx.conf | 212 +- .../resources/openresty/nginx/luaext/auth.lua | 15 - .../openresty/nginx/luaext/customrouter.lua | 194 ++ .../resources/openresty/nginx/luaext/iui_auth.lua | 41 - .../resources/openresty/nginx/luaext/login.lua | 9 - .../resources/openresty/nginx/luaext/logout.lua | 6 - .../openresty/nginx/luaext/make_authed.lua | 44 - .../openresty/nginx/luaext/openoadminrouter.lua | 110 + .../openresty/nginx/luaext/openoapijsonrouter.lua | 110 + .../openresty/nginx/luaext/openoapirouter.lua | 117 + .../openresty/nginx/luaext/openouirouter.lua | 115 + .../openresty/nginx/luaext/serviceaccess.lua | 15 - .../openresty/nginx/luaext/setnocacheflag.lua | 29 + .../openresty/nginx/sites-enabled/openomsb.conf | 150 + .../src/assembly/resources/openresty/reload.sh | 7 +- .../src/assembly/resources/openresty/run.bat | 105 +- .../src/assembly/resources/openresty/run.sh | 7 +- .../src/assembly/resources/openresty/run4docker.sh | 39 - .../src/assembly/resources/openresty/stop.bat | 105 +- .../src/assembly/resources/openresty/stop.sh | 8 +- msb-core/openresty/pom.xml | 164 +- msb-core/pom.xml | 81 +- msb-core/redis-ext/pom.xml | 194 +- .../src/assembly/resources/redis/BGREWRITEAOF.bat | 86 +- .../src/assembly/resources/redis/BGREWRITEAOF.sh | 8 +- .../src/assembly/resources/redis/redisService.xml | 44 +- .../redis-ext/src/assembly/resources/redis/run.bat | 98 +- .../redis-ext/src/assembly/resources/redis/run.sh | 8 +- .../src/assembly/resources/redis/run4docker.sh | 30 - .../src/assembly/resources/redis/stop.bat | 86 +- .../redis-ext/src/assembly/resources/redis/stop.sh | 8 +- msb-core/redis/pom.xml | 164 +- msb-parent/README.md | 34 +- msb-parent/msbparent-lite/pom.xml | 10 +- msb-parent/msbparent/pom.xml | 19 +- msb-parent/pom.xml | 8 +- pom.xml | 85 +- 268 files changed, 19567 insertions(+), 17678 deletions(-) delete mode 100644 doc/java-license-header.txt delete mode 100644 doc/license-format.sh delete mode 100644 msb-core/distributions/standalone/src/assembly/resource/startup4docker.sh delete mode 100644 msb-core/distributions/standalone/src/main/docker/Dockerfile delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/auth.lua create mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/customrouter.lua delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/iui_auth.lua delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/login.lua delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/logout.lua delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/make_authed.lua create mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openoadminrouter.lua create mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openoapijsonrouter.lua create mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openoapirouter.lua create mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openouirouter.lua delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/serviceaccess.lua create mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/setnocacheflag.lua create mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/sites-enabled/openomsb.conf delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/run4docker.sh delete mode 100644 msb-core/redis-ext/src/assembly/resources/redis/run4docker.sh diff --git a/doc/java-license-header.txt b/doc/java-license-header.txt deleted file mode 100644 index 03dc039..0000000 --- a/doc/java-license-header.txt +++ /dev/null @@ -1,13 +0,0 @@ -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. diff --git a/doc/license-format.sh b/doc/license-format.sh deleted file mode 100644 index 89fb451..0000000 --- a/doc/license-format.sh +++ /dev/null @@ -1 +0,0 @@ -mvn com.mycila:license-maven-plugin:format -Dlicense.header=doc/java-license-header.txt \ No newline at end of file diff --git a/msb-core/apiroute/apiroute-service/pom.xml b/msb-core/apiroute/apiroute-service/pom.xml index 54f8daf..55d1a5e 100644 --- a/msb-core/apiroute/apiroute-service/pom.xml +++ b/msb-core/apiroute/apiroute-service/pom.xml @@ -1,12 +1,12 @@ - @@ -46,7 +49,7 @@ swagger-jersey2-jaxrs compile - + redis.clients jedis @@ -62,10 +65,10 @@ jdk15 - junit - junit - test - + junit + junit + test + diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/ApiRouteApp.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/ApiRouteApp.java index 7a9f524..94b29ac 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/ApiRouteApp.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/ApiRouteApp.java @@ -1,550 +1,549 @@ -/** - * 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. - */ - -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 { - - 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 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 routeList = - (List) 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 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 { + + 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 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 routeList = + (List) 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()); + } + } + + + } + +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/ApiRouteAppConfig.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/ApiRouteAppConfig.java index e14413c..4029c04 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/ApiRouteAppConfig.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/ApiRouteAppConfig.java @@ -1,5 +1,5 @@ /** - * 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. diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/ConsulClientApp.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/ConsulClientApp.java index 4f47732..4986e54 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/ConsulClientApp.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/ConsulClientApp.java @@ -1,452 +1,451 @@ -/** - * 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. - */ - -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> cacheList = new AtomicReference>( - new ArrayList()); - - - 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 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>>() { - @Override - public void notify(List oldValues, List newValues) { - // do Something with updated server List - LOGGER.info("--new service notify--"); - - List 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 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() { - @Override - public void notify(Map 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 nodes = new HashSet(); - String url = ""; - String version = "", visualRange = "", protocol = "",lb_policy=""; - - for (Map.Entry 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 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() { - @Override - public void notify(Map 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 nodes = new HashSet(); - String url = ""; - String version = "", visualRange = "", protocol = ""; - - for (Map.Entry 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 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 - */ - private List getDiffrent(List list1, List list2) { - - List diff = new ArrayList(); - - - - 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(); - - - } - - -} +/** + * 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> cacheList = new AtomicReference>( + new ArrayList()); + + + 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 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>>() { + @Override + public void notify(List oldValues, List newValues) { + // do Something with updated server List + LOGGER.info("--new service notify--"); + + List 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 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() { + @Override + public void notify(Map 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 nodes = new HashSet(); + String url = ""; + String version = "", visualRange = "", protocol = "",lb_policy=""; + + for (Map.Entry 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 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() { + @Override + public void notify(Map 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 nodes = new HashSet(); + String url = ""; + String version = "", visualRange = "", protocol = ""; + + for (Map.Entry 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 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 + */ + private List getDiffrent(List list1, List list2) { + + List diff = new ArrayList(); + + + + 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(); + + + } + + +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/ApiRouteInfo.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/ApiRouteInfo.java index 37cb5c0..ef22994 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/ApiRouteInfo.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/ApiRouteInfo.java @@ -1,136 +1,136 @@ -/** - * 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. - */ -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; - } - - - - - -} +/** + * 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; + } + + + + + +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/ConsulInfo.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/ConsulInfo.java index 2bcade0..68a22cf 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/ConsulInfo.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/ConsulInfo.java @@ -1,38 +1,38 @@ -/** - * 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. - */ -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; - } - +/** + * 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 diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/CustomDateSerializer.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/CustomDateSerializer.java index ee9dc56..89f51af 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/CustomDateSerializer.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/CustomDateSerializer.java @@ -1,39 +1,39 @@ -/** - * 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. - */ -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 { - - @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)); - } - - +/** + * 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 { + + @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 diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/CustomRouteInfo.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/CustomRouteInfo.java index 378b4d5..208f3ff 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/CustomRouteInfo.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/CustomRouteInfo.java @@ -1,102 +1,102 @@ -/** - * 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. - */ -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; - } - -} +/** + * 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; + } + +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/DiscoverInfo.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/DiscoverInfo.java index ac16cbb..dc6ec40 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/DiscoverInfo.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/DiscoverInfo.java @@ -1,49 +1,49 @@ -/** - * 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. - */ -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; - } - - - - -} +/** + * 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; + } + + + + +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/IuiRouteInfo.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/IuiRouteInfo.java index 19d9ff6..9e40783 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/IuiRouteInfo.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/IuiRouteInfo.java @@ -1,102 +1,102 @@ -/** - * 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. - */ -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; - } - -} +/** + * 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; + } + +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/MetricsInfo.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/MetricsInfo.java index 097c918..339bb31 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/MetricsInfo.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/MetricsInfo.java @@ -1,191 +1,191 @@ -/** - * 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. - */ -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; -} - - +/** + * 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; +} + + diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/MicroServiceFullInfo.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/MicroServiceFullInfo.java index 3ce7dc2..14cea47 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/MicroServiceFullInfo.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/MicroServiceFullInfo.java @@ -1,44 +1,44 @@ -/** - * 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. - */ -package org.openo.msb.api; - -import java.io.Serializable; -import java.util.Set; - -public class MicroServiceFullInfo extends Service implements Serializable { - private static final long serialVersionUID = 1L; - - private Set nodes; - - private String status = "1"; //0:disable 1:enable - - public Set getNodes() { - return nodes; - } - - public void setNodes(Set nodes) { - this.nodes = nodes; - } - - public String getStatus() { - return status; - } - public void setStatus(String status) { - this.status = status; - } - - +/** + * 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 implements Serializable { + private static final long serialVersionUID = 1L; + + private Set nodes; + + private String status = "1"; //0:disable 1:enable + + public Set getNodes() { + return nodes; + } + + public void setNodes(Set nodes) { + this.nodes = nodes; + } + + public String getStatus() { + return status; + } + public void setStatus(String status) { + this.status = status; + } + + } \ No newline at end of file diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/MicroServiceInfo.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/MicroServiceInfo.java index 2b88c21..02609f9 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/MicroServiceInfo.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/MicroServiceInfo.java @@ -1,38 +1,38 @@ -/** - * 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. - */ -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 implements Serializable { - private static final long serialVersionUID = 1L; - - private Set nodes; - - public Set getNodes() { - return nodes; - } - - public void setNodes(Set nodes) { - this.nodes = nodes; - } - - -} +/** + * 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 implements Serializable { + private static final long serialVersionUID = 1L; + + private Set nodes; + + public Set getNodes() { + return nodes; + } + + public void setNodes(Set nodes) { + this.nodes = nodes; + } + + +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/Node.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/Node.java index 96b340a..0879c61 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/Node.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/Node.java @@ -1,75 +1,75 @@ -/** - * 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. - */ -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; - } - - -} +/** + * 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; + } + + +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/NodeInfo.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/NodeInfo.java index 493b9a9..e3a30e7 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/NodeInfo.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/NodeInfo.java @@ -1,74 +1,74 @@ -/** - * 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. - */ -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; - } - - -} +/** + * 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; + } + + +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/RouteServer.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/RouteServer.java index e7349b9..675bc69 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/RouteServer.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/RouteServer.java @@ -1,68 +1,68 @@ -/** - * 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. - */ -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; - } - -} +/** + * 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; + } + +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/Service.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/Service.java index 618f994..8969e1d 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/Service.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/Service.java @@ -1,104 +1,104 @@ -/** - * 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. - */ -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 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 nodes; - - public Set getNodes() { - return nodes; - } - - public void setNodes(Set 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; - } - - - -} +/** + * 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 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 nodes; + + public Set getNodes() { + return nodes; + } + + public void setNodes(Set 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; + } + + + +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/ServiceAccessInfo.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/ServiceAccessInfo.java index 65ca179..bb375ac 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/ServiceAccessInfo.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/ServiceAccessInfo.java @@ -1,88 +1,88 @@ -/** - * 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. - */ -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; - } -} +/** + * 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; + } +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/exception/ExtendedInternalServerErrorException.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/exception/ExtendedInternalServerErrorException.java index 8946da3..a377c4c 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/exception/ExtendedInternalServerErrorException.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/exception/ExtendedInternalServerErrorException.java @@ -1,28 +1,28 @@ -/** - * 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. - */ -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()); - } - -} +/** + * 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()); + } + +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/exception/ExtendedNotFoundException.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/exception/ExtendedNotFoundException.java index defd059..e3e74ea 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/exception/ExtendedNotFoundException.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/exception/ExtendedNotFoundException.java @@ -1,28 +1,28 @@ -/** - * 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. - */ -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()); - } -} - +/** + * 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()); + } +} + diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/exception/ExtendedNotSupportedException.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/exception/ExtendedNotSupportedException.java index 6dcc0f5..e0c7805 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/exception/ExtendedNotSupportedException.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/exception/ExtendedNotSupportedException.java @@ -1,27 +1,27 @@ -/** - * 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. - */ -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 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()); + } +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/health/ApiRouteHealthCheck.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/health/ApiRouteHealthCheck.java index 31c33e0..cd7ecda 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/health/ApiRouteHealthCheck.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/health/ApiRouteHealthCheck.java @@ -1,5 +1,5 @@ /** - * 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. diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/ApiRouteResource.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/ApiRouteResource.java index 2a4c74a..cc1e4de 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/ApiRouteResource.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/ApiRouteResource.java @@ -1,233 +1,233 @@ -/** - * 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. - */ -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(); - - - } - - - -} +/** + * 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(); + + + } + + + +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/CustomRouteResource.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/CustomRouteResource.java index ffb7924..48545fe 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/CustomRouteResource.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/CustomRouteResource.java @@ -1,152 +1,152 @@ -/** - * 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. - */ -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(); - - - } - -} +/** + * 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(); + + + } + +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/IuiRouteResource.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/IuiRouteResource.java index c46527e..7635579 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/IuiRouteResource.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/IuiRouteResource.java @@ -1,155 +1,154 @@ -/** - * 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. - */ - -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(); - - } - -} +/** + * 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(); + + } + +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/MetricsResource.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/MetricsResource.java index 8bf797a..7377c86 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/MetricsResource.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/MetricsResource.java @@ -1,49 +1,48 @@ -/** - * 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. - */ - -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(); - } - - -} +/** + * 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(); + } + + +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/MicroServiceResource.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/MicroServiceResource.java index 7afa5c7..45328f0 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/MicroServiceResource.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/MicroServiceResource.java @@ -1,247 +1,246 @@ -/** - * 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. - */ - -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 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; -// } -} +/** + * 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 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; +// } +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/ServiceAccessResource.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/ServiceAccessResource.java index 7e000e9..814f979 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/ServiceAccessResource.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/ServiceAccessResource.java @@ -1,65 +1,64 @@ -/** - * 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. - */ - -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 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); - - } -} +/** + * 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 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); + + } +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/ApiRouteServiceWrapper.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/ApiRouteServiceWrapper.java index d43bc76..9680a1a 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/ApiRouteServiceWrapper.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/ApiRouteServiceWrapper.java @@ -1,653 +1,653 @@ -/** - * 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. - */ -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 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 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 serviceLBset = jedis.keys(serviceLBkey + ":*"); - int serverNum = serviceLBset.size(); - RouteServer[] apiRouteServerList = new RouteServer[serverNum]; - int i = 0; - for (String serviceInfo : serviceLBset) { - Map 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 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 serviceInfoMap = new HashMap(); - 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 serviceInfoMap = new HashMap(); - 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 servermap = new HashMap(); - 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 serviceLifeMap = new HashMap(); -// 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 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; - - } - - -} +/** + * 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 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 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 serviceLBset = jedis.keys(serviceLBkey + ":*"); + int serverNum = serviceLBset.size(); + RouteServer[] apiRouteServerList = new RouteServer[serverNum]; + int i = 0; + for (String serviceInfo : serviceLBset) { + Map 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 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 serviceInfoMap = new HashMap(); + 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 serviceInfoMap = new HashMap(); + 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 servermap = new HashMap(); + 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 serviceLifeMap = new HashMap(); +// 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 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; + + } + + +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/CustomRouteServiceWrapper.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/CustomRouteServiceWrapper.java index f99e71a..f5a642b 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/CustomRouteServiceWrapper.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/CustomRouteServiceWrapper.java @@ -1,474 +1,474 @@ -/** - * 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. - */ -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 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 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 serviceLBset = jedis.keys(serviceLBkey + ":*"); - int serverNum = serviceLBset.size(); - RouteServer[] CustomRouteServerList = new RouteServer[serverNum]; - int i = 0; - for (String serviceInfo : serviceLBset) { - Map 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 serviceInfoMap = new HashMap(); - 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 serviceInfoMap = new HashMap(); - 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 servermap = new HashMap(); - 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 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); - } - - - } -} +/** + * 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 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 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 serviceLBset = jedis.keys(serviceLBkey + ":*"); + int serverNum = serviceLBset.size(); + RouteServer[] CustomRouteServerList = new RouteServer[serverNum]; + int i = 0; + for (String serviceInfo : serviceLBset) { + Map 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 serviceInfoMap = new HashMap(); + 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 serviceInfoMap = new HashMap(); + 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 servermap = new HashMap(); + 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 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); + } + + + } +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/IuiRouteServiceWrapper.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/IuiRouteServiceWrapper.java index 1ee03b8..c3419a0 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/IuiRouteServiceWrapper.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/IuiRouteServiceWrapper.java @@ -1,453 +1,453 @@ -/** - * 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. - */ -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 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 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 serviceLBset = jedis.keys(serviceLBkey + ":*"); - int serverNum = serviceLBset.size(); - RouteServer[] iuiRouteServerList = new RouteServer[serverNum]; - int i = 0; - for (String serviceInfo : serviceLBset) { - Map 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 serviceInfoMap = new HashMap(); - 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 serviceInfoMap = new HashMap(); - 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 servermap = new HashMap(); - 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 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); - } - - - } - - - -} +/** + * 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 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 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 serviceLBset = jedis.keys(serviceLBkey + ":*"); + int serverNum = serviceLBset.size(); + RouteServer[] iuiRouteServerList = new RouteServer[serverNum]; + int i = 0; + for (String serviceInfo : serviceLBset) { + Map 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 serviceInfoMap = new HashMap(); + 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 serviceInfoMap = new HashMap(); + 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 servermap = new HashMap(); + 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 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); + } + + + } + + + +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/MetricsServiceWrapper.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/MetricsServiceWrapper.java index fec1946..d0d9ed9 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/MetricsServiceWrapper.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/MetricsServiceWrapper.java @@ -1,92 +1,91 @@ -/** - * 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. - */ - -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; - } -} +/** + * 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; + } +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/MicroServiceWrapper.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/MicroServiceWrapper.java index f9b3cdd..08e3e26 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/MicroServiceWrapper.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/MicroServiceWrapper.java @@ -1,536 +1,535 @@ -/** - * 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. - */ - -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 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()); - - } - - } - - -} +/** + * 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 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()); + + } + + } + + +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/ServiceAccessWrapper.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/ServiceAccessWrapper.java index 6a67bba..69be552 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/ServiceAccessWrapper.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/ServiceAccessWrapper.java @@ -1,172 +1,171 @@ -/** - * 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. - */ - -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 getApiRouteAccessAddr(String serviceType, String serviceName, - String version, String host) { - List serviceList = new ArrayList(); - 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 infoKeys = jedis.keys(keyPattern); - Pattern pattern = this.getKeyPattern(); - for (Iterator 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:(?api|iui|custom|p2p):(?[^:]+)(:(?[^:]*))?:info"; - return Pattern.compile(pStr); - } +/** + * 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 getApiRouteAccessAddr(String serviceType, String serviceName, + String version, String host) { + List serviceList = new ArrayList(); + 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 infoKeys = jedis.keys(keyPattern); + Pattern pattern = this.getKeyPattern(); + for (Iterator 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:(?api|iui|custom|p2p):(?[^:]+)(:(?[^:]*))?:info"; + return Pattern.compile(pStr); + } } \ No newline at end of file diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/CatalogClient.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/CatalogClient.java index 2bc3914..cd881b0 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/CatalogClient.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/CatalogClient.java @@ -1,5 +1,5 @@ /** - * 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. diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/Consul.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/Consul.java index ce02c27..67c9ef3 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/Consul.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/Consul.java @@ -1,5 +1,5 @@ /** - * 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. diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/ConsulException.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/ConsulException.java index b21edcb..9fd62a6 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/ConsulException.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/ConsulException.java @@ -1,5 +1,5 @@ /** - * 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. diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/HealthClient.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/HealthClient.java index 7c41bc8..96d62e6 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/HealthClient.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/HealthClient.java @@ -1,5 +1,5 @@ /** - * 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. diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/async/ConsulResponseCallback.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/async/ConsulResponseCallback.java index c61433a..c74f4a2 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/async/ConsulResponseCallback.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/async/ConsulResponseCallback.java @@ -1,5 +1,5 @@ /** - * 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. diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/CatalogCache.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/CatalogCache.java index 7672ae1..e928dcf 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/CatalogCache.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/CatalogCache.java @@ -1,70 +1,69 @@ -/** - * 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. - */ - -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{ - - private final String serviceName; - - private CatalogCache(Function keyConversion, - ConsulCache.CallbackConsumer 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 keyExtractor = new Function() { - @Override - public String apply(CatalogService input) { - //return input.getKey().substring(rootPath.length() + 1); - return input.getServiceId(); - } - }; - - final CallbackConsumer callbackConsumer = new CallbackConsumer() { - @Override - public void consume(BigInteger index, ConsulResponseCallback> callback) { - catalogClient.getService(serviceName, watchParams(index, watchSeconds),callback); - } - }; - - - return new CatalogCache(keyExtractor, callbackConsumer,serviceName); - - - } - - public String getServiceName(){ - return this.serviceName; - } - - -} +/** + * 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{ + + private final String serviceName; + + private CatalogCache(Function keyConversion, + ConsulCache.CallbackConsumer 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 keyExtractor = new Function() { + @Override + public String apply(CatalogService input) { + //return input.getKey().substring(rootPath.length() + 1); + return input.getServiceId(); + } + }; + + final CallbackConsumer callbackConsumer = new CallbackConsumer() { + @Override + public void consume(BigInteger index, ConsulResponseCallback> callback) { + catalogClient.getService(serviceName, watchParams(index, watchSeconds),callback); + } + }; + + + return new CatalogCache(keyExtractor, callbackConsumer,serviceName); + + + } + + public String getServiceName(){ + return this.serviceName; + } + + +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ConsulCache.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ConsulCache.java index 5f431f1..1e0071c 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ConsulCache.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ConsulCache.java @@ -1,5 +1,5 @@ /** - * 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. diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ConsulCache4Map.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ConsulCache4Map.java index 83f1717..ec0e54a 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ConsulCache4Map.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ConsulCache4Map.java @@ -1,258 +1,257 @@ -/** - * 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. - */ - -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 - */ -public class ConsulCache4Map { - - enum State {latent, starting, started, stopped } - - private final static Logger LOGGER = LoggerFactory.getLogger(ConsulCache4Map.class); - - private final AtomicReference latestIndex = new AtomicReference(null); - private final AtomicReference> lastResponse = new AtomicReference>(ImmutableList.of()); - private final AtomicReference state = new AtomicReference(State.latent); - private final CountDownLatch initLatch = new CountDownLatch(1); - private final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); - private final CopyOnWriteArrayList> listeners = new CopyOnWriteArrayList>(); - - private final CallbackConsumer callBackConsumer; - private final ConsulResponseCallback>> responseCallback; - - ConsulCache4Map(CallbackConsumer callbackConsumer) { - this( callbackConsumer, 10, TimeUnit.SECONDS); - } - - ConsulCache4Map( - CallbackConsumer callbackConsumer, - final long backoffDelayQty, - final TimeUnit backoffDelayUnit) { - - this.callBackConsumer = callbackConsumer; - - this.responseCallback = new ConsulResponseCallback>>() { - @Override - public void onComplete(ConsulResponse>> consulResponse) { - - if (!isRunning()) { - return; - } - updateIndex(consulResponse); - ImmutableList full = convertToList(consulResponse); - List 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 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 getMap() { - return lastResponse.get(); - } - - @VisibleForTesting - ImmutableList convertToList(final ConsulResponse>> response) { - if (response == null || response.getResponse() == null || response.getResponse().isEmpty()) { - return ImmutableList.of(); - } - - final ImmutableList.Builder builder = ImmutableList.builder(); - final Set keySet = new HashSet<>(); - - for(Map.Entry> 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 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>> 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 - */ - protected interface CallbackConsumer { - void consume(BigInteger index, ConsulResponseCallback>> callback); - } - - /** - * Implementers can register a listener to receive - * a new map when it changes - * - * @param - */ - public interface Listener { - void notify(List oldValues,List newValues); - } - - public boolean addListener(Listener listener) { - boolean added = listeners.add(listener); - if (state.get() == State.started) { - listener.notify(lastResponse.get(),lastResponse.get()); - } - return added; - } - - public boolean removeListener(Listener listener) { - return listeners.remove(listener); - } - - @VisibleForTesting - protected State getState() { - return state.get(); - } - - - -} +/** + * 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 + */ +public class ConsulCache4Map { + + enum State {latent, starting, started, stopped } + + private final static Logger LOGGER = LoggerFactory.getLogger(ConsulCache4Map.class); + + private final AtomicReference latestIndex = new AtomicReference(null); + private final AtomicReference> lastResponse = new AtomicReference>(ImmutableList.of()); + private final AtomicReference state = new AtomicReference(State.latent); + private final CountDownLatch initLatch = new CountDownLatch(1); + private final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); + private final CopyOnWriteArrayList> listeners = new CopyOnWriteArrayList>(); + + private final CallbackConsumer callBackConsumer; + private final ConsulResponseCallback>> responseCallback; + + ConsulCache4Map(CallbackConsumer callbackConsumer) { + this( callbackConsumer, 10, TimeUnit.SECONDS); + } + + ConsulCache4Map( + CallbackConsumer callbackConsumer, + final long backoffDelayQty, + final TimeUnit backoffDelayUnit) { + + this.callBackConsumer = callbackConsumer; + + this.responseCallback = new ConsulResponseCallback>>() { + @Override + public void onComplete(ConsulResponse>> consulResponse) { + + if (!isRunning()) { + return; + } + updateIndex(consulResponse); + ImmutableList full = convertToList(consulResponse); + List 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 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 getMap() { + return lastResponse.get(); + } + + @VisibleForTesting + ImmutableList convertToList(final ConsulResponse>> response) { + if (response == null || response.getResponse() == null || response.getResponse().isEmpty()) { + return ImmutableList.of(); + } + + final ImmutableList.Builder builder = ImmutableList.builder(); + final Set keySet = new HashSet<>(); + + for(Map.Entry> 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 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>> 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 + */ + protected interface CallbackConsumer { + void consume(BigInteger index, ConsulResponseCallback>> callback); + } + + /** + * Implementers can register a listener to receive + * a new map when it changes + * + * @param + */ + public interface Listener { + void notify(List oldValues,List newValues); + } + + public boolean addListener(Listener listener) { + boolean added = listeners.add(listener); + if (state.get() == State.started) { + listener.notify(lastResponse.get(),lastResponse.get()); + } + return added; + } + + public boolean removeListener(Listener listener) { + return listeners.remove(listener); + } + + @VisibleForTesting + protected State getState() { + return state.get(); + } + + + +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/HealthCache.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/HealthCache.java index 7bf40a7..54caab6 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/HealthCache.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/HealthCache.java @@ -1,70 +1,69 @@ -/** - * 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. - */ - -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{ - - private final String serviceName; - - private HealthCache(Function keyConversion, - ConsulCache.CallbackConsumer 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 keyExtractor = new Function() { - @Override - public String apply(ServiceHealth input) { - //return input.getKey().substring(rootPath.length() + 1); - return input.getService().getId(); - } - }; - - final CallbackConsumer callbackConsumer = new CallbackConsumer() { - @Override - public void consume(BigInteger index, ConsulResponseCallback> callback) { - healthClient.getHealthyServiceInstances(serviceName, watchParams(index, watchSeconds),callback); - } - }; - - - return new HealthCache(keyExtractor, callbackConsumer,serviceName); - - - } - - public String getServiceName(){ - return this.serviceName; - } - - +/** + * 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{ + + private final String serviceName; + + private HealthCache(Function keyConversion, + ConsulCache.CallbackConsumer 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 keyExtractor = new Function() { + @Override + public String apply(ServiceHealth input) { + //return input.getKey().substring(rootPath.length() + 1); + return input.getService().getId(); + } + }; + + final CallbackConsumer callbackConsumer = new CallbackConsumer() { + @Override + public void consume(BigInteger index, ConsulResponseCallback> 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 diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ServiceCache.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ServiceCache.java index f82c6fd..78c4b92 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ServiceCache.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ServiceCache.java @@ -1,50 +1,49 @@ -/** - * 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. - */ - -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>> { - private ServiceCache( ConsulCache4Map.CallbackConsumer>> callbackConsumer) { - super(callbackConsumer); - // TODO Auto-generated constructor stub - } - - - public static ServiceCache newCache( - final CatalogClient catalogClient, - final int watchSeconds){ - - - final CallbackConsumer>> callbackConsumer = new CallbackConsumer>>() { - @Override - public void consume(BigInteger index, ConsulResponseCallback>> callback) { - catalogClient.getService(watchParams(index, watchSeconds),callback); - } - }; - - - return new ServiceCache(callbackConsumer); - - - } -} +/** + * 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>> { + private ServiceCache( ConsulCache4Map.CallbackConsumer>> callbackConsumer) { + super(callbackConsumer); + // TODO Auto-generated constructor stub + } + + + public static ServiceCache newCache( + final CatalogClient catalogClient, + final int watchSeconds){ + + + final CallbackConsumer>> callbackConsumer = new CallbackConsumer>>() { + @Override + public void consume(BigInteger index, ConsulResponseCallback>> callback) { + catalogClient.getService(watchParams(index, watchSeconds),callback); + } + }; + + + return new ServiceCache(callbackConsumer); + + + } +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/ConsulResponse.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/ConsulResponse.java index 2851921..3ee15f1 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/ConsulResponse.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/ConsulResponse.java @@ -1,5 +1,5 @@ /** - * 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. diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/CatalogNode.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/CatalogNode.java index 53320bd..1a33a4f 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/CatalogNode.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/CatalogNode.java @@ -1,5 +1,5 @@ /** - * 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. diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/CatalogService.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/CatalogService.java index b2ca82a..ec6ecfe 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/CatalogService.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/CatalogService.java @@ -1,5 +1,5 @@ /** - * 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. diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ImmutableCatalogNode.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ImmutableCatalogNode.java index 4ad2743..de872df 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ImmutableCatalogNode.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ImmutableCatalogNode.java @@ -1,306 +1,305 @@ -/** - * 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. - */ - -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}. - *

- * 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 services; - - private ImmutableCatalogNode( - Node node, - ImmutableMap 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 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 entries) { - if (this.services == entries) return this; - ImmutableMap 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 Jackson-binding infrastructure - */ - @Deprecated - @JsonDeserialize - static final class Json extends CatalogNode { - Node node; - Map services; - @JsonProperty(value = "Node") - public void setNode(Node node) { - this.node = node; - } - @JsonProperty(value = "Services") - public void setServices(Map services) { - this.services = services; - } - @Override - public Node getNode() { throw new UnsupportedOperationException(); } - @Override - public Map 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 Jackson-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. - *

{@code Builder} is not thread-safe and generally should not be stored in a field or collection, - * but instead used immediately to create instances. - */ - public static final class Builder { - private static final long INIT_BIT_NODE = 0x1L; - private long initBits = 0x1; - - private Node node; - private ImmutableMap.Builder 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 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 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 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 attributes = Lists.newArrayList(); - if ((initBits & INIT_BIT_NODE) != 0) attributes.add("node"); - return "Cannot build CatalogNode, some of required attributes are not set " + attributes; - } - } -} +/** + * 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}. + *

+ * 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 services; + + private ImmutableCatalogNode( + Node node, + ImmutableMap 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 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 entries) { + if (this.services == entries) return this; + ImmutableMap 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 Jackson-binding infrastructure + */ + @Deprecated + @JsonDeserialize + static final class Json extends CatalogNode { + Node node; + Map services; + @JsonProperty(value = "Node") + public void setNode(Node node) { + this.node = node; + } + @JsonProperty(value = "Services") + public void setServices(Map services) { + this.services = services; + } + @Override + public Node getNode() { throw new UnsupportedOperationException(); } + @Override + public Map 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 Jackson-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. + *

{@code Builder} is not thread-safe and generally should not be stored in a field or collection, + * but instead used immediately to create instances. + */ + public static final class Builder { + private static final long INIT_BIT_NODE = 0x1L; + private long initBits = 0x1; + + private Node node; + private ImmutableMap.Builder 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 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 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 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 attributes = Lists.newArrayList(); + if ((initBits & INIT_BIT_NODE) != 0) attributes.add("node"); + return "Cannot build CatalogNode, some of required attributes are not set " + attributes; + } + } +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ImmutableCatalogService.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ImmutableCatalogService.java index d5c0038..738b094 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ImmutableCatalogService.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ImmutableCatalogService.java @@ -1,626 +1,625 @@ -/** - * 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. - */ - -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}. - *

- * 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 serviceTags; - - private ImmutableCatalogService( - String node, - String address, - String serviceName, - String serviceId, - String serviceAddress, - int servicePort, - ImmutableList 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 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 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 elements) { - if (this.serviceTags == elements) return this; - ImmutableList 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 Jackson-binding infrastructure - */ - @Deprecated - @JsonDeserialize - static final class Json extends CatalogService { - String node; - String address; - String serviceName; - String serviceId; - String serviceAddress; - Integer servicePort; - List 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 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 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 Jackson-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. - *

{@code Builder} is not thread-safe and generally should not be stored in a field or collection, - * but instead used immediately to create instances. - */ - 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 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 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 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 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; - } - } -} +/** + * 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}. + *

+ * 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 serviceTags; + + private ImmutableCatalogService( + String node, + String address, + String serviceName, + String serviceId, + String serviceAddress, + int servicePort, + ImmutableList 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 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 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 elements) { + if (this.serviceTags == elements) return this; + ImmutableList 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 Jackson-binding infrastructure + */ + @Deprecated + @JsonDeserialize + static final class Json extends CatalogService { + String node; + String address; + String serviceName; + String serviceId; + String serviceAddress; + Integer servicePort; + List 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 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 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 Jackson-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. + *

{@code Builder} is not thread-safe and generally should not be stored in a field or collection, + * but instead used immediately to create instances. + */ + 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 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 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 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 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; + } + } +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ServiceInfo.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ServiceInfo.java index 86f1d4c..285b997 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ServiceInfo.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ServiceInfo.java @@ -1,63 +1,62 @@ -/** - * 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. - */ - -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); - } - -} +/** + * 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); + } + +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ImmutableNode.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ImmutableNode.java index 509bde5..56d2cb1 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ImmutableNode.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ImmutableNode.java @@ -1,266 +1,265 @@ -/** - * 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. - */ - -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}. - *

- * 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 Jackson-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 Jackson-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. - *

{@code Builder} is not thread-safe and generally should not be stored in a field or collection, - * but instead used immediately to create instances. - */ - 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 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; - } - } -} +/** + * 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}. + *

+ * 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 Jackson-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 Jackson-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. + *

{@code Builder} is not thread-safe and generally should not be stored in a field or collection, + * but instead used immediately to create instances. + */ + 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 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; + } + } +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ImmutableService.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ImmutableService.java index 6d4717d..f350510 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ImmutableService.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ImmutableService.java @@ -1,478 +1,477 @@ -/** - * 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. - */ - -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}. - *

- * 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 tags; - private final String address; - private final int port; - - private ImmutableService( - String id, - String service, - ImmutableList 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 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 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 elements) { - if (this.tags == elements) return this; - ImmutableList 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 Jackson-binding infrastructure - */ - @Deprecated - @JsonDeserialize - static final class Json extends Service { - String id; - String service; - List 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 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 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 Jackson-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. - *

{@code Builder} is not thread-safe and generally should not be stored in a field or collection, - * but instead used immediately to create instances. - */ - 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 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 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 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 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 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}. + *

+ * 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 tags; + private final String address; + private final int port; + + private ImmutableService( + String id, + String service, + ImmutableList 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 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 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 elements) { + if (this.tags == elements) return this; + ImmutableList 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 Jackson-binding infrastructure + */ + @Deprecated + @JsonDeserialize + static final class Json extends Service { + String id; + String service; + List 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 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 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 Jackson-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. + *

{@code Builder} is not thread-safe and generally should not be stored in a field or collection, + * but instead used immediately to create instances. + */ + 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 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 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 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 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; + } + } +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/Node.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/Node.java index 56eb94d..0933c5b 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/Node.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/Node.java @@ -1,5 +1,5 @@ /** - * 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. diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/Service.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/Service.java index 0a64737..0af11f8 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/Service.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/Service.java @@ -1,5 +1,5 @@ /** - * 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. diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ServiceHealth.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ServiceHealth.java index f11b5b2..c543203 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ServiceHealth.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ServiceHealth.java @@ -1,5 +1,5 @@ /** - * 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. diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/CatalogOptions.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/CatalogOptions.java index da422bf..1408cca 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/CatalogOptions.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/CatalogOptions.java @@ -1,5 +1,5 @@ /** - * 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. diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ConsistencyMode.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ConsistencyMode.java index 37df9ca..7320e8a 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ConsistencyMode.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ConsistencyMode.java @@ -1,5 +1,5 @@ /** - * 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. diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ImmutableCatalogOptions.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ImmutableCatalogOptions.java index 87a3a62..3e530f1 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ImmutableCatalogOptions.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ImmutableCatalogOptions.java @@ -1,251 +1,250 @@ -/** - * 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. - */ - -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}. - *

- * 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 datacenter; - private final Optional tag; - - private ImmutableCatalogOptions( - Optional datacenter, - Optional tag) { - this.datacenter = datacenter; - this.tag = tag; - } - - /** - * @return The value of the {@code datacenter} attribute - */ - @Override - public Optional getDatacenter() { - return datacenter; - } - - /** - * @return The value of the {@code tag} attribute - */ - @Override - public Optional getTag() { - return tag; - } - - /** - * Copy the current immutable object by setting a present 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 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 optional) { - Optional 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 present 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 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 optional) { - Optional 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. - *

{@code Builder} is not thread-safe and generally should not be stored in a field or collection, - * but instead used immediately to create instances. - */ - public static final class Builder { - private Optional datacenter = Optional.absent(); - private Optional 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 datacenterOptional = instance.getDatacenter(); - if (datacenterOptional.isPresent()) { - datacenter(datacenterOptional); - } - Optional 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 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 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); - } - } -} +/** + * 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}. + *

+ * 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 datacenter; + private final Optional tag; + + private ImmutableCatalogOptions( + Optional datacenter, + Optional tag) { + this.datacenter = datacenter; + this.tag = tag; + } + + /** + * @return The value of the {@code datacenter} attribute + */ + @Override + public Optional getDatacenter() { + return datacenter; + } + + /** + * @return The value of the {@code tag} attribute + */ + @Override + public Optional getTag() { + return tag; + } + + /** + * Copy the current immutable object by setting a present 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 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 optional) { + Optional 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 present 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 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 optional) { + Optional 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. + *

{@code Builder} is not thread-safe and generally should not be stored in a field or collection, + * but instead used immediately to create instances. + */ + public static final class Builder { + private Optional datacenter = Optional.absent(); + private Optional 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 datacenterOptional = instance.getDatacenter(); + if (datacenterOptional.isPresent()) { + datacenter(datacenterOptional); + } + Optional 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 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 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); + } + } +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ImmutableQueryOptions.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ImmutableQueryOptions.java index 2b8d14a..23fc5e7 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ImmutableQueryOptions.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ImmutableQueryOptions.java @@ -1,531 +1,530 @@ -/** - * 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. - */ - -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}. - *

- * 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 wait; - private final Optional token; - private final Optional index; - private final Optional 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 wait, - Optional token, - Optional index, - Optional 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 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 getWait() { - return wait; - } - - /** - * @return The value of the {@code token} attribute - */ - @Override - public Optional getToken() { - return token; - } - - /** - * @return The value of the {@code index} attribute - */ - @Override - public Optional getIndex() { - return index; - } - - /** - * @return The value of the {@code near} attribute - */ - @Override - public Optional 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 present 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 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 optional) { - Optional 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 present 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 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 optional) { - Optional 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 present 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 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 optional) { - Optional 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 present 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 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 optional) { - Optional 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. - *

{@code Builder} is not thread-safe and generally should not be stored in a field or collection, - * but instead used immediately to create instances. - */ - public static final class Builder { - private Optional wait = Optional.absent(); - private Optional token = Optional.absent(); - private Optional index = Optional.absent(); - private Optional 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 waitOptional = instance.getWait(); - if (waitOptional.isPresent()) { - wait(waitOptional); - } - Optional tokenOptional = instance.getToken(); - if (tokenOptional.isPresent()) { - token(tokenOptional); - } - Optional indexOptional = instance.getIndex(); - if (indexOptional.isPresent()) { - index(indexOptional); - } - Optional 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 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 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 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 near) { - this.near = Preconditions.checkNotNull(near, "near"); - return this; - } - - /** - * Initializes the value for the {@link QueryOptions#getConsistencyMode() consistencyMode} attribute. - *

If not set, this attribute will have a default value as returned by the initializer of {@link QueryOptions#getConsistencyMode() consistencyMode}. - * @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 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}. + *

+ * 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 wait; + private final Optional token; + private final Optional index; + private final Optional 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 wait, + Optional token, + Optional index, + Optional 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 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 getWait() { + return wait; + } + + /** + * @return The value of the {@code token} attribute + */ + @Override + public Optional getToken() { + return token; + } + + /** + * @return The value of the {@code index} attribute + */ + @Override + public Optional getIndex() { + return index; + } + + /** + * @return The value of the {@code near} attribute + */ + @Override + public Optional 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 present 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 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 optional) { + Optional 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 present 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 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 optional) { + Optional 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 present 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 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 optional) { + Optional 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 present 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 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 optional) { + Optional 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. + *

{@code Builder} is not thread-safe and generally should not be stored in a field or collection, + * but instead used immediately to create instances. + */ + public static final class Builder { + private Optional wait = Optional.absent(); + private Optional token = Optional.absent(); + private Optional index = Optional.absent(); + private Optional 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 waitOptional = instance.getWait(); + if (waitOptional.isPresent()) { + wait(waitOptional); + } + Optional tokenOptional = instance.getToken(); + if (tokenOptional.isPresent()) { + token(tokenOptional); + } + Optional indexOptional = instance.getIndex(); + if (indexOptional.isPresent()) { + index(indexOptional); + } + Optional 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 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 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 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 near) { + this.near = Preconditions.checkNotNull(near, "near"); + return this; + } + + /** + * Initializes the value for the {@link QueryOptions#getConsistencyMode() consistencyMode} attribute. + *

If not set, this attribute will have a default value as returned by the initializer of {@link QueryOptions#getConsistencyMode() consistencyMode}. + * @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)); + } + } +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/Options.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/Options.java index f27c60a..2593c48 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/Options.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/Options.java @@ -1,5 +1,5 @@ /** - * 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. diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ParamAdder.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ParamAdder.java index 0ef9816..188f04e 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ParamAdder.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ParamAdder.java @@ -1,5 +1,5 @@ /** - * 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. diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/QueryOptions.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/QueryOptions.java index bca98ab..0d7abe8 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/QueryOptions.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/QueryOptions.java @@ -1,5 +1,5 @@ /** - * 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. diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/Base64EncodingDeserializer.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/Base64EncodingDeserializer.java index 48fd005..2502c2f 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/Base64EncodingDeserializer.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/Base64EncodingDeserializer.java @@ -1,5 +1,5 @@ /** - * 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. diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/ClientUtil.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/ClientUtil.java index 2a6d165..03264c0 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/ClientUtil.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/ClientUtil.java @@ -1,5 +1,5 @@ /** - * 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. diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/Jackson.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/Jackson.java index 945cafb..d573c50 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/Jackson.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/Jackson.java @@ -1,5 +1,5 @@ /** - * 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. diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/ObjectMapperContextResolver.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/ObjectMapperContextResolver.java index bc0d4c6..4a5cd1b 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/ObjectMapperContextResolver.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/ObjectMapperContextResolver.java @@ -1,5 +1,5 @@ /** - * 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. diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/SecondsDeserializer.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/SecondsDeserializer.java index b5aa808..2c34e37 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/SecondsDeserializer.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/SecondsDeserializer.java @@ -1,5 +1,5 @@ /** - * 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. diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/SecondsSerializer.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/SecondsSerializer.java index f72ff50..1d1f9e3 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/SecondsSerializer.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/SecondsSerializer.java @@ -1,5 +1,5 @@ /** - * 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. diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/UnsignedLongDeserializer.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/UnsignedLongDeserializer.java index 423ec3a..f3aeb09 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/UnsignedLongDeserializer.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/UnsignedLongDeserializer.java @@ -1,5 +1,5 @@ /** - * 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. diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/serviceListener/IMicroServiceChangeListener.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/serviceListener/IMicroServiceChangeListener.java index 11b2a7c..30b179b 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/serviceListener/IMicroServiceChangeListener.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/serviceListener/IMicroServiceChangeListener.java @@ -1,33 +1,31 @@ -/** - * 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. - */ - - -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); - -} +/** + * 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); + +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/serviceListener/MicroServiceChangeListener.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/serviceListener/MicroServiceChangeListener.java index e861782..45c085c 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/serviceListener/MicroServiceChangeListener.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/serviceListener/MicroServiceChangeListener.java @@ -1,306 +1,305 @@ -/** - * 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. - */ - -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 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 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 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; - } -} +/** + * 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 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 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 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; + } +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/FileUtil.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/FileUtil.java index d1f73cf..e739ceb 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/FileUtil.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/FileUtil.java @@ -1,66 +1,65 @@ -/** - * 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. - */ - -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; - } -} +/** + * 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; + } +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/JacksonJsonUtil.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/JacksonJsonUtil.java index 998ecc6..9f6f236 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/JacksonJsonUtil.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/JacksonJsonUtil.java @@ -1,120 +1,119 @@ -/** - * 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. - */ - -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 jsonToListBean(String json) throws Exception { - List vo =null; - try { - - ObjectMapper objectMapper = getMapperInstance(); - - - vo = objectMapper.readValue(json, new TypeReference>() {}); - - } 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(); - } - } - - -} +/** + * 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 jsonToListBean(String json) throws Exception { + List vo =null; + try { + + ObjectMapper objectMapper = getMapperInstance(); + + + vo = objectMapper.readValue(json, new TypeReference>() {}); + + } 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(); + } + } + + +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/JedisUtil.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/JedisUtil.java index d7e1eb9..97309e8 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/JedisUtil.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/JedisUtil.java @@ -1,221 +1,220 @@ -/** - * 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. - */ - -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; - - } - +/** + * 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 diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/MetricsUtil.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/MetricsUtil.java index a70c33d..6a579b1 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/MetricsUtil.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/MetricsUtil.java @@ -1,24 +1,23 @@ -/** - * 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. - */ - -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; -} +/** + * 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; +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/MicroServiceDB.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/MicroServiceDB.java index 8b87c31..98e051f 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/MicroServiceDB.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/MicroServiceDB.java @@ -1,423 +1,422 @@ -/** - * 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. - */ - -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 serviceListenerlist = - new ArrayList(); - - 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 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 serviceInfoMap = new HashMap(); - 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 nodeMap = new HashMap(); - - 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 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 serviceInfoMap = new HashMap(); - 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 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 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 nodeKeys=jedis.keys(nodeLBkey+":*"); - - Set nodes=new HashSet(); - for(String nodeKey:nodeKeys){ - Map 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 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; - } - } - - - -} +/** + * 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 serviceListenerlist = + new ArrayList(); + + 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 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 serviceInfoMap = new HashMap(); + 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 nodeMap = new HashMap(); + + 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 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 serviceInfoMap = new HashMap(); + 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 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 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 nodeKeys=jedis.keys(nodeLBkey+":*"); + + Set nodes=new HashSet(); + for(String nodeKey:nodeKeys){ + Map 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 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; + } + } + + + +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/MicroServiceUtil.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/MicroServiceUtil.java index f92c5fe..044ce9c 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/MicroServiceUtil.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/MicroServiceUtil.java @@ -1,96 +1,95 @@ -/** - * 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. - */ - -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:(?[^:]+)(:(?[^:]*))?: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(); - - } - - -} +/** + * 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:(?[^:]+)(:(?[^:]*))?: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(); + + } + + +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/RegExpTestUtil.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/RegExpTestUtil.java index 5a162b2..d7a8116 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/RegExpTestUtil.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/RegExpTestUtil.java @@ -1,88 +1,88 @@ -/** - * 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. - */ -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("/")); - } -} +/** + * 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("/")); + } +} diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/RouteUtil.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/RouteUtil.java index 3b2b2b3..f14908a 100644 --- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/RouteUtil.java +++ b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/RouteUtil.java @@ -1,135 +1,134 @@ -/** - * 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. - */ - -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 */ .swagger-section pre code { display: block; diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/css/typography.css b/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/css/typography.css index 27c3751..877304f 100644 --- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/css/typography.css +++ b/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/css/typography.css @@ -1,3 +1,21 @@ +/** + * 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'; diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/index.html b/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/index.html index 1ebb459..ee78118 100644 --- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/index.html +++ b/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/index.html @@ -1,118 +1,121 @@ - - - - - Swagger UI - - - - - - - - - - - - - - - - - - - - - - - - - -

- -
 
-
- - - + + + + + Swagger UI + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+
+ + + diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/js/iframeResizer/iframeResizer.contentWindow.min.js b/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/js/iframeResizer/iframeResizer.contentWindow.min.js index 9330e0f..5b66af2 100644 --- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/js/iframeResizer/iframeResizer.contentWindow.min.js +++ b/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/js/iframeResizer/iframeResizer.contentWindow.min.js @@ -1,10 +1,2 @@ -/*! 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 diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/js/iframeResizer/iframeResizer.min.js b/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/js/iframeResizer/iframeResizer.min.js index e8f4bcb..f5c4c4e 100644 --- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/js/iframeResizer/iframeResizer.min.js +++ b/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/js/iframeResizer/iframeResizer.min.js @@ -1,9 +1,2 @@ -/*! 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;be&&(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);aP[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 - - - - - - - - - - - - + + + + + + + + + + + + + + + +
+ +
+
+ +
+ +
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/i18n/loadi18nApp_iui-route_view.js b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/i18n/loadi18nApp_iui-route_view.js index ad8dc39..17642ab 100644 --- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/i18n/loadi18nApp_iui-route_view.js +++ b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/i18n/loadi18nApp_iui-route_view.js @@ -1,17 +1,20 @@ /* - * 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({ diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/i18n/msb-iui-route-i18n-en-US.properties b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/i18n/msb-iui-route-i18n-en-US.properties index 1f3ff5d..8c00440 100644 --- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/i18n/msb-iui-route-i18n-en-US.properties +++ b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/i18n/msb-iui-route-i18n-en-US.properties @@ -1,11 +1,11 @@ # -# 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, @@ -13,6 +13,10 @@ # 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 diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/i18n/msb-iui-route-i18n-zh-CN.properties b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/i18n/msb-iui-route-i18n-zh-CN.properties index 75e374a..34bc7dc 100644 --- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/i18n/msb-iui-route-i18n-zh-CN.properties +++ b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/i18n/msb-iui-route-i18n-zh-CN.properties @@ -1,11 +1,11 @@ # -# 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, @@ -13,6 +13,10 @@ # 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=服务路由 diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/index.html b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/index.html index 92af3ca..cc5674b 100644 --- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/index.html +++ b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/index.html @@ -1,1039 +1,1040 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
- - -
-
-
- - - -
- - - - -
- - - -
- -
-
- - -
-
- - {{route.version}} - -
- - - - - - - - - - - - -
- -
- -
- - -
-
-
- - -
- - - -
- - - -
- -
-
- - -
-
- - {{route.servers[0].ip}}:{{route.servers[0].port}} -
- - - - - - - - - -
- -
- -
- -
- -
-
- - -
- - - -
- - - - -
-
- {{routeUtil.showGroupName($index,el)}} - {{customGroupRouteArray[$index].length}} - -
- -
-
-
-
-
-
- - -
-
- - {{elem.servers[0].ip}}:{{elem.servers[0].port}} -
- - - - - - - - - -
- -
-
- -
- - - -
- -
- - -
-
- - -
- - - -
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- {{node.ip}}:{{node.port}}:{{node.ttl}} - {{msb.url==""?"/":msb.url}} - - - - -
- -
- - - - - -
- -
- -
- - - -
-
- -
-
- - -
- -
- -
- -
-
- -
- -
-
- - - -
-
- - -
- -
-
- - - - - - - -
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+
+ + + +
+ + + + +
+ + + +
+ +
+
+ + +
+
+ + {{route.version}} + +
+ + + + + + + + + + + + +
+ +
+ +
+ + +
+
+
+ + +
+ + + +
+ + + +
+ +
+
+ + +
+
+ + {{route.servers[0].ip}}:{{route.servers[0].port}} +
+ + + + + + + + + +
+ +
+ +
+ +
+ +
+
+ + +
+ + + +
+ + + + +
+
+ {{routeUtil.showGroupName($index,el)}} + {{customGroupRouteArray[$index].length}} + +
+ +
+
+
+
+
+
+ + +
+
+ + {{elem.servers[0].ip}}:{{elem.servers[0].port}} +
+ + + + + + + + + +
+ +
+
+ +
+ + + +
+ +
+ + +
+
+ + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {{node.ip}}:{{node.port}}:{{node.ttl}} + {{msb.url==""?"/":msb.url}} + + + + +
+ +
+ + + + + +
+ +
+ +
+ + + +
+
+ +
+
+ + +
+ +
+ +
+ +
+
+ +
+ +
+
+ + + +
+
+ + +
+ +
+
+ + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/avalon.js b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/avalon.js index a22bb7d..73698dc 100644 --- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/avalon.js +++ b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/avalon.js @@ -1,3 +1,21 @@ +/* + * 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/ diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/css/bootstrap-dt.css b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/css/bootstrap-dt.css index 2828337..8ec95e1 100644 --- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/css/bootstrap-dt.css +++ b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/css/bootstrap-dt.css @@ -1,9 +1,3 @@ -/*! - * 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; diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/css/bootstrap.min.css b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/css/bootstrap.min.css index 679272d..9611bd2 100644 --- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/css/bootstrap.min.css +++ b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/css/bootstrap.min.css @@ -1,7 +1 @@ -/*! - * 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 diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap.js b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap.js index 8ae571b..a5271e0 100644 --- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap.js +++ b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap.js @@ -1,9 +1,3 @@ -/*! - * 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') } /* ======================================================================== diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap.min.js b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap.min.js index b04a0e8..b4f2fa3 100644 --- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap.min.js +++ b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap.min.js @@ -1,6 +1 @@ -/*! - * 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(''}),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 diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap2-typeahead.min.js b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap2-typeahead.min.js index 1d11b34..3e66cd6 100644 --- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap2-typeahead.min.js +++ b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap2-typeahead.min.js @@ -1,21 +1,2 @@ -/* ============================================================= - * 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"+e+""})},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:'',item:'
  • ',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 diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/dataTables/dataTables.bootstrap.css b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/dataTables/dataTables.bootstrap.css index c80d1bf..4ec986a 100644 --- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/dataTables/dataTables.bootstrap.css +++ b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/dataTables/dataTables.bootstrap.css @@ -1,3 +1,21 @@ +/** + * 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; diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/css/font-awesome.min.css b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/css/font-awesome.min.css index ee4e978..28431ad 100644 --- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/css/font-awesome.min.css +++ b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/css/font-awesome.min.css @@ -1,4 +1 @@ -/*! - * 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"} diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/iframeResizer/iframeResizer.contentWindow.min.js b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/iframeResizer/iframeResizer.contentWindow.min.js index 9330e0f..5b66af2 100644 --- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/iframeResizer/iframeResizer.contentWindow.min.js +++ b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/iframeResizer/iframeResizer.contentWindow.min.js @@ -1,10 +1,2 @@ -/*! 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 diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/iframeResizer/iframeResizer.min.js b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/iframeResizer/iframeResizer.min.js index e8f4bcb..f5c4c4e 100644 --- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/iframeResizer/iframeResizer.min.js +++ b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/iframeResizer/iframeResizer.min.js @@ -1,9 +1,2 @@ -/*! 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;be&&(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);aP[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