From 4143173cd08ef515173e5ad4b4c15d4e9f9f1943 Mon Sep 17 00:00:00 2001 From: HuabingZhao Date: Wed, 17 Aug 2016 12:37:07 +0800 Subject: 1. Adjust the directory hierarchy 2. Fix the compile issue Change-Id: Ibf10c83104e5e673bc797013799861426cd950ce Signed-off-by: HuabingZhao --- .../src/main/java/org/openo/msb/ApiRouteApp.java | 550 -- .../main/java/org/openo/msb/ApiRouteAppConfig.java | 111 - .../main/java/org/openo/msb/ConsulClientApp.java | 452 -- .../main/java/org/openo/msb/api/ApiRouteInfo.java | 136 - .../main/java/org/openo/msb/api/ConsulInfo.java | 38 - .../org/openo/msb/api/CustomDateSerializer.java | 39 - .../java/org/openo/msb/api/CustomRouteInfo.java | 102 - .../main/java/org/openo/msb/api/DiscoverInfo.java | 49 - .../main/java/org/openo/msb/api/IuiRouteInfo.java | 102 - .../main/java/org/openo/msb/api/MetricsInfo.java | 191 - .../org/openo/msb/api/MicroServiceFullInfo.java | 44 - .../java/org/openo/msb/api/MicroServiceInfo.java | 38 - .../src/main/java/org/openo/msb/api/Node.java | 75 - .../src/main/java/org/openo/msb/api/NodeInfo.java | 74 - .../main/java/org/openo/msb/api/RouteServer.java | 68 - .../src/main/java/org/openo/msb/api/Service.java | 104 - .../java/org/openo/msb/api/ServiceAccessInfo.java | 88 - .../ExtendedInternalServerErrorException.java | 28 - .../api/exception/ExtendedNotFoundException.java | 28 - .../exception/ExtendedNotSupportedException.java | 27 - .../org/openo/msb/health/ApiRouteHealthCheck.java | 35 - .../org/openo/msb/resources/ApiRouteResource.java | 233 - .../openo/msb/resources/CustomRouteResource.java | 152 - .../org/openo/msb/resources/IuiRouteResource.java | 155 - .../org/openo/msb/resources/MetricsResource.java | 49 - .../openo/msb/resources/MicroServiceResource.java | 247 - .../openo/msb/resources/ServiceAccessResource.java | 65 - .../openo/msb/wrapper/ApiRouteServiceWrapper.java | 653 --- .../msb/wrapper/CustomRouteServiceWrapper.java | 474 -- .../openo/msb/wrapper/IuiRouteServiceWrapper.java | 453 -- .../openo/msb/wrapper/MetricsServiceWrapper.java | 92 - .../org/openo/msb/wrapper/MicroServiceWrapper.java | 536 -- .../openo/msb/wrapper/ServiceAccessWrapper.java | 172 - .../openo/msb/wrapper/consul/CatalogClient.java | 285 - .../java/org/openo/msb/wrapper/consul/Consul.java | 299 - .../openo/msb/wrapper/consul/ConsulException.java | 42 - .../org/openo/msb/wrapper/consul/HealthClient.java | 247 - .../consul/async/ConsulResponseCallback.java | 42 - .../msb/wrapper/consul/cache/CatalogCache.java | 70 - .../msb/wrapper/consul/cache/ConsulCache.java | 230 - .../msb/wrapper/consul/cache/ConsulCache4Map.java | 258 - .../msb/wrapper/consul/cache/HealthCache.java | 70 - .../msb/wrapper/consul/cache/ServiceCache.java | 50 - .../msb/wrapper/consul/model/ConsulResponse.java | 80 - .../wrapper/consul/model/catalog/CatalogNode.java | 41 - .../consul/model/catalog/CatalogService.java | 52 - .../consul/model/catalog/ImmutableCatalogNode.java | 306 - .../model/catalog/ImmutableCatalogService.java | 626 --- .../wrapper/consul/model/catalog/ServiceInfo.java | 63 - .../wrapper/consul/model/health/ImmutableNode.java | 266 - .../consul/model/health/ImmutableService.java | 478 -- .../msb/wrapper/consul/model/health/Node.java | 35 - .../msb/wrapper/consul/model/health/Service.java | 48 - .../wrapper/consul/model/health/ServiceHealth.java | 73 - .../msb/wrapper/consul/option/CatalogOptions.java | 39 - .../msb/wrapper/consul/option/ConsistencyMode.java | 21 - .../consul/option/ImmutableCatalogOptions.java | 251 - .../consul/option/ImmutableQueryOptions.java | 531 -- .../openo/msb/wrapper/consul/option/Options.java | 29 - .../msb/wrapper/consul/option/ParamAdder.java | 23 - .../msb/wrapper/consul/option/QueryOptions.java | 100 - .../consul/util/Base64EncodingDeserializer.java | 45 - .../openo/msb/wrapper/consul/util/ClientUtil.java | 246 - .../org/openo/msb/wrapper/consul/util/Jackson.java | 34 - .../consul/util/ObjectMapperContextResolver.java | 35 - .../wrapper/consul/util/SecondsDeserializer.java | 43 - .../msb/wrapper/consul/util/SecondsSerializer.java | 34 - .../consul/util/UnsignedLongDeserializer.java | 37 - .../IMicroServiceChangeListener.java | 33 - .../MicroServiceChangeListener.java | 306 - .../java/org/openo/msb/wrapper/util/FileUtil.java | 66 - .../openo/msb/wrapper/util/JacksonJsonUtil.java | 120 - .../java/org/openo/msb/wrapper/util/JedisUtil.java | 221 - .../org/openo/msb/wrapper/util/MetricsUtil.java | 24 - .../org/openo/msb/wrapper/util/MicroServiceDB.java | 423 -- .../openo/msb/wrapper/util/MicroServiceUtil.java | 96 - .../org/openo/msb/wrapper/util/RegExpTestUtil.java | 88 - .../java/org/openo/msb/wrapper/util/RouteUtil.java | 135 - .../main/resources/api-doc/META-INF/MANIFEST.MF | 3 - .../src/main/resources/api-doc/WEB-INF/web.xml | 40 - .../src/main/resources/api-doc/css/reset.css | 125 - .../src/main/resources/api-doc/css/screen.css | 1256 ----- .../src/main/resources/api-doc/css/typography.css | 26 - .../api-doc/fonts/droid-sans-v6-latin-700.eot | Bin 22924 -> 0 bytes .../api-doc/fonts/droid-sans-v6-latin-700.svg | 411 -- .../api-doc/fonts/droid-sans-v6-latin-700.ttf | Bin 40516 -> 0 bytes .../api-doc/fonts/droid-sans-v6-latin-700.woff | Bin 25992 -> 0 bytes .../api-doc/fonts/droid-sans-v6-latin-700.woff2 | Bin 11480 -> 0 bytes .../api-doc/fonts/droid-sans-v6-latin-regular.eot | Bin 22008 -> 0 bytes .../api-doc/fonts/droid-sans-v6-latin-regular.svg | 403 -- .../api-doc/fonts/droid-sans-v6-latin-regular.ttf | Bin 39072 -> 0 bytes .../api-doc/fonts/droid-sans-v6-latin-regular.woff | Bin 24868 -> 0 bytes .../fonts/droid-sans-v6-latin-regular.woff2 | Bin 11304 -> 0 bytes .../resources/api-doc/images/explorer_icons.png | Bin 5763 -> 0 bytes .../main/resources/api-doc/images/logo_small.png | Bin 770 -> 0 bytes .../resources/api-doc/images/pet_store_api.png | Bin 824 -> 0 bytes .../src/main/resources/api-doc/images/throbber.gif | Bin 9257 -> 0 bytes .../main/resources/api-doc/images/wordnik_api.png | Bin 980 -> 0 bytes .../src/main/resources/api-doc/index.html | 118 - .../iframeResizer.contentWindow.min.js | 10 - .../api-doc/js/iframeResizer/iframeResizer.min.js | 9 - .../src/main/resources/api-doc/lib/backbone-min.js | 15 - .../main/resources/api-doc/lib/handlebars-2.0.0.js | 28 - .../resources/api-doc/lib/highlight.7.3.pack.js | 1 - .../main/resources/api-doc/lib/jquery-1.8.0.min.js | 2 - .../resources/api-doc/lib/jquery.ba-bbq.min.js | 18 - .../resources/api-doc/lib/jquery.slideto.min.js | 1 - .../resources/api-doc/lib/jquery.wiggle.min.js | 8 - .../src/main/resources/api-doc/lib/marked.js | 1272 ----- .../src/main/resources/api-doc/lib/shred.bundle.js | 2765 ---------- .../main/resources/api-doc/lib/shred/content.js | 193 - .../main/resources/api-doc/lib/swagger-client.js | 3315 ----------- .../main/resources/api-doc/lib/swagger-oauth.js | 279 - .../main/resources/api-doc/lib/underscore-min.js | 6 - .../src/main/resources/api-doc/o2c.html | 20 - .../src/main/resources/api-doc/swagger-ui.js | 2241 -------- .../src/main/resources/api-doc/swagger-ui.min.js | 2 - .../apiroute-service/src/main/resources/banner.txt | 5 - .../main/resources/iui-metrics/css/animate.min.css | 6 - .../src/main/resources/iui-metrics/css/metrics.css | 156 - .../i18n/loadi18nApp_iui-metrics_view.js | 43 - .../i18n/msb-iui-metrics-i18n-en-US.properties | 82 - .../i18n/msb-iui-metrics-i18n-zh-CN.properties | 78 - .../iui-metrics/img/loading-spinner-grey.gif | Bin 5203 -> 0 bytes .../resources/iui-metrics/img/netnumenLogo.png | Bin 5639 -> 0 bytes .../main/resources/iui-metrics/img/throbber.gif | Bin 9257 -> 0 bytes .../src/main/resources/iui-metrics/index.html | 256 - .../src/main/resources/iui-metrics/js/avalon.js | 5819 -------------------- .../iui-metrics/js/bootstrap/css/bootstrap-dt.css | 5804 ------------------- .../iui-metrics/js/bootstrap/css/bootstrap.min.css | 7 - .../iui-metrics/js/bootstrap/js/bootstrap.js | 1951 ------- .../iui-metrics/js/bootstrap/js/bootstrap.min.js | 6 - .../js/bootstrap/js/bootstrap2-typeahead.min.js | 21 - .../js/dataTables/dataTables.bootstrap.css | 308 -- .../js/dataTables/dataTables.bootstrap.min.js | 8 - .../js/dataTables/jquery.dataTables.min.js | 160 - .../iui-metrics/js/echarts/echarts-all.js | 35 - .../js/fontAwesome/css/font-awesome.css | 2026 ------- .../js/fontAwesome/css/font-awesome.css.map | 7 - .../js/fontAwesome/css/font-awesome.min.css | 4 - .../js/fontAwesome/fonts/FontAwesome.otf | Bin 106260 -> 0 bytes .../js/fontAwesome/fonts/fontawesome-webfont.eot | Bin 68875 -> 0 bytes .../js/fontAwesome/fonts/fontawesome-webfont.svg | 640 --- .../js/fontAwesome/fonts/fontawesome-webfont.ttf | Bin 138204 -> 0 bytes .../js/fontAwesome/fonts/fontawesome-webfont.woff | Bin 81284 -> 0 bytes .../js/fontAwesome/fonts/fontawesome-webfont.woff2 | Bin 64464 -> 0 bytes .../iui-metrics/js/fontAwesome/less/animated.less | 34 - .../js/fontAwesome/less/bordered-pulled.less | 25 - .../iui-metrics/js/fontAwesome/less/core.less | 12 - .../js/fontAwesome/less/fixed-width.less | 6 - .../js/fontAwesome/less/font-awesome.less | 17 - .../iui-metrics/js/fontAwesome/less/icons.less | 677 --- .../iui-metrics/js/fontAwesome/less/larger.less | 13 - .../iui-metrics/js/fontAwesome/less/list.less | 19 - .../iui-metrics/js/fontAwesome/less/mixins.less | 26 - .../iui-metrics/js/fontAwesome/less/path.less | 15 - .../js/fontAwesome/less/rotated-flipped.less | 20 - .../iui-metrics/js/fontAwesome/less/stacked.less | 20 - .../iui-metrics/js/fontAwesome/less/variables.less | 688 --- .../iui-metrics/js/fontAwesome/scss/_animated.scss | 34 - .../js/fontAwesome/scss/_bordered-pulled.scss | 25 - .../iui-metrics/js/fontAwesome/scss/_core.scss | 12 - .../js/fontAwesome/scss/_fixed-width.scss | 6 - .../iui-metrics/js/fontAwesome/scss/_icons.scss | 677 --- .../iui-metrics/js/fontAwesome/scss/_larger.scss | 13 - .../iui-metrics/js/fontAwesome/scss/_list.scss | 19 - .../iui-metrics/js/fontAwesome/scss/_mixins.scss | 26 - .../iui-metrics/js/fontAwesome/scss/_path.scss | 15 - .../js/fontAwesome/scss/_rotated-flipped.scss | 20 - .../iui-metrics/js/fontAwesome/scss/_stacked.scss | 20 - .../js/fontAwesome/scss/_variables.scss | 688 --- .../js/fontAwesome/scss/font-awesome.scss | 17 - .../iframeResizer.contentWindow.min.js | 10 - .../js/iframeResizer/iframeResizer.min.js | 9 - .../resources/iui-metrics/js/images/sort_both.png | Bin 5639 -> 0 bytes .../js/jquery.i18n/jquery.i18n.properties-1.0.9.js | 479 -- .../iui-metrics/js/jquery/jquery-1.10.2.min.js | 4 - .../main/resources/iui-metrics/js/metricsChart.js | 417 -- .../resources/iui-metrics/js/metricsController.js | 228 - .../main/resources/iui-metrics/js/metricsUtil.js | 47 - .../main/resources/iui-route/css/animate.min.css | 6 - .../src/main/resources/iui-route/css/newRoute.css | 270 - .../src/main/resources/iui-route/css/route.css | 643 --- .../src/main/resources/iui-route/default.html | 141 - .../iui-route/i18n/loadi18nApp_iui-route_view.js | 43 - .../i18n/msb-iui-route-i18n-en-US.properties | 164 - .../i18n/msb-iui-route-i18n-zh-CN.properties | 159 - .../resources/iui-route/img/checkbox-checked.png | Bin 3053 -> 0 bytes .../main/resources/iui-route/img/checkbox-init.png | Bin 2833 -> 0 bytes .../resources/iui-route/img/conductor-logo.png | Bin 7470 -> 0 bytes .../main/resources/iui-route/img/details_close.png | Bin 3300 -> 0 bytes .../main/resources/iui-route/img/details_open.png | Bin 3304 -> 0 bytes .../src/main/resources/iui-route/img/down.png | Bin 2938 -> 0 bytes .../iui-route/img/loading-spinner-grey.gif | Bin 5203 -> 0 bytes .../src/main/resources/iui-route/img/logo.png | Bin 5379 -> 0 bytes .../main/resources/iui-route/img/netnumenLogo.png | Bin 5639 -> 0 bytes .../iui-route/img/sidebar-toggler-grey.jpg | Bin 14801 -> 0 bytes .../src/main/resources/iui-route/img/throbber.gif | Bin 9257 -> 0 bytes .../src/main/resources/iui-route/img/up.png | Bin 2926 -> 0 bytes .../main/resources/iui-route/img/zte_logo_16.gif | Bin 583 -> 0 bytes .../src/main/resources/iui-route/index.html | 1039 ---- .../src/main/resources/iui-route/js/avalon.js | 5819 -------------------- .../resources/iui-route/js/bootbox/bootbox.min.js | 6 - .../resources/iui-route/js/bootstrap-growl.min.js | 2 - .../iui-route/js/bootstrap/css/bootstrap-dt.css | 5804 ------------------- .../iui-route/js/bootstrap/css/bootstrap.min.css | 7 - .../iui-route/js/bootstrap/js/bootstrap.js | 1951 ------- .../iui-route/js/bootstrap/js/bootstrap.min.js | 6 - .../js/bootstrap/js/bootstrap2-typeahead.min.js | 21 - .../js/dataTables/dataTables.bootstrap.css | 308 -- .../js/dataTables/dataTables.bootstrap.min.js | 8 - .../js/dataTables/jquery.dataTables.min.js | 160 - .../iui-route/js/fontAwesome/css/font-awesome.css | 2026 ------- .../js/fontAwesome/css/font-awesome.css.map | 7 - .../js/fontAwesome/css/font-awesome.min.css | 4 - .../iui-route/js/fontAwesome/fonts/FontAwesome.otf | Bin 106260 -> 0 bytes .../js/fontAwesome/fonts/fontawesome-webfont.eot | Bin 68875 -> 0 bytes .../js/fontAwesome/fonts/fontawesome-webfont.svg | 640 --- .../js/fontAwesome/fonts/fontawesome-webfont.ttf | Bin 138204 -> 0 bytes .../js/fontAwesome/fonts/fontawesome-webfont.woff | Bin 81284 -> 0 bytes .../js/fontAwesome/fonts/fontawesome-webfont.woff2 | Bin 64464 -> 0 bytes .../iui-route/js/fontAwesome/less/animated.less | 34 - .../js/fontAwesome/less/bordered-pulled.less | 25 - .../iui-route/js/fontAwesome/less/core.less | 12 - .../iui-route/js/fontAwesome/less/fixed-width.less | 6 - .../js/fontAwesome/less/font-awesome.less | 17 - .../iui-route/js/fontAwesome/less/icons.less | 677 --- .../iui-route/js/fontAwesome/less/larger.less | 13 - .../iui-route/js/fontAwesome/less/list.less | 19 - .../iui-route/js/fontAwesome/less/mixins.less | 26 - .../iui-route/js/fontAwesome/less/path.less | 15 - .../js/fontAwesome/less/rotated-flipped.less | 20 - .../iui-route/js/fontAwesome/less/stacked.less | 20 - .../iui-route/js/fontAwesome/less/variables.less | 688 --- .../iui-route/js/fontAwesome/scss/_animated.scss | 34 - .../js/fontAwesome/scss/_bordered-pulled.scss | 25 - .../iui-route/js/fontAwesome/scss/_core.scss | 12 - .../js/fontAwesome/scss/_fixed-width.scss | 6 - .../iui-route/js/fontAwesome/scss/_icons.scss | 677 --- .../iui-route/js/fontAwesome/scss/_larger.scss | 13 - .../iui-route/js/fontAwesome/scss/_list.scss | 19 - .../iui-route/js/fontAwesome/scss/_mixins.scss | 26 - .../iui-route/js/fontAwesome/scss/_path.scss | 15 - .../js/fontAwesome/scss/_rotated-flipped.scss | 20 - .../iui-route/js/fontAwesome/scss/_stacked.scss | 20 - .../iui-route/js/fontAwesome/scss/_variables.scss | 688 --- .../js/fontAwesome/scss/font-awesome.scss | 17 - .../iframeResizer.contentWindow.min.js | 10 - .../js/iframeResizer/iframeResizer.min.js | 9 - .../js/jquery-validation/additional-methods.js | 928 ---- .../js/jquery-validation/additional-methods.min.js | 4 - .../js/jquery-validation/jquery.validate.js | 1357 ----- .../js/jquery-validation/jquery.validate.min.js | 4 - .../jquery-validation/localization/messages_ar.js | 33 - .../localization/messages_ar.min.js | 4 - .../jquery-validation/localization/messages_bg.js | 33 - .../localization/messages_bg.min.js | 4 - .../jquery-validation/localization/messages_ca.js | 33 - .../localization/messages_ca.min.js | 4 - .../jquery-validation/localization/messages_cs.js | 33 - .../localization/messages_cs.min.js | 4 - .../jquery-validation/localization/messages_da.js | 30 - .../localization/messages_da.min.js | 4 - .../jquery-validation/localization/messages_de.js | 30 - .../localization/messages_de.min.js | 4 - .../jquery-validation/localization/messages_el.js | 33 - .../localization/messages_el.min.js | 4 - .../jquery-validation/localization/messages_es.js | 36 - .../localization/messages_es.min.js | 4 - .../localization/messages_es_AR.js | 37 - .../localization/messages_es_AR.min.js | 4 - .../jquery-validation/localization/messages_et.js | 31 - .../localization/messages_et.min.js | 4 - .../jquery-validation/localization/messages_eu.js | 33 - .../localization/messages_eu.min.js | 4 - .../jquery-validation/localization/messages_fa.js | 36 - .../localization/messages_fa.min.js | 4 - .../jquery-validation/localization/messages_fi.js | 31 - .../localization/messages_fi.min.js | 4 - .../jquery-validation/localization/messages_fr.js | 59 - .../localization/messages_fr.min.js | 4 - .../jquery-validation/localization/messages_gl.js | 38 - .../localization/messages_gl.min.js | 4 - .../jquery-validation/localization/messages_he.js | 33 - .../localization/messages_he.min.js | 4 - .../jquery-validation/localization/messages_hr.js | 33 - .../localization/messages_hr.min.js | 4 - .../jquery-validation/localization/messages_hu.js | 32 - .../localization/messages_hu.min.js | 4 - .../jquery-validation/localization/messages_id.js | 32 - .../localization/messages_id.min.js | 4 - .../jquery-validation/localization/messages_is.js | 31 - .../localization/messages_is.min.js | 4 - .../jquery-validation/localization/messages_it.js | 36 - .../localization/messages_it.min.js | 4 - .../jquery-validation/localization/messages_ja.js | 33 - .../localization/messages_ja.min.js | 4 - .../jquery-validation/localization/messages_ka.js | 33 - .../localization/messages_ka.min.js | 4 - .../jquery-validation/localization/messages_kk.js | 33 - .../localization/messages_kk.min.js | 4 - .../jquery-validation/localization/messages_ko.js | 33 - .../localization/messages_ko.min.js | 4 - .../jquery-validation/localization/messages_lt.js | 33 - .../localization/messages_lt.min.js | 4 - .../jquery-validation/localization/messages_lv.js | 33 - .../localization/messages_lv.min.js | 4 - .../jquery-validation/localization/messages_my.js | 33 - .../localization/messages_my.min.js | 4 - .../jquery-validation/localization/messages_nl.js | 43 - .../localization/messages_nl.min.js | 4 - .../jquery-validation/localization/messages_no.js | 33 - .../localization/messages_no.min.js | 4 - .../jquery-validation/localization/messages_pl.js | 33 - .../localization/messages_pl.min.js | 4 - .../localization/messages_pt_BR.js | 37 - .../localization/messages_pt_BR.min.js | 4 - .../localization/messages_pt_PT.js | 37 - .../localization/messages_pt_PT.min.js | 4 - .../jquery-validation/localization/messages_ro.js | 33 - .../localization/messages_ro.min.js | 4 - .../jquery-validation/localization/messages_ru.js | 33 - .../localization/messages_ru.min.js | 4 - .../jquery-validation/localization/messages_si.js | 33 - .../localization/messages_si.min.js | 4 - .../jquery-validation/localization/messages_sk.js | 30 - .../localization/messages_sk.min.js | 4 - .../jquery-validation/localization/messages_sl.js | 33 - .../localization/messages_sl.min.js | 4 - .../jquery-validation/localization/messages_sr.js | 33 - .../localization/messages_sr.min.js | 4 - .../localization/messages_sr_lat.js | 33 - .../localization/messages_sr_lat.min.js | 4 - .../jquery-validation/localization/messages_sv.js | 31 - .../localization/messages_sv.min.js | 4 - .../jquery-validation/localization/messages_th.js | 33 - .../localization/messages_th.min.js | 4 - .../jquery-validation/localization/messages_tj.js | 33 - .../localization/messages_tj.min.js | 4 - .../jquery-validation/localization/messages_tr.js | 33 - .../localization/messages_tr.min.js | 4 - .../jquery-validation/localization/messages_uk.js | 33 - .../localization/messages_uk.min.js | 4 - .../jquery-validation/localization/messages_vi.js | 33 - .../localization/messages_vi.min.js | 4 - .../jquery-validation/localization/messages_zh.js | 33 - .../localization/messages_zh.min.js | 4 - .../localization/messages_zh_TW.js | 34 - .../localization/messages_zh_TW.min.js | 4 - .../jquery-validation/localization/methods_de.js | 22 - .../localization/methods_de.min.js | 4 - .../localization/methods_es_CL.js | 22 - .../localization/methods_es_CL.min.js | 4 - .../jquery-validation/localization/methods_fi.js | 22 - .../localization/methods_fi.min.js | 4 - .../jquery-validation/localization/methods_nl.js | 19 - .../localization/methods_nl.min.js | 4 - .../jquery-validation/localization/methods_pt.js | 19 - .../localization/methods_pt.min.js | 4 - .../js/jquery.i18n/jquery.i18n.properties-1.0.9.js | 479 -- .../iui-route/js/jquery/jquery-1.10.2.min.js | 4 - .../main/resources/iui-route/js/routeController.js | 1823 ------ .../src/main/resources/iui-route/js/routeFunc.js | 646 --- .../src/main/resources/iui-route/js/routeUtil.js | 280 - 364 files changed, 76494 deletions(-) delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/ApiRouteApp.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/ApiRouteAppConfig.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/ConsulClientApp.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/api/ApiRouteInfo.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/api/ConsulInfo.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/api/CustomDateSerializer.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/api/CustomRouteInfo.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/api/DiscoverInfo.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/api/IuiRouteInfo.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/api/MetricsInfo.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/api/MicroServiceFullInfo.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/api/MicroServiceInfo.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/api/Node.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/api/NodeInfo.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/api/RouteServer.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/api/Service.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/api/ServiceAccessInfo.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/api/exception/ExtendedInternalServerErrorException.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/api/exception/ExtendedNotFoundException.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/api/exception/ExtendedNotSupportedException.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/health/ApiRouteHealthCheck.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/resources/ApiRouteResource.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/resources/CustomRouteResource.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/resources/IuiRouteResource.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/resources/MetricsResource.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/resources/MicroServiceResource.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/resources/ServiceAccessResource.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/ApiRouteServiceWrapper.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/CustomRouteServiceWrapper.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/IuiRouteServiceWrapper.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/MetricsServiceWrapper.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/MicroServiceWrapper.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/ServiceAccessWrapper.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/CatalogClient.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/Consul.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/ConsulException.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/HealthClient.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/async/ConsulResponseCallback.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/CatalogCache.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ConsulCache.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ConsulCache4Map.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/HealthCache.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ServiceCache.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/ConsulResponse.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/CatalogNode.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/CatalogService.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ImmutableCatalogNode.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ImmutableCatalogService.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ServiceInfo.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ImmutableNode.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ImmutableService.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/Node.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/Service.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ServiceHealth.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/CatalogOptions.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ConsistencyMode.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ImmutableCatalogOptions.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ImmutableQueryOptions.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/Options.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ParamAdder.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/QueryOptions.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/Base64EncodingDeserializer.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/ClientUtil.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/Jackson.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/ObjectMapperContextResolver.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/SecondsDeserializer.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/SecondsSerializer.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/UnsignedLongDeserializer.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/serviceListener/IMicroServiceChangeListener.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/serviceListener/MicroServiceChangeListener.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/FileUtil.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/JacksonJsonUtil.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/JedisUtil.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/MetricsUtil.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/MicroServiceDB.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/MicroServiceUtil.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/RegExpTestUtil.java delete mode 100644 apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/RouteUtil.java delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/META-INF/MANIFEST.MF delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/WEB-INF/web.xml delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/css/reset.css delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/css/screen.css delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/css/typography.css delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.eot delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.svg delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.ttf delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.woff delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.woff2 delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.eot delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.svg delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.ttf delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.woff delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.woff2 delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/images/explorer_icons.png delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/images/logo_small.png delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/images/pet_store_api.png delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/images/throbber.gif delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/images/wordnik_api.png delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/index.html delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/js/iframeResizer/iframeResizer.contentWindow.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/js/iframeResizer/iframeResizer.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/lib/backbone-min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/lib/handlebars-2.0.0.js delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/lib/highlight.7.3.pack.js delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/lib/jquery-1.8.0.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/lib/jquery.ba-bbq.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/lib/jquery.slideto.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/lib/jquery.wiggle.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/lib/marked.js delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/lib/shred.bundle.js delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/lib/shred/content.js delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/lib/swagger-client.js delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/lib/swagger-oauth.js delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/lib/underscore-min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/o2c.html delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/swagger-ui.js delete mode 100644 apiroute/apiroute-service/src/main/resources/api-doc/swagger-ui.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/banner.txt delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/css/animate.min.css delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/css/metrics.css delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/i18n/loadi18nApp_iui-metrics_view.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/i18n/msb-iui-metrics-i18n-en-US.properties delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/i18n/msb-iui-metrics-i18n-zh-CN.properties delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/img/loading-spinner-grey.gif delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/img/netnumenLogo.png delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/img/throbber.gif delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/index.html delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/avalon.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/bootstrap/css/bootstrap-dt.css delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/bootstrap/css/bootstrap.min.css delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/bootstrap/js/bootstrap.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/bootstrap/js/bootstrap.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/bootstrap/js/bootstrap2-typeahead.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/dataTables/dataTables.bootstrap.css delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/dataTables/dataTables.bootstrap.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/dataTables/jquery.dataTables.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/echarts/echarts-all.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/css/font-awesome.css delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/css/font-awesome.css.map delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/css/font-awesome.min.css delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/fonts/FontAwesome.otf delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/fonts/fontawesome-webfont.eot delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/fonts/fontawesome-webfont.svg delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/fonts/fontawesome-webfont.ttf delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/fonts/fontawesome-webfont.woff delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/fonts/fontawesome-webfont.woff2 delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/animated.less delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/bordered-pulled.less delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/core.less delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/fixed-width.less delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/font-awesome.less delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/icons.less delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/larger.less delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/list.less delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/mixins.less delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/path.less delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/rotated-flipped.less delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/stacked.less delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/variables.less delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_animated.scss delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_bordered-pulled.scss delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_core.scss delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_fixed-width.scss delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_icons.scss delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_larger.scss delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_list.scss delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_mixins.scss delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_path.scss delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_rotated-flipped.scss delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_stacked.scss delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_variables.scss delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/font-awesome.scss delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/iframeResizer/iframeResizer.contentWindow.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/iframeResizer/iframeResizer.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/images/sort_both.png delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/jquery.i18n/jquery.i18n.properties-1.0.9.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/jquery/jquery-1.10.2.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/metricsChart.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/metricsController.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-metrics/js/metricsUtil.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/css/animate.min.css delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/css/newRoute.css delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/css/route.css delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/default.html delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/i18n/loadi18nApp_iui-route_view.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/i18n/msb-iui-route-i18n-en-US.properties delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/i18n/msb-iui-route-i18n-zh-CN.properties delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/img/checkbox-checked.png delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/img/checkbox-init.png delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/img/conductor-logo.png delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/img/details_close.png delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/img/details_open.png delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/img/down.png delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/img/loading-spinner-grey.gif delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/img/logo.png delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/img/netnumenLogo.png delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/img/sidebar-toggler-grey.jpg delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/img/throbber.gif delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/img/up.png delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/img/zte_logo_16.gif delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/index.html delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/avalon.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/bootbox/bootbox.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap-growl.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/css/bootstrap-dt.css delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/css/bootstrap.min.css delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap2-typeahead.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/dataTables/dataTables.bootstrap.css delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/dataTables/dataTables.bootstrap.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/dataTables/jquery.dataTables.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/css/font-awesome.css delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/css/font-awesome.css.map delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/css/font-awesome.min.css delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/FontAwesome.otf delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.eot delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.svg delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.ttf delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.woff delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.woff2 delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/animated.less delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/bordered-pulled.less delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/core.less delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/fixed-width.less delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/font-awesome.less delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/icons.less delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/larger.less delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/list.less delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/mixins.less delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/path.less delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/rotated-flipped.less delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/stacked.less delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/variables.less delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_animated.scss delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_bordered-pulled.scss delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_core.scss delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_fixed-width.scss delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_icons.scss delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_larger.scss delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_list.scss delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_mixins.scss delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_path.scss delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_rotated-flipped.scss delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_stacked.scss delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_variables.scss delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/font-awesome.scss delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/iframeResizer/iframeResizer.contentWindow.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/iframeResizer/iframeResizer.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/additional-methods.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/additional-methods.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/jquery.validate.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/jquery.validate.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ar.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ar.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_bg.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_bg.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ca.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ca.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_cs.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_cs.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_da.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_da.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_de.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_de.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_el.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_el.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_es.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_es.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_es_AR.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_es_AR.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_et.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_et.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_eu.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_eu.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fa.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fa.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fi.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fi.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fr.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fr.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_gl.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_gl.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_he.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_he.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_hr.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_hr.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_hu.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_hu.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_id.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_id.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_is.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_is.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_it.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_it.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ja.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ja.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ka.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ka.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_kk.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_kk.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ko.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ko.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_lt.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_lt.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_lv.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_lv.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_my.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_my.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_nl.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_nl.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_no.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_no.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pl.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pl.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pt_BR.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pt_BR.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pt_PT.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pt_PT.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ro.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ro.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ru.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ru.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_si.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_si.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sk.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sk.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sl.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sl.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sr.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sr.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sr_lat.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sr_lat.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sv.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sv.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_th.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_th.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_tj.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_tj.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_tr.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_tr.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_uk.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_uk.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_vi.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_vi.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_zh.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_zh.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_zh_TW.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_zh_TW.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_de.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_de.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_es_CL.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_es_CL.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_fi.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_fi.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_nl.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_nl.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_pt.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_pt.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery.i18n/jquery.i18n.properties-1.0.9.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/jquery/jquery-1.10.2.min.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/routeController.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/routeFunc.js delete mode 100644 apiroute/apiroute-service/src/main/resources/iui-route/js/routeUtil.js (limited to 'apiroute/apiroute-service/src/main') diff --git a/apiroute/apiroute-service/src/main/java/org/openo/msb/ApiRouteApp.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/ApiRouteApp.java deleted file mode 100644 index 0e0860d..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/ApiRouteApp.java +++ /dev/null @@ -1,550 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -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/apiroute/apiroute-service/src/main/java/org/openo/msb/ApiRouteAppConfig.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/ApiRouteAppConfig.java deleted file mode 100644 index 6439462..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/ApiRouteAppConfig.java +++ /dev/null @@ -1,111 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -package org.openo.msb; - -import io.dropwizard.Configuration; - -import javax.validation.Valid; - -import org.hibernate.validator.constraints.NotEmpty; -import org.openo.msb.api.ConsulInfo; -import org.openo.msb.api.DiscoverInfo; - -import com.fasterxml.jackson.annotation.JsonProperty; - -public class ApiRouteAppConfig extends Configuration { - @NotEmpty - private String defaultWorkspace = "apiroute-works"; - - @NotEmpty - private String defaultName = "Stranger"; - - @NotEmpty - private String propertiesName="redis.properties"; - - @NotEmpty - private String propertiesDir="conf"; - - - @Valid - private DiscoverInfo discoverInfo; - - @Valid - private ConsulInfo consulInfo; - - @JsonProperty - public ConsulInfo getConsulInfo() { - return consulInfo; - } - - @JsonProperty - public void setConsulInfo(ConsulInfo consulInfo) { - this.consulInfo = consulInfo; - } - - - public String getPropertiesDir() { - return propertiesDir; - } - - public void setPropertiesDir(String propertiesDir) { - this.propertiesDir = propertiesDir; - } - - public String getPropertiesName() { - return propertiesName; - } - - public void setPropertiesName(String propertiesName) { - this.propertiesName = propertiesName; - } - - @JsonProperty - public String getDefaultWorkspace() { - return defaultWorkspace; - } - - @JsonProperty - public void setDefaultWorkspace(String defaultWorkspace) { - this.defaultWorkspace = defaultWorkspace; - } - - @JsonProperty - public String getDefaultName() { - return defaultName; - } - - @JsonProperty - public void setDefaultName(String name) { - this.defaultName = name; - } - - - - @JsonProperty - public DiscoverInfo getDiscoverInfo() { - return discoverInfo; - } - - @JsonProperty - public void setDiscoverInfo(DiscoverInfo discoverInfo) { - this.discoverInfo = discoverInfo; - } - - - - -} \ No newline at end of file diff --git a/apiroute/apiroute-service/src/main/java/org/openo/msb/ConsulClientApp.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/ConsulClientApp.java deleted file mode 100644 index bb0ff66..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/ConsulClientApp.java +++ /dev/null @@ -1,452 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -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/apiroute/apiroute-service/src/main/java/org/openo/msb/api/ApiRouteInfo.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/api/ApiRouteInfo.java deleted file mode 100644 index 54f3f34..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/api/ApiRouteInfo.java +++ /dev/null @@ -1,136 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -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/apiroute/apiroute-service/src/main/java/org/openo/msb/api/ConsulInfo.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/api/ConsulInfo.java deleted file mode 100644 index 12c0dcb..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/api/ConsulInfo.java +++ /dev/null @@ -1,38 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -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/apiroute/apiroute-service/src/main/java/org/openo/msb/api/CustomDateSerializer.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/api/CustomDateSerializer.java deleted file mode 100644 index f99dcad..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/api/CustomDateSerializer.java +++ /dev/null @@ -1,39 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -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/apiroute/apiroute-service/src/main/java/org/openo/msb/api/CustomRouteInfo.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/api/CustomRouteInfo.java deleted file mode 100644 index 2b84a38..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/api/CustomRouteInfo.java +++ /dev/null @@ -1,102 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -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/apiroute/apiroute-service/src/main/java/org/openo/msb/api/DiscoverInfo.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/api/DiscoverInfo.java deleted file mode 100644 index 122dbc4..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/api/DiscoverInfo.java +++ /dev/null @@ -1,49 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -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/apiroute/apiroute-service/src/main/java/org/openo/msb/api/IuiRouteInfo.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/api/IuiRouteInfo.java deleted file mode 100644 index 0087fdf..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/api/IuiRouteInfo.java +++ /dev/null @@ -1,102 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -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/apiroute/apiroute-service/src/main/java/org/openo/msb/api/MetricsInfo.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/api/MetricsInfo.java deleted file mode 100644 index 324b582..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/api/MetricsInfo.java +++ /dev/null @@ -1,191 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -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/apiroute/apiroute-service/src/main/java/org/openo/msb/api/MicroServiceFullInfo.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/api/MicroServiceFullInfo.java deleted file mode 100644 index ccf1977..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/api/MicroServiceFullInfo.java +++ /dev/null @@ -1,44 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -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/apiroute/apiroute-service/src/main/java/org/openo/msb/api/MicroServiceInfo.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/api/MicroServiceInfo.java deleted file mode 100644 index e6e1b73..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/api/MicroServiceInfo.java +++ /dev/null @@ -1,38 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -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/apiroute/apiroute-service/src/main/java/org/openo/msb/api/Node.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/api/Node.java deleted file mode 100644 index f0d179f..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/api/Node.java +++ /dev/null @@ -1,75 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -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/apiroute/apiroute-service/src/main/java/org/openo/msb/api/NodeInfo.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/api/NodeInfo.java deleted file mode 100644 index 9988e1d..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/api/NodeInfo.java +++ /dev/null @@ -1,74 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -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/apiroute/apiroute-service/src/main/java/org/openo/msb/api/RouteServer.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/api/RouteServer.java deleted file mode 100644 index 3e01c4f..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/api/RouteServer.java +++ /dev/null @@ -1,68 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -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/apiroute/apiroute-service/src/main/java/org/openo/msb/api/Service.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/api/Service.java deleted file mode 100644 index 51f0e86..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/api/Service.java +++ /dev/null @@ -1,104 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -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/apiroute/apiroute-service/src/main/java/org/openo/msb/api/ServiceAccessInfo.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/api/ServiceAccessInfo.java deleted file mode 100644 index 34c4a67..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/api/ServiceAccessInfo.java +++ /dev/null @@ -1,88 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -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/apiroute/apiroute-service/src/main/java/org/openo/msb/api/exception/ExtendedInternalServerErrorException.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/api/exception/ExtendedInternalServerErrorException.java deleted file mode 100644 index ce57dc6..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/api/exception/ExtendedInternalServerErrorException.java +++ /dev/null @@ -1,28 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -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/apiroute/apiroute-service/src/main/java/org/openo/msb/api/exception/ExtendedNotFoundException.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/api/exception/ExtendedNotFoundException.java deleted file mode 100644 index ca5f747..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/api/exception/ExtendedNotFoundException.java +++ /dev/null @@ -1,28 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -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/apiroute/apiroute-service/src/main/java/org/openo/msb/api/exception/ExtendedNotSupportedException.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/api/exception/ExtendedNotSupportedException.java deleted file mode 100644 index 84bfbaa..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/api/exception/ExtendedNotSupportedException.java +++ /dev/null @@ -1,27 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -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/apiroute/apiroute-service/src/main/java/org/openo/msb/health/ApiRouteHealthCheck.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/health/ApiRouteHealthCheck.java deleted file mode 100644 index dc2af2a..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/health/ApiRouteHealthCheck.java +++ /dev/null @@ -1,35 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -package org.openo.msb.health; - -import com.codahale.metrics.health.HealthCheck; - -public class ApiRouteHealthCheck extends HealthCheck { - private final String template; - - public ApiRouteHealthCheck(String template) { - this.template = template; - } - - @Override - protected Result check() throws Exception { - final String saying = String.format(template, "TEST"); - if (!saying.contains("TEST")) { - return Result.unhealthy("template doesn't include a name"); - } - return Result.healthy(); - } -} \ No newline at end of file diff --git a/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/ApiRouteResource.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/ApiRouteResource.java deleted file mode 100644 index cd86047..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/ApiRouteResource.java +++ /dev/null @@ -1,233 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -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/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/CustomRouteResource.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/CustomRouteResource.java deleted file mode 100644 index 89cdf5f..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/CustomRouteResource.java +++ /dev/null @@ -1,152 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -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/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/IuiRouteResource.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/IuiRouteResource.java deleted file mode 100644 index b852fa9..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/IuiRouteResource.java +++ /dev/null @@ -1,155 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -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/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/MetricsResource.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/MetricsResource.java deleted file mode 100644 index d15799b..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/MetricsResource.java +++ /dev/null @@ -1,49 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -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/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/MicroServiceResource.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/MicroServiceResource.java deleted file mode 100644 index 5ea80ae..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/MicroServiceResource.java +++ /dev/null @@ -1,247 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -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/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/ServiceAccessResource.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/ServiceAccessResource.java deleted file mode 100644 index 6a2d741..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/ServiceAccessResource.java +++ /dev/null @@ -1,65 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -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/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/ApiRouteServiceWrapper.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/ApiRouteServiceWrapper.java deleted file mode 100644 index 6f0ed7d..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/ApiRouteServiceWrapper.java +++ /dev/null @@ -1,653 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -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/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/CustomRouteServiceWrapper.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/CustomRouteServiceWrapper.java deleted file mode 100644 index 85d4d4e..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/CustomRouteServiceWrapper.java +++ /dev/null @@ -1,474 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -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/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/IuiRouteServiceWrapper.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/IuiRouteServiceWrapper.java deleted file mode 100644 index d705172..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/IuiRouteServiceWrapper.java +++ /dev/null @@ -1,453 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -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/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/MetricsServiceWrapper.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/MetricsServiceWrapper.java deleted file mode 100644 index 656acb8..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/MetricsServiceWrapper.java +++ /dev/null @@ -1,92 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -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/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/MicroServiceWrapper.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/MicroServiceWrapper.java deleted file mode 100644 index 4e5e6cb..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/MicroServiceWrapper.java +++ /dev/null @@ -1,536 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -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/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/ServiceAccessWrapper.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/ServiceAccessWrapper.java deleted file mode 100644 index 35b02e7..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/ServiceAccessWrapper.java +++ /dev/null @@ -1,172 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -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/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/CatalogClient.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/CatalogClient.java deleted file mode 100644 index 576bf9b..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/CatalogClient.java +++ /dev/null @@ -1,285 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -package org.openo.msb.wrapper.consul; - -import static org.openo.msb.wrapper.consul.util.ClientUtil.response; - -import java.util.List; -import java.util.Map; - -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.GenericType; -import javax.ws.rs.core.MediaType; - -import org.openo.msb.wrapper.consul.async.ConsulResponseCallback; -import org.openo.msb.wrapper.consul.model.ConsulResponse; -import org.openo.msb.wrapper.consul.model.catalog.CatalogNode; -import org.openo.msb.wrapper.consul.model.catalog.CatalogService; -import org.openo.msb.wrapper.consul.model.health.Node; -import org.openo.msb.wrapper.consul.option.CatalogOptions; -import org.openo.msb.wrapper.consul.option.QueryOptions; - -/** - * HTTP Client for /v1/catalog/ endpoints or api/catalog/v1 by openresty - */ -public class CatalogClient { - - private static final GenericType> TYPE_STRING_LIST = new GenericType>() {}; - private static final GenericType> TYPE_NODE_LIST = new GenericType>() {}; - private static final GenericType>> TYPE_SERVICES_MAP = new GenericType>>() {}; - private static final GenericType> TYPE_CATALOG_SERVICE_LIST = new GenericType>() {}; - private static final GenericType TYPE_CATALOG_NODE = new GenericType() {}; - - private final WebTarget webTarget; - - /** - * Constructs an instance of this class. - * - * @param webTarget The {@link javax.ws.rs.client.WebTarget} to base requests from. - */ - CatalogClient(WebTarget webTarget) { - this.webTarget = webTarget; - } - - /** - * Retrieves all datacenters. - * - * GET /v1/catalog/datacenters - * - * @return A list of datacenter names. - */ - public List getDatacenters() { - return webTarget.path("datacenters").request() - .accept(MediaType.APPLICATION_JSON_TYPE).get(TYPE_STRING_LIST); - } - - /** - * Retrieves all nodes. - * - * GET /v1/catalog/nodes - * - * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a list of - * {@link org.openo.msb.wrapper.consul.model.health.Node} objects. - */ - public ConsulResponse> getNodes() { - return getNodes(null, QueryOptions.BLANK); - } - - /** - * Retrieves all nodes for a given datacenter. - * - * GET /v1/catalog/nodes?dc={datacenter} - * - * @param catalogOptions Catalog specific options to use. - * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a list of - * {@link org.openo.msb.wrapper.consul.model.health.Node} objects. - */ - public ConsulResponse> getNodes(CatalogOptions catalogOptions) { - return getNodes(catalogOptions, QueryOptions.BLANK); - } - - /** - * Retrieves all nodes with {@link org.openo.msb.wrapper.consul.option.QueryOptions}. - * - * GET /v1/catalog/nodes - * - * @param queryOptions The Query Options to use. - * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a list of - * {@link org.openo.msb.wrapper.consul.model.health.Node} objects. - */ - public ConsulResponse> getNodes(QueryOptions queryOptions) { - return getNodes(null, queryOptions); - } - - /** - * Retrieves all nodes for a given datacenter with {@link org.openo.msb.wrapper.consul.option.QueryOptions}. - * - * GET /v1/catalog/nodes?dc={datacenter} - * - * @param catalogOptions Catalog specific options to use. - * @param queryOptions The Query Options to use. - * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a list of - * {@link org.openo.msb.wrapper.consul.model.health.Node} objects. - */ - public ConsulResponse> getNodes(CatalogOptions catalogOptions, QueryOptions queryOptions) { - return response(webTarget.path("nodes"), catalogOptions, queryOptions, TYPE_NODE_LIST); - } - - /** - * Retrieves all services for a given datacenter. - * - * GET /v1/catalog/services?dc={datacenter} - * - * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a map of service name to list of tags. - */ - public ConsulResponse>> getServices() { - return getServices(null, QueryOptions.BLANK); - } - - /** - * Retrieves all services for a given datacenter. - * - * GET /v1/catalog/services?dc={datacenter} - * - * @param catalogOptions Catalog specific options to use. - * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a map of service name to list of tags. - */ - public ConsulResponse>> getServices(CatalogOptions catalogOptions) { - return getServices(catalogOptions, QueryOptions.BLANK); - } - - /** - * Retrieves all services for a given datacenter with {@link org.openo.msb.wrapper.consul.option.QueryOptions}. - * - * GET /v1/catalog/services?dc={datacenter} - * - * @param queryOptions The Query Options to use. - * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a map of service name to list of tags. - */ - public ConsulResponse>> getServices(QueryOptions queryOptions) { - return getServices(null, queryOptions); - } - - /** - * Retrieves all services for a given datacenter with {@link org.openo.msb.wrapper.consul.option.QueryOptions}. - * - * GET /v1/catalog/services?dc={datacenter} - * - * @param catalogOptions Catalog specific options to use. - * @param queryOptions The Query Options to use. - * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a map of service name to list of tags. - */ - public ConsulResponse>> getServices(CatalogOptions catalogOptions, QueryOptions queryOptions) { - return response(webTarget.path("services"), catalogOptions, queryOptions, TYPE_SERVICES_MAP); - } - - public void getService(QueryOptions queryOptions, ConsulResponseCallback>> callback) { - response(webTarget.path("services"), CatalogOptions.BLANK, - queryOptions, TYPE_SERVICES_MAP, callback); - } - - /** - * Retrieves a single service. - * - * GET /v1/catalog/service/{service} - * - * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing - * {@link org.openo.msb.wrapper.consul.model.catalog.CatalogService} objects. - */ - public ConsulResponse> getService(String service) { - return getService(service, null, QueryOptions.BLANK); - } - - /** - * Retrieves a single service for a given datacenter. - * - * GET /v1/catalog/service/{service}?dc={datacenter} - * - * @param catalogOptions Catalog specific options to use. - * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing - * {@link org.openo.msb.wrapper.consul.model.catalog.CatalogService} objects. - */ - public ConsulResponse> getService(String service, CatalogOptions catalogOptions) { - return getService(service, catalogOptions, QueryOptions.BLANK); - } - - /** - * Retrieves a single service with {@link org.openo.msb.wrapper.consul.option.QueryOptions}. - * - * GET /v1/catalog/service/{service} - * - * @param queryOptions The Query Options to use. - * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing - * {@link org.openo.msb.wrapper.consul.model.catalog.CatalogService} objects. - */ - public ConsulResponse> getService(String service, QueryOptions queryOptions) { - return getService(service, null, queryOptions); - } - - public void getService(String service, QueryOptions queryOptions, ConsulResponseCallback> callback) { - - response(webTarget.path("service").path(service), CatalogOptions.BLANK, - queryOptions, TYPE_CATALOG_SERVICE_LIST, callback); - } - - - - /** - * Retrieves a single service for a given datacenter with {@link org.openo.msb.wrapper.consul.option.QueryOptions}. - * - * GET /v1/catalog/service/{service}?dc={datacenter} - * - * @param catalogOptions Catalog specific options to use. - * @param queryOptions The Query Options to use. - * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing - * {@link org.openo.msb.wrapper.consul.model.catalog.CatalogService} objects. - */ - public ConsulResponse> getService(String service, CatalogOptions catalogOptions, - QueryOptions queryOptions) { - return response(webTarget.path("service").path(service), catalogOptions, queryOptions, - TYPE_CATALOG_SERVICE_LIST); - } - - /** - * Retrieves a single node. - * - * GET /v1/catalog/node/{node} - * - * @return A list of matching {@link org.openo.msb.wrapper.consul.model.catalog.CatalogService} objects. - */ - public ConsulResponse getNode(String node) { - return getNode(node, null, QueryOptions.BLANK); - } - - /** - * Retrieves a single node for a given datacenter. - * - * GET /v1/catalog/node/{node}?dc={datacenter} - * - * @param catalogOptions Catalog specific options to use. - * @return A list of matching {@link org.openo.msb.wrapper.consul.model.catalog.CatalogService} objects. - */ - public ConsulResponse getNode(String node, CatalogOptions catalogOptions) { - return getNode(node, catalogOptions, QueryOptions.BLANK); - } - - /** - * Retrieves a single node with {@link org.openo.msb.wrapper.consul.option.QueryOptions}. - * - * GET /v1/catalog/node/{node} - * - * @param queryOptions The Query Options to use. - * @return A list of matching {@link org.openo.msb.wrapper.consul.model.catalog.CatalogService} objects. - */ - public ConsulResponse getNode(String node, QueryOptions queryOptions) { - return getNode(node, null, queryOptions); - } - - /** - * Retrieves a single node for a given datacenter with {@link org.openo.msb.wrapper.consul.option.QueryOptions}. - * - * GET /v1/catalog/node/{node}?dc={datacenter} - * - * @param catalogOptions Catalog specific options to use. - * @param queryOptions The Query Options to use. - * @return A list of matching {@link org.openo.msb.wrapper.consul.model.catalog.CatalogService} objects. - */ - public ConsulResponse getNode(String node, CatalogOptions catalogOptions, QueryOptions queryOptions) { - return response(webTarget.path("node").path(node), catalogOptions, queryOptions, - TYPE_CATALOG_NODE); - } -} diff --git a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/Consul.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/Consul.java deleted file mode 100644 index 2a55b7f..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/Consul.java +++ /dev/null @@ -1,299 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -package org.openo.msb.wrapper.consul; - -import java.net.MalformedURLException; -import java.net.URL; - -import javax.net.ssl.SSLContext; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; - -import org.openo.msb.wrapper.consul.util.Jackson; -import org.openo.msb.wrapper.consul.util.ObjectMapperContextResolver; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.guava.GuavaModule; -import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider; -import com.google.common.base.Optional; -import com.google.common.base.Predicate; -import com.google.common.collect.FluentIterable; -import com.google.common.net.HostAndPort; - -/** - * Client for interacting with the Consul HTTP API. - * - * @author rfast - */ -public class Consul { - - /** - * Default Consul HTTP API host. - */ - public static final String DEFAULT_HTTP_HOST = "localhost"; - - /** - * Default Consul HTTP API port. - */ - public static final int DEFAULT_HTTP_PORT = 8500; - - - - - private final CatalogClient catalogClient; - - private final HealthClient healthClient; - - - /** - * Private constructor. - * - * @param url The full URL of a running Consul instance. - * @param builder JAX-RS client builder instance. - */ - private Consul(String url, ClientBuilder builder, ObjectMapper mapper) { - - if (!FluentIterable.from(builder.getConfiguration().getClasses()) - .filter(new Predicate>() { - @Override - public boolean apply(final Class clazz) { - return JacksonJaxbJsonProvider.class.isAssignableFrom(clazz); - } - }).first().isPresent()) { - builder.register(JacksonJaxbJsonProvider.class); - } - final Client client = builder - .register(new ObjectMapperContextResolver(mapper)) - .build(); - - - if(url.endsWith("8500")){ - this.catalogClient = new CatalogClient(client.target(url).path("v1").path("catalog")); - this.healthClient = new HealthClient(client.target(url).path("v1").path("health")); - } - else{ - this.catalogClient = new CatalogClient(client.target(url).path("api").path("catalog").path("v1")); - this.healthClient = new HealthClient(client.target(url).path("api").path("health").path("v1")); - } - - -// agentClient.ping(); - } - - /** - * Creates a new client given a complete URL. - * - * @deprecated Use {@link Consul.Builder} - * - * @param url The Consul API URL. - * @param builder The JAX-RS client builder instance. - * @return A new client. - */ - @Deprecated - public static Consul newClient(String url, ClientBuilder builder, ObjectMapper mapper) { - return new Consul(url, builder, mapper); - } - - /** - * Creates a new client given a host and a port. - * - * @deprecated Use {@link Consul.Builder} - * - * @param host The Consul API hostname or IP. - * @param port The Consul port. - * @param builder The JAX-RS client builder instance. - * @return A new client. - */ - @Deprecated - public static Consul newClient(String host, int port, ClientBuilder builder, ObjectMapper mapper) { - try { - return new Consul(new URL("http", host, port, "").toString(), builder, mapper); - } catch (MalformedURLException e) { - throw new ConsulException("Bad Consul URL", e); - } - } - - /** - * Creates a new client given a host and a port. - * - * @deprecated Use {@link Consul.Builder} - * - * @param host The Consul API hostname or IP. - * @param port The Consul port. - * @return A new client. - */ - @Deprecated - public static Consul newClient(String host, int port) { - return newClient(host, port, ClientBuilder.newBuilder(), Jackson.MAPPER); - } - - /** - * Creates a new client given a host and a port. - * - * @deprecated Use {@link Consul.Builder} - * - * @return A new client. - */ - @Deprecated - public static Consul newClient() { - return newClient(DEFAULT_HTTP_HOST, DEFAULT_HTTP_PORT); - } - - - /** - * Get the Catalog HTTP client. - *

- * /v1/catalog - * - * @return The Catalog HTTP client. - */ - public CatalogClient catalogClient() { - return catalogClient; - } - - public HealthClient healthClient() { - return healthClient; - } - /** - * Creates a new {@link Builder} object. - * - * @return A new Consul builder. - */ - public static Builder builder() { - return new Builder(); - } - - /** - * Builder for {@link Consul} client objects. - */ - public static class Builder { - private URL url; - private Optional sslContext = Optional.absent(); - private ObjectMapper objectMapper = Jackson.MAPPER; - private ClientBuilder clientBuilder = ClientBuilder.newBuilder(); - - { - try { - url = new URL("http", "localhost", 8500, ""); - } catch (MalformedURLException e) { - throw new RuntimeException(e); - } - } - - /** - * Constructs a new builder. - */ - Builder() { - - } - - /** - * Sets the URL from a {@link URL} object. - * - * @param url The Consul agent URL. - * @return The builder. - */ - public Builder withUrl(URL url) { - this.url = url; - - return this; - } - - /** - * Sets the URL from a {@link HostAndPort} object. - * - * @param hostAndPort The Consul agent host and port. - * @return The builder. - */ - public Builder withHostAndPort(HostAndPort hostAndPort) { - try { - this.url = new URL("http", hostAndPort.getHostText(), hostAndPort.getPort(), ""); - } catch (MalformedURLException e) { - throw new RuntimeException(e); - } - - return this; - } - - /** - * Sets the URL from a string. - * - * @param url The Consul agent URL. - * @return The builder. - */ - public Builder withUrl(String url) { - try { - this.url = new URL(url); - } catch (MalformedURLException e) { - throw new RuntimeException(e); - } - - return this; - } - - /** - * Sets the {@link SSLContext} for the client. - * - * @param sslContext The SSL context for HTTPS agents. - * @return The builder. - */ - public Builder withSslContext(SSLContext sslContext) { - this.sslContext = Optional.of(sslContext); - - return this; - } - - /** - * Sets the {@link ObjectMapper} for the client. - * - * @param objectMapper The {@link ObjectMapper} to use. - * @return The builder. - */ - public Builder withObjectMapper(ObjectMapper objectMapper) { - this.objectMapper = objectMapper; - - objectMapper.registerModule(new GuavaModule()); - - return this; - } - - /** - * Sets the JAX-RS {@link ClientBuilder} to use. - * - * @param clientBuilder The JAX-RS builder. - * @return This builder. - */ - public Builder withClientBuilder(ClientBuilder clientBuilder) { - this.clientBuilder = clientBuilder; - - return this; - } - - /** - * Constructs a new {@link Consul} client. - * - * @return A new Consul client. - */ - public Consul build() { - if (this.sslContext.isPresent()) { - this.clientBuilder.sslContext(this.sslContext.get()); - } - - return new Consul(this.url.toExternalForm(), this.clientBuilder, this.objectMapper); - } - } -} diff --git a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/ConsulException.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/ConsulException.java deleted file mode 100644 index ce08ac9..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/ConsulException.java +++ /dev/null @@ -1,42 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -package org.openo.msb.wrapper.consul; - -/** - * Wraps an exception thrown whilst interacting with the Consul API. - */ -public class ConsulException extends RuntimeException { - - /** - * Constructs an instance of this class. - * - * @param message The exception message. - */ - public ConsulException(String message) { - super(message); - } - - /** - * Constructs an instance of this class. - * - * @param message The exception message. - * @param throwable The wrapped {@link java.lang.Throwable} object. - */ - public ConsulException(String message, Throwable throwable) { - super(message, throwable); - } -} diff --git a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/HealthClient.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/HealthClient.java deleted file mode 100644 index 1d4c00a..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/HealthClient.java +++ /dev/null @@ -1,247 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -package org.openo.msb.wrapper.consul; - -import static org.openo.msb.wrapper.consul.util.ClientUtil.response; - -import java.util.List; - -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.GenericType; - -import org.openo.msb.wrapper.consul.async.ConsulResponseCallback; -import org.openo.msb.wrapper.consul.model.ConsulResponse; -import org.openo.msb.wrapper.consul.model.health.ServiceHealth; -import org.openo.msb.wrapper.consul.option.CatalogOptions; -import org.openo.msb.wrapper.consul.option.QueryOptions; - -/** - * HTTP Client for /v1/health/ endpoints. - */ -public class HealthClient { - - - private static final GenericType> TYPE_SERVICE_HEALTH_LIST = - new GenericType>() {}; - - private final WebTarget webTarget; - - /** - * Constructs an instance of this class. - * - * @param webTarget The {@link javax.ws.rs.client.WebTarget} to base requests from. - */ - HealthClient(WebTarget webTarget) { - this.webTarget = webTarget; - } - - - - /** - * Retrieves the healthchecks for all healthy service instances. - * - * GET /v1/health/service/{service}?passing - * - * @param service The service to query. - * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a list of - * {@link com.orbitz.consul.model.health.HealthCheck} objects. - */ - public ConsulResponse> getHealthyServiceInstances(String service) { - return getHealthyServiceInstances(service, null, QueryOptions.BLANK); - } - - /** - * Retrieves the healthchecks for all healthy service instances in a given datacenter. - * - * GET /v1/health/service/{service}?dc={datacenter}&passing - * - * @param service The service to query. - * @param catalogOptions The catalog specific options to use. - * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a list of - * {@link com.orbitz.consul.model.health.HealthCheck} objects. - */ - public ConsulResponse> getHealthyServiceInstances(String service, CatalogOptions catalogOptions) { - return getHealthyServiceInstances(service, catalogOptions, QueryOptions.BLANK); - } - - /** - * Retrieves the healthchecks for all healthy service instances with {@link org.openo.msb.wrapper.consul.option.QueryOptions}. - * - * GET /v1/health/service/{service}?passing - * - * @param service The service to query. - * @param queryOptions The Query Options to use. - * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a list of - * {@link com.orbitz.consul.model.health.HealthCheck} objects. - */ - public ConsulResponse> getHealthyServiceInstances(String service, QueryOptions queryOptions) { - return getHealthyServiceInstances(service, null, queryOptions); - } - - /** - * Retrieves the healthchecks for all healthy service instances in a given datacenter with - * {@link org.openo.msb.wrapper.consul.option.QueryOptions}. - * - * GET /v1/health/service/{service}?dc={datacenter}&passing - * - * @param service The service to query. - * @param catalogOptions The catalog specific options to use. - * @param queryOptions The Query Options to use. - * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a list of - * {@link com.orbitz.consul.model.health.HealthCheck} objects. - */ - public ConsulResponse> getHealthyServiceInstances(String service, CatalogOptions catalogOptions, - QueryOptions queryOptions) { - return response(webTarget.path("service").path(service).queryParam("passing", "true"), - catalogOptions, queryOptions, TYPE_SERVICE_HEALTH_LIST); - } - - /** - * Asynchronously retrieves the healthchecks for all healthy service instances in a given - * datacenter with {@link org.openo.msb.wrapper.consul.option.QueryOptions}. - * - * GET /v1/health/service/{service}?dc={datacenter}&passing - * - * Experimental. - * - * @param service The service to query. - * @param catalogOptions The catalog specific options to use. - * @param queryOptions The Query Options to use. - * @param callback Callback implemented by callee to handle results. - */ - public void getHealthyServiceInstances(String service, CatalogOptions catalogOptions, - QueryOptions queryOptions, - ConsulResponseCallback> callback) { - response(webTarget.path("service").path(service).queryParam("passing", "true"), - catalogOptions, queryOptions, TYPE_SERVICE_HEALTH_LIST, callback); - } - - /** - * Asynchronously retrieves the healthchecks for all healthy service instances in a given - * datacenter with {@link org.openo.msb.wrapper.consul.option.QueryOptions}. - * - * GET /v1/health/service/{service}?dc={datacenter}&passing - * - * Experimental. - * - * @param service The service to query. - * @param queryOptions The Query Options to use. - * @param callback Callback implemented by callee to handle results. - */ - public void getHealthyServiceInstances(String service, QueryOptions queryOptions, - ConsulResponseCallback> callback) { - response(webTarget.path("service").path(service).queryParam("passing", "true"), - CatalogOptions.BLANK, queryOptions, TYPE_SERVICE_HEALTH_LIST, callback); - } - - /** - * Retrieves the healthchecks for all nodes. - * - * GET /v1/health/service/{service} - * - * @param service The service to query. - * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a list of - * {@link com.orbitz.consul.model.health.HealthCheck} objects. - */ - public ConsulResponse> getAllServiceInstances(String service) { - return getAllServiceInstances(service, null, QueryOptions.BLANK); - } - - /** - * Retrieves the healthchecks for all nodes in a given datacenter. - * - * GET /v1/health/service/{service}?dc={datacenter} - * - * @param service The service to query. - * @param catalogOptions The catalog specific options to use. - * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a list of - * {@link com.orbitz.consul.model.health.HealthCheck} objects. - */ - public ConsulResponse> getAllServiceInstances(String service, CatalogOptions catalogOptions) { - return getAllServiceInstances(service, catalogOptions, QueryOptions.BLANK); - } - - /** - * Retrieves the healthchecks for all nodes with {@link org.openo.msb.wrapper.consul.option.QueryOptions}. - * - * GET /v1/health/service/{service} - * - * @param service The service to query. - * @param queryOptions The Query Options to use. - * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a list of - * {@link com.orbitz.consul.model.health.HealthCheck} objects. - */ - public ConsulResponse> getAllServiceInstances(String service, QueryOptions queryOptions) { - return getAllServiceInstances(service, null, queryOptions); - } - - /** - * Retrieves the healthchecks for all nodes in a given datacenter with - * {@link org.openo.msb.wrapper.consul.option.QueryOptions}. - * - * GET /v1/health/service/{service}?dc={datacenter} - * - * @param service The service to query. - * @param catalogOptions The catalog specific options to use. - * @param queryOptions The Query Options to use. - * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a list of - * {@link com.orbitz.consul.model.health.HealthCheck} objects. - */ - public ConsulResponse> getAllServiceInstances(String service, CatalogOptions catalogOptions, - QueryOptions queryOptions) { - return response(webTarget.path("service").path(service), catalogOptions, queryOptions, - TYPE_SERVICE_HEALTH_LIST); - } - - /** - * Asynchronously retrieves the healthchecks for all nodes in a given - * datacenter with {@link org.openo.msb.wrapper.consul.option.QueryOptions}. - * - * GET /v1/health/service/{service}?dc={datacenter} - * - * Experimental. - * - * @param service The service to query. - * @param catalogOptions The catalog specific options to use. - * @param queryOptions The Query Options to use. - * @param callback Callback implemented by callee to handle results. - */ - public void getAllServiceInstances(String service, CatalogOptions catalogOptions, - QueryOptions queryOptions, - ConsulResponseCallback> callback) { - response(webTarget.path("service").path(service), catalogOptions, queryOptions, - TYPE_SERVICE_HEALTH_LIST, callback); - } - - /** - * Asynchronously retrieves the healthchecks for all nodes in a given - * datacenter with {@link org.openo.msb.wrapper.consul.option.QueryOptions}. - * - * GET /v1/health/service/{service}?dc={datacenter} - * - * Experimental. - * - * @param service The service to query. - * @param queryOptions The Query Options to use. - * @param callback Callback implemented by callee to handle results. - */ - public void getAllServiceInstances(String service, QueryOptions queryOptions, - ConsulResponseCallback> callback) { - response(webTarget.path("service").path(service), CatalogOptions.BLANK, - queryOptions, TYPE_SERVICE_HEALTH_LIST, callback); - } -} diff --git a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/async/ConsulResponseCallback.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/async/ConsulResponseCallback.java deleted file mode 100644 index 1db3cc5..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/async/ConsulResponseCallback.java +++ /dev/null @@ -1,42 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -package org.openo.msb.wrapper.consul.async; - -import org.openo.msb.wrapper.consul.model.ConsulResponse; - -/** - * For API calls that support long-polling, this callback is used to handle - * the result on success or failure for an async HTTP call. - * - * @param The Response type. - */ -public interface ConsulResponseCallback { - - /** - * Callback for a successful {@link org.openo.msb.wrapper.consul.model.ConsulResponse}. - * - * @param consulResponse The Consul response. - */ - void onComplete(ConsulResponse consulResponse); - - /** - * Callback for an unsuccessful request. - * - * @param throwable The exception thrown. - */ - void onFailure(Throwable throwable); -} diff --git a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/CatalogCache.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/CatalogCache.java deleted file mode 100644 index 8cafab4..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/CatalogCache.java +++ /dev/null @@ -1,70 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -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/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ConsulCache.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ConsulCache.java deleted file mode 100644 index e7494fa..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ConsulCache.java +++ /dev/null @@ -1,230 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -package org.openo.msb.wrapper.consul.cache; - -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Function; -import com.google.common.collect.ImmutableMap; - -import org.openo.msb.wrapper.consul.async.ConsulResponseCallback; -import org.openo.msb.wrapper.consul.model.ConsulResponse; -import org.openo.msb.wrapper.consul.option.QueryOptions; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.math.BigInteger; -import java.util.HashSet; -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 static com.google.common.base.Preconditions.checkState; - -/** - * A cache structure that can provide an up-to-date read-only - * map backed by consul data - * - * @param - */ -public class ConsulCache { - - enum State {latent, starting, started, stopped } - - private final static Logger LOGGER = LoggerFactory.getLogger(ConsulCache.class); - - private final AtomicReference latestIndex = new AtomicReference(null); - private final AtomicReference> lastResponse = new AtomicReference>(ImmutableMap.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 Function keyConversion; - private final CallbackConsumer callBackConsumer; - private final ConsulResponseCallback> responseCallback; - - ConsulCache( - Function keyConversion, - CallbackConsumer callbackConsumer) { - this(keyConversion, callbackConsumer, 10, TimeUnit.SECONDS); - } - - ConsulCache( - Function keyConversion, - CallbackConsumer callbackConsumer, - final long backoffDelayQty, - final TimeUnit backoffDelayUnit) { - - this.keyConversion = keyConversion; - this.callBackConsumer = callbackConsumer; - - this.responseCallback = new ConsulResponseCallback>() { - @Override - public void onComplete(ConsulResponse> consulResponse) { - - if (!isRunning()) { - return; - } - updateIndex(consulResponse); - ImmutableMap full = convertToMap(consulResponse); - - boolean changed = !full.equals(lastResponse.get()); -// LOGGER.info("node changed:"+changed+"----"+full); - if (changed) { - // changes - lastResponse.set(full); - } - - if (changed) { - for (Listener l : listeners) { - l.notify(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 ImmutableMap getMap() { - return lastResponse.get(); - } - - @VisibleForTesting - ImmutableMap convertToMap(final ConsulResponse> response) { - if (response == null || response.getResponse() == null || response.getResponse().isEmpty()) { - return ImmutableMap.of(); - } - - final ImmutableMap.Builder builder = ImmutableMap.builder(); - final Set keySet = new HashSet<>(); - for (final V v : response.getResponse()) { - final K key = keyConversion.apply(v); - if (key != null) { - if (!keySet.contains(key)) { - builder.put(key, v); - } 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(Map newValues); - } - - public boolean addListener(Listener listener) { - boolean added = listeners.add(listener); - if (state.get() == State.started) { - listener.notify(lastResponse.get()); - } - return added; - } - - public boolean removeListener(Listener listener) { - return listeners.remove(listener); - } - - @VisibleForTesting - protected State getState() { - return state.get(); - } -} diff --git a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ConsulCache4Map.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ConsulCache4Map.java deleted file mode 100644 index 84fd8ec..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ConsulCache4Map.java +++ /dev/null @@ -1,258 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -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/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/HealthCache.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/HealthCache.java deleted file mode 100644 index 0134eeb..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/HealthCache.java +++ /dev/null @@ -1,70 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -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/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ServiceCache.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ServiceCache.java deleted file mode 100644 index 80cdb7b..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ServiceCache.java +++ /dev/null @@ -1,50 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -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/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/ConsulResponse.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/ConsulResponse.java deleted file mode 100644 index 7d3b2e2..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/ConsulResponse.java +++ /dev/null @@ -1,80 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -package org.openo.msb.wrapper.consul.model; - -import com.google.common.base.Objects; - -import java.math.BigInteger; - -public class ConsulResponse { - - private final T response; - private final long lastContact; - private final boolean knownLeader; - private final BigInteger index; - - public ConsulResponse(T response, long lastContact, boolean knownLeader, BigInteger index) { - this.response = response; - this.lastContact = lastContact; - this.knownLeader = knownLeader; - this.index = index; - } - - public T getResponse() { - return response; - } - - public long getLastContact() { - return lastContact; - } - - public boolean isKnownLeader() { - return knownLeader; - } - - public BigInteger getIndex() { - return index; - } - - @Override - public String toString() { - return "ConsulResponse{" + - "response=" + response + - ", lastContact=" + lastContact + - ", knownLeader=" + knownLeader + - ", index=" + index + - '}'; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - ConsulResponse that = (ConsulResponse) o; - - return Objects.equal(this.response, that.response) && - Objects.equal(this.lastContact, that.lastContact) && - Objects.equal(this.knownLeader, that.knownLeader) && - Objects.equal(this.index, that.index); - } - - @Override - public int hashCode() { - return Objects.hashCode(response, lastContact, knownLeader, index); - } -} diff --git a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/CatalogNode.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/CatalogNode.java deleted file mode 100644 index 1221c08..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/CatalogNode.java +++ /dev/null @@ -1,41 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -package org.openo.msb.wrapper.consul.model.catalog; - -import java.util.Map; - -import org.openo.msb.wrapper.consul.model.health.Node; -import org.openo.msb.wrapper.consul.model.health.Service; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; - - -@JsonSerialize(as = ImmutableCatalogNode.class) -@JsonDeserialize(as = ImmutableCatalogNode.class) -@JsonIgnoreProperties(ignoreUnknown = true) -public abstract class CatalogNode { - - @JsonProperty("Node") - public abstract Node getNode(); - - @JsonProperty("Services") - public abstract Map getServices(); - -} diff --git a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/CatalogService.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/CatalogService.java deleted file mode 100644 index 5951fa7..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/CatalogService.java +++ /dev/null @@ -1,52 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -package org.openo.msb.wrapper.consul.model.catalog; - -import java.util.List; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; - - -@JsonSerialize(as = ImmutableCatalogService.class) -@JsonDeserialize(as = ImmutableCatalogService.class) -@JsonIgnoreProperties(ignoreUnknown = true) -public abstract class CatalogService { - - @JsonProperty("Node") - public abstract String getNode(); - - @JsonProperty("Address") - public abstract String getAddress(); - - @JsonProperty("ServiceName") - public abstract String getServiceName(); - - @JsonProperty("ServiceID") - public abstract String getServiceId(); - - @JsonProperty("ServiceAddress") - public abstract String getServiceAddress(); - - @JsonProperty("ServicePort") - public abstract int getServicePort(); - - @JsonProperty("ServiceTags") - public abstract List getServiceTags(); -} diff --git a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ImmutableCatalogNode.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ImmutableCatalogNode.java deleted file mode 100644 index f504168..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ImmutableCatalogNode.java +++ /dev/null @@ -1,306 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -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/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ImmutableCatalogService.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ImmutableCatalogService.java deleted file mode 100644 index 33d0e03..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ImmutableCatalogService.java +++ /dev/null @@ -1,626 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -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/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ServiceInfo.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ServiceInfo.java deleted file mode 100644 index 657af12..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ServiceInfo.java +++ /dev/null @@ -1,63 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -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/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ImmutableNode.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ImmutableNode.java deleted file mode 100644 index 8499ac3..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ImmutableNode.java +++ /dev/null @@ -1,266 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -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/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ImmutableService.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ImmutableService.java deleted file mode 100644 index 70eabf2..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ImmutableService.java +++ /dev/null @@ -1,478 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -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/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/Node.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/Node.java deleted file mode 100644 index 83e6632..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/Node.java +++ /dev/null @@ -1,35 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -package org.openo.msb.wrapper.consul.model.health; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; - - -@JsonSerialize(as = ImmutableNode.class) -@JsonDeserialize(as = ImmutableNode.class) -@JsonIgnoreProperties(ignoreUnknown = true) -public abstract class Node { - - @JsonProperty("Node") - public abstract String getNode(); - - @JsonProperty("Address") - public abstract String getAddress(); -} diff --git a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/Service.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/Service.java deleted file mode 100644 index 379e9f1..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/Service.java +++ /dev/null @@ -1,48 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -package org.openo.msb.wrapper.consul.model.health; - -import java.util.List; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.google.common.collect.ImmutableList; - - -@JsonSerialize(as = ImmutableService.class) -@JsonDeserialize(as = ImmutableService.class) -@JsonIgnoreProperties(ignoreUnknown = true) -public abstract class Service { - - @JsonProperty("ID") - public abstract String getId(); - - @JsonProperty("Service") - public abstract String getService(); - - @JsonProperty("Tags") - @JsonDeserialize(as = ImmutableList.class, contentAs = String.class) - public abstract List getTags(); - - @JsonProperty("Address") - public abstract String getAddress(); - - @JsonProperty("Port") - public abstract int getPort(); -} diff --git a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ServiceHealth.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ServiceHealth.java deleted file mode 100644 index d353b55..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ServiceHealth.java +++ /dev/null @@ -1,73 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -package org.openo.msb.wrapper.consul.model.health; - -import org.openo.msb.wrapper.consul.model.catalog.ServiceInfo; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.google.common.base.Objects; - - -@JsonIgnoreProperties(ignoreUnknown = true) -public class ServiceHealth { - - @JsonProperty("Node") - public Node node; - - @JsonProperty("Service") - public Service service; - - public Node getNode() { - return node; - } - - public void setNode(Node node) { - this.node = node; - } - - public Service getService() { - return service; - } - - public void setService(Service service) { - this.service = service; - } - - @Override - public boolean equals(Object other) - { - if(this == other) - return true; - if(other instanceof ServiceHealth) - { - ServiceHealth that = (ServiceHealth)other; - return Objects.equal(node, that.node) && Objects.equal(service, that.service); - } else - { - return false; - } - } - - @Override - public int hashCode() { - return Objects.hashCode(node, service); - } - - - -} diff --git a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/CatalogOptions.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/CatalogOptions.java deleted file mode 100644 index 34972fe..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/CatalogOptions.java +++ /dev/null @@ -1,39 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -package org.openo.msb.wrapper.consul.option; - -import static org.openo.msb.wrapper.consul.option.Options.optionallyAdd; - -import javax.ws.rs.client.WebTarget; - -import com.google.common.base.Optional; - - -public abstract class CatalogOptions implements ParamAdder { - - public abstract Optional getDatacenter(); - public abstract Optional getTag(); - - public static final CatalogOptions BLANK = ImmutableCatalogOptions.builder().build(); - - @Override - public final WebTarget apply(final WebTarget input) { - WebTarget added = optionallyAdd(input, "dc", getDatacenter()); - added = optionallyAdd(added, "tag", getTag()); - return added; - } -} diff --git a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ConsistencyMode.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ConsistencyMode.java deleted file mode 100644 index 52afa00..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ConsistencyMode.java +++ /dev/null @@ -1,21 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -package org.openo.msb.wrapper.consul.option; - -public enum ConsistencyMode { - DEFAULT, STALE, CONSISTENT -} diff --git a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ImmutableCatalogOptions.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ImmutableCatalogOptions.java deleted file mode 100644 index 35eda18..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ImmutableCatalogOptions.java +++ /dev/null @@ -1,251 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -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/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ImmutableQueryOptions.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ImmutableQueryOptions.java deleted file mode 100644 index 87a0f8a..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ImmutableQueryOptions.java +++ /dev/null @@ -1,531 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -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/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/Options.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/Options.java deleted file mode 100644 index bccdd5c..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/Options.java +++ /dev/null @@ -1,29 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -package org.openo.msb.wrapper.consul.option; - -import com.google.common.base.Optional; - -import javax.ws.rs.client.WebTarget; - -public class Options { - private Options(){}; - - static WebTarget optionallyAdd(WebTarget input, String key, Optional val) { - return val.isPresent() ? input.queryParam(key, val.get()) : input; - } -} diff --git a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ParamAdder.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ParamAdder.java deleted file mode 100644 index 56f97f6..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ParamAdder.java +++ /dev/null @@ -1,23 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -package org.openo.msb.wrapper.consul.option; - -import com.google.common.base.Function; - -import javax.ws.rs.client.WebTarget; - -public interface ParamAdder extends Function {} diff --git a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/QueryOptions.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/QueryOptions.java deleted file mode 100644 index 63d201e..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/QueryOptions.java +++ /dev/null @@ -1,100 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -package org.openo.msb.wrapper.consul.option; - -import static com.google.common.base.Preconditions.checkArgument; -import static org.openo.msb.wrapper.consul.option.Options.optionallyAdd; - -import java.math.BigInteger; - -import javax.ws.rs.client.WebTarget; - -import com.google.common.base.Optional; - -/** - * Container for common query options used by the Consul API. - */ - -public abstract class QueryOptions implements ParamAdder { - - public static final QueryOptions BLANK = ImmutableQueryOptions.builder().build(); - - public abstract Optional getWait(); - public abstract Optional getToken(); - public abstract Optional getIndex(); - public abstract Optional getNear(); - - - public ConsistencyMode getConsistencyMode() { - return ConsistencyMode.DEFAULT; - } - - - public boolean isBlocking() { - return getWait().isPresent(); - } - - - public boolean hasToken() { - return getToken().isPresent(); - } - - - void validate() { - if (isBlocking()) { - checkArgument(getIndex().isPresent(), "If wait is specified, index must also be specified"); - } - } - - public static ImmutableQueryOptions.Builder blockSeconds(int seconds, BigInteger index) { - return blockBuilder("s", seconds, index); - } - - public static ImmutableQueryOptions.Builder blockMinutes(int minutes, BigInteger index) { - return blockBuilder("m", minutes, index); - } - - private static ImmutableQueryOptions.Builder blockBuilder(String identifier, int qty, BigInteger index) { - return ImmutableQueryOptions.builder() - .wait(String.format("%s%s", qty, identifier)) - .index(index); - } - - @Override - public WebTarget apply(WebTarget input) { - - WebTarget added = input; - switch (getConsistencyMode()) { - case CONSISTENT: - added = added.queryParam("consistent", ""); - break; - case STALE: - added = added.queryParam("stale", ""); - break; - } - - if (isBlocking()) { - added = added.queryParam("wait", getWait().get()) - .queryParam("index", String.valueOf(getIndex().get())); - } - - added = optionallyAdd(added, "token", getToken()); - added = optionallyAdd(added, "near", getToken()); - - return added; - } -} diff --git a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/Base64EncodingDeserializer.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/Base64EncodingDeserializer.java deleted file mode 100644 index 58af732..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/Base64EncodingDeserializer.java +++ /dev/null @@ -1,45 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -package org.openo.msb.wrapper.consul.util; - -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.google.common.base.Optional; -import com.google.common.io.BaseEncoding; -import org.apache.commons.lang3.StringUtils; - -import java.io.IOException; - -/** - * For use with JSON fields that Consul Base 64 encodes. - */ -public class Base64EncodingDeserializer extends JsonDeserializer> { - - /** - * {@inheritDoc} - */ - @Override - public Optional deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { - String value = p.getValueAsString(); - - if (StringUtils.isNotEmpty(value)) { - return Optional.of(new String(BaseEncoding.base64().decode(value))); - } - return Optional.absent(); - } -} diff --git a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/ClientUtil.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/ClientUtil.java deleted file mode 100644 index ab184c1..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/ClientUtil.java +++ /dev/null @@ -1,246 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -package org.openo.msb.wrapper.consul.util; - -import com.google.common.base.Optional; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; - -import javax.ws.rs.ServerErrorException; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.client.InvocationCallback; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.GenericType; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; - -import org.openo.msb.wrapper.consul.ConsulException; -import org.openo.msb.wrapper.consul.async.ConsulResponseCallback; -import org.openo.msb.wrapper.consul.model.ConsulResponse; -import org.openo.msb.wrapper.consul.option.CatalogOptions; -import org.openo.msb.wrapper.consul.option.ParamAdder; -import org.openo.msb.wrapper.consul.option.QueryOptions; - -import java.math.BigInteger; -import java.util.List; -import java.util.Map; - -/** - * A collection of stateless utility methods for use in constructing - * requests and responses to the Consul HTTP API. - */ -public class ClientUtil { - - /** - * Applies all key/values from the params map to query string parameters. - * - * @param webTarget The JAX-RS target to apply the query parameters. - * @param params Map of parameters. - * @return The new target with the parameters applied. - */ - public static WebTarget queryParams(WebTarget webTarget, Map params) { - WebTarget target = webTarget; - - if(params != null) { - for(Map.Entry entry : params.entrySet()) { - target = target.queryParam(entry.getKey(), entry.getValue()); - } - } - - return target; - } - - /** - * Given a {@link org.openo.msb.wrapper.consul.option.ParamAdder} object, adds the - * appropriate query string parameters to the request being built. - * - * @param webTarget The base {@link javax.ws.rs.client.WebTarget}. - * @param paramAdder will add specific params to the target. - * @return A {@link javax.ws.rs.client.WebTarget} with all appropriate query - * string parameters. - */ - public static WebTarget addParams(WebTarget webTarget, ParamAdder paramAdder) { - return paramAdder == null ? webTarget : paramAdder.apply(webTarget); - } - - /** - * Generates a {@link org.openo.msb.wrapper.consul.model.ConsulResponse} for a specific datacenter, - * set of {@link org.openo.msb.wrapper.consul.option.QueryOptions}, and a result type. - * - * @param target The base {@link javax.ws.rs.client.WebTarget}. - * @param catalogOptions Catalog specific options to use. - * @param queryOptions The Query Options to use. - * @param type The generic type to marshall the resulting data to. - * @param The result type. - * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse}. - */ - public static ConsulResponse response(WebTarget target, CatalogOptions catalogOptions, - QueryOptions queryOptions, - GenericType type) { - target = addParams(target, catalogOptions); - target = addParams(target, queryOptions); - - return response(target, type); - } - - /** - * Generates a {@link org.openo.msb.wrapper.consul.model.ConsulResponse} for a specific datacenter, - * set of {@link org.openo.msb.wrapper.consul.option.QueryOptions}, and a result type. - * - * @param target The base {@link javax.ws.rs.client.WebTarget}. - * @param catalogOptions Catalog specific options to use. - * @param queryOptions The Query Options to use. - * @param type The generic type to marshall the resulting data to. - * @param The result type. - */ - public static void response(WebTarget target, CatalogOptions catalogOptions, - QueryOptions queryOptions, - GenericType type, - ConsulResponseCallback callback) { - - target = addParams(target, catalogOptions); - target = addParams(target, queryOptions); - - response(target, type, callback); - } - - /** - * Given a {@link javax.ws.rs.client.WebTarget} object and a type to marshall - * the result JSON into, complete the HTTP GET request. - * - * @param webTarget The JAX-RS target. - * @param responseType The class to marshall the JSON into. - * @param The class to marshall the JSON into. - * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing the result. - */ - public static ConsulResponse response(WebTarget webTarget, GenericType responseType) { - Response response = webTarget.request().accept(MediaType.APPLICATION_JSON_TYPE).get(); - - return consulResponse(responseType, response); - } - - /** - * Given a {@link javax.ws.rs.client.WebTarget} object and a type to marshall - * the result JSON into, complete the HTTP GET request. - * - * @param webTarget The JAX-RS target. - * @param responseType The class to marshall the JSON into. - * @param callback The callback object to handle the result on a different thread. - * @param The class to marshall the JSON into. - */ - public static void response(WebTarget webTarget, final GenericType responseType, - final ConsulResponseCallback callback) { - webTarget.request().accept(MediaType.APPLICATION_JSON_TYPE).async().get(new InvocationCallback() { - - @Override - public void completed(Response response) { - try { - callback.onComplete(consulResponse(responseType, response)); - } catch (Exception ex) { - callback.onFailure(ex); - } - } - - @Override - public void failed(Throwable throwable) { - callback.onFailure(throwable); - } - }); - } - - /** - * Extracts Consul specific headers and adds them to a {@link org.openo.msb.wrapper.consul.model.ConsulResponse} - * object, which also contains the returned JSON entity. - * - * @param responseType The class to marshall the JSON to. - * @param response The HTTP response. - * @param The class to marshall the JSON to. - * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} object. - */ - private static ConsulResponse consulResponse(GenericType responseType, Response response) { - handleErrors(response); - - String indexHeaderValue = response.getHeaderString("X-Consul-Index"); - String lastContactHeaderValue = response.getHeaderString("X-Consul-Lastcontact"); - String knownLeaderHeaderValue = response.getHeaderString("X-Consul-Knownleader"); - - BigInteger index = new BigInteger(indexHeaderValue); - long lastContact = lastContactHeaderValue == null ? -1 : Long.valueOf(lastContactHeaderValue); - boolean knownLeader = knownLeaderHeaderValue == null ? false : Boolean.valueOf(knownLeaderHeaderValue); - - ConsulResponse consulResponse = new ConsulResponse(readResponse(response, responseType), lastContact, knownLeader, index); - - response.close(); - - return consulResponse; - } - - /** - * Converts a {@link Response} object to the generic type provided, or an empty - * representation if appropriate - * - * @param response response - * @param responseType response type - * @param - * @return the re - */ - private static T readResponse(Response response, GenericType responseType) { - if (response.getStatus() == Response.Status.NOT_FOUND.getStatusCode()) { - // would be nice I knew a better way to do this - if (responseType.getRawType() == List.class) { - return (T) ImmutableList.of(); - } else if (responseType.getRawType() == Optional.class) { - return (T) Optional.absent(); - } else if(responseType.getRawType() == Map.class) { - return (T) ImmutableMap.of(); - } else { - // Not sure if this case will be reached, but if it is it'll be nice to know - throw new IllegalStateException("Cannot determine empty representation for " + responseType.getRawType()); - } - } - return response.readEntity(responseType); - } - - /** - * Since Consul returns plain text when an error occurs, check for - * unsuccessful HTTP status code, and throw an exception with the text - * from Consul as the message. - * - * @param response The HTTP response. - */ - public static void handleErrors(Response response) { - - if (response.getStatusInfo().getFamily() == Response.Status.Family.SUCCESSFUL - || response.getStatus() == Response.Status.NOT_FOUND.getStatusCode()) { - // not an error - return; - } - - try { - final String message = response.hasEntity() ? response.readEntity(String.class) : null; - if (response.getStatusInfo().getFamily() == Response.Status.Family.SERVER_ERROR) { - throw new ServerErrorException(message, response); - } else { - throw new WebApplicationException(message, response); - } - } catch (Exception e) { - throw new ConsulException(e.getLocalizedMessage(), e); - } finally { - response.close(); - } - } -} diff --git a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/Jackson.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/Jackson.java deleted file mode 100644 index 64feeac..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/Jackson.java +++ /dev/null @@ -1,34 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -package org.openo.msb.wrapper.consul.util; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.guava.GuavaModule; - -public class Jackson { - - public static final ObjectMapper MAPPER = newObjectMapper(); - - private static ObjectMapper newObjectMapper() { - ObjectMapper mapper = new ObjectMapper(); - mapper.registerModule(new GuavaModule()); - return mapper; - } - - private Jackson() {} - -} diff --git a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/ObjectMapperContextResolver.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/ObjectMapperContextResolver.java deleted file mode 100644 index c438967..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/ObjectMapperContextResolver.java +++ /dev/null @@ -1,35 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -package org.openo.msb.wrapper.consul.util; - -import javax.ws.rs.ext.ContextResolver; - -import com.fasterxml.jackson.databind.ObjectMapper; - -public class ObjectMapperContextResolver implements ContextResolver { - - private final ObjectMapper objectMapper; - public ObjectMapperContextResolver(final ObjectMapper objectMapper) { - this.objectMapper = objectMapper; - } - - @Override - public ObjectMapper getContext(final Class type) { - return objectMapper; - } - -} diff --git a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/SecondsDeserializer.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/SecondsDeserializer.java deleted file mode 100644 index 17438f9..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/SecondsDeserializer.java +++ /dev/null @@ -1,43 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -package org.openo.msb.wrapper.consul.util; - -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import org.apache.commons.lang3.StringUtils; - -import java.io.IOException; - -/** - * Deserializes Consul time values with "s" suffix to {@link Long} objects. - */ -public class SecondsDeserializer extends JsonDeserializer { - - @Override - public Long deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException { - String value = p.getValueAsString(); - - if (StringUtils.isNotEmpty(value)) { - value = value.replaceAll("[a-zA-Z]", ""); - return Long.valueOf(value); - } else { - return null; - } - } -} diff --git a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/SecondsSerializer.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/SecondsSerializer.java deleted file mode 100644 index 1420e18..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/SecondsSerializer.java +++ /dev/null @@ -1,34 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -package org.openo.msb.wrapper.consul.util; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; - -import java.io.IOException; - -/** - * Serializes a time field (e.g. TTL) as seconds. - */ -public class SecondsSerializer extends JsonSerializer { - - @Override - public void serialize(Long value, JsonGenerator gen, SerializerProvider serializers) throws IOException { - gen.writeString(String.format("%ss", value)); - } -} diff --git a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/UnsignedLongDeserializer.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/UnsignedLongDeserializer.java deleted file mode 100644 index 802c048..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/UnsignedLongDeserializer.java +++ /dev/null @@ -1,37 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -package org.openo.msb.wrapper.consul.util; - -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.google.common.primitives.UnsignedLongs; - -import java.io.IOException; - -/** - * @author sgardner - * @since 2015.02.28 - */ -public class UnsignedLongDeserializer extends JsonDeserializer { - @Override - public Long deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { - String sValue = jp.getValueAsString(); - return UnsignedLongs.decode(sValue); - } -} diff --git a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/serviceListener/IMicroServiceChangeListener.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/serviceListener/IMicroServiceChangeListener.java deleted file mode 100644 index 098f71d..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/serviceListener/IMicroServiceChangeListener.java +++ /dev/null @@ -1,33 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - - -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/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/serviceListener/MicroServiceChangeListener.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/serviceListener/MicroServiceChangeListener.java deleted file mode 100644 index d41a0d0..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/serviceListener/MicroServiceChangeListener.java +++ /dev/null @@ -1,306 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -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/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/FileUtil.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/FileUtil.java deleted file mode 100644 index 25c0888..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/FileUtil.java +++ /dev/null @@ -1,66 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -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/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/JacksonJsonUtil.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/JacksonJsonUtil.java deleted file mode 100644 index 531b0d4..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/JacksonJsonUtil.java +++ /dev/null @@ -1,120 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -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/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/JedisUtil.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/JedisUtil.java deleted file mode 100644 index 7075249..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/JedisUtil.java +++ /dev/null @@ -1,221 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -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/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/MetricsUtil.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/MetricsUtil.java deleted file mode 100644 index b07737b..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/MetricsUtil.java +++ /dev/null @@ -1,24 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -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/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/MicroServiceDB.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/MicroServiceDB.java deleted file mode 100644 index ed22745..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/MicroServiceDB.java +++ /dev/null @@ -1,423 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -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/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/MicroServiceUtil.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/MicroServiceUtil.java deleted file mode 100644 index 67fd60f..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/MicroServiceUtil.java +++ /dev/null @@ -1,96 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -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/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/RegExpTestUtil.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/RegExpTestUtil.java deleted file mode 100644 index 88e83b0..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/RegExpTestUtil.java +++ /dev/null @@ -1,88 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -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/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/RouteUtil.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/RouteUtil.java deleted file mode 100644 index 5f60bd8..0000000 --- a/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/RouteUtil.java +++ /dev/null @@ -1,135 +0,0 @@ -/** -* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -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 - - - - - ZENAP API-DOC. - - ZENAP API-DOC - - - - - index.html - index.xhtml - index.htm - index.jsp - - - - diff --git a/apiroute/apiroute-service/src/main/resources/api-doc/css/reset.css b/apiroute/apiroute-service/src/main/resources/api-doc/css/reset.css deleted file mode 100644 index b2b0789..0000000 --- a/apiroute/apiroute-service/src/main/resources/api-doc/css/reset.css +++ /dev/null @@ -1,125 +0,0 @@ -/* http://meyerweb.com/eric/tools/css/reset/ v2.0 | 20110126 */ -html, -body, -div, -span, -applet, -object, -iframe, -h1, -h2, -h3, -h4, -h5, -h6, -p, -blockquote, -pre, -a, -abbr, -acronym, -address, -big, -cite, -code, -del, -dfn, -em, -img, -ins, -kbd, -q, -s, -samp, -small, -strike, -strong, -sub, -sup, -tt, -var, -b, -u, -i, -center, -dl, -dt, -dd, -ol, -ul, -li, -fieldset, -form, -label, -legend, -table, -caption, -tbody, -tfoot, -thead, -tr, -th, -td, -article, -aside, -canvas, -details, -embed, -figure, -figcaption, -footer, -header, -hgroup, -menu, -nav, -output, -ruby, -section, -summary, -time, -mark, -audio, -video { - margin: 0; - padding: 0; - border: 0; - font-size: 100%; - font: inherit; - vertical-align: baseline; -} -/* HTML5 display-role reset for older browsers */ -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -menu, -nav, -section { - display: block; -} -body { - line-height: 1; -} -ol, -ul { - list-style: none; -} -blockquote, -q { - quotes: none; -} -blockquote:before, -blockquote:after, -q:before, -q:after { - content: ''; - content: none; -} -table { - border-collapse: collapse; - border-spacing: 0; -} diff --git a/apiroute/apiroute-service/src/main/resources/api-doc/css/screen.css b/apiroute/apiroute-service/src/main/resources/api-doc/css/screen.css deleted file mode 100644 index 32b199b..0000000 --- a/apiroute/apiroute-service/src/main/resources/api-doc/css/screen.css +++ /dev/null @@ -1,1256 +0,0 @@ -/* Original style from softwaremaniacs.org (c) Ivan Sagalaev */ -.swagger-section pre code { - display: block; - padding: 0.5em; - background: #F0F0F0; -} -.swagger-section pre code, -.swagger-section pre .subst, -.swagger-section pre .tag .title, -.swagger-section pre .lisp .title, -.swagger-section pre .clojure .built_in, -.swagger-section pre .nginx .title { - color: black; -} -.swagger-section pre .string, -.swagger-section pre .title, -.swagger-section pre .constant, -.swagger-section pre .parent, -.swagger-section pre .tag .value, -.swagger-section pre .rules .value, -.swagger-section pre .rules .value .number, -.swagger-section pre .preprocessor, -.swagger-section pre .ruby .symbol, -.swagger-section pre .ruby .symbol .string, -.swagger-section pre .aggregate, -.swagger-section pre .template_tag, -.swagger-section pre .django .variable, -.swagger-section pre .smalltalk .class, -.swagger-section pre .addition, -.swagger-section pre .flow, -.swagger-section pre .stream, -.swagger-section pre .bash .variable, -.swagger-section pre .apache .tag, -.swagger-section pre .apache .cbracket, -.swagger-section pre .tex .command, -.swagger-section pre .tex .special, -.swagger-section pre .erlang_repl .function_or_atom, -.swagger-section pre .markdown .header { - color: #800; -} -.swagger-section pre .comment, -.swagger-section pre .annotation, -.swagger-section pre .template_comment, -.swagger-section pre .diff .header, -.swagger-section pre .chunk, -.swagger-section pre .markdown .blockquote { - color: #888; -} -.swagger-section pre .number, -.swagger-section pre .date, -.swagger-section pre .regexp, -.swagger-section pre .literal, -.swagger-section pre .smalltalk .symbol, -.swagger-section pre .smalltalk .char, -.swagger-section pre .go .constant, -.swagger-section pre .change, -.swagger-section pre .markdown .bullet, -.swagger-section pre .markdown .link_url { - color: #080; -} -.swagger-section pre .label, -.swagger-section pre .javadoc, -.swagger-section pre .ruby .string, -.swagger-section pre .decorator, -.swagger-section pre .filter .argument, -.swagger-section pre .localvars, -.swagger-section pre .array, -.swagger-section pre .attr_selector, -.swagger-section pre .important, -.swagger-section pre .pseudo, -.swagger-section pre .pi, -.swagger-section pre .doctype, -.swagger-section pre .deletion, -.swagger-section pre .envvar, -.swagger-section pre .shebang, -.swagger-section pre .apache .sqbracket, -.swagger-section pre .nginx .built_in, -.swagger-section pre .tex .formula, -.swagger-section pre .erlang_repl .reserved, -.swagger-section pre .prompt, -.swagger-section pre .markdown .link_label, -.swagger-section pre .vhdl .attribute, -.swagger-section pre .clojure .attribute, -.swagger-section pre .coffeescript .property { - color: #8888ff; -} -.swagger-section pre .keyword, -.swagger-section pre .id, -.swagger-section pre .phpdoc, -.swagger-section pre .title, -.swagger-section pre .built_in, -.swagger-section pre .aggregate, -.swagger-section pre .css .tag, -.swagger-section pre .javadoctag, -.swagger-section pre .phpdoc, -.swagger-section pre .yardoctag, -.swagger-section pre .smalltalk .class, -.swagger-section pre .winutils, -.swagger-section pre .bash .variable, -.swagger-section pre .apache .tag, -.swagger-section pre .go .typename, -.swagger-section pre .tex .command, -.swagger-section pre .markdown .strong, -.swagger-section pre .request, -.swagger-section pre .status { - font-weight: bold; -} -.swagger-section pre .markdown .emphasis { - font-style: italic; -} -.swagger-section pre .nginx .built_in { - font-weight: normal; -} -.swagger-section pre .coffeescript .javascript, -.swagger-section pre .javascript .xml, -.swagger-section pre .tex .formula, -.swagger-section pre .xml .javascript, -.swagger-section pre .xml .vbscript, -.swagger-section pre .xml .css, -.swagger-section pre .xml .cdata { - opacity: 0.5; -} -.swagger-section .swagger-ui-wrap { - line-height: 1; - font-family: "Droid Sans", sans-serif; - max-width: 960px; - margin-left: auto; - margin-right: auto; -} -.swagger-section .swagger-ui-wrap b, -.swagger-section .swagger-ui-wrap strong { - font-family: "Droid Sans", sans-serif; - font-weight: bold; -} -.swagger-section .swagger-ui-wrap q, -.swagger-section .swagger-ui-wrap blockquote { - quotes: none; -} -.swagger-section .swagger-ui-wrap p { - line-height: 1.4em; - padding: 0 0 10px; - color: #333333; -} -.swagger-section .swagger-ui-wrap q:before, -.swagger-section .swagger-ui-wrap q:after, -.swagger-section .swagger-ui-wrap blockquote:before, -.swagger-section .swagger-ui-wrap blockquote:after { - content: none; -} -.swagger-section .swagger-ui-wrap .heading_with_menu h1, -.swagger-section .swagger-ui-wrap .heading_with_menu h2, -.swagger-section .swagger-ui-wrap .heading_with_menu h3, -.swagger-section .swagger-ui-wrap .heading_with_menu h4, -.swagger-section .swagger-ui-wrap .heading_with_menu h5, -.swagger-section .swagger-ui-wrap .heading_with_menu h6 { - display: block; - clear: none; - float: left; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; - width: 60%; -} -.swagger-section .swagger-ui-wrap table { - border-collapse: collapse; - border-spacing: 0; -} -.swagger-section .swagger-ui-wrap table thead tr th { - padding: 5px; - font-size: 0.9em; - color: #666666; - border-bottom: 1px solid #999999; -} -.swagger-section .swagger-ui-wrap table tbody tr:last-child td { - border-bottom: none; -} -.swagger-section .swagger-ui-wrap table tbody tr.offset { - background-color: #f0f0f0; -} -.swagger-section .swagger-ui-wrap table tbody tr td { - padding: 6px; - font-size: 0.9em; - border-bottom: 1px solid #cccccc; - vertical-align: top; - line-height: 1.3em; -} -.swagger-section .swagger-ui-wrap ol { - margin: 0px 0 10px; - padding: 0 0 0 18px; - list-style-type: decimal; -} -.swagger-section .swagger-ui-wrap ol li { - padding: 5px 0px; - font-size: 0.9em; - color: #333333; -} -.swagger-section .swagger-ui-wrap ol, -.swagger-section .swagger-ui-wrap ul { - list-style: none; -} -.swagger-section .swagger-ui-wrap h1 a, -.swagger-section .swagger-ui-wrap h2 a, -.swagger-section .swagger-ui-wrap h3 a, -.swagger-section .swagger-ui-wrap h4 a, -.swagger-section .swagger-ui-wrap h5 a, -.swagger-section .swagger-ui-wrap h6 a { - text-decoration: none; -} -.swagger-section .swagger-ui-wrap h1 a:hover, -.swagger-section .swagger-ui-wrap h2 a:hover, -.swagger-section .swagger-ui-wrap h3 a:hover, -.swagger-section .swagger-ui-wrap h4 a:hover, -.swagger-section .swagger-ui-wrap h5 a:hover, -.swagger-section .swagger-ui-wrap h6 a:hover { - text-decoration: underline; -} -.swagger-section .swagger-ui-wrap h1 span.divider, -.swagger-section .swagger-ui-wrap h2 span.divider, -.swagger-section .swagger-ui-wrap h3 span.divider, -.swagger-section .swagger-ui-wrap h4 span.divider, -.swagger-section .swagger-ui-wrap h5 span.divider, -.swagger-section .swagger-ui-wrap h6 span.divider { - color: #aaaaaa; -} -.swagger-section .swagger-ui-wrap a { - color: #547f00; -} -.swagger-section .swagger-ui-wrap a img { - border: none; -} -.swagger-section .swagger-ui-wrap article, -.swagger-section .swagger-ui-wrap aside, -.swagger-section .swagger-ui-wrap details, -.swagger-section .swagger-ui-wrap figcaption, -.swagger-section .swagger-ui-wrap figure, -.swagger-section .swagger-ui-wrap footer, -.swagger-section .swagger-ui-wrap header, -.swagger-section .swagger-ui-wrap hgroup, -.swagger-section .swagger-ui-wrap menu, -.swagger-section .swagger-ui-wrap nav, -.swagger-section .swagger-ui-wrap section, -.swagger-section .swagger-ui-wrap summary { - display: block; -} -.swagger-section .swagger-ui-wrap pre { - font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace; - background-color: #fcf6db; - border: 1px solid #e5e0c6; - padding: 10px; -} -.swagger-section .swagger-ui-wrap pre code { - line-height: 1.6em; - background: none; -} -.swagger-section .swagger-ui-wrap .content > .content-type > div > label { - clear: both; - display: block; - color: #0F6AB4; - font-size: 1.1em; - margin: 0; - padding: 15px 0 5px; -} -.swagger-section .swagger-ui-wrap .content pre { - font-size: 12px; - margin-top: 5px; - padding: 5px; -} -.swagger-section .swagger-ui-wrap .icon-btn { - cursor: pointer; -} -.swagger-section .swagger-ui-wrap .info_title { - padding-bottom: 10px; - font-weight: bold; - font-size: 25px; -} -.swagger-section .swagger-ui-wrap p.big, -.swagger-section .swagger-ui-wrap div.big p { - font-size: 1em; - margin-bottom: 10px; -} -.swagger-section .swagger-ui-wrap form.fullwidth ol li.string input, -.swagger-section .swagger-ui-wrap form.fullwidth ol li.url input, -.swagger-section .swagger-ui-wrap form.fullwidth ol li.text textarea, -.swagger-section .swagger-ui-wrap form.fullwidth ol li.numeric input { - width: 500px !important; -} -.swagger-section .swagger-ui-wrap .info_license { - padding-bottom: 5px; -} -.swagger-section .swagger-ui-wrap .info_tos { - padding-bottom: 5px; -} -.swagger-section .swagger-ui-wrap .message-fail { - color: #cc0000; -} -.swagger-section .swagger-ui-wrap .info_url { - padding-bottom: 5px; -} -.swagger-section .swagger-ui-wrap .info_email { - padding-bottom: 5px; -} -.swagger-section .swagger-ui-wrap .info_name { - padding-bottom: 5px; -} -.swagger-section .swagger-ui-wrap .info_description { - padding-bottom: 10px; - font-size: 15px; -} -.swagger-section .swagger-ui-wrap .markdown ol li, -.swagger-section .swagger-ui-wrap .markdown ul li { - padding: 3px 0px; - line-height: 1.4em; - color: #333333; -} -.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.string input, -.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.url input, -.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.numeric input { - display: block; - padding: 4px; - width: auto; - clear: both; -} -.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.string input.title, -.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.url input.title, -.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.numeric input.title { - font-size: 1.3em; -} -.swagger-section .swagger-ui-wrap table.fullwidth { - width: 100%; -} -.swagger-section .swagger-ui-wrap .model-signature { - font-family: "Droid Sans", sans-serif; - font-size: 1em; - line-height: 1.5em; -} -.swagger-section .swagger-ui-wrap .model-signature .signature-nav a { - text-decoration: none; - color: #AAA; -} -.swagger-section .swagger-ui-wrap .model-signature .signature-nav a:hover { - text-decoration: underline; - color: black; -} -.swagger-section .swagger-ui-wrap .model-signature .signature-nav .selected { - color: black; - text-decoration: none; -} -.swagger-section .swagger-ui-wrap .model-signature .propType { - color: #5555aa; -} -.swagger-section .swagger-ui-wrap .model-signature pre:hover { - background-color: #ffffdd; -} -.swagger-section .swagger-ui-wrap .model-signature pre { - font-size: .85em; - line-height: 1.2em; - overflow: auto; - max-height: 200px; - cursor: pointer; -} -.swagger-section .swagger-ui-wrap .model-signature ul.signature-nav { - display: block; - margin: 0; - padding: 0; -} -.swagger-section .swagger-ui-wrap .model-signature ul.signature-nav li:last-child { - padding-right: 0; - border-right: none; -} -.swagger-section .swagger-ui-wrap .model-signature ul.signature-nav li { - float: left; - margin: 0 5px 5px 0; - padding: 2px 5px 2px 0; - border-right: 1px solid #ddd; -} -.swagger-section .swagger-ui-wrap .model-signature .propOpt { - color: #555; -} -.swagger-section .swagger-ui-wrap .model-signature .snippet small { - font-size: 0.75em; -} -.swagger-section .swagger-ui-wrap .model-signature .propOptKey { - font-style: italic; -} -.swagger-section .swagger-ui-wrap .model-signature .description .strong { - font-weight: bold; - color: #000; - font-size: .9em; -} -.swagger-section .swagger-ui-wrap .model-signature .description div { - font-size: 0.9em; - line-height: 1.5em; - margin-left: 1em; -} -.swagger-section .swagger-ui-wrap .model-signature .description .stronger { - font-weight: bold; - color: #000; -} -.swagger-section .swagger-ui-wrap .model-signature .description .propWrap .optionsWrapper { - border-spacing: 0; - position: absolute; - background-color: #ffffff; - border: 1px solid #bbbbbb; - display: none; - font-size: 11px; - max-width: 400px; - line-height: 30px; - color: black; - padding: 5px; - margin-left: 10px; -} -.swagger-section .swagger-ui-wrap .model-signature .description .propWrap .optionsWrapper th { - text-align: center; - background-color: #eeeeee; - border: 1px solid #bbbbbb; - font-size: 11px; - color: #666666; - font-weight: bold; - padding: 5px; - line-height: 15px; -} -.swagger-section .swagger-ui-wrap .model-signature .description .propWrap .optionsWrapper .optionName { - font-weight: bold; -} -.swagger-section .swagger-ui-wrap .model-signature .propName { - font-weight: bold; -} -.swagger-section .swagger-ui-wrap .model-signature .signature-container { - clear: both; -} -.swagger-section .swagger-ui-wrap .body-textarea { - width: 300px; - height: 100px; - border: 1px solid #aaa; -} -.swagger-section .swagger-ui-wrap .markdown p code, -.swagger-section .swagger-ui-wrap .markdown li code { - font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace; - background-color: #f0f0f0; - color: black; - padding: 1px 3px; -} -.swagger-section .swagger-ui-wrap .required { - font-weight: bold; -} -.swagger-section .swagger-ui-wrap input.parameter { - width: 300px; - border: 1px solid #aaa; -} -.swagger-section .swagger-ui-wrap h1 { - color: black; - font-size: 1.5em; - line-height: 1.3em; - padding: 10px 0 10px 0; - font-family: "Droid Sans", sans-serif; - font-weight: bold; -} -.swagger-section .swagger-ui-wrap .heading_with_menu { - float: none; - clear: both; - overflow: hidden; - display: block; -} -.swagger-section .swagger-ui-wrap .heading_with_menu ul { - display: block; - clear: none; - float: right; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; - margin-top: 10px; -} -.swagger-section .swagger-ui-wrap h2 { - color: black; - font-size: 1.3em; - padding: 10px 0 10px 0; -} -.swagger-section .swagger-ui-wrap h2 a { - color: black; -} -.swagger-section .swagger-ui-wrap h2 span.sub { - font-size: 0.7em; - color: #999999; - font-style: italic; -} -.swagger-section .swagger-ui-wrap h2 span.sub a { - color: #777777; -} -.swagger-section .swagger-ui-wrap span.weak { - color: #666666; -} -.swagger-section .swagger-ui-wrap .message-success { - color: #89BF04; -} -.swagger-section .swagger-ui-wrap caption, -.swagger-section .swagger-ui-wrap th, -.swagger-section .swagger-ui-wrap td { - text-align: left; - font-weight: normal; - vertical-align: middle; -} -.swagger-section .swagger-ui-wrap .code { - font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace; -} -.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.text textarea { - font-family: "Droid Sans", sans-serif; - height: 250px; - padding: 4px; - display: block; - clear: both; -} -.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.select select { - display: block; - clear: both; -} -.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.boolean { - float: none; - clear: both; - overflow: hidden; - display: block; -} -.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.boolean label { - display: block; - float: left; - clear: none; - margin: 0; - padding: 0; -} -.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.boolean input { - display: block; - float: left; - clear: none; - margin: 0 5px 0 0; -} -.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.required label { - color: black; -} -.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li label { - display: block; - clear: both; - width: auto; - padding: 0 0 3px; - color: #666666; -} -.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li label abbr { - padding-left: 3px; - color: #888888; -} -.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li p.inline-hints { - margin-left: 0; - font-style: italic; - font-size: 0.9em; - margin: 0; -} -.swagger-section .swagger-ui-wrap form.formtastic fieldset.buttons { - margin: 0; - padding: 0; -} -.swagger-section .swagger-ui-wrap span.blank, -.swagger-section .swagger-ui-wrap span.empty { - color: #888888; - font-style: italic; -} -.swagger-section .swagger-ui-wrap .markdown h3 { - color: #547f00; -} -.swagger-section .swagger-ui-wrap .markdown h4 { - color: #666666; -} -.swagger-section .swagger-ui-wrap .markdown pre { - font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace; - background-color: #fcf6db; - border: 1px solid #e5e0c6; - padding: 10px; - margin: 0 0 10px 0; -} -.swagger-section .swagger-ui-wrap .markdown pre code { - line-height: 1.6em; -} -.swagger-section .swagger-ui-wrap div.gist { - margin: 20px 0 25px 0 !important; -} -.swagger-section .swagger-ui-wrap ul#resources { - font-family: "Droid Sans", sans-serif; - font-size: 0.9em; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource { - border-bottom: 1px solid #dddddd; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource:hover div.heading h2 a, -.swagger-section .swagger-ui-wrap ul#resources li.resource.active div.heading h2 a { - color: black; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource:hover div.heading ul.options li a, -.swagger-section .swagger-ui-wrap ul#resources li.resource.active div.heading ul.options li a { - color: #555555; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource:last-child { - border-bottom: none; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading { - border: 1px solid transparent; - float: none; - clear: both; - overflow: hidden; - display: block; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options { - overflow: hidden; - padding: 0; - display: block; - clear: none; - float: right; - margin: 14px 10px 0 0; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li { - float: left; - clear: none; - margin: 0; - padding: 2px 10px; - border-right: 1px solid #dddddd; - color: #666666; - font-size: 0.9em; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li a { - color: #aaaaaa; - text-decoration: none; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li a:hover { - text-decoration: underline; - color: black; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li a:hover, -.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li a:active, -.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li a.active { - text-decoration: underline; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li:first-child, -.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li.first { - padding-left: 0; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li:last-child, -.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li.last { - padding-right: 0; - border-right: none; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options:first-child, -.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options.first { - padding-left: 0; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading h2 { - color: #999999; - padding-left: 0; - display: block; - clear: none; - float: left; - font-family: "Droid Sans", sans-serif; - font-weight: bold; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading h2 a { - color: #999999; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading h2 a:hover { - color: black; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation { - float: none; - clear: both; - overflow: hidden; - display: block; - margin: 0 0 10px; - padding: 0; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading { - float: none; - clear: both; - overflow: hidden; - display: block; - margin: 0; - padding: 0; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 { - display: block; - clear: none; - float: left; - width: auto; - margin: 0; - padding: 0; - line-height: 1.1em; - color: black; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span.path { - padding-left: 10px; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span.path a { - color: black; - text-decoration: none; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span.path a:hover { - text-decoration: underline; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span.http_method a { - text-transform: uppercase; - text-decoration: none; - color: white; - display: inline-block; - width: 50px; - font-size: 0.7em; - text-align: center; - padding: 7px 0 4px; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - -o-border-radius: 2px; - -ms-border-radius: 2px; - -khtml-border-radius: 2px; - border-radius: 2px; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span { - margin: 0; - padding: 0; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading ul.options { - overflow: hidden; - padding: 0; - display: block; - clear: none; - float: right; - margin: 6px 10px 0 0; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading ul.options li { - float: left; - clear: none; - margin: 0; - padding: 2px 10px; - font-size: 0.9em; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading ul.options li a { - text-decoration: none; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading ul.options li.access { - color: black; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content { - border-top: none; - padding: 10px; - -moz-border-radius-bottomleft: 6px; - -webkit-border-bottom-left-radius: 6px; - -o-border-bottom-left-radius: 6px; - -ms-border-bottom-left-radius: 6px; - -khtml-border-bottom-left-radius: 6px; - border-bottom-left-radius: 6px; - -moz-border-radius-bottomright: 6px; - -webkit-border-bottom-right-radius: 6px; - -o-border-bottom-right-radius: 6px; - -ms-border-bottom-right-radius: 6px; - -khtml-border-bottom-right-radius: 6px; - border-bottom-right-radius: 6px; - margin: 0 0 20px; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content h4 { - font-size: 1.1em; - margin: 0; - padding: 15px 0 5px; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.sandbox_header { - float: none; - clear: both; - overflow: hidden; - display: block; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.sandbox_header a { - padding: 4px 0 0 10px; - display: inline-block; - font-size: 0.9em; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.sandbox_header input.submit { - display: block; - clear: none; - float: left; - padding: 6px 8px; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.sandbox_header span.response_throbber { - background-image: url('../images/throbber.gif'); - width: 128px; - height: 16px; - display: block; - clear: none; - float: right; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content form input[type='text'].error { - outline: 2px solid black; - outline-color: #cc0000; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.response div.block pre { - font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace; - padding: 10px; - font-size: 0.9em; - max-height: 400px; - overflow-y: auto; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading { - background-color: #f9f2e9; - border: 1px solid #f0e0ca; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading h3 span.http_method a { - background-color: #c5862b; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li { - border-right: 1px solid #dddddd; - border-right-color: #f0e0ca; - color: #c5862b; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li a { - color: #c5862b; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content { - background-color: #faf5ee; - border: 1px solid #f0e0ca; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content h4 { - color: #c5862b; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content div.sandbox_header a { - color: #dcb67f; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading { - background-color: #fcffcd; - border: 1px solid black; - border-color: #ffd20f; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading h3 span.http_method a { - text-transform: uppercase; - background-color: #ffd20f; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li { - border-right: 1px solid #dddddd; - border-right-color: #ffd20f; - color: #ffd20f; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li a { - color: #ffd20f; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content { - background-color: #fcffcd; - border: 1px solid black; - border-color: #ffd20f; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content h4 { - color: #ffd20f; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content div.sandbox_header a { - color: #6fc992; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading { - background-color: #f5e8e8; - border: 1px solid #e8c6c7; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading h3 span.http_method a { - text-transform: uppercase; - background-color: #a41e22; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li { - border-right: 1px solid #dddddd; - border-right-color: #e8c6c7; - color: #a41e22; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li a { - color: #a41e22; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content { - background-color: #f7eded; - border: 1px solid #e8c6c7; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content h4 { - color: #a41e22; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content div.sandbox_header a { - color: #c8787a; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading { - background-color: #e7f6ec; - border: 1px solid #c3e8d1; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading h3 span.http_method a { - background-color: #10a54a; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li { - border-right: 1px solid #dddddd; - border-right-color: #c3e8d1; - color: #10a54a; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li a { - color: #10a54a; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content { - background-color: #ebf7f0; - border: 1px solid #c3e8d1; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content h4 { - color: #10a54a; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content div.sandbox_header a { - color: #6fc992; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading { - background-color: #FCE9E3; - border: 1px solid #F5D5C3; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading h3 span.http_method a { - background-color: #D38042; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li { - border-right: 1px solid #dddddd; - border-right-color: #f0cecb; - color: #D38042; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li a { - color: #D38042; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content { - background-color: #faf0ef; - border: 1px solid #f0cecb; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content h4 { - color: #D38042; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content div.sandbox_header a { - color: #dcb67f; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading { - background-color: #e7f0f7; - border: 1px solid #c3d9ec; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading h3 span.http_method a { - background-color: #0f6ab4; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li { - border-right: 1px solid #dddddd; - border-right-color: #c3d9ec; - color: #0f6ab4; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li a { - color: #0f6ab4; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content { - background-color: #ebf3f9; - border: 1px solid #c3d9ec; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content h4 { - color: #0f6ab4; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content div.sandbox_header a { - color: #6fa5d2; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.heading { - background-color: #e7f0f7; - border: 1px solid #c3d9ec; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.heading h3 span.http_method a { - background-color: #0f6ab4; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.heading ul.options li { - border-right: 1px solid #dddddd; - border-right-color: #c3d9ec; - color: #0f6ab4; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.heading ul.options li a { - color: #0f6ab4; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.content { - background-color: #ebf3f9; - border: 1px solid #c3d9ec; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.content h4 { - color: #0f6ab4; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.content div.sandbox_header a { - color: #6fa5d2; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content, -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content, -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content, -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content, -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content, -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content { - border-top: none; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li:last-child, -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li:last-child, -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li:last-child, -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li:last-child, -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li:last-child, -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li:last-child, -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li.last, -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li.last, -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li.last, -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li.last, -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li.last, -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li.last { - padding-right: 0; - border-right: none; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations ul.options li a:hover, -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations ul.options li a:active, -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations ul.options li a.active { - text-decoration: underline; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations ul.options li:first-child, -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations ul.options li.first { - padding-left: 0; -} -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations:first-child, -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations.first { - padding-left: 0; -} -.swagger-section .swagger-ui-wrap p#colophon { - margin: 0 15px 40px 15px; - padding: 10px 0; - font-size: 0.8em; - border-top: 1px solid #dddddd; - font-family: "Droid Sans", sans-serif; - color: #999999; - font-style: italic; -} -.swagger-section .swagger-ui-wrap p#colophon a { - text-decoration: none; - color: #547f00; -} -.swagger-section .swagger-ui-wrap h3 { - color: black; - font-size: 1.1em; - padding: 10px 0 10px 0; -} -.swagger-section .swagger-ui-wrap .markdown ol, -.swagger-section .swagger-ui-wrap .markdown ul { - font-family: "Droid Sans", sans-serif; - margin: 5px 0 10px; - padding: 0 0 0 18px; - list-style-type: disc; -} -.swagger-section .swagger-ui-wrap form.form_box { - background-color: #ebf3f9; - border: 1px solid #c3d9ec; - padding: 10px; -} -.swagger-section .swagger-ui-wrap form.form_box label { - color: #0f6ab4 !important; -} -.swagger-section .swagger-ui-wrap form.form_box input[type=submit] { - display: block; - padding: 10px; -} -.swagger-section .swagger-ui-wrap form.form_box p.weak { - font-size: 0.8em; -} -.swagger-section .swagger-ui-wrap form.form_box p { - font-size: 0.9em; - padding: 0 0 15px; - color: #7e7b6d; -} -.swagger-section .swagger-ui-wrap form.form_box p a { - color: #646257; -} -.swagger-section .swagger-ui-wrap form.form_box p strong { - color: black; -} -.swagger-section .title { - font-style: bold; -} -.swagger-section .secondary_form { - display: none; -} -.swagger-section .main_image { - display: block; - margin-left: auto; - margin-right: auto; -} -.swagger-section .oauth_body { - margin-left: 100px; - margin-right: 100px; -} -.swagger-section .oauth_submit { - text-align: center; -} -.swagger-section .api-popup-dialog { - z-index: 10000; - position: absolute; - width: 500px; - background: #FFF; - padding: 20px; - border: 1px solid #ccc; - border-radius: 5px; - display: none; - font-size: 13px; - color: #777; -} -.swagger-section .api-popup-dialog .api-popup-title { - font-size: 24px; - padding: 10px 0; -} -.swagger-section .api-popup-dialog .api-popup-title { - font-size: 24px; - padding: 10px 0; -} -.swagger-section .api-popup-dialog p.error-msg { - padding-left: 5px; - padding-bottom: 5px; -} -.swagger-section .api-popup-dialog button.api-popup-authbtn { - height: 30px; -} -.swagger-section .api-popup-dialog button.api-popup-cancel { - height: 30px; -} -.swagger-section .api-popup-scopes { - padding: 10px 20px; -} -.swagger-section .api-popup-scopes li { - padding: 5px 0; - line-height: 20px; -} -.swagger-section .api-popup-scopes .api-scope-desc { - padding-left: 20px; - font-style: italic; -} -.swagger-section .api-popup-scopes li input { - position: relative; - top: 2px; -} -.swagger-section .api-popup-actions { - padding-top: 10px; -} -.swagger-section .access { - float: right; -} -.swagger-section .auth { - float: right; -} -.swagger-section #api_information_panel { - position: absolute; - background: #FFF; - border: 1px solid #ccc; - border-radius: 5px; - display: none; - font-size: 13px; - max-width: 300px; - line-height: 30px; - color: black; - padding: 5px; -} -.swagger-section #api_information_panel p .api-msg-enabled { - color: green; -} -.swagger-section #api_information_panel p .api-msg-disabled { - color: red; -} -.swagger-section .api-ic { - height: 18px; - vertical-align: middle; - display: inline-block; - background: url(../images/explorer_icons.png) no-repeat; -} -.swagger-section .ic-info { - background-position: 0 0; - width: 18px; - margin-top: -7px; - margin-left: 4px; -} -.swagger-section .ic-warning { - background-position: -60px 0; - width: 18px; - margin-top: -7px; - margin-left: 4px; -} -.swagger-section .ic-error { - background-position: -30px 0; - width: 18px; - margin-top: -7px; - margin-left: 4px; -} -.swagger-section .ic-off { - background-position: -90px 0; - width: 58px; - margin-top: -4px; - cursor: pointer; -} -.swagger-section .ic-on { - background-position: -160px 0; - width: 58px; - margin-top: -4px; - cursor: pointer; -} -.swagger-section #header { - background-color: #89bf04; - padding: 14px; -} -.swagger-section #header a#logo { - font-size: 1.5em; - font-weight: bold; - text-decoration: none; - background: transparent url(../images/logo_small.png) no-repeat left center; - padding: 20px 0 20px 40px; - color: white; -} -.swagger-section #header form#api_selector { - display: block; - clear: none; - float: right; -} -.swagger-section #header form#api_selector .input { - display: block; - clear: none; - float: left; - margin: 0 10px 0 0; -} -.swagger-section #header form#api_selector .input input#input_apiKey { - width: 200px; -} -.swagger-section #header form#api_selector .input input#input_baseUrl { - width: 400px; -} -.swagger-section #header form#api_selector .input a#explore { - display: block; - text-decoration: none; - font-weight: bold; - padding: 6px 8px; - font-size: 0.9em; - color: white; - background-color: #547f00; - -moz-border-radius: 4px; - -webkit-border-radius: 4px; - -o-border-radius: 4px; - -ms-border-radius: 4px; - -khtml-border-radius: 4px; - border-radius: 4px; -} -.swagger-section #header form#api_selector .input a#explore:hover { - background-color: #547f00; -} -.swagger-section #header form#api_selector .input input { - font-size: 0.9em; - padding: 3px; - margin: 0; -} -.swagger-section #content_message { - margin: 10px 15px; - font-style: italic; - color: #999999; -} -.swagger-section #message-bar { - min-height: 30px; - text-align: center; - padding-top: 10px; -} diff --git a/apiroute/apiroute-service/src/main/resources/api-doc/css/typography.css b/apiroute/apiroute-service/src/main/resources/api-doc/css/typography.css deleted file mode 100644 index 27c3751..0000000 --- a/apiroute/apiroute-service/src/main/resources/api-doc/css/typography.css +++ /dev/null @@ -1,26 +0,0 @@ -/* droid-sans-regular - latin */ -@font-face { - font-family: 'Droid Sans'; - font-style: normal; - font-weight: 400; - src: url('../fonts/droid-sans-v6-latin-regular.eot'); /* IE9 Compat Modes */ - src: local('Droid Sans'), local('DroidSans'), - url('../fonts/droid-sans-v6-latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ - url('../fonts/droid-sans-v6-latin-regular.woff2') format('woff2'), /* Super Modern Browsers */ - url('../fonts/droid-sans-v6-latin-regular.woff') format('woff'), /* Modern Browsers */ - url('../fonts/droid-sans-v6-latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */ - url('../fonts/droid-sans-v6-latin-regular.svg#DroidSans') format('svg'); /* Legacy iOS */ -} -/* droid-sans-700 - latin */ -@font-face { - font-family: 'Droid Sans'; - font-style: normal; - font-weight: 700; - src: url('../fonts/droid-sans-v6-latin-700.eot'); /* IE9 Compat Modes */ - src: local('Droid Sans Bold'), local('DroidSans-Bold'), - url('../fonts/droid-sans-v6-latin-700.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ - url('../fonts/droid-sans-v6-latin-700.woff2') format('woff2'), /* Super Modern Browsers */ - url('../fonts/droid-sans-v6-latin-700.woff') format('woff'), /* Modern Browsers */ - url('../fonts/droid-sans-v6-latin-700.ttf') format('truetype'), /* Safari, Android, iOS */ - url('../fonts/droid-sans-v6-latin-700.svg#DroidSans') format('svg'); /* Legacy iOS */ -} diff --git a/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.eot b/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.eot deleted file mode 100644 index 2250b71..0000000 Binary files a/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.eot and /dev/null differ diff --git a/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.svg b/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.svg deleted file mode 100644 index a54bbbb..0000000 --- a/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.svg +++ /dev/null @@ -1,411 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.ttf b/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.ttf deleted file mode 100644 index 523cb92..0000000 Binary files a/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.ttf and /dev/null differ diff --git a/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.woff b/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.woff deleted file mode 100644 index 67e3e25..0000000 Binary files a/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.woff and /dev/null differ diff --git a/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.woff2 b/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.woff2 deleted file mode 100644 index 1e726a7..0000000 Binary files a/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.woff2 and /dev/null differ diff --git a/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.eot b/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.eot deleted file mode 100644 index ac2698e..0000000 Binary files a/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.eot and /dev/null differ diff --git a/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.svg b/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.svg deleted file mode 100644 index d9f2a21..0000000 --- a/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.svg +++ /dev/null @@ -1,403 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.ttf b/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.ttf deleted file mode 100644 index 76aede2..0000000 Binary files a/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.ttf and /dev/null differ diff --git a/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.woff b/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.woff deleted file mode 100644 index abf1989..0000000 Binary files a/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.woff and /dev/null differ diff --git a/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.woff2 b/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.woff2 deleted file mode 100644 index 9f93f74..0000000 Binary files a/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.woff2 and /dev/null differ diff --git a/apiroute/apiroute-service/src/main/resources/api-doc/images/explorer_icons.png b/apiroute/apiroute-service/src/main/resources/api-doc/images/explorer_icons.png deleted file mode 100644 index ed9d2ff..0000000 Binary files a/apiroute/apiroute-service/src/main/resources/api-doc/images/explorer_icons.png and /dev/null differ diff --git a/apiroute/apiroute-service/src/main/resources/api-doc/images/logo_small.png b/apiroute/apiroute-service/src/main/resources/api-doc/images/logo_small.png deleted file mode 100644 index 5496a65..0000000 Binary files a/apiroute/apiroute-service/src/main/resources/api-doc/images/logo_small.png and /dev/null differ diff --git a/apiroute/apiroute-service/src/main/resources/api-doc/images/pet_store_api.png b/apiroute/apiroute-service/src/main/resources/api-doc/images/pet_store_api.png deleted file mode 100644 index f9f9cd4..0000000 Binary files a/apiroute/apiroute-service/src/main/resources/api-doc/images/pet_store_api.png and /dev/null differ diff --git a/apiroute/apiroute-service/src/main/resources/api-doc/images/throbber.gif b/apiroute/apiroute-service/src/main/resources/api-doc/images/throbber.gif deleted file mode 100644 index 0639388..0000000 Binary files a/apiroute/apiroute-service/src/main/resources/api-doc/images/throbber.gif and /dev/null differ diff --git a/apiroute/apiroute-service/src/main/resources/api-doc/images/wordnik_api.png b/apiroute/apiroute-service/src/main/resources/api-doc/images/wordnik_api.png deleted file mode 100644 index dca4f14..0000000 Binary files a/apiroute/apiroute-service/src/main/resources/api-doc/images/wordnik_api.png and /dev/null differ diff --git a/apiroute/apiroute-service/src/main/resources/api-doc/index.html b/apiroute/apiroute-service/src/main/resources/api-doc/index.html deleted file mode 100644 index 1ebb459..0000000 --- a/apiroute/apiroute-service/src/main/resources/api-doc/index.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - Swagger UI - - - - - - - - - - - - - - - - - - - - - - - - - -

- -
 
-
- - - diff --git a/apiroute/apiroute-service/src/main/resources/api-doc/js/iframeResizer/iframeResizer.contentWindow.min.js b/apiroute/apiroute-service/src/main/resources/api-doc/js/iframeResizer/iframeResizer.contentWindow.min.js deleted file mode 100644 index 9330e0f..0000000 --- a/apiroute/apiroute-service/src/main/resources/api-doc/js/iframeResizer/iframeResizer.contentWindow.min.js +++ /dev/null @@ -1,10 +0,0 @@ -/*! 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/apiroute/apiroute-service/src/main/resources/api-doc/js/iframeResizer/iframeResizer.min.js b/apiroute/apiroute-service/src/main/resources/api-doc/js/iframeResizer/iframeResizer.min.js deleted file mode 100644 index e8f4bcb..0000000 --- a/apiroute/apiroute-service/src/main/resources/api-doc/js/iframeResizer/iframeResizer.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/*! 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/apiroute/apiroute-service/src/main/resources/iui-route/i18n/loadi18nApp_iui-route_view.js b/apiroute/apiroute-service/src/main/resources/iui-route/i18n/loadi18nApp_iui-route_view.js deleted file mode 100644 index ad8dc39..0000000 --- a/apiroute/apiroute-service/src/main/resources/iui-route/i18n/loadi18nApp_iui-route_view.js +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -function loadPropertiesSideMenu(lang, propertiesFileNamePrefix, propertiesFilePath){ - jQuery.i18n.properties({ - // language:lang, - name:propertiesFileNamePrefix, - path:propertiesFilePath, // 资源文件路径 - mode:'map', // 用 Map 的方式使用资源文件中的值 - callback: function() {// 加载成功后设置显示内容 - - var i18nItems = $('[name_i18n=org_openo_msb_route_ui_i18n]'); - for(var i=0;i - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
- - -
-
-
- - - -
- - - - -
- - - -
- -
-
- - -
-
- - {{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/apiroute/apiroute-service/src/main/resources/iui-route/js/avalon.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/avalon.js deleted file mode 100644 index a22bb7d..0000000 --- a/apiroute/apiroute-service/src/main/resources/iui-route/js/avalon.js +++ /dev/null @@ -1,5819 +0,0 @@ -/*================================================== - Copyright (c) 2013-2015 司徒正美 and other contributors - http://www.cnblogs.com/rubylouvre/ - https://github.com/RubyLouvre - http://weibo.com/jslouvre/ - - Released under the MIT license - avalon.js 1.45 built in 2015.7.17 - support IE6+ and other browsers - ==================================================*/ -(function(global, factory) { - - if (typeof module === "object" && typeof module.exports === "object") { - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get avalon. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var avalon = require("avalon")(window); - module.exports = global.document ? factory(global, true) : function(w) { - if (!w.document) { - throw new Error("Avalon requires a window with a document") - } - return factory(w) - } - } else { - factory(global) - } - -// Pass this if window is not defined yet -}(typeof window !== "undefined" ? window : this, function(window, noGlobal){ - -/********************************************************************* - * 全局变量及方法 * - **********************************************************************/ -var expose = new Date() - 0 -//http://stackoverflow.com/questions/7290086/javascript-use-strict-and-nicks-find-global-function -var DOC = window.document -var head = DOC.getElementsByTagName("head")[0] //HEAD元素 -var ifGroup = head.insertBefore(document.createElement("avalon"), head.firstChild) //避免IE6 base标签BUG -ifGroup.innerHTML = "X" -ifGroup.setAttribute("ms-skip", "1") -ifGroup.className = "avalonHide" -var rnative = /\[native code\]/ //判定是否原生函数 -function log() { - if (window.console && avalon.config.debug) { - // http://stackoverflow.com/questions/8785624/how-to-safely-wrap-console-log - Function.apply.call(console.log, console, arguments) - } -} - - -var subscribers = "$" + expose -var otherRequire = window.require -var otherDefine = window.define -var innerRequire -var stopRepeatAssign = false -var rword = /[^, ]+/g //切割字符串为一个个小块,以空格或豆号分开它们,结合replace实现字符串的forEach -var rcomplexType = /^(?:object|array)$/ -var rsvg = /^\[object SVG\w*Element\]$/ -var rwindow = /^\[object (?:Window|DOMWindow|global)\]$/ -var oproto = Object.prototype -var ohasOwn = oproto.hasOwnProperty -var serialize = oproto.toString -var ap = Array.prototype -var aslice = ap.slice -var Registry = {} //将函数曝光到此对象上,方便访问器收集依赖 -var W3C = window.dispatchEvent -var root = DOC.documentElement -var avalonFragment = DOC.createDocumentFragment() -var cinerator = DOC.createElement("div") -var class2type = {} -"Boolean Number String Function Array Date RegExp Object Error".replace(rword, function (name) { - class2type["[object " + name + "]"] = name.toLowerCase() -}) - - -function noop() { -} - - -function oneObject(array, val) { - if (typeof array === "string") { - array = array.match(rword) || [] - } - var result = {}, - value = val !== void 0 ? val : 1 - for (var i = 0, n = array.length; i < n; i++) { - result[array[i]] = value - } - return result -} - -//生成UUID http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript -var generateID = function (prefix) { - prefix = prefix || "avalon" - return String(Math.random() + Math.random()).replace(/\d\.\d{4}/, prefix) -} -function IE() { - if (window.VBArray) { - var mode = document.documentMode - return mode ? mode : window.XMLHttpRequest ? 7 : 6 - } else { - return NaN - } -} -var IEVersion = IE() - -avalon = function (el) { //创建jQuery式的无new 实例化结构 - return new avalon.init(el) -} - -avalon.profile = function () { - if (window.console && avalon.config.profile) { - Function.apply.call(console.log, console, arguments) - } -} - -/*视浏览器情况采用最快的异步回调*/ -avalon.nextTick = new function () {// jshint ignore:line - var tickImmediate = window.setImmediate - var tickObserver = window.MutationObserver - var tickPost = W3C && window.postMessage - if (tickImmediate) { - return tickImmediate.bind(window) - } - - var queue = [] - function callback() { - var n = queue.length - for (var i = 0; i < n; i++) { - queue[i]() - } - queue = queue.slice(n) - } - - if (tickObserver) { - var node = document.createTextNode("avalon") - new tickObserver(callback).observe(node, {characterData: true})// jshint ignore:line - return function (fn) { - queue.push(fn) - node.data = Math.random() - } - } - - if (tickPost) { - window.addEventListener("message", function (e) { - var source = e.source - if ((source === window || source === null) && e.data === "process-tick") { - e.stopPropagation() - callback() - } - }) - - return function (fn) { - queue.push(fn) - window.postMessage('process-tick', '*') - } - } - - return function (fn) { - setTimeout(fn, 0) - } -}// jshint ignore:line -/********************************************************************* - * avalon的静态方法定义区 * - **********************************************************************/ -avalon.init = function (el) { - this[0] = this.element = el -} -avalon.fn = avalon.prototype = avalon.init.prototype - -avalon.type = function (obj) { //取得目标的类型 - if (obj == null) { - return String(obj) - } - // 早期的webkit内核浏览器实现了已废弃的ecma262v4标准,可以将正则字面量当作函数使用,因此typeof在判定正则时会返回function - return typeof obj === "object" || typeof obj === "function" ? - class2type[serialize.call(obj)] || "object" : - typeof obj -} - -var isFunction = typeof alert === "object" ? function (fn) { - try { - return /^\s*\bfunction\b/.test(fn + "") - } catch (e) { - return false - } -} : function (fn) { - return serialize.call(fn) === "[object Function]" -} -avalon.isFunction = isFunction - -avalon.isWindow = function (obj) { - if (!obj) - return false - // 利用IE678 window == document为true,document == window竟然为false的神奇特性 - // 标准浏览器及IE9,IE10等使用 正则检测 - return obj == obj.document && obj.document != obj //jshint ignore:line -} - -function isWindow(obj) { - return rwindow.test(serialize.call(obj)) -} -if (isWindow(window)) { - avalon.isWindow = isWindow -} -var enu -for (enu in avalon({})) { - break -} -var enumerateBUG = enu !== "0" //IE6下为true, 其他为false -/*判定是否是一个朴素的javascript对象(Object),不是DOM对象,不是BOM对象,不是自定义类的实例*/ -avalon.isPlainObject = function (obj, key) { - if (!obj || avalon.type(obj) !== "object" || obj.nodeType || avalon.isWindow(obj)) { - return false; - } - try { //IE内置对象没有constructor - if (obj.constructor && !ohasOwn.call(obj, "constructor") && !ohasOwn.call(obj.constructor.prototype, "isPrototypeOf")) { - return false; - } - } catch (e) { //IE8 9会在这里抛错 - return false; - } - if (enumerateBUG) { - for (key in obj) { - return ohasOwn.call(obj, key) - } - } - for (key in obj) { - } - return key === void 0 || ohasOwn.call(obj, key) -} -if (rnative.test(Object.getPrototypeOf)) { - avalon.isPlainObject = function (obj) { - // 简单的 typeof obj === "object"检测,会致使用isPlainObject(window)在opera下通不过 - return serialize.call(obj) === "[object Object]" && Object.getPrototypeOf(obj) === oproto - } -} -//与jQuery.extend方法,可用于浅拷贝,深拷贝 -avalon.mix = avalon.fn.mix = function () { - var options, name, src, copy, copyIsArray, clone, - target = arguments[0] || {}, - i = 1, - length = arguments.length, - deep = false - - // 如果第一个参数为布尔,判定是否深拷贝 - if (typeof target === "boolean") { - deep = target - target = arguments[1] || {} - i++ - } - - //确保接受方为一个复杂的数据类型 - if (typeof target !== "object" && !isFunction(target)) { - target = {} - } - - //如果只有一个参数,那么新成员添加于mix所在的对象上 - if (i === length) { - target = this - i-- - } - - for (; i < length; i++) { - //只处理非空参数 - if ((options = arguments[i]) != null) { - for (name in options) { - src = target[name] - try { - copy = options[name] //当options为VBS对象时报错 - } catch (e) { - continue - } - - // 防止环引用 - if (target === copy) { - continue - } - if (deep && copy && (avalon.isPlainObject(copy) || (copyIsArray = Array.isArray(copy)))) { - - if (copyIsArray) { - copyIsArray = false - clone = src && Array.isArray(src) ? src : [] - - } else { - clone = src && avalon.isPlainObject(src) ? src : {} - } - - target[name] = avalon.mix(deep, clone, copy) - } else if (copy !== void 0) { - target[name] = copy - } - } - } - } - return target -} - -function _number(a, len) { //用于模拟slice, splice的效果 - a = Math.floor(a) || 0 - return a < 0 ? Math.max(len + a, 0) : Math.min(a, len); -} -avalon.mix({ - rword: rword, - subscribers: subscribers, - version: 1.45, - ui: {}, - log: log, - slice: W3C ? function (nodes, start, end) { - return aslice.call(nodes, start, end) - } : function (nodes, start, end) { - var ret = [] - var len = nodes.length - if (end === void 0) - end = len - if (typeof end === "number" && isFinite(end)) { - start = _number(start, len) - end = _number(end, len) - for (var i = start; i < end; ++i) { - ret[i - start] = nodes[i] - } - } - return ret - }, - noop: noop, - /*如果不用Error对象封装一下,str在控制台下可能会乱码*/ - error: function (str, e) { - throw (e || Error)(str) - }, - /*将一个以空格或逗号隔开的字符串或数组,转换成一个键值都为1的对象*/ - oneObject: oneObject, - /* avalon.range(10) - => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] - avalon.range(1, 11) - => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] - avalon.range(0, 30, 5) - => [0, 5, 10, 15, 20, 25] - avalon.range(0, -10, -1) - => [0, -1, -2, -3, -4, -5, -6, -7, -8, -9] - avalon.range(0) - => []*/ - range: function (start, end, step) { // 用于生成整数数组 - step || (step = 1) - if (end == null) { - end = start || 0 - start = 0 - } - var index = -1, - length = Math.max(0, Math.ceil((end - start) / step)), - result = new Array(length) - while (++index < length) { - result[index] = start - start += step - } - return result - }, - eventHooks: [], - /*绑定事件*/ - bind: function(el, type, fn, phase) { - var hooks = avalon.eventHooks - var hook = hooks[type] - if (typeof hook === "object") { - type = hook.type - if (hook.deel) { - fn = hook.deel(el, type, fn, phase) - } - } - var callback = W3C ? fn : function(e) { - fn.call(el, fixEvent(e)); - } - if (W3C) { - el.addEventListener(type, callback, !!phase) - } else { - el.attachEvent("on" + type, callback) - } - return callback - }, - /*卸载事件*/ - unbind: function(el, type, fn, phase) { - var hooks = avalon.eventHooks - var hook = hooks[type] - var callback = fn || noop - if (typeof hook === "object") { - type = hook.type - if (hook.deel) { - fn = hook.deel(el, type, fn, false) - } - } - if (W3C) { - el.removeEventListener(type, callback, !!phase) - } else { - el.detachEvent("on" + type, callback) - } - }, - /*读写删除元素节点的样式*/ - css: function (node, name, value) { - if (node instanceof avalon) { - node = node[0] - } - var prop = /[_-]/.test(name) ? camelize(name) : name, fn - name = avalon.cssName(prop) || prop - if (value === void 0 || typeof value === "boolean") { //获取样式 - fn = cssHooks[prop + ":get"] || cssHooks["@:get"] - if (name === "background") { - name = "backgroundColor" - } - var val = fn(node, name) - return value === true ? parseFloat(val) || 0 : val - } else if (value === "") { //请除样式 - node.style[name] = "" - } else { //设置样式 - if (value == null || value !== value) { - return - } - if (isFinite(value) && !avalon.cssNumber[prop]) { - value += "px" - } - fn = cssHooks[prop + ":set"] || cssHooks["@:set"] - fn(node, name, value) - } - }, - /*遍历数组与对象,回调的第一个参数为索引或键名,第二个或元素或键值*/ - each: function (obj, fn) { - if (obj) { //排除null, undefined - var i = 0 - if (isArrayLike(obj)) { - for (var n = obj.length; i < n; i++) { - if (fn(i, obj[i]) === false) - break - } - } else { - for (i in obj) { - if (obj.hasOwnProperty(i) && fn(i, obj[i]) === false) { - break - } - } - } - } - }, - //收集元素的data-{{prefix}}-*属性,并转换为对象 - getWidgetData: function (elem, prefix) { - var raw = avalon(elem).data() - var result = {} - for (var i in raw) { - if (i.indexOf(prefix) === 0) { - result[i.replace(prefix, "").replace(/\w/, function (a) { - return a.toLowerCase() - })] = raw[i] - } - } - return result - }, - Array: { - /*只有当前数组不存在此元素时只添加它*/ - ensure: function (target, item) { - if (target.indexOf(item) === -1) { - return target.push(item) - } - }, - /*移除数组中指定位置的元素,返回布尔表示成功与否*/ - removeAt: function (target, index) { - return !!target.splice(index, 1).length - }, - /*移除数组中第一个匹配传参的那个元素,返回布尔表示成功与否*/ - remove: function (target, item) { - var index = target.indexOf(item) - if (~index) - return avalon.Array.removeAt(target, index) - return false - } - } -}) - -var bindingHandlers = avalon.bindingHandlers = {} -var bindingExecutors = avalon.bindingExecutors = {} - -/*判定是否类数组,如节点集合,纯数组,arguments与拥有非负整数的length属性的纯JS对象*/ -function isArrayLike(obj) { - if (!obj) - return false - var n = obj.length - if (n === (n >>> 0)) { //检测length属性是否为非负整数 - var type = serialize.call(obj).slice(8, -1) - if (/(?:regexp|string|function|window|global)$/i.test(type)) - return false - if (type === "Array") - return true - try { - if ({}.propertyIsEnumerable.call(obj, "length") === false) { //如果是原生对象 - return /^\s?function/.test(obj.item || obj.callee) - } - return true - } catch (e) { //IE的NodeList直接抛错 - return !obj.window //IE6-8 window - } - } - return false -} - - -// https://github.com/rsms/js-lru -var Cache = new function() {// jshint ignore:line - function LRU(maxLength) { - this.size = 0 - this.limit = maxLength - this.head = this.tail = void 0 - this._keymap = {} - } - - var p = LRU.prototype - - p.put = function(key, value) { - var entry = { - key: key, - value: value - } - this._keymap[key] = entry - if (this.tail) { - this.tail.newer = entry - entry.older = this.tail - } else { - this.head = entry - } - this.tail = entry - if (this.size === this.limit) { - this.shift() - } else { - this.size++ - } - return value - } - - p.shift = function() { - var entry = this.head - if (entry) { - this.head = this.head.newer - this.head.older = - entry.newer = - entry.older = - this._keymap[entry.key] = void 0 - } - } - p.get = function(key) { - var entry = this._keymap[key] - if (entry === void 0) - return - if (entry === this.tail) { - return entry.value - } - // HEAD--------------TAIL - // <.older .newer> - // <--- add direction -- - // A B C E - if (entry.newer) { - if (entry === this.head) { - this.head = entry.newer - } - entry.newer.older = entry.older // C <-- E. - } - if (entry.older) { - entry.older.newer = entry.newer // C. --> E - } - entry.newer = void 0 // D --x - entry.older = this.tail // D. --> E - if (this.tail) { - this.tail.newer = entry // E. <-- D - } - this.tail = entry - return entry.value - } - return LRU -}// jshint ignore:line - -/********************************************************************* - * javascript 底层补丁 * - **********************************************************************/ -if (!"司徒正美".trim) { - var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g - String.prototype.trim = function () { - return this.replace(rtrim, "") - } -} -var hasDontEnumBug = !({ - 'toString': null -}).propertyIsEnumerable('toString'), - hasProtoEnumBug = (function () { - }).propertyIsEnumerable('prototype'), - dontEnums = [ - "toString", - "toLocaleString", - "valueOf", - "hasOwnProperty", - "isPrototypeOf", - "propertyIsEnumerable", - "constructor" - ], - dontEnumsLength = dontEnums.length; -if (!Object.keys) { - Object.keys = function (object) { //ecma262v5 15.2.3.14 - var theKeys = [] - var skipProto = hasProtoEnumBug && typeof object === "function" - if (typeof object === "string" || (object && object.callee)) { - for (var i = 0; i < object.length; ++i) { - theKeys.push(String(i)) - } - } else { - for (var name in object) { - if (!(skipProto && name === "prototype") && ohasOwn.call(object, name)) { - theKeys.push(String(name)) - } - } - } - - if (hasDontEnumBug) { - var ctor = object.constructor, - skipConstructor = ctor && ctor.prototype === object - for (var j = 0; j < dontEnumsLength; j++) { - var dontEnum = dontEnums[j] - if (!(skipConstructor && dontEnum === "constructor") && ohasOwn.call(object, dontEnum)) { - theKeys.push(dontEnum) - } - } - } - return theKeys - } -} -if (!Array.isArray) { - Array.isArray = function (a) { - return serialize.call(a) === "[object Array]" - } -} - -if (!noop.bind) { - Function.prototype.bind = function (scope) { - if (arguments.length < 2 && scope === void 0) - return this - var fn = this, - argv = arguments - return function () { - var args = [], - i - for (i = 1; i < argv.length; i++) - args.push(argv[i]) - for (i = 0; i < arguments.length; i++) - args.push(arguments[i]) - return fn.apply(scope, args) - } - } -} - -function iterator(vars, body, ret) { - var fun = 'for(var ' + vars + 'i=0,n = this.length; i < n; i++){' + body.replace('_', '((i in this) && fn.call(scope,this[i],i,this))') + '}' + ret - /* jshint ignore:start */ - return Function("fn,scope", fun) - /* jshint ignore:end */ -} -if (!rnative.test([].map)) { - avalon.mix(ap, { - //定位操作,返回数组中第一个等于给定参数的元素的索引值。 - indexOf: function (item, index) { - var n = this.length, - i = ~~index - if (i < 0) - i += n - for (; i < n; i++) - if (this[i] === item) - return i - return -1 - }, - //定位操作,同上,不过是从后遍历。 - lastIndexOf: function (item, index) { - var n = this.length, - i = index == null ? n - 1 : index - if (i < 0) - i = Math.max(0, n + i) - for (; i >= 0; i--) - if (this[i] === item) - return i - return -1 - }, - //迭代操作,将数组的元素挨个儿传入一个函数中执行。Prototype.js的对应名字为each。 - forEach: iterator("", '_', ""), - //迭代类 在数组中的每个项上运行一个函数,如果此函数的值为真,则此元素作为新数组的元素收集起来,并返回新数组 - filter: iterator('r=[],j=0,', 'if(_)r[j++]=this[i]', 'return r'), - //收集操作,将数组的元素挨个儿传入一个函数中执行,然后把它们的返回值组成一个新数组返回。Prototype.js的对应名字为collect。 - map: iterator('r=[],', 'r[i]=_', 'return r'), - //只要数组中有一个元素满足条件(放进给定函数返回true),那么它就返回true。Prototype.js的对应名字为any。 - some: iterator("", 'if(_)return true', 'return false'), - //只有数组中的元素都满足条件(放进给定函数返回true),它才返回true。Prototype.js的对应名字为all。 - every: iterator("", 'if(!_)return false', 'return true') - }) -} -/********************************************************************* - * DOM 底层补丁 * - **********************************************************************/ - -function fixContains(root, el) { - try { //IE6-8,游离于DOM树外的文本节点,访问parentNode有时会抛错 - while ((el = el.parentNode)) - if (el === root) - return true - return false - } catch (e) { - return false - } -} -avalon.contains = fixContains -//IE6-11的文档对象没有contains -if (!DOC.contains) { - DOC.contains = function (b) { - return fixContains(DOC, b) - } -} - -function outerHTML() { - return new XMLSerializer().serializeToString(this) -} - -if (window.SVGElement) { - //safari5+是把contains方法放在Element.prototype上而不是Node.prototype - if (!DOC.createTextNode("x").contains) { - Node.prototype.contains = function (arg) {//IE6-8没有Node对象 - return !!(this.compareDocumentPosition(arg) & 16) - } - } - var svgns = "http://www.w3.org/2000/svg" - var svg = DOC.createElementNS(svgns, "svg") - svg.innerHTML = '' - if (!rsvg.test(svg.firstChild)) { // #409 - function enumerateNode(node, targetNode) {// jshint ignore:line - if (node && node.childNodes) { - var nodes = node.childNodes - for (var i = 0, el; el = nodes[i++]; ) { - if (el.tagName) { - var svg = DOC.createElementNS(svgns, - el.tagName.toLowerCase()) - ap.forEach.call(el.attributes, function (attr) { - svg.setAttribute(attr.name, attr.value) //复制属性 - })// jshint ignore:line - // 递归处理子节点 - enumerateNode(el, svg) - targetNode.appendChild(svg) - } - } - } - } - Object.defineProperties(SVGElement.prototype, { - "outerHTML": {//IE9-11,firefox不支持SVG元素的innerHTML,outerHTML属性 - enumerable: true, - configurable: true, - get: outerHTML, - set: function (html) { - var tagName = this.tagName.toLowerCase(), - par = this.parentNode, - frag = avalon.parseHTML(html) - // 操作的svg,直接插入 - if (tagName === "svg") { - par.insertBefore(frag, this) - // svg节点的子节点类似 - } else { - var newFrag = DOC.createDocumentFragment() - enumerateNode(frag, newFrag) - par.insertBefore(newFrag, this) - } - par.removeChild(this) - } - }, - "innerHTML": { - enumerable: true, - configurable: true, - get: function () { - var s = this.outerHTML - var ropen = new RegExp("<" + this.nodeName + '\\b(?:(["\'])[^"]*?(\\1)|[^>])*>', "i") - var rclose = new RegExp("<\/" + this.nodeName + ">$", "i") - return s.replace(ropen, "").replace(rclose, "") - }, - set: function (html) { - if (avalon.clearHTML) { - avalon.clearHTML(this) - var frag = avalon.parseHTML(html) - enumerateNode(frag, this) - } - } - } - }) - } -} -if (!root.outerHTML && window.HTMLElement) { //firefox 到11时才有outerHTML - HTMLElement.prototype.__defineGetter__("outerHTML", outerHTML); -} - - -//============================= event binding ======================= -var rmouseEvent = /^(?:mouse|contextmenu|drag)|click/ -function fixEvent(event) { - var ret = {} - for (var i in event) { - ret[i] = event[i] - } - var target = ret.target = event.srcElement - if (event.type.indexOf("key") === 0) { - ret.which = event.charCode != null ? event.charCode : event.keyCode - } else if (rmouseEvent.test(event.type)) { - var doc = target.ownerDocument || DOC - var box = doc.compatMode === "BackCompat" ? doc.body : doc.documentElement - ret.pageX = event.clientX + (box.scrollLeft >> 0) - (box.clientLeft >> 0) - ret.pageY = event.clientY + (box.scrollTop >> 0) - (box.clientTop >> 0) - ret.wheelDeltaY = ret.wheelDelta - ret.wheelDeltaX = 0 - } - ret.timeStamp = new Date() - 0 - ret.originalEvent = event - ret.preventDefault = function () { //阻止默认行为 - event.returnValue = false - } - ret.stopPropagation = function () { //阻止事件在DOM树中的传播 - event.cancelBubble = true - } - return ret -} - -var eventHooks = avalon.eventHooks -//针对firefox, chrome修正mouseenter, mouseleave -if (!("onmouseenter" in root)) { - avalon.each({ - mouseenter: "mouseover", - mouseleave: "mouseout" - }, function (origType, fixType) { - eventHooks[origType] = { - type: fixType, - deel: function (elem, _, fn) { - return function (e) { - var t = e.relatedTarget - if (!t || (t !== elem && !(elem.compareDocumentPosition(t) & 16))) { - delete e.type - e.type = origType - return fn.call(elem, e) - } - } - } - } - }) -} -//针对IE9+, w3c修正animationend -avalon.each({ - AnimationEvent: "animationend", - WebKitAnimationEvent: "webkitAnimationEnd" -}, function (construct, fixType) { - if (window[construct] && !eventHooks.animationend) { - eventHooks.animationend = { - type: fixType - } - } -}) -//针对IE6-8修正input -if (!("oninput" in DOC.createElement("input"))) { - eventHooks.input = { - type: "propertychange", - deel: function (elem, _, fn) { - return function (e) { - if (e.propertyName === "value") { - e.type = "input" - return fn.call(elem, e) - } - } - } - } -} -if (DOC.onmousewheel === void 0) { - /* IE6-11 chrome mousewheel wheelDetla 下 -120 上 120 - firefox DOMMouseScroll detail 下3 上-3 - firefox wheel detlaY 下3 上-3 - IE9-11 wheel deltaY 下40 上-40 - chrome wheel deltaY 下100 上-100 */ - var fixWheelType = DOC.onwheel !== void 0 ? "wheel" : "DOMMouseScroll" - var fixWheelDelta = fixWheelType === "wheel" ? "deltaY" : "detail" - eventHooks.mousewheel = { - type: fixWheelType, - deel: function (elem, _, fn) { - return function (e) { - e.wheelDeltaY = e.wheelDelta = e[fixWheelDelta] > 0 ? -120 : 120 - e.wheelDeltaX = 0 - if (Object.defineProperty) { - Object.defineProperty(e, "type", { - value: "mousewheel" - }) - } - fn.call(elem, e) - } - } - } -} - - - -/********************************************************************* - * 配置系统 * - **********************************************************************/ - -function kernel(settings) { - for (var p in settings) { - if (!ohasOwn.call(settings, p)) - continue - var val = settings[p] - if (typeof kernel.plugins[p] === "function") { - kernel.plugins[p](val) - } else if (typeof kernel[p] === "object") { - avalon.mix(kernel[p], val) - } else { - kernel[p] = val - } - } - return this -} -var openTag, closeTag, rexpr, rexprg, rbind, rregexp = /[-.*+?^${}()|[\]\/\\]/g - -function escapeRegExp(target) { - //http://stevenlevithan.com/regex/xregexp/ - //将字符串安全格式化为正则表达式的源码 - return (target + "").replace(rregexp, "\\$&") -} - -var plugins = { - loader: function (builtin) { - var flag = innerRequire && builtin - window.require = flag ? innerRequire : otherRequire - window.define = flag ? innerRequire.define : otherDefine - }, - interpolate: function (array) { - openTag = array[0] - closeTag = array[1] - if (openTag === closeTag) { - throw new SyntaxError("openTag!==closeTag") - var test = openTag + "test" + closeTag - cinerator.innerHTML = test - if (cinerator.innerHTML !== test && cinerator.innerHTML.indexOf("<") > -1) { - throw new SyntaxError("此定界符不合法") - } - cinerator.innerHTML = "" - } - var o = escapeRegExp(openTag), - c = escapeRegExp(closeTag) - rexpr = new RegExp(o + "(.*?)" + c) - rexprg = new RegExp(o + "(.*?)" + c, "g") - rbind = new RegExp(o + ".*?" + c + "|\\sms-") - } -} - -kernel.debug = true -kernel.plugins = plugins -kernel.plugins['interpolate'](["{{", "}}"]) -kernel.paths = {} -kernel.shim = {} -kernel.maxRepeatSize = 100 -avalon.config = kernel -var ravalon = /(\w+)\[(avalonctrl)="(\S+)"\]/ -var findNodes = DOC.querySelectorAll ? function(str) { - return DOC.querySelectorAll(str) -} : function(str) { - var match = str.match(ravalon) - var all = DOC.getElementsByTagName(match[1]) - var nodes = [] - for (var i = 0, el; el = all[i++]; ) { - if (el.getAttribute(match[2]) === match[3]) { - nodes.push(el) - } - } - return nodes -} -/********************************************************************* - * 事件总线 * - **********************************************************************/ -var EventBus = { - $watch: function (type, callback) { - if (typeof callback === "function") { - var callbacks = this.$events[type] - if (callbacks) { - callbacks.push(callback) - } else { - this.$events[type] = [callback] - } - } else { //重新开始监听此VM的第一重简单属性的变动 - this.$events = this.$watch.backup - } - return this - }, - $unwatch: function (type, callback) { - var n = arguments.length - if (n === 0) { //让此VM的所有$watch回调无效化 - this.$watch.backup = this.$events - this.$events = {} - } else if (n === 1) { - this.$events[type] = [] - } else { - var callbacks = this.$events[type] || [] - var i = callbacks.length - while (~--i < 0) { - if (callbacks[i] === callback) { - return callbacks.splice(i, 1) - } - } - } - return this - }, - $fire: function (type) { - var special, i, v, callback - if (/^(\w+)!(\S+)$/.test(type)) { - special = RegExp.$1 - type = RegExp.$2 - } - var events = this.$events - if (!events) - return - var args = aslice.call(arguments, 1) - var detail = [type].concat(args) - if (special === "all") { - for (i in avalon.vmodels) { - v = avalon.vmodels[i] - if (v !== this) { - v.$fire.apply(v, detail) - } - } - } else if (special === "up" || special === "down") { - var elements = events.expr ? findNodes(events.expr) : [] - if (elements.length === 0) - return - for (i in avalon.vmodels) { - v = avalon.vmodels[i] - if (v !== this) { - if (v.$events.expr) { - var eventNodes = findNodes(v.$events.expr) - if (eventNodes.length === 0) { - continue - } - //循环两个vmodel中的节点,查找匹配(向上匹配或者向下匹配)的节点并设置标识 - /* jshint ignore:start */ - ap.forEach.call(eventNodes, function (node) { - ap.forEach.call(elements, function (element) { - var ok = special === "down" ? element.contains(node) : //向下捕获 - node.contains(element) //向上冒泡 - if (ok) { - node._avalon = v //符合条件的加一个标识 - } - }); - }) - /* jshint ignore:end */ - } - } - } - var nodes = DOC.getElementsByTagName("*") //实现节点排序 - var alls = [] - ap.forEach.call(nodes, function (el) { - if (el._avalon) { - alls.push(el._avalon) - el._avalon = "" - el.removeAttribute("_avalon") - } - }) - if (special === "up") { - alls.reverse() - } - for (i = 0; callback = alls[i++]; ) { - if (callback.$fire.apply(callback, detail) === false) { - break - } - } - } else { - var callbacks = events[type] || [] - var all = events.$all || [] - for (i = 0; callback = callbacks[i++]; ) { - if (isFunction(callback)) - callback.apply(this, args) - } - for (i = 0; callback = all[i++]; ) { - if (isFunction(callback)) - callback.apply(this, arguments) - } - } - } -} - -/********************************************************************* - * modelFactory * - **********************************************************************/ -//avalon最核心的方法的两个方法之一(另一个是avalon.scan),返回一个ViewModel(VM) -var VMODELS = avalon.vmodels = {} //所有vmodel都储存在这里 -avalon.define = function (id, factory) { - var $id = id.$id || id - if (!$id) { - log("warning: vm必须指定$id") - } - if (VMODELS[$id]) { - log("warning: " + $id + " 已经存在于avalon.vmodels中") - } - if (typeof id === "object") { - var model = modelFactory(id) - } else { - var scope = { - $watch: noop - } - factory(scope) //得到所有定义 - - model = modelFactory(scope) //偷天换日,将scope换为model - stopRepeatAssign = true - factory(model) - stopRepeatAssign = false - } - model.$id = $id - return VMODELS[$id] = model -} - -//一些不需要被监听的属性 -var $$skipArray = String("$id,$watch,$unwatch,$fire,$events,$model,$skipArray,$proxy,$reinitialize,$propertyNames").match(rword) -var defineProperty = Object.defineProperty -var canHideOwn = true -//如果浏览器不支持ecma262v5的Object.defineProperties或者存在BUG,比如IE8 -//标准浏览器使用__defineGetter__, __defineSetter__实现 -try { - defineProperty({}, "_", { - value: "x" - }) - var defineProperties = Object.defineProperties -} catch (e) { - canHideOwn = false -} - -function modelFactory(source, $special, $model) { - if (Array.isArray(source)) { - var arr = source.concat() - source.length = 0 - var collection = arrayFactory(source) - collection.pushArray(arr) - return collection - } - //0 null undefined || Node || VModel(fix IE6-8 createWithProxy $val: val引发的BUG) - if (!source || source.nodeType > 0 || (source.$id && source.$events)) { - return source - } - var $skipArray = Array.isArray(source.$skipArray) ? source.$skipArray : [] - $skipArray.$special = $special || {} //强制要监听的属性 - var $vmodel = {} //要返回的对象, 它在IE6-8下可能被偷龙转凤 - $model = $model || {} //vmodels.$model属性 - var $events = {} //vmodel.$events属性 - var accessors = {} //监控属性 - var computed = [] - $$skipArray.forEach(function (name) { - delete source[name] - }) - var names = Object.keys(source) - /* jshint ignore:start */ - names.forEach(function (name, accessor) { - var val = source[name] - $model[name] = val - if (isObservable(name, val, $skipArray)) { - //总共产生三种accessor - $events[name] = [] - var valueType = avalon.type(val) - //总共产生三种accessor - if (valueType === "object" && isFunction(val.get) && Object.keys(val).length <= 2) { - accessor = makeComputedAccessor(name, val) - computed.push(accessor) - } else if (rcomplexType.test(valueType)) { - accessor = makeComplexAccessor(name, val, valueType, $events[name]) - } else { - accessor = makeSimpleAccessor(name, val) - } - accessors[name] = accessor - } - }) - /* jshint ignore:end */ - - $vmodel = defineProperties($vmodel, descriptorFactory(accessors), source) //生成一个空的ViewModel - for (var i = 0; i < names.length; i++) { - var name = names[i] - if (!accessors[name]) { - $vmodel[name] = source[name] - } - } - //添加$id, $model, $events, $watch, $unwatch, $fire - $vmodel.$propertyNames = names.join("­") - $vmodel.$id = generateID() - $vmodel.$model = $model - $vmodel.$events = $events - for (i in EventBus) { - var fn = EventBus[i] - if (!W3C) { //在IE6-8下,VB对象的方法里的this并不指向自身,需要用bind处理一下 - fn = fn.bind($vmodel) - } - $vmodel[i] = fn - } - if (canHideOwn) { - Object.defineProperty($vmodel, "hasOwnProperty", hasOwnDescriptor) - } else { - /* jshint ignore:start */ - $vmodel.hasOwnProperty = function (name) { - return name in $vmodel.$model - } - /* jshint ignore:end */ - } - - $vmodel.$reinitialize = function () { - computed.forEach(function (accessor) { - delete accessor._value - delete accessor.oldArgs - accessor.digest = function () { - accessor.call($vmodel) - } - dependencyDetection.begin({ - callback: function (vm, dependency) {//dependency为一个accessor - var name = dependency._name - if (dependency !== accessor) { - var list = vm.$events[name] - injectDependency(list, accessor.digest) - } - } - }) - try { - accessor.get.call($vmodel) - } finally { - dependencyDetection.end() - } - }) - } - $vmodel.$reinitialize() - return $vmodel -} - -var hasOwnDescriptor = { - value: function (name) { - return name in this.$model - }, - writable: false, - enumerable: false, - configurable: true -} -//创建一个简单访问器 -function makeSimpleAccessor(name, value) { - function accessor(value) { - var oldValue = accessor._value - if (arguments.length > 0) { - if (!stopRepeatAssign && !isEqual(value, oldValue)) { - accessor.updateValue(this, value) - accessor.notify(this, value, oldValue) - } - return this - } else { - dependencyDetection.collectDependency(this, accessor) - return oldValue - } - } - accessorFactory(accessor, name) - accessor._value = value - return accessor; -} - -//创建一个计算访问器 -function makeComputedAccessor(name, options) { - function accessor(value) {//计算属性 - var oldValue = accessor._value - var init = ("_value" in accessor) - if (arguments.length > 0) { - if (stopRepeatAssign) { - return this - } - if (typeof accessor.set === "function") { - if (accessor.oldArgs !== value) { - accessor.oldArgs = value - var $events = this.$events - var lock = $events[name] - $events[name] = [] //清空回调,防止内部冒泡而触发多次$fire - accessor.set.call(this, value) - $events[name] = lock - value = accessor.get.call(this) - if (value !== oldValue) { - accessor.updateValue(this, value) - accessor.notify(this, value, oldValue) //触发$watch回调 - } - } - } - return this - } else { - //将依赖于自己的高层访问器或视图刷新函数(以绑定对象形式)放到自己的订阅数组中 - //将自己注入到低层访问器的订阅数组中 - value = accessor.get.call(this) - accessor.updateValue(this, value) - if (init && oldValue !== value) { - accessor.notify(this, value, oldValue) //触发$watch回调 - } - return value - } - } - accessor.set = options.set - accessor.get = options.get - accessorFactory(accessor, name) - return accessor -} - -//创建一个复杂访问器 -function makeComplexAccessor(name, initValue, valueType, list) { - function accessor(value) { - var oldValue = accessor._value - - var son = accessor._vmodel - if (arguments.length > 0) { - if (stopRepeatAssign) { - return this - } - if (valueType === "array") { - var a = son, b = value, - an = a.length, - bn = b.length - a.$lock = true - if (an > bn) { - a.splice(bn, an - bn) - } else if (bn > an) { - a.push.apply(a, b.slice(an)) - } - var n = Math.min(an, bn) - for (var i = 0; i < n; i++) { - a.set(i, b[i]) - } - delete a.$lock - a._fire("set") - } else if (valueType === "object") { - var newPropertyNames = Object.keys(value).join("­") - if (son.$propertyNames === newPropertyNames) { - for (i in value) { - son[i] = value[i] - } - } else { - var sson = accessor._vmodel = modelFactory(value) - var sevent = sson.$events - var oevent = son.$events - for (var i in sevent) { - var arr = sevent[i] - if (Array.isArray(arr)) { - arr = arr.concat(oevent[i]) - } - } - sevent[subscribers] = oevent[subscribers] - sson.$proxy = son.$proxy - son = sson - } - } - accessor.updateValue(this, son.$model) - accessor.notify(this, this._value, oldValue) - return this - } else { - dependencyDetection.collectDependency(this, accessor) - return son - } - } - accessorFactory(accessor, name) - var son = accessor._vmodel = modelFactory(initValue) - son.$events[subscribers] = list - return accessor -} - -function globalUpdateValue(vmodel, value) { - vmodel.$model[this._name] = this._value = value -} - -function globalNotify(vmodel, value, oldValue) { - var name = this._name - var array = vmodel.$events[name] //刷新值 - if (array) { - fireDependencies(array) //同步视图 - EventBus.$fire.call(vmodel, name, value, oldValue) //触发$watch回调 - } -} - -function accessorFactory(accessor, name) { - accessor._name = name - //同时更新_value与model - accessor.updateValue = globalUpdateValue - accessor.notify = globalNotify -} - -//比较两个值是否相等 -var isEqual = Object.is || function (v1, v2) { - if (v1 === 0 && v2 === 0) { - return 1 / v1 === 1 / v2 - } else if (v1 !== v1) { - return v2 !== v2 - } else { - return v1 === v2 - } -} - -function isObservable(name, value, $skipArray) { - if (isFunction(value) || value && value.nodeType) { - return false - } - if ($skipArray.indexOf(name) !== -1) { - return false - } - var $special = $skipArray.$special - if (name && name.charAt(0) === "$" && !$special[name]) { - return false - } - return true -} - -var descriptorFactory = W3C ? function (obj) { - var descriptors = {} - for (var i in obj) { - descriptors[i] = { - get: obj[i], - set: obj[i], - enumerable: true, - configurable: true - } - } - return descriptors -} : function (a) { - return a -} - -//===================修复浏览器对Object.defineProperties的支持================= -if (!canHideOwn) { - if ("__defineGetter__" in avalon) { - defineProperty = function (obj, prop, desc) { - if ('value' in desc) { - obj[prop] = desc.value - } - if ("get" in desc) { - obj.__defineGetter__(prop, desc.get) - } - if ('set' in desc) { - obj.__defineSetter__(prop, desc.set) - } - return obj - } - defineProperties = function (obj, descs) { - for (var prop in descs) { - if (descs.hasOwnProperty(prop)) { - defineProperty(obj, prop, descs[prop]) - } - } - return obj - } - } - if (IEVersion) { - var VBClassPool = {} - window.execScript([// jshint ignore:line - "Function parseVB(code)", - "\tExecuteGlobal(code)", - "End Function" //转换一段文本为VB代码 - ].join("\n"), "VBScript") - function VBMediator(instance, accessors, name, value) {// jshint ignore:line - var accessor = accessors[name] - if (arguments.length === 4) { - accessor.call(instance, value) - } else { - return accessor.call(instance) - } - } - defineProperties = function (name, accessors, properties) { - // jshint ignore:line - var buffer = [] - buffer.push( - "\r\n\tPrivate [__data__], [__proxy__]", - "\tPublic Default Function [__const__](d, p)", - "\t\tSet [__data__] = d: set [__proxy__] = p", - "\t\tSet [__const__] = Me", //链式调用 - "\tEnd Function") - //添加普通属性,因为VBScript对象不能像JS那样随意增删属性,必须在这里预先定义好 - for (name in properties) { - if (!accessors.hasOwnProperty(name)) { - buffer.push("\tPublic [" + name + "]") - } - } - $$skipArray.forEach(function (name) { - if (!accessors.hasOwnProperty(name)) { - buffer.push("\tPublic [" + name + "]") - } - }) - buffer.push("\tPublic [" + 'hasOwnProperty' + "]") - //添加访问器属性 - for (name in accessors) { - buffer.push( - //由于不知对方会传入什么,因此set, let都用上 - "\tPublic Property Let [" + name + "](val" + expose + ")", //setter - "\t\tCall [__proxy__](Me,[__data__], \"" + name + "\", val" + expose + ")", - "\tEnd Property", - "\tPublic Property Set [" + name + "](val" + expose + ")", //setter - "\t\tCall [__proxy__](Me,[__data__], \"" + name + "\", val" + expose + ")", - "\tEnd Property", - "\tPublic Property Get [" + name + "]", //getter - "\tOn Error Resume Next", //必须优先使用set语句,否则它会误将数组当字符串返回 - "\t\tSet[" + name + "] = [__proxy__](Me,[__data__],\"" + name + "\")", - "\tIf Err.Number <> 0 Then", - "\t\t[" + name + "] = [__proxy__](Me,[__data__],\"" + name + "\")", - "\tEnd If", - "\tOn Error Goto 0", - "\tEnd Property") - - } - - buffer.push("End Class") - var body = buffer.join("\r\n") - var className =VBClassPool[body] - if (!className) { - className = generateID("VBClass") - window.parseVB("Class " + className + body) - window.parseVB([ - "Function " + className + "Factory(a, b)", //创建实例并传入两个关键的参数 - "\tDim o", - "\tSet o = (New " + className + ")(a, b)", - "\tSet " + className + "Factory = o", - "End Function" - ].join("\r\n")) - VBClassPool[body] = className - } - var ret = window[className + "Factory"](accessors, VBMediator) //得到其产品 - return ret //得到其产品 - } - } -} - -/********************************************************************* - * 监控数组(与ms-each, ms-repeat配合使用) * - **********************************************************************/ - -function arrayFactory(model) { - var array = [] - array.$id = generateID() - array.$model = model //数据模型 - array.$events = {} - array.$events[subscribers] = [] - array._ = modelFactory({ - length: model.length - }) - array._.$watch("length", function (a, b) { - array.$fire("length", a, b) - }) - for (var i in EventBus) { - array[i] = EventBus[i] - } - avalon.mix(array, arrayPrototype) - return array -} - -function mutateArray(method, pos, n, index, method2, pos2, n2) { - var oldLen = this.length, loop = 2 - while (--loop) { - switch (method) { - case "add": - /* jshint ignore:start */ - var array = this.$model.slice(pos, pos + n).map(function (el) { - if (rcomplexType.test(avalon.type(el))) { - return el.$id ? el : modelFactory(el, 0, el) - } else { - return el - } - }) - /* jshint ignore:end */ - _splice.apply(this, [pos, 0].concat(array)) - this._fire("add", pos, n) - break - case "del": - var ret = this._splice(pos, n) - this._fire("del", pos, n) - break - } - if (method2) { - method = method2 - pos = pos2 - n = n2 - loop = 2 - method2 = 0 - } - } - this._fire("index", index) - if (this.length !== oldLen) { - this._.length = this.length - } - return ret -} - -var _splice = ap.splice -var arrayPrototype = { - _splice: _splice, - _fire: function (method, a, b) { - fireDependencies(this.$events[subscribers], method, a, b) - }, - size: function () { //取得数组长度,这个函数可以同步视图,length不能 - return this._.length - }, - pushArray: function (array) { - var m = array.length, n = this.length - if (m) { - ap.push.apply(this.$model, array) - mutateArray.call(this, "add", n, m, Math.max(0, n - 1)) - } - return m + n - }, - push: function () { - //http://jsperf.com/closure-with-arguments - var array = [] - var i, n = arguments.length - for (i = 0; i < n; i++) { - array[i] = arguments[i] - } - return this.pushArray(array) - }, - unshift: function () { - var m = arguments.length, n = this.length - if (m) { - ap.unshift.apply(this.$model, arguments) - mutateArray.call(this, "add", 0, m, 0) - } - return m + n //IE67的unshift不会返回长度 - }, - shift: function () { - if (this.length) { - var el = this.$model.shift() - mutateArray.call(this, "del", 0, 1, 0) - return el //返回被移除的元素 - } - }, - pop: function () { - var n = this.length - if (n) { - var el = this.$model.pop() - mutateArray.call(this, "del", n - 1, 1, Math.max(0, n - 2)) - return el //返回被移除的元素 - } - }, - splice: function (start) { - var m = arguments.length, args = [], change - var removed = _splice.apply(this.$model, arguments) - if (removed.length) { //如果用户删掉了元素 - args.push("del", start, removed.length, 0) - change = true - } - if (m > 2) { //如果用户添加了元素 - if (change) { - args.splice(3, 1, 0, "add", start, m - 2) - } else { - args.push("add", start, m - 2, 0) - } - change = true - } - if (change) { //返回被移除的元素 - return mutateArray.apply(this, args) - } else { - return [] - } - }, - contains: function (el) { //判定是否包含 - return this.indexOf(el) !== -1 - }, - remove: function (el) { //移除第一个等于给定值的元素 - return this.removeAt(this.indexOf(el)) - }, - removeAt: function (index) { //移除指定索引上的元素 - if (index >= 0) { - this.$model.splice(index, 1) - return mutateArray.call(this, "del", index, 1, 0) - } - return [] - }, - clear: function () { - this.$model.length = this.length = this._.length = 0 //清空数组 - this._fire("clear", 0) - return this - }, - removeAll: function (all) { //移除N个元素 - if (Array.isArray(all)) { - for (var i = this.length - 1; i >= 0; i--) { - if (all.indexOf(this[i]) !== -1) { - this.removeAt(i) - } - } - } else if (typeof all === "function") { - for ( i = this.length - 1; i >= 0; i--) { - var el = this[i] - if (all(el, i)) { - this.removeAt(i) - } - } - } else { - this.clear() - } - }, - ensure: function (el) { - if (!this.contains(el)) { //只有不存在才push - this.push(el) - } - return this - }, - set: function (index, val) { - if (index >= 0) { - var valueType = avalon.type(val) - if (val && val.$model) { - val = val.$model - } - var target = this[index] - if (valueType === "object") { - for (var i in val) { - if (target.hasOwnProperty(i)) { - target[i] = val[i] - } - } - } else if (valueType === "array") { - target.clear().push.apply(target, val) - } else if (target !== val) { - this[index] = val - this.$model[index] = val - this._fire("set", index, val) - } - } - return this - } -} -//相当于原来bindingExecutors.repeat 的index分支 -function resetIndex(array, pos) { - var last = array.length - 1 - for (var el; el = array[pos]; pos++) { - el.$index = pos - el.$first = pos === 0 - el.$last = pos === last - } -} - -function sortByIndex(array, indexes) { - var map = {}; - for (var i = 0, n = indexes.length; i < n; i++) { - map[i] = array[i] // preserve - var j = indexes[i] - if (j in map) { - array[i] = map[j] - delete map[j] - } else { - array[i] = array[j] - } - } -} - -"sort,reverse".replace(rword, function (method) { - arrayPrototype[method] = function () { - var newArray = this.$model//这是要排序的新数组 - var oldArray = newArray.concat() //保持原来状态的旧数组 - var mask = Math.random() - var indexes = [] - var hasSort - ap[method].apply(newArray, arguments) //排序 - for (var i = 0, n = oldArray.length; i < n; i++) { - var neo = newArray[i] - var old = oldArray[i] - if (isEqual(neo, old)) { - indexes.push(i) - } else { - var index = oldArray.indexOf(neo) - indexes.push(index)//得到新数组的每个元素在旧数组对应的位置 - oldArray[index] = mask //屏蔽已经找过的元素 - hasSort = true - } - } - if (hasSort) { - sortByIndex(this, indexes) - // sortByIndex(this.$proxy, indexes) - this._fire("move", indexes) - this._fire("index", 0) - } - return this - } -}) - - -/********************************************************************* - * 依赖调度系统 * - **********************************************************************/ -//检测两个对象间的依赖关系 -var dependencyDetection = (function () { - var outerFrames = [] - var currentFrame - return { - begin: function (accessorObject) { - //accessorObject为一个拥有callback的对象 - outerFrames.push(currentFrame) - currentFrame = accessorObject - }, - end: function () { - currentFrame = outerFrames.pop() - }, - collectDependency: function (vmodel, accessor) { - if (currentFrame) { - //被dependencyDetection.begin调用 - currentFrame.callback(vmodel, accessor); - } - } - }; -})() -//将绑定对象注入到其依赖项的订阅数组中 -var ronduplex = /^(duplex|on)$/ -avalon.injectBinding = function (data) { - var valueFn = data.evaluator - if (valueFn) { //如果是求值函数 - dependencyDetection.begin({ - callback: function (vmodel, dependency) { - injectDependency(vmodel.$events[dependency._name], data) - } - }) - try { - var value = ronduplex.test(data.type) ? data : valueFn.apply(0, data.args) - if(value === void 0){ - delete data.evaluator - } - data.handler(value, data.element, data) - } catch (e) { - //log("warning:exception throwed in [avalon.injectBinding] " + e) - delete data.evaluator - var node = data.element - if (node.nodeType === 3) { - var parent = node.parentNode - if (kernel.commentInterpolate) { - parent.replaceChild(DOC.createComment(data.value), node) - } else { - node.data = openTag + (data.oneTime ? "::" : "") + data.value + closeTag - } - } - } finally { - dependencyDetection.end() - } - } -} - -//将依赖项(比它高层的访问器或构建视图刷新函数的绑定对象)注入到订阅者数组 -function injectDependency(list, data) { - if (data.oneTime) - return - if (list && avalon.Array.ensure(list, data) && data.element) { - injectDisposeQueue(data, list) - } -} - -//通知依赖于这个访问器的订阅者更新自身 -function fireDependencies(list) { - if (list && list.length) { - if (new Date() - beginTime > 444 && typeof list[0] === "object") { - rejectDisposeQueue() - } - var args = aslice.call(arguments, 1) - for (var i = list.length, fn; fn = list[--i]; ) { - var el = fn.element - if (el && el.parentNode) { - try { - var valueFn = fn.evaluator - if (fn.$repeat) { - fn.handler.apply(fn, args) //处理监控数组的方法 - }else if("$repeat" in fn || !valueFn ){//如果没有eval,先eval - bindingHandlers[fn.type](fn, fn.vmodels) - } else if (fn.type !== "on") { //事件绑定只能由用户触发,不能由程序触发 - var value = valueFn.apply(0, fn.args || []) - fn.handler(value, el, fn) - } - } catch (e) { } - } - } - } -} -/********************************************************************* - * 定时GC回收机制 * - **********************************************************************/ -var disposeCount = 0 -var disposeQueue = avalon.$$subscribers = [] -var beginTime = new Date() -var oldInfo = {} -var uuid2Node = {} -function getUid(obj, makeID) { //IE9+,标准浏览器 - if (!obj.uuid && !makeID) { - obj.uuid = ++disposeCount - uuid2Node[obj.uuid] = obj - } - return obj.uuid -} -function getNode(uuid) { - return uuid2Node[uuid] -} -//添加到回收列队中 -function injectDisposeQueue(data, list) { - var elem = data.element - if (!data.uuid) { - if (elem.nodeType !== 1) { - data.uuid = data.type + (data.pos || 0) + "-" + getUid(elem.parentNode) - } else { - data.uuid = data.name + "-" + getUid(elem) - } - } - var lists = data.lists || (data.lists = []) - avalon.Array.ensure(lists, list) - list.$uuid = list.$uuid || generateID() - if (!disposeQueue[data.uuid]) { - disposeQueue[data.uuid] = 1 - disposeQueue.push(data) - } -} - -function rejectDisposeQueue(data) { - if (avalon.optimize) - return - var i = disposeQueue.length - var n = i - var allTypes = [] - var iffishTypes = {} - var newInfo = {} - //对页面上所有绑定对象进行分门别类, 只检测个数发生变化的类型 - while (data = disposeQueue[--i]) { - var type = data.type - if (newInfo[type]) { - newInfo[type]++ - } else { - newInfo[type] = 1 - allTypes.push(type) - } - } - var diff = false - allTypes.forEach(function (type) { - if (oldInfo[type] !== newInfo[type]) { - iffishTypes[type] = 1 - diff = true - } - }) - i = n - if (diff) { - while (data = disposeQueue[--i]) { - if (!data.element) - continue - if (iffishTypes[data.type] && shouldDispose(data.element)) { //如果它没有在DOM树 - disposeQueue.splice(i, 1) - delete disposeQueue[data.uuid] - delete uuid2Node[data.element.uuid] - var lists = data.lists - for (var k = 0, list; list = lists[k++]; ) { - avalon.Array.remove(lists, list) - avalon.Array.remove(list, data) - } - disposeData(data) - } - } - } - oldInfo = newInfo - beginTime = new Date() -} - -function disposeData(data) { - data.element = null - data.rollback && data.rollback() - for (var key in data) { - data[key] = null - } -} - -function shouldDispose(el) { - try {//IE下,如果文本节点脱离DOM树,访问parentNode会报错 - if (!el.parentNode) { - return true - } - } catch (e) { - return true - } - - return el.msRetain ? 0 : (el.nodeType === 1 ? !root.contains(el) : !avalon.contains(root, el)) -} - -/************************************************************************ - * HTML处理(parseHTML, innerHTML, clearHTML) * - ************************************************************************/ -// We have to close these tags to support XHTML -var tagHooks = { - area: [1, "", ""], - param: [1, "", ""], - col: [2, "", "
"], - legend: [1, "
", "
"], - option: [1, ""], - thead: [1, "", "
"], - tr: [2, "", "
"], - td: [3, "", "
"], - g: [1, '', ''], - //IE6-8在用innerHTML生成节点时,不能直接创建no-scope元素与HTML5的新标签 - _default: W3C ? [0, "", ""] : [1, "X
", "
"] //div可以不用闭合 -} -tagHooks.th = tagHooks.td -tagHooks.optgroup = tagHooks.option -tagHooks.tbody = tagHooks.tfoot = tagHooks.colgroup = tagHooks.caption = tagHooks.thead -String("circle,defs,ellipse,image,line,path,polygon,polyline,rect,symbol,text,use").replace(rword, function (tag) { - tagHooks[tag] = tagHooks.g //处理SVG -}) -var rtagName = /<([\w:]+)/ //取得其tagName -var rxhtml = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig -var rcreate = W3C ? /[^\d\D]/ : /(<(?:script|link|style|meta|noscript))/ig -var scriptTypes = oneObject(["", "text/javascript", "text/ecmascript", "application/ecmascript", "application/javascript"]) -var rnest = /<(?:tb|td|tf|th|tr|col|opt|leg|cap|area)/ //需要处理套嵌关系的标签 -var script = DOC.createElement("script") -var rhtml = /<|&#?\w+;/ -avalon.parseHTML = function (html) { - var fragment = avalonFragment.cloneNode(false) - if (typeof html !== "string") { - return fragment - } - if (!rhtml.test(html)) { - fragment.appendChild(DOC.createTextNode(html)) - return fragment - } - html = html.replace(rxhtml, "<$1>").trim() - var tag = (rtagName.exec(html) || ["", ""])[1].toLowerCase(), - //取得其标签名 - wrap = tagHooks[tag] || tagHooks._default, - wrapper = cinerator, - firstChild, neo - if (!W3C) { //fix IE - html = html.replace(rcreate, "
$1") //在link style script等标签之前添加一个补丁 - } - wrapper.innerHTML = wrap[1] + html + wrap[2] - var els = wrapper.getElementsByTagName("script") - if (els.length) { //使用innerHTML生成的script节点不会发出请求与执行text属性 - for (var i = 0, el; el = els[i++]; ) { - if (scriptTypes[el.type]) { - //以偷龙转凤方式恢复执行脚本功能 - neo = script.cloneNode(false) //FF不能省略参数 - ap.forEach.call(el.attributes, function (attr) { - if (attr && attr.specified) { - neo[attr.name] = attr.value //复制其属性 - neo.setAttribute(attr.name, attr.value) - } - }) // jshint ignore:line - neo.text = el.text - el.parentNode.replaceChild(neo, el) //替换节点 - } - } - } - if (!W3C) { //fix IE - var target = wrap[1] === "X
" ? wrapper.lastChild.firstChild : wrapper.lastChild - if (target && target.tagName === "TABLE" && tag !== "tbody") { - //IE6-7处理 --> , - // --> , - // -->
- for (els = target.childNodes, i = 0; el = els[i++]; ) { - if (el.tagName === "TBODY" && !el.innerHTML) { - target.removeChild(el) - break - } - } - } - els = wrapper.getElementsByTagName("br") - var n = els.length - while (el = els[--n]) { - if (el.className === "msNoScope") { - el.parentNode.removeChild(el) - } - } - for (els = wrapper.all, i = 0; el = els[i++]; ) { //fix VML - if (isVML(el)) { - fixVML(el) - } - } - } - //移除我们为了符合套嵌关系而添加的标签 - for (i = wrap[0]; i--; wrapper = wrapper.lastChild) { - } - while (firstChild = wrapper.firstChild) { // 将wrapper上的节点转移到文档碎片上! - fragment.appendChild(firstChild) - } - return fragment -} - -function isVML(src) { - var nodeName = src.nodeName - return nodeName.toLowerCase() === nodeName && src.scopeName && src.outerText === "" -} - -function fixVML(node) { - if (node.currentStyle.behavior !== "url(#default#VML)") { - node.style.behavior = "url(#default#VML)" - node.style.display = "inline-block" - node.style.zoom = 1 //hasLayout - } -} -avalon.innerHTML = function (node, html) { - if (!W3C && (!rcreate.test(html) && !rnest.test(html))) { - try { - node.innerHTML = html - return - } catch (e) { - } - } - var a = this.parseHTML(html) - this.clearHTML(node).appendChild(a) -} -avalon.clearHTML = function (node) { - node.textContent = "" - while (node.firstChild) { - node.removeChild(node.firstChild) - } - return node -} - -/********************************************************************* - * avalon的原型方法定义区 * - **********************************************************************/ - -function hyphen(target) { - //转换为连字符线风格 - return target.replace(/([a-z\d])([A-Z]+)/g, "$1-$2").toLowerCase() -} - -function camelize(target) { - //提前判断,提高getStyle等的效率 - if (!target || target.indexOf("-") < 0 && target.indexOf("_") < 0) { - return target - } - //转换为驼峰风格 - return target.replace(/[-_][^-_]/g, function(match) { - return match.charAt(1).toUpperCase() - }) -} - -var fakeClassListMethods = { - _toString: function() { - var node = this.node - var cls = node.className - var str = typeof cls === "string" ? cls : cls.baseVal - return str.split(/\s+/).join(" ") - }, - _contains: function(cls) { - return (" " + this + " ").indexOf(" " + cls + " ") > -1 - }, - _add: function(cls) { - if (!this.contains(cls)) { - this._set(this + " " + cls) - } - }, - _remove: function(cls) { - this._set((" " + this + " ").replace(" " + cls + " ", " ")) - }, - __set: function(cls) { - cls = cls.trim() - var node = this.node - if (rsvg.test(node)) { - //SVG元素的className是一个对象 SVGAnimatedString { baseVal="", animVal=""},只能通过set/getAttribute操作 - node.setAttribute("class", cls) - } else { - node.className = cls - } - } //toggle存在版本差异,因此不使用它 -} - - function fakeClassList(node) { - if (!("classList" in node)) { - node.classList = { - node: node - } - for (var k in fakeClassListMethods) { - node.classList[k.slice(1)] = fakeClassListMethods[k] - } - } - return node.classList - } - - - "add,remove".replace(rword, function(method) { - avalon.fn[method + "Class"] = function(cls) { - var el = this[0] - //https://developer.mozilla.org/zh-CN/docs/Mozilla/Firefox/Releases/26 - if (cls && typeof cls === "string" && el && el.nodeType === 1) { - cls.replace(/\S+/g, function(c) { - fakeClassList(el)[method](c) - }) - } - return this - } - }) - avalon.fn.mix({ - hasClass: function(cls) { - var el = this[0] || {} - return el.nodeType === 1 && fakeClassList(el).contains(cls) - }, - toggleClass: function(value, stateVal) { - var className, i = 0 - var classNames = String(value).split(/\s+/) - var isBool = typeof stateVal === "boolean" - while ((className = classNames[i++])) { - var state = isBool ? stateVal : !this.hasClass(className) - this[state ? "addClass" : "removeClass"](className) - } - return this - }, - attr: function(name, value) { - if (arguments.length === 2) { - this[0].setAttribute(name, value) - return this - } else { - return this[0].getAttribute(name) - } - }, - data: function(name, value) { - name = "data-" + hyphen(name || "") - switch (arguments.length) { - case 2: - this.attr(name, value) - return this - case 1: - var val = this.attr(name) - return parseData(val) - case 0: - var ret = {} - ap.forEach.call(this[0].attributes, function(attr) { - if (attr) { - name = attr.name - if (!name.indexOf("data-")) { - name = camelize(name.slice(5)) - ret[name] = parseData(attr.value) - } - } - }) - return ret - } - }, - removeData: function(name) { - name = "data-" + hyphen(name) - this[0].removeAttribute(name) - return this - }, - css: function(name, value) { - if (avalon.isPlainObject(name)) { - for (var i in name) { - avalon.css(this, i, name[i]) - } - } else { - var ret = avalon.css(this, name, value) - } - return ret !== void 0 ? ret : this - }, - position: function() { - var offsetParent, offset, - elem = this[0], - parentOffset = { - top: 0, - left: 0 - } - if (!elem) { - return - } - if (this.css("position") === "fixed") { - offset = elem.getBoundingClientRect() - } else { - offsetParent = this.offsetParent() //得到真正的offsetParent - offset = this.offset() // 得到正确的offsetParent - if (offsetParent[0].tagName !== "HTML") { - parentOffset = offsetParent.offset() - } - parentOffset.top += avalon.css(offsetParent[0], "borderTopWidth", true) - parentOffset.left += avalon.css(offsetParent[0], "borderLeftWidth", true) - - // Subtract offsetParent scroll positions - parentOffset.top -= offsetParent.scrollTop() - parentOffset.left -= offsetParent.scrollLeft() - } - return { - top: offset.top - parentOffset.top - avalon.css(elem, "marginTop", true), - left: offset.left - parentOffset.left - avalon.css(elem, "marginLeft", true) - } - }, - offsetParent: function() { - var offsetParent = this[0].offsetParent - while (offsetParent && avalon.css(offsetParent, "position") === "static") { - offsetParent = offsetParent.offsetParent; - } - return avalon(offsetParent || root) - }, - bind: function(type, fn, phase) { - if (this[0]) { //此方法不会链 - return avalon.bind(this[0], type, fn, phase) - } - }, - unbind: function(type, fn, phase) { - if (this[0]) { - avalon.unbind(this[0], type, fn, phase) - } - return this - }, - val: function(value) { - var node = this[0] - if (node && node.nodeType === 1) { - var get = arguments.length === 0 - var access = get ? ":get" : ":set" - var fn = valHooks[getValType(node) + access] - if (fn) { - var val = fn(node, value) - } else if (get) { - return (node.value || "").replace(/\r/g, "") - } else { - node.value = value - } - } - return get ? val : this - } - }) - - function parseData(data) { - try { - if (typeof data === "object") - return data - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : +data + "" === data ? +data : rbrace.test(data) ? avalon.parseJSON(data) : data - } catch (e) {} - return data - } -var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/, - rvalidchars = /^[\],:{}\s]*$/, - rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, - rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g, - rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g -avalon.parseJSON = window.JSON ? JSON.parse : function(data) { - if (typeof data === "string") { - data = data.trim(); - if (data) { - if (rvalidchars.test(data.replace(rvalidescape, "@") - .replace(rvalidtokens, "]") - .replace(rvalidbraces, ""))) { - return (new Function("return " + data))() // jshint ignore:line - } - } - avalon.error("Invalid JSON: " + data) - } - return data -} - -//生成avalon.fn.scrollLeft, avalon.fn.scrollTop方法 -avalon.each({ - scrollLeft: "pageXOffset", - scrollTop: "pageYOffset" -}, function(method, prop) { - avalon.fn[method] = function(val) { - var node = this[0] || {}, win = getWindow(node), - top = method === "scrollTop" - if (!arguments.length) { - return win ? (prop in win) ? win[prop] : root[method] : node[method] - } else { - if (win) { - win.scrollTo(!top ? val : avalon(win).scrollLeft(), top ? val : avalon(win).scrollTop()) - } else { - node[method] = val - } - } - } -}) - -function getWindow(node) { - return node.window && node.document ? node : node.nodeType === 9 ? node.defaultView || node.parentWindow : false; -} -//=============================css相关======================= -var cssHooks = avalon.cssHooks = {} -var prefixes = ["", "-webkit-", "-o-", "-moz-", "-ms-"] -var cssMap = { - "float": W3C ? "cssFloat" : "styleFloat" -} -avalon.cssNumber = oneObject("columnCount,order,fillOpacity,fontWeight,lineHeight,opacity,orphans,widows,zIndex,zoom") - -avalon.cssName = function(name, host, camelCase) { - if (cssMap[name]) { - return cssMap[name] - } - host = host || root.style - for (var i = 0, n = prefixes.length; i < n; i++) { - camelCase = camelize(prefixes[i] + name) - if (camelCase in host) { - return (cssMap[name] = camelCase) - } - } - return null -} -cssHooks["@:set"] = function(node, name, value) { - try { //node.style.width = NaN;node.style.width = "xxxxxxx";node.style.width = undefine 在旧式IE下会抛异常 - node.style[name] = value - } catch (e) {} -} -if (window.getComputedStyle) { - cssHooks["@:get"] = function(node, name) { - if (!node || !node.style) { - throw new Error("getComputedStyle要求传入一个节点 " + node) - } - var ret, styles = getComputedStyle(node, null) - if (styles) { - ret = name === "filter" ? styles.getPropertyValue(name) : styles[name] - if (ret === "") { - ret = node.style[name] //其他浏览器需要我们手动取内联样式 - } - } - return ret - } - cssHooks["opacity:get"] = function(node) { - var ret = cssHooks["@:get"](node, "opacity") - return ret === "" ? "1" : ret - } -} else { - var rnumnonpx = /^-?(?:\d*\.)?\d+(?!px)[^\d\s]+$/i - var rposition = /^(top|right|bottom|left)$/ - var ralpha = /alpha\([^)]*\)/i - var ie8 = !! window.XDomainRequest - var salpha = "DXImageTransform.Microsoft.Alpha" - var border = { - thin: ie8 ? '1px' : '2px', - medium: ie8 ? '3px' : '4px', - thick: ie8 ? '5px' : '6px' - } - cssHooks["@:get"] = function(node, name) { - //取得精确值,不过它有可能是带em,pc,mm,pt,%等单位 - var currentStyle = node.currentStyle - var ret = currentStyle[name] - if ((rnumnonpx.test(ret) && !rposition.test(ret))) { - //①,保存原有的style.left, runtimeStyle.left, - var style = node.style, - left = style.left, - rsLeft = node.runtimeStyle.left - //②由于③处的style.left = xxx会影响到currentStyle.left, - //因此把它currentStyle.left放到runtimeStyle.left, - //runtimeStyle.left拥有最高优先级,不会style.left影响 - node.runtimeStyle.left = currentStyle.left - //③将精确值赋给到style.left,然后通过IE的另一个私有属性 style.pixelLeft - //得到单位为px的结果;fontSize的分支见http://bugs.jquery.com/ticket/760 - style.left = name === 'fontSize' ? '1em' : (ret || 0) - ret = style.pixelLeft + "px" - //④还原 style.left,runtimeStyle.left - style.left = left - node.runtimeStyle.left = rsLeft - } - if (ret === "medium") { - name = name.replace("Width", "Style") - //border width 默认值为medium,即使其为0" - if (currentStyle[name] === "none") { - ret = "0px" - } - } - return ret === "" ? "auto" : border[ret] || ret - } - cssHooks["opacity:set"] = function(node, name, value) { - var style = node.style - var opacity = isFinite(value) && value <= 1 ? "alpha(opacity=" + value * 100 + ")" : "" - var filter = style.filter || ""; - style.zoom = 1 - //不能使用以下方式设置透明度 - //node.filters.alpha.opacity = value * 100 - style.filter = (ralpha.test(filter) ? - filter.replace(ralpha, opacity) : - filter + " " + opacity).trim() - if (!style.filter) { - style.removeAttribute("filter") - } - } - cssHooks["opacity:get"] = function(node) { - //这是最快的获取IE透明值的方式,不需要动用正则了! - var alpha = node.filters.alpha || node.filters[salpha], - op = alpha && alpha.enabled ? alpha.opacity : 100 - return (op / 100) + "" //确保返回的是字符串 - } -} - -"top,left".replace(rword, function(name) { - cssHooks[name + ":get"] = function(node) { - var computed = cssHooks["@:get"](node, name) - return /px$/.test(computed) ? computed : - avalon(node).position()[name] + "px" - } -}) - -var cssShow = { - position: "absolute", - visibility: "hidden", - display: "block" -} - -var rdisplayswap = /^(none|table(?!-c[ea]).+)/ - - function showHidden(node, array) { - //http://www.cnblogs.com/rubylouvre/archive/2012/10/27/2742529.html - if (node.offsetWidth <= 0) { //opera.offsetWidth可能小于0 - if (rdisplayswap.test(cssHooks["@:get"](node, "display"))) { - var obj = { - node: node - } - for (var name in cssShow) { - obj[name] = node.style[name] - node.style[name] = cssShow[name] - } - array.push(obj) - } - var parent = node.parentNode - if (parent && parent.nodeType === 1) { - showHidden(parent, array) - } - } - } - "Width,Height".replace(rword, function(name) { //fix 481 - var method = name.toLowerCase(), - clientProp = "client" + name, - scrollProp = "scroll" + name, - offsetProp = "offset" + name - cssHooks[method + ":get"] = function(node, which, override) { - var boxSizing = -4 - if (typeof override === "number") { - boxSizing = override - } - which = name === "Width" ? ["Left", "Right"] : ["Top", "Bottom"] - var ret = node[offsetProp] // border-box 0 - if (boxSizing === 2) { // margin-box 2 - return ret + avalon.css(node, "margin" + which[0], true) + avalon.css(node, "margin" + which[1], true) - } - if (boxSizing < 0) { // padding-box -2 - ret = ret - avalon.css(node, "border" + which[0] + "Width", true) - avalon.css(node, "border" + which[1] + "Width", true) - } - if (boxSizing === -4) { // content-box -4 - ret = ret - avalon.css(node, "padding" + which[0], true) - avalon.css(node, "padding" + which[1], true) - } - return ret - } - cssHooks[method + "&get"] = function(node) { - var hidden = []; - showHidden(node, hidden); - var val = cssHooks[method + ":get"](node) - for (var i = 0, obj; obj = hidden[i++];) { - node = obj.node - for (var n in obj) { - if (typeof obj[n] === "string") { - node.style[n] = obj[n] - } - } - } - return val; - } - avalon.fn[method] = function(value) { //会忽视其display - var node = this[0] - if (arguments.length === 0) { - if (node.setTimeout) { //取得窗口尺寸,IE9后可以用node.innerWidth /innerHeight代替 - return node["inner" + name] || node.document.documentElement[clientProp] - } - if (node.nodeType === 9) { //取得页面尺寸 - var doc = node.documentElement - //FF chrome html.scrollHeight< body.scrollHeight - //IE 标准模式 : html.scrollHeight> body.scrollHeight - //IE 怪异模式 : html.scrollHeight 最大等于可视窗口多一点? - return Math.max(node.body[scrollProp], doc[scrollProp], node.body[offsetProp], doc[offsetProp], doc[clientProp]) - } - return cssHooks[method + "&get"](node) - } else { - return this.css(method, value) - } - } - avalon.fn["inner" + name] = function() { - return cssHooks[method + ":get"](this[0], void 0, -2) - } - avalon.fn["outer" + name] = function(includeMargin) { - return cssHooks[method + ":get"](this[0], void 0, includeMargin === true ? 2 : 0) - } - }) - avalon.fn.offset = function() { //取得距离页面左右角的坐标 - var node = this[0], - box = { - left: 0, - top: 0 - } - if (!node || !node.tagName || !node.ownerDocument) { - return box - } - var doc = node.ownerDocument, - body = doc.body, - root = doc.documentElement, - win = doc.defaultView || doc.parentWindow - if (!avalon.contains(root, node)) { - return box - } - //http://hkom.blog1.fc2.com/?mode=m&no=750 body的偏移量是不包含margin的 - //我们可以通过getBoundingClientRect来获得元素相对于client的rect. - //http://msdn.microsoft.com/en-us/library/ms536433.aspx - if (node.getBoundingClientRect) { - box = node.getBoundingClientRect() // BlackBerry 5, iOS 3 (original iPhone) - } - //chrome/IE6: body.scrollTop, firefox/other: root.scrollTop - var clientTop = root.clientTop || body.clientTop, - clientLeft = root.clientLeft || body.clientLeft, - scrollTop = Math.max(win.pageYOffset || 0, root.scrollTop, body.scrollTop), - scrollLeft = Math.max(win.pageXOffset || 0, root.scrollLeft, body.scrollLeft) - // 把滚动距离加到left,top中去。 - // IE一些版本中会自动为HTML元素加上2px的border,我们需要去掉它 - // http://msdn.microsoft.com/en-us/library/ms533564(VS.85).aspx - return { - top: box.top + scrollTop - clientTop, - left: box.left + scrollLeft - clientLeft - } - } - - //==================================val相关============================ - - function getValType(elem) { - var ret = elem.tagName.toLowerCase() - return ret === "input" && /checkbox|radio/.test(elem.type) ? "checked" : ret - } -var roption = /^]+))?)*\s+value[\s=]/i -var valHooks = { - "option:get": IEVersion ? function(node) { - //在IE11及W3C,如果没有指定value,那么node.value默认为node.text(存在trim作),但IE9-10则是取innerHTML(没trim操作) - //specified并不可靠,因此通过分析outerHTML判定用户有没有显示定义value - return roption.test(node.outerHTML) ? node.value : node.text.trim() - } : function(node) { - return node.value - }, - "select:get": function(node, value) { - var option, options = node.options, - index = node.selectedIndex, - getter = valHooks["option:get"], - one = node.type === "select-one" || index < 0, - values = one ? null : [], - max = one ? index + 1 : options.length, - i = index < 0 ? max : one ? index : 0 - for (; i < max; i++) { - option = options[i] - //旧式IE在reset后不会改变selected,需要改用i === index判定 - //我们过滤所有disabled的option元素,但在safari5下,如果设置select为disable,那么其所有孩子都disable - //因此当一个元素为disable,需要检测其是否显式设置了disable及其父节点的disable情况 - if ((option.selected || i === index) && !option.disabled) { - value = getter(option) - if (one) { - return value - } - //收集所有selected值组成数组返回 - values.push(value) - } - } - return values - }, - "select:set": function(node, values, optionSet) { - values = [].concat(values) //强制转换为数组 - var getter = valHooks["option:get"] - for (var i = 0, el; el = node.options[i++];) { - if ((el.selected = values.indexOf(getter(el)) > -1)) { - optionSet = true - } - } - if (!optionSet) { - node.selectedIndex = -1 - } - } -} - -/********************************************************************* - * 编译系统 * - **********************************************************************/ -var meta = { - '\b': '\\b', - '\t': '\\t', - '\n': '\\n', - '\f': '\\f', - '\r': '\\r', - '"': '\\"', - '\\': '\\\\' -} -var quote = window.JSON && JSON.stringify || function(str) { - return '"' + str.replace(/[\\\"\x00-\x1f]/g, function(a) { - var c = meta[a]; - return typeof c === 'string' ? c : - '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); - }) + '"' -} - -var keywords = [ - "break,case,catch,continue,debugger,default,delete,do,else,false", - "finally,for,function,if,in,instanceof,new,null,return,switch,this", - "throw,true,try,typeof,var,void,while,with", /* 关键字*/ - "abstract,boolean,byte,char,class,const,double,enum,export,extends", - "final,float,goto,implements,import,int,interface,long,native", - "package,private,protected,public,short,static,super,synchronized", - "throws,transient,volatile", /*保留字*/ - "arguments,let,yield,undefined" /* ECMA 5 - use strict*/].join(",") -var rrexpstr = /\/\*[\w\W]*?\*\/|\/\/[^\n]*\n|\/\/[^\n]*$|"(?:[^"\\]|\\[\w\W])*"|'(?:[^'\\]|\\[\w\W])*'|[\s\t\n]*\.[\s\t\n]*[$\w\.]+/g -var rsplit = /[^\w$]+/g -var rkeywords = new RegExp(["\\b" + keywords.replace(/,/g, '\\b|\\b') + "\\b"].join('|'), 'g') -var rnumber = /\b\d[^,]*/g -var rcomma = /^,+|,+$/g -var variablePool = new Cache(512) -var getVariables = function (code) { - var key = "," + code.trim() - var ret = variablePool.get(key) - if (ret) { - return ret - } - var match = code - .replace(rrexpstr, "") - .replace(rsplit, ",") - .replace(rkeywords, "") - .replace(rnumber, "") - .replace(rcomma, "") - .split(/^$|,+/) - return variablePool.put(key, uniqSet(match)) -} -/*添加赋值语句*/ - -function addAssign(vars, scope, name, data) { - var ret = [], - prefix = " = " + name + "." - for (var i = vars.length, prop; prop = vars[--i]; ) { - if (scope.hasOwnProperty(prop)) { - ret.push(prop + prefix + prop) - data.vars.push(prop) - if (data.type === "duplex") { - vars.get = name + "." + prop - } - vars.splice(i, 1) - } - } - return ret -} - -function uniqSet(array) { - var ret = [], - unique = {} - for (var i = 0; i < array.length; i++) { - var el = array[i] - var id = el && typeof el.$id === "string" ? el.$id : el - if (!unique[id]) { - unique[id] = ret.push(el) - } - } - return ret -} -//缓存求值函数,以便多次利用 -var evaluatorPool = new Cache(128) -//取得求值函数及其传参 -var rduplex = /\w\[.*\]|\w\.\w/ -var rproxy = /(\$proxy\$[a-z]+)\d+$/ -var rthimRightParentheses = /\)\s*$/ -var rthimOtherParentheses = /\)\s*\|/g -var rquoteFilterName = /\|\s*([$\w]+)/g -var rpatchBracket = /"\s*\["/g -var rthimLeftParentheses = /"\s*\(/g -function parseFilter(val, filters) { - filters = filters - .replace(rthimRightParentheses, "")//处理最后的小括号 - .replace(rthimOtherParentheses, function () {//处理其他小括号 - return "],|" - }) - .replace(rquoteFilterName, function (a, b) { //处理|及它后面的过滤器的名字 - return "[" + quote(b) - }) - .replace(rpatchBracket, function () { - return '"],["' - }) - .replace(rthimLeftParentheses, function () { - return '",' - }) + "]" - return "return avalon.filters.$filter(" + val + ", " + filters + ")" -} - -function parseExpr(code, scopes, data) { - var dataType = data.type - var filters = data.filters || "" - var exprId = scopes.map(function (el) { - return String(el.$id).replace(rproxy, "$1") - }) + code + dataType + filters - var vars = getVariables(code).concat(), - assigns = [], - names = [], - args = [], - prefix = "" - //args 是一个对象数组, names 是将要生成的求值函数的参数 - scopes = uniqSet(scopes) - data.vars = [] - for (var i = 0, sn = scopes.length; i < sn; i++) { - if (vars.length) { - var name = "vm" + expose + "_" + i - names.push(name) - args.push(scopes[i]) - assigns.push.apply(assigns, addAssign(vars, scopes[i], name, data)) - } - } - if (!assigns.length && dataType === "duplex") { - return - } - if (dataType !== "duplex" && (code.indexOf("||") > -1 || code.indexOf("&&") > -1)) { - //https://github.com/RubyLouvre/avalon/issues/583 - data.vars.forEach(function (v) { - var reg = new RegExp("\\b" + v + "(?:\\.\\w+|\\[\\w+\\])+", "ig") - code = code.replace(reg, function (_) { - var c = _.charAt(v.length) - var r = IEVersion ? code.slice(arguments[1] + _.length) : RegExp.rightContext - var method = /^\s*\(/.test(r) - if (c === "." || c === "[" || method) {//比如v为aa,我们只匹配aa.bb,aa[cc],不匹配aaa.xxx - var name = "var" + String(Math.random()).replace(/^0\./, "") - if (method) {//array.size() - var array = _.split(".") - if (array.length > 2) { - var last = array.pop() - assigns.push(name + " = " + array.join(".")) - return name + "." + last - } else { - return _ - } - } - assigns.push(name + " = " + _) - return name - } else { - return _ - } - }) - }) - } - //---------------args---------------- - data.args = args - //---------------cache---------------- - delete data.vars - var fn = evaluatorPool.get(exprId) //直接从缓存,免得重复生成 - if (fn) { - data.evaluator = fn - return - } - prefix = assigns.join(", ") - if (prefix) { - prefix = "var " + prefix - } - if (/\S/.test(filters)) { //文本绑定,双工绑定才有过滤器 - if (!/text|html/.test(data.type)) { - throw Error("ms-" + data.type + "不支持过滤器") - } - code = "\nvar ret" + expose + " = " + code + ";\r\n" - code += parseFilter("ret" + expose, filters) - } else if (dataType === "duplex") { //双工绑定 - var _body = "'use strict';\nreturn function(vvv){\n\t" + - prefix + - ";\n\tif(!arguments.length){\n\t\treturn " + - code + - "\n\t}\n\t" + (!rduplex.test(code) ? vars.get : code) + - "= vvv;\n} " - try { - fn = Function.apply(noop, names.concat(_body)) - data.evaluator = evaluatorPool.put(exprId, fn) - } catch (e) { - log("debug: parse error," + e.message) - } - return - } else if (dataType === "on") { //事件绑定 - if (code.indexOf("(") === -1) { - code += ".call(this, $event)" - } else { - code = code.replace("(", ".call(this,") - } - names.push("$event") - code = "\nreturn " + code + ";" //IE全家 Function("return ")出错,需要Function("return ;") - var lastIndex = code.lastIndexOf("\nreturn") - var header = code.slice(0, lastIndex) - var footer = code.slice(lastIndex) - code = header + "\n" + footer - } else { //其他绑定 - code = "\nreturn " + code + ";" //IE全家 Function("return ")出错,需要Function("return ;") - } - try { - fn = Function.apply(noop, names.concat("'use strict';\n" + prefix + code)) - data.evaluator = evaluatorPool.put(exprId, fn) - } catch (e) { - log("debug: parse error," + e.message) - } finally { - vars = assigns = names = null //释放内存 - } -} - - -//parseExpr的智能引用代理 - -function parseExprProxy(code, scopes, data, tokens, noRegister) { - if (Array.isArray(tokens)) { - code = tokens.map(function (el) { - return el.expr ? "(" + el.value + ")" : quote(el.value) - }).join(" + ") - } - parseExpr(code, scopes, data) - if (data.evaluator && !noRegister) { - data.handler = bindingExecutors[data.handlerName || data.type] - //方便调试 - //这里非常重要,我们通过判定视图刷新函数的element是否在DOM树决定 - //将它移出订阅者列表 - avalon.injectBinding(data) - } -} -avalon.parseExprProxy = parseExprProxy -/********************************************************************* - * 扫描系统 * - **********************************************************************/ - -avalon.scan = function(elem, vmodel) { - elem = elem || root - var vmodels = vmodel ? [].concat(vmodel) : [] - scanTag(elem, vmodels) -} - -//http://www.w3.org/TR/html5/syntax.html#void-elements -var stopScan = oneObject("area,base,basefont,br,col,command,embed,hr,img,input,link,meta,param,source,track,wbr,noscript,script,style,textarea".toUpperCase()) - -function checkScan(elem, callback, innerHTML) { - var id = setTimeout(function() { - var currHTML = elem.innerHTML - clearTimeout(id) - if (currHTML === innerHTML) { - callback() - } else { - checkScan(elem, callback, currHTML) - } - }) -} - - -function createSignalTower(elem, vmodel) { - var id = elem.getAttribute("avalonctrl") || vmodel.$id - elem.setAttribute("avalonctrl", id) - vmodel.$events.expr = elem.tagName + '[avalonctrl="' + id + '"]' -} - -var getBindingCallback = function(elem, name, vmodels) { - var callback = elem.getAttribute(name) - if (callback) { - for (var i = 0, vm; vm = vmodels[i++]; ) { - if (vm.hasOwnProperty(callback) && typeof vm[callback] === "function") { - return vm[callback] - } - } - } -} - -function executeBindings(bindings, vmodels) { - for (var i = 0, data; data = bindings[i++]; ) { - data.vmodels = vmodels - bindingHandlers[data.type](data, vmodels) - if (data.evaluator && data.element && data.element.nodeType === 1) { //移除数据绑定,防止被二次解析 - //chrome使用removeAttributeNode移除不存在的特性节点时会报错 https://github.com/RubyLouvre/avalon/issues/99 - data.element.removeAttribute(data.name) - } - } - bindings.length = 0 -} - -//https://github.com/RubyLouvre/avalon/issues/636 -var mergeTextNodes = IEVersion && window.MutationObserver ? function (elem) { - var node = elem.firstChild, text - while (node) { - var aaa = node.nextSibling - if (node.nodeType === 3) { - if (text) { - text.nodeValue += node.nodeValue - elem.removeChild(node) - } else { - text = node - } - } else { - text = null - } - node = aaa - } -} : 0 -var roneTime = /^\s*::/ -var rmsAttr = /ms-(\w+)-?(.*)/ -var priorityMap = { - "if": 10, - "repeat": 90, - "data": 100, - "widget": 110, - "each": 1400, - "with": 1500, - "duplex": 2000, - "on": 3000 -} - -var events = oneObject("animationend,blur,change,input,click,dblclick,focus,keydown,keypress,keyup,mousedown,mouseenter,mouseleave,mousemove,mouseout,mouseover,mouseup,scan,scroll,submit") -var obsoleteAttrs = oneObject("value,title,alt,checked,selected,disabled,readonly,enabled") -function bindingSorter(a, b) { - return a.priority - b.priority -} - -function scanAttr(elem, vmodels, match) { - var scanNode = true - if (vmodels.length) { - var attributes = getAttributes ? getAttributes(elem) : elem.attributes - var bindings = [] - var fixAttrs = [] - var msData = {} - for (var i = 0, attr; attr = attributes[i++]; ) { - if (attr.specified) { - if (match = attr.name.match(rmsAttr)) { - //如果是以指定前缀命名的 - var type = match[1] - var param = match[2] || "" - var value = attr.value - var name = attr.name - if (events[type]) { - param = type - type = "on" - } else if (obsoleteAttrs[type]) { - if (type === "enabled") {//吃掉ms-enabled绑定,用ms-disabled代替 - log("warning!ms-enabled或ms-attr-enabled已经被废弃") - type = "disabled" - value = "!(" + value + ")" - } - param = type - type = "attr" - name = "ms-" + type + "-"+ param - fixAttrs.push([attr.name, name, value]) - } - msData[name] = value - if (typeof bindingHandlers[type] === "function") { - var newValue = value.replace(roneTime, "") - var oneTime = value !== newValue - var binding = { - type: type, - param: param, - element: elem, - name: name, - value: newValue, - oneTime: oneTime, - uuid: name+"-"+getUid(elem), - //chrome与firefox下Number(param)得到的值不一样 #855 - priority: (priorityMap[type] || type.charCodeAt(0) * 10 )+ (Number(param.replace(/\D/g, "")) || 0) - } - if (type === "html" || type === "text") { - var token = getToken(value) - avalon.mix(binding, token) - binding.filters = binding.filters.replace(rhasHtml, function () { - binding.type = "html" - binding.group = 1 - return "" - })// jshint ignore:line - } else if (type === "duplex") { - var hasDuplex = name - } else if (name === "ms-if-loop") { - binding.priority += 100 - } - bindings.push(binding) - if (type === "widget") { - elem.msData = elem.msData || msData - } - } - } - } - } - if (bindings.length) { - bindings.sort(bindingSorter) - fixAttrs.forEach(function (arr) { - log("warning!请改用" + arr[1] + "代替" + arr[0] + "!") - elem.removeAttribute(arr[0]) - elem.setAttribute(arr[1], arr[2]) - }) - //http://bugs.jquery.com/ticket/7071 - //在IE下对VML读取type属性,会让此元素所有属性都变成 - if (hasDuplex) { - if (msData["ms-attr-checked"]) { - log("warning!一个控件不能同时定义ms-attr-checked与" + hasDuplex) - } - if (msData["ms-attr-value"]) { - log("warning!一个控件不能同时定义ms-attr-value与" + hasDuplex) - } - } - for (i = 0; binding = bindings[i]; i++) { - type = binding.type - if (rnoscanAttrBinding.test(type)) { - return executeBindings(bindings.slice(0, i + 1), vmodels) - } else if (scanNode) { - scanNode = !rnoscanNodeBinding.test(type) - } - } - executeBindings(bindings, vmodels) - } - } - if (scanNode && !stopScan[elem.tagName] && rbind.test(elem.innerHTML.replace(rlt, "<").replace(rgt, ">"))) { - mergeTextNodes && mergeTextNodes(elem) - scanNodeList(elem, vmodels) //扫描子孙元素 - } -} -var rnoscanAttrBinding = /^if|widget|repeat$/ -var rnoscanNodeBinding = /^each|with|html|include$/ -//IE67下,在循环绑定中,一个节点如果是通过cloneNode得到,自定义属性的specified为false,无法进入里面的分支, -//但如果我们去掉scanAttr中的attr.specified检测,一个元素会有80+个特性节点(因为它不区分固有属性与自定义属性),很容易卡死页面 -if (!"1" [0]) { - var attrPool = new Cache(512) - var rattrs = /\s+(ms-[^=\s]+)(?:=("[^"]*"|'[^']*'|[^\s>]+))?/g, - rquote = /^['"]/, - rtag = /<\w+\b(?:(["'])[^"]*?(\1)|[^>])*>/i, - ramp = /&/g - //IE6-8解析HTML5新标签,会将它分解两个元素节点与一个文本节点 - //
ddd
- // window.onload = function() { - // var body = document.body - // for (var i = 0, el; el = body.children[i++]; ) { - // avalon.log(el.outerHTML) - // } - // } - //依次输出
,
- var getAttributes = function (elem) { - var html = elem.outerHTML - //处理IE6-8解析HTML5新标签的情况,及
等半闭合标签outerHTML为空的情况 - if (html.slice(0, 2) === " ms-important(1) --> ms-controller(2) --> ms-if(10) --> ms-repeat(100) - //--> ms-if-loop(110) --> ms-attr(970) ...--> ms-each(1400)-->ms-with(1500)--〉ms-duplex(2000)垫后 - var a = elem.getAttribute("ms-skip") - //#360 在旧式IE中 Object标签在引入Flash等资源时,可能出现没有getAttributeNode,innerHTML的情形 - if (!elem.getAttributeNode) { - return log("warning " + elem.tagName + " no getAttributeNode method") - } - var b = elem.getAttributeNode("ms-important") - var c = elem.getAttributeNode("ms-controller") - if (typeof a === "string") { - return - } else if (node = b || c) { - var newVmodel = avalon.vmodels[node.value] - if (!newVmodel) { - return - } - //ms-important不包含父VM,ms-controller相反 - vmodels = node === b ? [newVmodel] : [newVmodel].concat(vmodels) - var name = node.name - elem.removeAttribute(name) //removeAttributeNode不会刷新[ms-controller]样式规则 - avalon(elem).removeClass(name) - createSignalTower(elem, newVmodel) - } - scanAttr(elem, vmodels) //扫描特性节点 -} -var rhasHtml = /\|\s*html(?:\b|$)/, - r11a = /\|\|/g, - rlt = /</g, - rgt = />/g, - rstringLiteral = /(['"])(\\\1|.)+?\1/g -function getToken(value) { - if (value.indexOf("|") > 0) { - var scapegoat = value.replace(rstringLiteral, function (_) { - return Array(_.length + 1).join("1")// jshint ignore:line - }) - var index = scapegoat.replace(r11a, "\u1122\u3344").indexOf("|") //干掉所有短路或 - if (index > -1) { - return { - filters: value.slice(index), - value: value.slice(0, index), - expr: true - } - } - } - return { - value: value, - filters: "", - expr: true - } -} - -function scanExpr(str) { - var tokens = [], - value, start = 0, - stop - do { - stop = str.indexOf(openTag, start) - if (stop === -1) { - break - } - value = str.slice(start, stop) - if (value) { // {{ 左边的文本 - tokens.push({ - value: value, - filters: "", - expr: false - }) - } - start = stop + openTag.length - stop = str.indexOf(closeTag, start) - if (stop === -1) { - break - } - value = str.slice(start, stop) - if (value) { //处理{{ }}插值表达式 - tokens.push(getToken(value, start)) - } - start = stop + closeTag.length - } while (1) - value = str.slice(start) - if (value) { //}} 右边的文本 - tokens.push({ - value: value, - expr: false, - filters: "" - }) - } - return tokens -} - -function scanText(textNode, vmodels, index) { - var bindings = [] - tokens = scanExpr(textNode.data) - if (tokens.length) { - for (var i = 0; token = tokens[i++]; ) { - var node = DOC.createTextNode(token.value) //将文本转换为文本节点,并替换原来的文本节点 - if (token.expr) { - token.value = token.value.replace(roneTime, function () { - token.oneTime = true - return "" - }) - token.type = "text" - token.element = node - token.filters = token.filters.replace(rhasHtml, function (a, b,c) { - token.type = "html" - return "" - })// jshint ignore:line - token.pos = index * 1000 + i - bindings.push(token) //收集带有插值表达式的文本 - } - avalonFragment.appendChild(node) - } - textNode.parentNode.replaceChild(avalonFragment, textNode) - if (bindings.length) - executeBindings(bindings, vmodels) - } -} - -var bools = ["autofocus,autoplay,async,allowTransparency,checked,controls", - "declare,disabled,defer,defaultChecked,defaultSelected", - "contentEditable,isMap,loop,multiple,noHref,noResize,noShade", - "open,readOnly,selected" -].join(",") -var boolMap = {} -bools.replace(rword, function(name) { - boolMap[name.toLowerCase()] = name -}) - -var propMap = { //属性名映射 - "accept-charset": "acceptCharset", - "char": "ch", - "charoff": "chOff", - "class": "className", - "for": "htmlFor", - "http-equiv": "httpEquiv" -} - -var anomaly = ["accessKey,bgColor,cellPadding,cellSpacing,codeBase,codeType,colSpan", - "dateTime,defaultValue,frameBorder,longDesc,maxLength,marginWidth,marginHeight", - "rowSpan,tabIndex,useMap,vSpace,valueType,vAlign" -].join(",") -anomaly.replace(rword, function(name) { - propMap[name.toLowerCase()] = name -}) - -var rnoscripts = /(?:[\s\S]+?)<\/noscript>/img -var rnoscriptText = /([\s\S]+?)<\/noscript>/im - -var getXHR = function() { - return new(window.XMLHttpRequest || ActiveXObject)("Microsoft.XMLHTTP") // jshint ignore:line -} - -var templatePool = avalon.templateCache = {} - -bindingHandlers.attr = function(data, vmodels) { - var text = data.value.trim(), - simple = true - if (text.indexOf(openTag) > -1 && text.indexOf(closeTag) > 2) { - simple = false - if (rexpr.test(text) && RegExp.rightContext === "" && RegExp.leftContext === "") { - simple = true - text = RegExp.$1 - } - } - if (data.type === "include") { - var elem = data.element - data.includeRendered = getBindingCallback(elem, "data-include-rendered", vmodels) - data.includeLoaded = getBindingCallback(elem, "data-include-loaded", vmodels) - var outer = data.includeReplace = !! avalon(elem).data("includeReplace") - if (avalon(elem).data("includeCache")) { - data.templateCache = {} - } - data.startInclude = DOC.createComment("ms-include") - data.endInclude = DOC.createComment("ms-include-end") - if (outer) { - data.element = data.startInclude - elem.parentNode.insertBefore(data.startInclude, elem) - elem.parentNode.insertBefore(data.endInclude, elem.nextSibling) - } else { - elem.insertBefore(data.startInclude, elem.firstChild) - elem.appendChild(data.endInclude) - } - } - data.handlerName = "attr" //handleName用于处理多种绑定共用同一种bindingExecutor的情况 - parseExprProxy(text, vmodels, data, (simple ? 0 : scanExpr(data.value))) -} - -bindingExecutors.attr = function(val, elem, data) { - var method = data.type, - attrName = data.param - if (method === "css") { - avalon(elem).css(attrName, val) - } else if (method === "attr") { - - // ms-attr-class="xxx" vm.xxx="aaa bbb ccc"将元素的className设置为aaa bbb ccc - // ms-attr-class="xxx" vm.xxx=false 清空元素的所有类名 - // ms-attr-name="yyy" vm.yyy="ooo" 为元素设置name属性 - var toRemove = (val === false) || (val === null) || (val === void 0) - - if (!W3C && propMap[attrName]) { //旧式IE下需要进行名字映射 - attrName = propMap[attrName] - } - var bool = boolMap[attrName] - if (typeof elem[bool] === "boolean") { - elem[bool] = !! val //布尔属性必须使用el.xxx = true|false方式设值 - if (!val) { //如果为false, IE全系列下相当于setAttribute(xxx,''),会影响到样式,需要进一步处理 - toRemove = true - } - } - if (toRemove) { - return elem.removeAttribute(attrName) - } - //SVG只能使用setAttribute(xxx, yyy), VML只能使用elem.xxx = yyy ,HTML的固有属性必须elem.xxx = yyy - var isInnate = rsvg.test(elem) ? false : (DOC.namespaces && isVML(elem)) ? true : attrName in elem.cloneNode(false) - if (isInnate) { - elem[attrName] = val+"" - } else { - elem.setAttribute(attrName, val) - } - } else if (method === "include" && val) { - var vmodels = data.vmodels - var rendered = data.includeRendered - var loaded = data.includeLoaded - var replace = data.includeReplace - var target = replace ? elem.parentNode : elem - var scanTemplate = function(text) { - if (loaded) { - var newText = loaded.apply(target, [text].concat(vmodels)) - if (typeof newText === "string") - text = newText - } - if (rendered) { - checkScan(target, function() { - rendered.call(target) - }, NaN) - } - var lastID = data.includeLastID - if (data.templateCache && lastID && lastID !== val) { - var lastTemplate = data.templateCache[lastID] - if (!lastTemplate) { - lastTemplate = data.templateCache[lastID] = DOC.createElement("div") - ifGroup.appendChild(lastTemplate) - } - } - data.includeLastID = val - while (true) { - var node = data.startInclude.nextSibling - if (node && node !== data.endInclude) { - target.removeChild(node) - if (lastTemplate) - lastTemplate.appendChild(node) - } else { - break - } - } - var dom = getTemplateNodes(data, val, text) - var nodes = avalon.slice(dom.childNodes) - target.insertBefore(dom, data.endInclude) - scanNodeArray(nodes, vmodels) - } - - if (data.param === "src") { - if (typeof templatePool[val] === "string") { - avalon.nextTick(function() { - scanTemplate(templatePool[val]) - }) - } else if (Array.isArray(templatePool[val])) { //#805 防止在循环绑定中发出许多相同的请求 - templatePool[val].push(scanTemplate) - } else { - var xhr = getXHR() - xhr.onreadystatechange = function() { - if (xhr.readyState === 4) { - var s = xhr.status - if (s >= 200 && s < 300 || s === 304 || s === 1223) { - var text = xhr.responseText - for (var f = 0, fn; fn = templatePool[val][f++];) { - fn(text) - } - templatePool[val] = text - } - } - } - templatePool[val] = [scanTemplate] - xhr.open("GET", val, true) - if ("withCredentials" in xhr) { - xhr.withCredentials = true - } - xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest") - xhr.send(null) - } - } else { - //IE系列与够新的标准浏览器支持通过ID取得元素(firefox14+) - //http://tjvantoll.com/2012/07/19/dom-element-references-as-global-variables/ - var el = val && val.nodeType === 1 ? val : DOC.getElementById(val) - if (el) { - if (el.tagName === "NOSCRIPT" && !(el.innerHTML || el.fixIE78)) { //IE7-8 innerText,innerHTML都无法取得其内容,IE6能取得其innerHTML - xhr = getXHR() //IE9-11与chrome的innerHTML会得到转义的内容,它们的innerText可以 - xhr.open("GET", location, false) //谢谢Nodejs 乱炖群 深圳-纯属虚构 - xhr.send(null) - //http://bbs.csdn.net/topics/390349046?page=1#post-393492653 - var noscripts = DOC.getElementsByTagName("noscript") - var array = (xhr.responseText || "").match(rnoscripts) || [] - var n = array.length - for (var i = 0; i < n; i++) { - var tag = noscripts[i] - if (tag) { //IE6-8中noscript标签的innerHTML,innerText是只读的 - tag.style.display = "none" //http://haslayout.net/css/noscript-Ghost-Bug - tag.fixIE78 = (array[i].match(rnoscriptText) || ["", " "])[1] - } - } - } - avalon.nextTick(function() { - scanTemplate(el.fixIE78 || el.value || el.innerText || el.innerHTML) - }) - } - } - } else { - if (!root.hasAttribute && typeof val === "string" && (method === "src" || method === "href")) { - val = val.replace(/&/g, "&") //处理IE67自动转义的问题 - } - elem[method] = val - if (window.chrome && elem.tagName === "EMBED") { - var parent = elem.parentNode //#525 chrome1-37下embed标签动态设置src不能发生请求 - var comment = document.createComment("ms-src") - parent.replaceChild(comment, elem) - parent.replaceChild(elem, comment) - } - } -} - -function getTemplateNodes(data, id, text) { - var div = data.templateCache && data.templateCache[id] - if (div) { - var dom = DOC.createDocumentFragment(), - firstChild - while (firstChild = div.firstChild) { - dom.appendChild(firstChild) - } - return dom - } - return avalon.parseHTML(text) -} - -//这几个指令都可以使用插值表达式,如ms-src="aaa/{{b}}/{{c}}.html" -"title,alt,src,value,css,include,href".replace(rword, function(name) { - bindingHandlers[name] = bindingHandlers.attr -}) -//根据VM的属性值或表达式的值切换类名,ms-class="xxx yyy zzz:flag" -//http://www.cnblogs.com/rubylouvre/archive/2012/12/17/2818540.html -bindingHandlers["class"] = function(data, vmodels) { - var oldStyle = data.param, - text = data.value, - rightExpr - data.handlerName = "class" - if (!oldStyle || isFinite(oldStyle)) { - data.param = "" //去掉数字 - var noExpr = text.replace(rexprg, function(a) { - return a.replace(/./g, "0") - //return Math.pow(10, a.length - 1) //将插值表达式插入10的N-1次方来占位 - }) - var colonIndex = noExpr.indexOf(":") //取得第一个冒号的位置 - if (colonIndex === -1) { // 比如 ms-class="aaa bbb ccc" 的情况 - var className = text - } else { // 比如 ms-class-1="ui-state-active:checked" 的情况 - className = text.slice(0, colonIndex) - rightExpr = text.slice(colonIndex + 1) - parseExpr(rightExpr, vmodels, data) //决定是添加还是删除 - if (!data.evaluator) { - log("debug: ms-class '" + (rightExpr || "").trim() + "' 不存在于VM中") - return false - } else { - data._evaluator = data.evaluator - data._args = data.args - } - } - var hasExpr = rexpr.test(className) //比如ms-class="width{{w}}"的情况 - if (!hasExpr) { - data.immobileClass = className - } - parseExprProxy("", vmodels, data, (hasExpr ? scanExpr(className) : 0)) - } else { - data.immobileClass = data.oldStyle = data.param - parseExprProxy(text, vmodels, data) - } -} - -bindingExecutors["class"] = function(val, elem, data) { - var $elem = avalon(elem), - method = data.type - if (method === "class" && data.oldStyle) { //如果是旧风格 - $elem.toggleClass(data.oldStyle, !! val) - } else { - //如果存在冒号就有求值函数 - data.toggleClass = data._evaluator ? !! data._evaluator.apply(elem, data._args) : true - data.newClass = data.immobileClass || val - if (data.oldClass && data.newClass !== data.oldClass) { - $elem.removeClass(data.oldClass) - } - data.oldClass = data.newClass - switch (method) { - case "class": - $elem.toggleClass(data.newClass, data.toggleClass) - break - case "hover": - case "active": - if (!data.hasBindEvent) { //确保只绑定一次 - var activate = "mouseenter" //在移出移入时切换类名 - var abandon = "mouseleave" - if (method === "active") { //在聚焦失焦中切换类名 - elem.tabIndex = elem.tabIndex || -1 - activate = "mousedown" - abandon = "mouseup" - var fn0 = $elem.bind("mouseleave", function() { - data.toggleClass && $elem.removeClass(data.newClass) - }) - } - var fn1 = $elem.bind(activate, function() { - data.toggleClass && $elem.addClass(data.newClass) - }) - var fn2 = $elem.bind(abandon, function() { - data.toggleClass && $elem.removeClass(data.newClass) - }) - data.rollback = function() { - $elem.unbind("mouseleave", fn0) - $elem.unbind(activate, fn1) - $elem.unbind(abandon, fn2) - } - data.hasBindEvent = true - } - break; - } - } -} - -"hover,active".replace(rword, function(method) { - bindingHandlers[method] = bindingHandlers["class"] -}) -//ms-controller绑定已经在scanTag 方法中实现 -//ms-css绑定已由ms-attr绑定实现 - - -// bindingHandlers.data 定义在if.js -bindingExecutors.data = function(val, elem, data) { - var key = "data-" + data.param - if (val && typeof val === "object") { - elem[key] = val - } else { - elem.setAttribute(key, String(val)) - } -} -//双工绑定 -var duplexBinding = bindingHandlers.duplex = function(data, vmodels) { - var elem = data.element, - hasCast - parseExprProxy(data.value, vmodels, data, 0, 1) - - data.changed = getBindingCallback(elem, "data-duplex-changed", vmodels) || noop - if (data.evaluator && data.args) { - var params = [] - var casting = oneObject("string,number,boolean,checked") - if (elem.type === "radio" && data.param === "") { - data.param = "checked" - } - if (elem.msData) { - elem.msData["ms-duplex"] = data.value - } - data.param.replace(/\w+/g, function(name) { - if (/^(checkbox|radio)$/.test(elem.type) && /^(radio|checked)$/.test(name)) { - if (name === "radio") - log("ms-duplex-radio已经更名为ms-duplex-checked") - name = "checked" - data.isChecked = true - } - if (name === "bool") { - name = "boolean" - log("ms-duplex-bool已经更名为ms-duplex-boolean") - } else if (name === "text") { - name = "string" - log("ms-duplex-text已经更名为ms-duplex-string") - } - if (casting[name]) { - hasCast = true - } - avalon.Array.ensure(params, name) - }) - if (!hasCast) { - params.push("string") - } - data.param = params.join("-") - data.bound = function(type, callback) { - if (elem.addEventListener) { - elem.addEventListener(type, callback, false) - } else { - elem.attachEvent("on" + type, callback) - } - var old = data.rollback - data.rollback = function() { - elem.avalonSetter = null - avalon.unbind(elem, type, callback) - old && old() - } - } - for (var i in avalon.vmodels) { - var v = avalon.vmodels[i] - v.$fire("avalon-ms-duplex-init", data) - } - var cpipe = data.pipe || (data.pipe = pipe) - cpipe(null, data, "init") - var tagName = elem.tagName - duplexBinding[tagName] && duplexBinding[tagName](elem, data.evaluator.apply(null, data.args), data) - } -} -//不存在 bindingExecutors.duplex - - function fixNull(val) { - return val == null ? "" : val - } -avalon.duplexHooks = { - checked: { - get: function(val, data) { - return !data.element.oldValue - } - }, - string: { - get: function(val) { //同步到VM - return val - }, - set: fixNull - }, - "boolean": { - get: function(val) { - return val === "true" - }, - set: fixNull - }, - number: { - get: function(val, data) { - var number = parseFloat(val) - if (-val === -number) { - return number - } - var arr = /strong|medium|weak/.exec(data.element.getAttribute("data-duplex-number")) || ["medium"] - switch (arr[0]) { - case "strong": - return 0 - case "medium": - return val === "" ? "" : 0 - case "weak": - return val - } - }, - set: fixNull - } -} - -function pipe(val, data, action, e) { - data.param.replace(/\w+/g, function(name) { - var hook = avalon.duplexHooks[name] - if (hook && typeof hook[action] === "function") { - val = hook[action](val, data) - } - }) - return val -} - -var TimerID, ribbon = [] - - avalon.tick = function(fn) { - if (ribbon.push(fn) === 1) { - TimerID = setInterval(ticker, 60) - } - } - - function ticker() { - for (var n = ribbon.length - 1; n >= 0; n--) { - var el = ribbon[n] - if (el() === false) { - ribbon.splice(n, 1) - } - } - if (!ribbon.length) { - clearInterval(TimerID) - } - } - -var watchValueInTimer = noop -var rmsinput = /text|password|hidden/ -new function() { // jshint ignore:line - try { //#272 IE9-IE11, firefox - var setters = {} - var aproto = HTMLInputElement.prototype - var bproto = HTMLTextAreaElement.prototype - function newSetter(value) { // jshint ignore:line - setters[this.tagName].call(this, value) - if (rmsinput.test(this.type) && !this.msFocus && this.avalonSetter) { - this.avalonSetter() - } - } - var inputProto = HTMLInputElement.prototype - Object.getOwnPropertyNames(inputProto) //故意引发IE6-8等浏览器报错 - setters["INPUT"] = Object.getOwnPropertyDescriptor(aproto, "value").set - - Object.defineProperty(aproto, "value", { - set: newSetter - }) - setters["TEXTAREA"] = Object.getOwnPropertyDescriptor(bproto, "value").set - Object.defineProperty(bproto, "value", { - set: newSetter - }) - } catch (e) { - //在chrome 43中 ms-duplex终于不需要使用定时器实现双向绑定了 - // http://updates.html5rocks.com/2015/04/DOM-attributes-now-on-the-prototype - // https://docs.google.com/document/d/1jwA8mtClwxI-QJuHT7872Z0pxpZz8PBkf2bGAbsUtqs/edit?pli=1 - watchValueInTimer = avalon.tick - } -} // jshint ignore:line -if (IEVersion) { - avalon.bind(DOC, "selectionchange", function(e) { - var el = DOC.activeElement - if (el && typeof el.avalonSetter === "function") { - el.avalonSetter() - } - }) -} - -//处理radio, checkbox, text, textarea, password -duplexBinding.INPUT = function(element, evaluator, data) { - var $type = element.type, - bound = data.bound, - $elem = avalon(element), - composing = false - - function callback(value) { - data.changed.call(this, value, data) - } - - function compositionStart() { - composing = true - } - - function compositionEnd() { - composing = false - } - //当value变化时改变model的值 - var updateVModel = function() { - if (composing) //处理中文输入法在minlengh下引发的BUG - return - var val = element.oldValue = element.value //防止递归调用形成死循环 - var lastValue = data.pipe(val, data, "get") - if ($elem.data("duplexObserve") !== false) { - evaluator(lastValue) - callback.call(element, lastValue) - if ($elem.data("duplex-focus")) { - avalon.nextTick(function() { - element.focus() - }) - } - } - } - //当model变化时,它就会改变value的值 - data.handler = function() { - var val = data.pipe(evaluator(), data, "set") + "" //fix #673 - if (val !== element.oldValue) { - element.value = val - } - } - if (data.isChecked || $type === "radio") { - var IE6 = IEVersion === 6 - updateVModel = function() { - if ($elem.data("duplexObserve") !== false) { - var lastValue = data.pipe(element.value, data, "get") - evaluator(lastValue) - callback.call(element, lastValue) - } - } - data.handler = function() { - var val = evaluator() - var checked = data.isChecked ? !! val : val + "" === element.value - element.oldValue = checked - if (IE6) { - setTimeout(function() { - //IE8 checkbox, radio是使用defaultChecked控制选中状态, - //并且要先设置defaultChecked后设置checked - //并且必须设置延迟 - element.defaultChecked = checked - element.checked = checked - }, 31) - } else { - element.checked = checked - } - } - bound("click", updateVModel) - } else if ($type === "checkbox") { - updateVModel = function() { - if ($elem.data("duplexObserve") !== false) { - var method = element.checked ? "ensure" : "remove" - var array = evaluator() - if (!Array.isArray(array)) { - log("ms-duplex应用于checkbox上要对应一个数组") - array = [array] - } - var val = data.pipe(element.value, data, "get") - avalon.Array[method](array, val) - callback.call(element, array) - } - } - - data.handler = function() { - var array = [].concat(evaluator()) //强制转换为数组 - var val = data.pipe(element.value, data, "get") - element.checked = array.indexOf(val) > -1 - } - bound(W3C ? "change" : "click", updateVModel) - } else { - var events = element.getAttribute("data-duplex-event") || "input" - if (element.attributes["data-event"]) { - log("data-event指令已经废弃,请改用data-duplex-event") - } - - function delay(e) { // jshint ignore:line - setTimeout(function() { - updateVModel(e) - }) - } - events.replace(rword, function(name) { - switch (name) { - case "input": - if (!IEVersion) { // W3C - bound("input", updateVModel) - //非IE浏览器才用这个 - bound("compositionstart", compositionStart) - bound("compositionend", compositionEnd) - bound("DOMAutoComplete", updateVModel) - } else { //onpropertychange事件无法区分是程序触发还是用户触发 - // IE下通过selectionchange事件监听IE9+点击input右边的X的清空行为,及粘贴,剪切,删除行为 - if (IEVersion > 8) { - bound("input", updateVModel) //IE9使用propertychange无法监听中文输入改动 - } else { - bound("propertychange", function(e) { //IE6-8下第一次修改时不会触发,需要使用keydown或selectionchange修正 - if (e.propertyName === "value") { - updateVModel() - } - }) - } - bound("dragend", delay) - //http://www.cnblogs.com/rubylouvre/archive/2013/02/17/2914604.html - //http://www.matts411.com/post/internet-explorer-9-oninput/ - } - break - default: - bound(name, updateVModel) - break - } - }) - bound("focus", function() { - element.msFocus = true - }) - bound("blur", function() { - element.msFocus = false - }) - - if (rmsinput.test($type)) { - watchValueInTimer(function() { - if (root.contains(element)) { - if (!element.msFocus && element.oldValue !== element.value) { - updateVModel() - } - } else if (!element.msRetain) { - return false - } - }) - } - - element.avalonSetter = updateVModel //#765 - } - - element.oldValue = element.value - avalon.injectBinding(data) - callback.call(element, element.value) -} -duplexBinding.TEXTAREA = duplexBinding.INPUT -duplexBinding.SELECT = function(element, evaluator, data) { - var $elem = avalon(element) - - function updateVModel() { - if ($elem.data("duplexObserve") !== false) { - var val = $elem.val() //字符串或字符串数组 - if (Array.isArray(val)) { - val = val.map(function(v) { - return data.pipe(v, data, "get") - }) - } else { - val = data.pipe(val, data, "get") - } - if (val + "" !== element.oldValue) { - evaluator(val) - } - data.changed.call(element, val, data) - } - } - data.handler = function() { - var val = evaluator() - val = val && val.$model || val - if (Array.isArray(val)) { - if (!element.multiple) { - log("ms-duplex在不能对应一个数组") - } - } - //必须变成字符串后才能比较 - val = Array.isArray(val) ? val.map(String) : val + "" - if (val + "" !== element.oldValue) { - $elem.val(val) - element.oldValue = val + "" - } - } - data.bound("change", updateVModel) - element.msCallback = function() { - avalon.injectBinding(data) - data.changed.call(element, evaluator(), data) - } -} -// bindingHandlers.html 定义在if.js -bindingExecutors.html = function (val, elem, data) { - var isHtmlFilter = elem.nodeType !== 1 - var parent = isHtmlFilter ? elem.parentNode : elem - if (!parent) - return - val = val == null ? "" : val - if (data.oldText !== val) { - data.oldText = val - } else { - return - } - if (elem.nodeType === 3) { - var signature = generateID("html") - parent.insertBefore(DOC.createComment(signature), elem) - data.element = DOC.createComment(signature + ":end") - parent.replaceChild(data.element, elem) - elem = data.element - } - if (typeof val !== "object") {//string, number, boolean - var fragment = avalon.parseHTML(String(val)) - } else if (val.nodeType === 11) { //将val转换为文档碎片 - fragment = val - } else if (val.nodeType === 1 || val.item) { - var nodes = val.nodeType === 1 ? val.childNodes : val.item - fragment = avalonFragment.cloneNode(true) - while (nodes[0]) { - fragment.appendChild(nodes[0]) - } - } - - nodes = avalon.slice(fragment.childNodes) - //插入占位符, 如果是过滤器,需要有节制地移除指定的数量,如果是html指令,直接清空 - if (isHtmlFilter) { - var endValue = elem.nodeValue.slice(0, -4) - while (true) { - var node = elem.previousSibling - if (!node || node.nodeType === 8 && node.nodeValue === endValue) { - break - } else { - parent.removeChild(node) - } - } - parent.insertBefore(fragment, elem) - } else { - avalon.clearHTML(elem).appendChild(fragment) - } - scanNodeArray(nodes, data.vmodels) -} -bindingHandlers["if"] = - bindingHandlers.data = - bindingHandlers.text = - bindingHandlers.html = - function(data, vmodels) { - parseExprProxy(data.value, vmodels, data) -} - -bindingExecutors["if"] = function(val, elem, data) { - try { - if(!elem.parentNode) return - } catch(e) {return} - if (val) { //插回DOM树 - if (elem.nodeType === 8) { - elem.parentNode.replaceChild(data.template, elem) - // animate.enter(data.template, elem.parentNode) - elem = data.element = data.template //这时可能为null - } - if (elem.getAttribute(data.name)) { - elem.removeAttribute(data.name) - scanAttr(elem, data.vmodels) - } - data.rollback = null - } else { //移出DOM树,并用注释节点占据原位置 - if (elem.nodeType === 1) { - var node = data.element = DOC.createComment("ms-if") - elem.parentNode.replaceChild(node, elem) - // animate.leave(elem, node.parentNode, node) - data.template = elem //元素节点 - ifGroup.appendChild(elem) - data.rollback = function() { - if (elem.parentNode === ifGroup) { - ifGroup.removeChild(elem) - } - } - } - } -} -//ms-important绑定已经在scanTag 方法中实现 -//ms-include绑定已由ms-attr绑定实现 - -var rdash = /\(([^)]*)\)/ -bindingHandlers.on = function(data, vmodels) { - var value = data.value - data.type = "on" - var eventType = data.param.replace(/-\d+$/, "") // ms-on-mousemove-10 - if (typeof bindingHandlers.on[eventType + "Hook"] === "function") { - bindingHandlers.on[eventType + "Hook"](data) - } - if (value.indexOf("(") > 0 && value.indexOf(")") > -1) { - var matched = (value.match(rdash) || ["", ""])[1].trim() - if (matched === "" || matched === "$event") { // aaa() aaa($event)当成aaa处理 - value = value.replace(rdash, "") - } - } - parseExprProxy(value, vmodels, data) -} - -bindingExecutors.on = function(callback, elem, data) { - callback = function(e) { - var fn = data.evaluator || noop - return fn.apply(this, data.args.concat(e)) - } - var eventType = data.param.replace(/-\d+$/, "") // ms-on-mousemove-10 - if (eventType === "scan") { - callback.call(elem, { - type: eventType - }) - } else if (typeof data.specialBind === "function") { - data.specialBind(elem, callback) - } else { - var removeFn = avalon.bind(elem, eventType, callback) - } - data.rollback = function() { - if (typeof data.specialUnbind === "function") { - data.specialUnbind() - } else { - avalon.unbind(elem, eventType, removeFn) - } - } -} -bindingHandlers.repeat = function (data, vmodels) { - var type = data.type - parseExprProxy(data.value, vmodels, data, 0, 1) - data.proxies = [] - var freturn = false - try { - var $repeat = data.$repeat = data.evaluator.apply(0, data.args || []) - var xtype = avalon.type($repeat) - if (xtype !== "object" && xtype !== "array") { - freturn = true - avalon.log("warning:" + data.value + "只能是对象或数组") - } - } catch (e) { - freturn = true - } - var arr = data.value.split(".") || [] - if (arr.length > 1) { - arr.pop() - var n = arr[0] - for (var i = 0, v; v = vmodels[i++]; ) { - if (v && v.hasOwnProperty(n)) { - var events = v[n].$events || {} - events[subscribers] = events[subscribers] || [] - events[subscribers].push(data) - break - } - } - } - - var elem = data.element - if (elem.nodeType === 1) { - elem.removeAttribute(data.name) - data.sortedCallback = getBindingCallback(elem, "data-with-sorted", vmodels) - data.renderedCallback = getBindingCallback(elem, "data-" + type + "-rendered", vmodels) - var signature = generateID(type) - var start = DOC.createComment(signature) - var end = DOC.createComment(signature + ":end") - data.signature = signature - data.template = avalonFragment.cloneNode(false) - if (type === "repeat") { - var parent = elem.parentNode - parent.replaceChild(end, elem) - parent.insertBefore(start, end) - data.template.appendChild(elem) - } else { - while (elem.firstChild) { - data.template.appendChild(elem.firstChild) - } - elem.appendChild(start) - elem.appendChild(end) - } - data.element = end - data.handler = bindingExecutors.repeat - data.rollback = function () { - var elem = data.element - if (!elem) - return - data.handler("clear") - } - } - - if (freturn) { - return - } - - data.$outer = {} - var check0 = "$key" - var check1 = "$val" - if (Array.isArray($repeat)) { - check0 = "$first" - check1 = "$last" - } - - for (i = 0; v = vmodels[i++]; ) { - if (v.hasOwnProperty(check0) && v.hasOwnProperty(check1)) { - data.$outer = v - break - } - } - var $events = $repeat.$events - var $list = ($events || {})[subscribers] - injectDependency($list, data) - if (xtype === "object") { - data.$with = true - $repeat.$proxy || ($repeat.$proxy = {}) - data.handler("append", $repeat) - } else if ($repeat.length) { - data.handler("add", 0, $repeat.length) - } -} - -bindingExecutors.repeat = function (method, pos, el) { - if (!method && this.$with) { - method = "append" - var flag = "update" - } - if (method) { - var data = this, start, fragment - var end = data.element - var comments = getComments(data) - var parent = end.parentNode - var proxies = data.proxies - var transation = avalonFragment.cloneNode(false) - switch (method) { - case "add": //在pos位置后添加el数组(pos为插入位置,el为要插入的个数) - var n = pos + el - var fragments = [] - for (var i = pos; i < n; i++) { - var proxy = eachProxyAgent(i, data) - proxies.splice(i, 0, proxy) - shimController(data, transation, proxy, fragments) - } - var now = new Date() - 0 - avalon.optimize = avalon.optimize || now - for (i = 0; fragment = fragments[i++]; ) { - scanNodeArray(fragment.nodes, fragment.vmodels) - fragment.nodes = fragment.vmodels = null - } - if (avalon.optimize === now) { - avalon.optimize = null - } - parent.insertBefore(transation, comments[pos] || end) - avalon.profile("插入操作花费了 " + (new Date - now)) - break - case "del": //将pos后的el个元素删掉(pos, el都是数字) - sweepNodes(comments[pos], comments[pos + el] || end) - var removed = proxies.splice(pos, el) - recycleProxies(removed, "each") - break - case "clear": - start = comments[0] - if (start) { - sweepNodes(start, end) - if (data.$with) { - parent.insertBefore(start, end) - } - } - recycleProxies(proxies, "each") - break - case "move": - start = comments[0] - if (start) { - var signature = start.nodeValue - var rooms = [] - var room = [], - node - sweepNodes(start, end, function () { - room.unshift(this) - if (this.nodeValue === signature) { - rooms.unshift(room) - room = [] - } - }) - sortByIndex(rooms, pos) - sortByIndex(proxies, pos) - while (room = rooms.shift()) { - while (node = room.shift()) { - transation.appendChild(node) - } - } - parent.insertBefore(transation, end) - } - break - case "index": //将proxies中的第pos个起的所有元素重新索引 - var last = proxies.length - 1 - for (; el = proxies[pos]; pos++) { - el.$index = pos - el.$first = pos === 0 - el.$last = pos === last - } - return - case "set": //将proxies中的第pos个元素的VM设置为el(pos为数字,el任意) - proxy = proxies[pos] - if (proxy) { - fireDependencies(proxy.$events[data.param || "el"]) - } - break - case "append": - var object = data.$repeat //原来第2参数, 被循环对象 - var oldProxy = object.$proxy //代理对象组成的hash - var keys = [] - now = new Date() - 0 - avalon.optimize = avalon.optimize || now - if (flag === "update") { - if (!data.evaluator) { - parseExprProxy(data.value, data.vmodels, data, 0, 1) - } - object = data.$repeat = data.evaluator.apply(0, data.args || []) - object.$proxy = oldProxy - } - var pool = object.$proxy || {} - removed = [] - var nodes = data.element.parentNode.childNodes - var add = false - for (i = 0; node = nodes[i++]; ) { - if (node.nodeValue === data.signature) { - add = true - } else if (node.nodeValue === data.signature + ":end") { - add = false - } - if (add) { - removed.push(node) - } - } - - var indexNode = [], item - var keyIndex = data.keyIndex || (data.keyIndex = {}) - //将现有的节点全部移出DOM树 - for ( i = 0; i < removed.length; i++) { - el = removed[i] - if (el.nodeValue === data.signature) { - item = avalonFragment.cloneNode(false) - indexNode.push(item) - } - item.appendChild(el) - } - - - for (var key in object) { //当前对象的所有键名 - if (object.hasOwnProperty(key) && key !== "hasOwnProperty" && key !== "$proxy") { - keys.push(key) - } - } - - for (var i = 0; key = keys[i++]; ) { - if (!pool.hasOwnProperty(key)) {//添加缺失的代理VM - pool[key] = withProxyAgent(pool[key], key, data) - } else { - pool[key].$val = object[key] - } - } - - for ( key in pool) { - if (keys.indexOf(key) === -1) {//删除没用的代理VM - proxyRecycler(pool[key], withProxyPool) //去掉之前的代理VM - delete pool[key] - } - } - var fragments = [] - var renderKeys = keys //需要渲染到DOM树去的键名 - var end = data.element - if (data.sortedCallback) { //如果有回调,则让它们排序 - var keys2 = data.sortedCallback.call(parent, keys) - if (keys2 && Array.isArray(keys2)) { - renderKeys = keys2 - } - } - - for (i = 0; i < renderKeys.length; i++) { - key = renderKeys[i] - if (typeof keyIndex[key] === "number") { - transation.appendChild(indexNode[keyIndex[key]]) - fragments.push({}) - } else { - shimController(data, transation, pool[key], fragments) - } - } - - for (i = 0; i < renderKeys.length; i++) { - keyIndex[renderKeys[i]] = i - } - - for (i = 0; fragment = fragments[i++]; ) { - if (fragment.nodes) { - scanNodeArray(fragment.nodes, fragment.vmodels) - fragment.nodes = fragment.vmodels = null - } - } - if (avalon.optimize === now) { - avalon.optimize = null - } - parent.insertBefore(transation, end) - avalon.profile("插入操作花费了 " + (new Date - now)) - break - } - if (!data.$repeat || data.$repeat.hasOwnProperty("$lock")) //IE6-8 VBScript对象会报错, 有时候data.$repeat不存在 - return - if (method === "clear") - method = "del" - var callback = data.renderedCallback || noop, - args = arguments - if (parent.oldValue && parent.tagName === "SELECT") { //fix #503 - avalon(parent).val(parent.oldValue.split(",")) - } - callback.apply(parent, args) - } -} -"with,each".replace(rword, function (name) { - bindingHandlers[name] = bindingHandlers.repeat -}) - -function shimController(data, transation, proxy, fragments) { - var content = data.template.cloneNode(true) - var nodes = avalon.slice(content.childNodes) - content.insertBefore(DOC.createComment(data.signature), content.firstChild) - transation.appendChild(content) - var nv = [proxy].concat(data.vmodels) - var fragment = { - nodes: nodes, - vmodels: nv - } - fragments.push(fragment) -} - -function getComments(data) { - var ret = [] - var nodes = data.element.parentNode.childNodes - for(var i= 0, node; node = nodes[i++];){ - if(node.nodeValue === data.signature){ - ret.push( node ) - }else if(node.nodeValue === data.signature+":end"){ - break - } - } - return ret -} - - -//移除掉start与end之间的节点(保留end) -function sweepNodes(start, end, callback) { - while (true) { - var node = end.previousSibling - if (!node) - break - node.parentNode.removeChild(node) - callback && callback.call(node) - if (node === start) { - break - } - } -} - -// 为ms-each,ms-with, ms-repeat会创建一个代理VM, -// 通过它们保持一个下上文,让用户能调用$index,$first,$last,$remove,$key,$val,$outer等属性与方法 -// 所有代理VM的产生,消费,收集,存放通过xxxProxyFactory,xxxProxyAgent, recycleProxies,xxxProxyPool实现 -var withProxyPool = [] -function withProxyFactory() { - var proxy = modelFactory({ - $key: "", - $outer: {}, - $host: {}, - $val: { - get: function () { - return this.$host[this.$key] - }, - set: function (val) { - this.$host[this.$key] = val - } - } - }, { - $val: 1 - }) - proxy.$id = generateID("$proxy$with") - return proxy -} - -function withProxyAgent(proxy, key, data) { - proxy = proxy || withProxyPool.pop() - if (!proxy) { - proxy = withProxyFactory() - } else { - proxy.$reinitialize() - } - var host = data.$repeat - proxy.$key = key - proxy.$host = host - proxy.$outer = data.$outer - if (host.$events) { - proxy.$events.$val = host.$events[key] - } else { - proxy.$events = {} - } - return proxy -} - - -function recycleProxies(proxies) { - eachProxyRecycler(proxies) -} -function eachProxyRecycler(proxies) { - proxies.forEach(function (proxy) { - proxyRecycler(proxy, eachProxyPool) - }) - proxies.length = 0 -} - - -var eachProxyPool = [] -function eachProxyFactory(name) { - var source = { - $host: [], - $outer: {}, - $index: 0, - $first: false, - $last: false, - $remove: avalon.noop - } - source[name] = { - get: function () { - var e = this.$events - var array = e.$index - e.$index = e[name] //#817 通过$index为el收集依赖 - try { - return this.$host[this.$index] - } finally { - e.$index = array - } - }, - set: function (val) { - try { - var e = this.$events - var array = e.$index - e.$index = [] - this.$host.set(this.$index, val) - } finally { - e.$index = array - } - } - } - var second = { - $last: 1, - $first: 1, - $index: 1 - } - var proxy = modelFactory(source, second) - proxy.$id = generateID("$proxy$each") - return proxy -} - -function eachProxyAgent(index, data) { - var param = data.param || "el", - proxy - for (var i = 0, n = eachProxyPool.length; i < n; i++) { - var candidate = eachProxyPool[i] - if (candidate && candidate.hasOwnProperty(param)) { - proxy = candidate - eachProxyPool.splice(i, 1) - } - } - if (!proxy) { - proxy = eachProxyFactory(param) - } - var host = data.$repeat - var last = host.length - 1 - proxy.$index = index - proxy.$first = index === 0 - proxy.$last = index === last - proxy.$host = host - proxy.$outer = data.$outer - proxy.$remove = function () { - return host.removeAt(proxy.$index) - } - return proxy -} - - -function proxyRecycler(proxy, proxyPool) { - for (var i in proxy.$events) { - if (Array.isArray(proxy.$events[i])) { - proxy.$events[i].forEach(function (data) { - if (typeof data === "object") - disposeData(data) - })// jshint ignore:line - proxy.$events[i].length = 0 - } - } - proxy.$host = proxy.$outer = {} - if (proxyPool.unshift(proxy) > kernel.maxRepeatSize) { - proxyPool.pop() - } -} -/********************************************************************* - * 各种指令 * - **********************************************************************/ -//ms-skip绑定已经在scanTag 方法中实现 -// bindingHandlers.text 定义在if.js -bindingExecutors.text = function(val, elem) { - val = val == null ? "" : val //不在页面上显示undefined null - if (elem.nodeType === 3) { //绑定在文本节点上 - try { //IE对游离于DOM树外的节点赋值会报错 - elem.data = val - } catch (e) {} - } else { //绑定在特性节点上 - if ("textContent" in elem) { - elem.textContent = val - } else { - elem.innerText = val - } - } -} -function parseDisplay(nodeName, val) { - //用于取得此类标签的默认display值 - var key = "_" + nodeName - if (!parseDisplay[key]) { - var node = DOC.createElement(nodeName) - root.appendChild(node) - if (W3C) { - val = getComputedStyle(node, null).display - } else { - val = node.currentStyle.display - } - root.removeChild(node) - parseDisplay[key] = val - } - return parseDisplay[key] -} - -avalon.parseDisplay = parseDisplay - -bindingHandlers.visible = function(data, vmodels) { - var elem = data.element - var display = elem.style.display - if(display === "none"){ - display = parseDisplay(elem.nodeName) - } - data.display = display - parseExprProxy(data.value, vmodels, data) -} - -bindingExecutors.visible = function(val, elem, data) { - elem.style.display = val ? data.display : "none" -} -bindingHandlers.widget = function(data, vmodels) { - var args = data.value.match(rword) - var elem = data.element - var widget = args[0] - var id = args[1] - if (!id || id === "$") { //没有定义或为$时,取组件名+随机数 - id = generateID(widget) - } - var optName = args[2] || widget //没有定义,取组件名 - var constructor = avalon.ui[widget] - if (typeof constructor === "function") { //ms-widget="tabs,tabsAAA,optname" - vmodels = elem.vmodels || vmodels - for (var i = 0, v; v = vmodels[i++];) { - if (v.hasOwnProperty(optName) && typeof v[optName] === "object") { - var vmOptions = v[optName] - vmOptions = vmOptions.$model || vmOptions - break - } - } - if (vmOptions) { - var wid = vmOptions[widget + "Id"] - if (typeof wid === "string") { - log("warning!不再支持" + widget + "Id") - id = wid - } - } - //抽取data-tooltip-text、data-tooltip-attr属性,组成一个配置对象 - var widgetData = avalon.getWidgetData(elem, widget) - data.value = [widget, id, optName].join(",") - data[widget + "Id"] = id - data.evaluator = noop - elem.msData["ms-widget-id"] = id - var options = data[widget + "Options"] = avalon.mix({}, constructor.defaults, vmOptions || {}, widgetData) - elem.removeAttribute("ms-widget") - var vmodel = constructor(elem, data, vmodels) || {} //防止组件不返回VM - if (vmodel.$id) { - avalon.vmodels[id] = vmodel - createSignalTower(elem, vmodel) - try { - vmodel.$init(function() { - avalon.scan(elem, [vmodel].concat(vmodels)) - if (typeof options.onInit === "function") { - options.onInit.call(elem, vmodel, options, vmodels) - } - }) - } catch (e) {} - data.rollback = function() { - try { - vmodel.widgetElement = null - vmodel.$remove() - } catch (e) {} - elem.msData = {} - delete avalon.vmodels[vmodel.$id] - } - injectDisposeQueue(data, widgetList) - if (window.chrome) { - elem.addEventListener("DOMNodeRemovedFromDocument", function() { - setTimeout(rejectDisposeQueue) - }) - } - } else { - avalon.scan(elem, vmodels) - } - } else if (vmodels.length) { //如果该组件还没有加载,那么保存当前的vmodels - elem.vmodels = vmodels - } -} -var widgetList = [] -//不存在 bindingExecutors.widget -/********************************************************************* - * 自带过滤器 * - **********************************************************************/ -var rscripts = /]*>([\S\s]*?)<\/script\s*>/gim -var ron = /\s+(on[^=\s]+)(?:=("[^"]*"|'[^']*'|[^\s>]+))?/g -var ropen = /<\w+\b(?:(["'])[^"]*?(\1)|[^>])*>/ig -var rsanitize = { - a: /\b(href)\=("javascript[^"]*"|'javascript[^']*')/ig, - img: /\b(src)\=("javascript[^"]*"|'javascript[^']*')/ig, - form: /\b(action)\=("javascript[^"]*"|'javascript[^']*')/ig -} -var rsurrogate = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g -var rnoalphanumeric = /([^\#-~| |!])/g; - -function numberFormat(number, decimals, point, thousands) { - //form http://phpjs.org/functions/number_format/ - //number 必需,要格式化的数字 - //decimals 可选,规定多少个小数位。 - //point 可选,规定用作小数点的字符串(默认为 . )。 - //thousands 可选,规定用作千位分隔符的字符串(默认为 , ),如果设置了该参数,那么所有其他参数都是必需的。 - number = (number + '') - .replace(/[^0-9+\-Ee.]/g, '') - var n = !isFinite(+number) ? 0 : +number, - prec = !isFinite(+decimals) ? 3 : Math.abs(decimals), - sep = thousands || ",", - dec = point || ".", - s = '', - toFixedFix = function(n, prec) { - var k = Math.pow(10, prec) - return '' + (Math.round(n * k) / k) - .toFixed(prec) - } - // Fix for IE parseFloat(0.55).toFixed(0) = 0; - s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)) - .split('.') - if (s[0].length > 3) { - s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep) - } - if ((s[1] || '') - .length < prec) { - s[1] = s[1] || '' - s[1] += new Array(prec - s[1].length + 1) - .join('0') - } - return s.join(dec) -} - - -var filters = avalon.filters = { - uppercase: function(str) { - return str.toUpperCase() - }, - lowercase: function(str) { - return str.toLowerCase() - }, - truncate: function(str, length, truncation) { - //length,新字符串长度,truncation,新字符串的结尾的字段,返回新字符串 - length = length || 30 - truncation = typeof truncation === "string" ? truncation : "..." - return str.length > length ? str.slice(0, length - truncation.length) + truncation : String(str) - }, - $filter: function(val) { - for (var i = 1, n = arguments.length; i < n; i++) { - var array = arguments[i] - var fn = avalon.filters[array.shift()] - if (typeof fn === "function") { - var arr = [val].concat(array) - val = fn.apply(null, arr) - } - } - return val - }, - camelize: camelize, - //https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet - // chrome - // chrome - // IE67chrome - // IE67chrome - // IE67chrome - sanitize: function(str) { - return str.replace(rscripts, "").replace(ropen, function(a, b) { - var match = a.toLowerCase().match(/<(\w+)\s/) - if (match) { //处理a标签的href属性,img标签的src属性,form标签的action属性 - var reg = rsanitize[match[1]] - if (reg) { - a = a.replace(reg, function(s, name, value) { - var quote = value.charAt(0) - return name + "=" + quote + "javascript:void(0)" + quote// jshint ignore:line - }) - } - } - return a.replace(ron, " ").replace(/\s+/g, " ") //移除onXXX事件 - }) - }, - escape: function(str) { - //将字符串经过 str 转义得到适合在页面中显示的内容, 例如替换 < 为 < - return String(str). - replace(/&/g, '&'). - replace(rsurrogate, function(value) { - var hi = value.charCodeAt(0) - var low = value.charCodeAt(1) - return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';' - }). - replace(rnoalphanumeric, function(value) { - return '&#' + value.charCodeAt(0) + ';' - }). - replace(//g, '>') - }, - currency: function(amount, symbol, fractionSize) { - return (symbol || "\uFFE5") + numberFormat(amount, isFinite(fractionSize) ? fractionSize : 2) - }, - number: numberFormat -} -/* - 'yyyy': 4 digit representation of year (e.g. AD 1 => 0001, AD 2010 => 2010) - 'yy': 2 digit representation of year, padded (00-99). (e.g. AD 2001 => 01, AD 2010 => 10) - 'y': 1 digit representation of year, e.g. (AD 1 => 1, AD 199 => 199) - 'MMMM': Month in year (January-December) - 'MMM': Month in year (Jan-Dec) - 'MM': Month in year, padded (01-12) - 'M': Month in year (1-12) - 'dd': Day in month, padded (01-31) - 'd': Day in month (1-31) - 'EEEE': Day in Week,(Sunday-Saturday) - 'EEE': Day in Week, (Sun-Sat) - 'HH': Hour in day, padded (00-23) - 'H': Hour in day (0-23) - 'hh': Hour in am/pm, padded (01-12) - 'h': Hour in am/pm, (1-12) - 'mm': Minute in hour, padded (00-59) - 'm': Minute in hour (0-59) - 'ss': Second in minute, padded (00-59) - 's': Second in minute (0-59) - 'a': am/pm marker - 'Z': 4 digit (+sign) representation of the timezone offset (-1200-+1200) - format string can also be one of the following predefined localizable formats: - - 'medium': equivalent to 'MMM d, y h:mm:ss a' for en_US locale (e.g. Sep 3, 2010 12:05:08 pm) - 'short': equivalent to 'M/d/yy h:mm a' for en_US locale (e.g. 9/3/10 12:05 pm) - 'fullDate': equivalent to 'EEEE, MMMM d,y' for en_US locale (e.g. Friday, September 3, 2010) - 'longDate': equivalent to 'MMMM d, y' for en_US locale (e.g. September 3, 2010 - 'mediumDate': equivalent to 'MMM d, y' for en_US locale (e.g. Sep 3, 2010) - 'shortDate': equivalent to 'M/d/yy' for en_US locale (e.g. 9/3/10) - 'mediumTime': equivalent to 'h:mm:ss a' for en_US locale (e.g. 12:05:08 pm) - 'shortTime': equivalent to 'h:mm a' for en_US locale (e.g. 12:05 pm) - */ -new function() {// jshint ignore:line - function toInt(str) { - return parseInt(str, 10) || 0 - } - - function padNumber(num, digits, trim) { - var neg = "" - if (num < 0) { - neg = '-' - num = -num - } - num = "" + num - while (num.length < digits) - num = "0" + num - if (trim) - num = num.substr(num.length - digits) - return neg + num - } - - function dateGetter(name, size, offset, trim) { - return function(date) { - var value = date["get" + name]() - if (offset > 0 || value > -offset) - value += offset - if (value === 0 && offset === -12) { - value = 12 - } - return padNumber(value, size, trim) - } - } - - function dateStrGetter(name, shortForm) { - return function(date, formats) { - var value = date["get" + name]() - var get = (shortForm ? ("SHORT" + name) : name).toUpperCase() - return formats[get][value] - } - } - - function timeZoneGetter(date) { - var zone = -1 * date.getTimezoneOffset() - var paddedZone = (zone >= 0) ? "+" : "" - paddedZone += padNumber(Math[zone > 0 ? "floor" : "ceil"](zone / 60), 2) + padNumber(Math.abs(zone % 60), 2) - return paddedZone - } - //取得上午下午 - - function ampmGetter(date, formats) { - return date.getHours() < 12 ? formats.AMPMS[0] : formats.AMPMS[1] - } - var DATE_FORMATS = { - yyyy: dateGetter("FullYear", 4), - yy: dateGetter("FullYear", 2, 0, true), - y: dateGetter("FullYear", 1), - MMMM: dateStrGetter("Month"), - MMM: dateStrGetter("Month", true), - MM: dateGetter("Month", 2, 1), - M: dateGetter("Month", 1, 1), - dd: dateGetter("Date", 2), - d: dateGetter("Date", 1), - HH: dateGetter("Hours", 2), - H: dateGetter("Hours", 1), - hh: dateGetter("Hours", 2, -12), - h: dateGetter("Hours", 1, -12), - mm: dateGetter("Minutes", 2), - m: dateGetter("Minutes", 1), - ss: dateGetter("Seconds", 2), - s: dateGetter("Seconds", 1), - sss: dateGetter("Milliseconds", 3), - EEEE: dateStrGetter("Day"), - EEE: dateStrGetter("Day", true), - a: ampmGetter, - Z: timeZoneGetter - } - var rdateFormat = /((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z))(.*)/ - var raspnetjson = /^\/Date\((\d+)\)\/$/ - filters.date = function(date, format) { - var locate = filters.date.locate, - text = "", - parts = [], - fn, match - format = format || "mediumDate" - format = locate[format] || format - if (typeof date === "string") { - if (/^\d+$/.test(date)) { - date = toInt(date) - } else if (raspnetjson.test(date)) { - date = +RegExp.$1 - } else { - var trimDate = date.trim() - var dateArray = [0, 0, 0, 0, 0, 0, 0] - var oDate = new Date(0) - //取得年月日 - trimDate = trimDate.replace(/^(\d+)\D(\d+)\D(\d+)/, function(_, a, b, c) { - var array = c.length === 4 ? [c, a, b] : [a, b, c] - dateArray[0] = toInt(array[0]) //年 - dateArray[1] = toInt(array[1]) - 1 //月 - dateArray[2] = toInt(array[2]) //日 - return "" - }) - var dateSetter = oDate.setFullYear - var timeSetter = oDate.setHours - trimDate = trimDate.replace(/[T\s](\d+):(\d+):?(\d+)?\.?(\d)?/, function(_, a, b, c, d) { - dateArray[3] = toInt(a) //小时 - dateArray[4] = toInt(b) //分钟 - dateArray[5] = toInt(c) //秒 - if (d) { //毫秒 - dateArray[6] = Math.round(parseFloat("0." + d) * 1000) - } - return "" - }) - var tzHour = 0 - var tzMin = 0 - trimDate = trimDate.replace(/Z|([+-])(\d\d):?(\d\d)/, function(z, symbol, c, d) { - dateSetter = oDate.setUTCFullYear - timeSetter = oDate.setUTCHours - if (symbol) { - tzHour = toInt(symbol + c) - tzMin = toInt(symbol + d) - } - return "" - }) - - dateArray[3] -= tzHour - dateArray[4] -= tzMin - dateSetter.apply(oDate, dateArray.slice(0, 3)) - timeSetter.apply(oDate, dateArray.slice(3)) - date = oDate - } - } - if (typeof date === "number") { - date = new Date(date) - } - if (avalon.type(date) !== "date") { - return - } - while (format) { - match = rdateFormat.exec(format) - if (match) { - parts = parts.concat(match.slice(1)) - format = parts.pop() - } else { - parts.push(format) - format = null - } - } - parts.forEach(function(value) { - fn = DATE_FORMATS[value] - text += fn ? fn(date, locate) : value.replace(/(^'|'$)/g, "").replace(/''/g, "'") - }) - return text - } - var locate = { - AMPMS: { - 0: "上午", - 1: "下午" - }, - DAY: { - 0: "星期日", - 1: "星期一", - 2: "星期二", - 3: "星期三", - 4: "星期四", - 5: "星期五", - 6: "星期六" - }, - MONTH: { - 0: "1月", - 1: "2月", - 2: "3月", - 3: "4月", - 4: "5月", - 5: "6月", - 6: "7月", - 7: "8月", - 8: "9月", - 9: "10月", - 10: "11月", - 11: "12月" - }, - SHORTDAY: { - "0": "周日", - "1": "周一", - "2": "周二", - "3": "周三", - "4": "周四", - "5": "周五", - "6": "周六" - }, - fullDate: "y年M月d日EEEE", - longDate: "y年M月d日", - medium: "yyyy-M-d H:mm:ss", - mediumDate: "yyyy-M-d", - mediumTime: "H:mm:ss", - "short": "yy-M-d ah:mm", - shortDate: "yy-M-d", - shortTime: "ah:mm" - } - locate.SHORTMONTH = locate.MONTH - filters.date.locate = locate -}// jshint ignore:line -/********************************************************************* - * AMD加载器 * - **********************************************************************/ -//https://www.devbridge.com/articles/understanding-amd-requirejs/ -//http://maxogden.com/nested-dependencies.html -var modules = avalon.modules = { - "domReady!": { - exports: avalon, - state: 3 - }, - "avalon": { - exports: avalon, - state: 4 - } -} -//Object(modules[id]).state拥有如下值 -// undefined 没有定义 -// 1(send) 已经发出请求 -// 2(loading) 已经被执行但还没有执行完成,在这个阶段define方法会被执行 -// 3(loaded) 执行完毕,通过onload/onreadystatechange回调判定,在这个阶段checkDeps方法会执行 -// 4(execute) 其依赖也执行完毕, 值放到exports对象上,在这个阶段fireFactory方法会执行 -modules.exports = modules.avalon - -new function () {// jshint ignore:line - var loadings = [] //正在加载中的模块列表 - var factorys = [] //放置define方法的factory函数 - var rjsext = /\.js$/i - function makeRequest(name, config) { -//1. 去掉资源前缀 - var res = "js" - name = name.replace(/^(\w+)\!/, function (a, b) { - res = b - return "" - }) - if (res === "ready") { - log("debug: ready!已经被废弃,请使用domReady!") - res = "domReady" - } -//2. 去掉querystring, hash - var query = "" - name = name.replace(rquery, function (a) { - query = a - return "" - }) - //3. 去掉扩展名 - var suffix = "." + res - var ext = /js|css/.test(suffix) ? suffix : "" - name = name.replace(/\.[a-z0-9]+$/g, function (a) { - if (a === suffix) { - ext = a - return "" - } else { - return a - } - }) - var req = avalon.mix({ - query: query, - ext: ext, - res: res, - name: name, - toUrl: toUrl - }, config) - req.toUrl(name) - return req - } - - function fireRequest(req) { - var name = req.name - var res = req.res - //1. 如果该模块已经发出请求,直接返回 - var module = modules[name] - var urlNoQuery = name && req.urlNoQuery - if (module && module.state >= 1) { - return name - } - module = modules[urlNoQuery] - if (module && module.state >= 3) { - innerRequire(module.deps || [], module.factory, urlNoQuery) - return urlNoQuery - } - if (name && !module) { - module = modules[urlNoQuery] = { - id: urlNoQuery, - state: 1 //send - } - var wrap = function (obj) { - resources[res] = obj - obj.load(name, req, function (a) { - if (arguments.length && a !== void 0) { - module.exports = a - } - module.state = 4 - checkDeps() - }) - } - - if (!resources[res]) { - innerRequire([res], wrap) - } else { - wrap(resources[res]) - } - } - return name ? urlNoQuery : res + "!" - } - -//核心API之一 require - var requireQueue = [] - var isUserFirstRequire = false - innerRequire = avalon.require = function (array, factory, parentUrl, defineConfig) { - if (!isUserFirstRequire) { - requireQueue.push(avalon.slice(arguments)) - if (arguments.length <= 2) { - isUserFirstRequire = true - var queue = requireQueue.splice(0, requireQueue.length), args - while (args = queue.shift()) { - innerRequire.apply(null, args) - } - } - return - } - - if (!Array.isArray(array)) { - avalon.error("require方法的第一个参数应为数组 " + array) - } - var deps = [] // 放置所有依赖项的完整路径 - var uniq = {} - var id = parentUrl || "callback" + setTimeout("1")// jshint ignore:line - defineConfig = defineConfig || {} - defineConfig.baseUrl = kernel.baseUrl - var isBuilt = !!defineConfig.built - if (parentUrl) { - defineConfig.parentUrl = parentUrl.substr(0, parentUrl.lastIndexOf("/")) - defineConfig.mapUrl = parentUrl.replace(rjsext, "") - } - if (isBuilt) { - var req = makeRequest(defineConfig.defineName, defineConfig) - id = req.urlNoQuery - } else { - array.forEach(function (name) { - var req = makeRequest(name, defineConfig) - var url = fireRequest(req) //加载资源,并返回该资源的完整地址 - if (url) { - if (!uniq[url]) { - deps.push(url) - uniq[url] = "司徒正美" //去重 - } - } - }) - } - - var module = modules[id] - if (!module || module.state !== 4) { - modules[id] = { - id: id, - deps: isBuilt ? array.concat() : deps, - factory: factory || noop, - state: 3 - } - } - if (!module) { - //如果此模块是定义在另一个JS文件中, 那必须等该文件加载完毕, 才能放到检测列队中 - loadings.push(id) - } - checkDeps() - } - -//核心API之二 require - innerRequire.define = function (name, deps, factory) { //模块名,依赖列表,模块本身 - if (typeof name !== "string") { - factory = deps - deps = name - name = "anonymous" - } - if (!Array.isArray(deps)) { - factory = deps - deps = [] - } - var config = { - built: !isUserFirstRequire, //用r.js打包后,所有define会放到requirejs之前 - defineName: name - } - var args = [deps, factory, config] - factory.require = function (url) { - args.splice(2, 0, url) - if (modules[url]) { - modules[url].state = 3 //loaded - var isCycle = false - try { - isCycle = checkCycle(modules[url].deps, url) - } catch (e) { - } - if (isCycle) { - avalon.error(url + "模块与之前的模块存在循环依赖,请不要直接用script标签引入" + url + "模块") - } - } - delete factory.require //释放内存 - innerRequire.apply(null, args) //0,1,2 --> 1,2,0 - } -//根据标准,所有遵循W3C标准的浏览器,script标签会按标签的出现顺序执行。 -//老的浏览器中,加载也是按顺序的:一个文件下载完成后,才开始下载下一个文件。 -//较新的浏览器中(IE8+ 、FireFox3.5+ 、Chrome4+ 、Safari4+),为了减小请求时间以优化体验, -//下载可以是并行的,但是执行顺序还是按照标签出现的顺序。 -//但如果script标签是动态插入的, 就未必按照先请求先执行的原则了,目测只有firefox遵守 -//唯一比较一致的是,IE10+及其他标准浏览器,一旦开始解析脚本, 就会一直堵在那里,直接脚本解析完毕 -//亦即,先进入loading阶段的script标签(模块)必然会先进入loaded阶段 - var url = config.built ? "unknown" : getCurrentScript() - if (url) { - var module = modules[url] - if (module) { - module.state = 2 - } - factory.require(url) - } else {//合并前后的safari,合并后的IE6-9走此分支 - factorys.push(factory) - } - } -//核心API之三 require.config(settings) - innerRequire.config = kernel - //核心API之四 define.amd 标识其符合AMD规范 - innerRequire.define.amd = modules - - //==========================对用户配置项进行再加工========================== - var allpaths = kernel["orig.paths"] = {} - var allmaps = kernel["orig.map"] = {} - var allpackages = kernel["packages"] = [] - var allargs = kernel["orig.args"] = {} - avalon.mix(plugins, { - paths: function (hash) { - avalon.mix(allpaths, hash) - kernel.paths = makeIndexArray(allpaths) - }, - map: function (hash) { - avalon.mix(allmaps, hash) - var list = makeIndexArray(allmaps, 1, 1) - avalon.each(list, function (_, item) { - item.val = makeIndexArray(item.val) - }) - kernel.map = list - }, - packages: function (array) { - array = array.concat(allpackages) - var uniq = {} - var ret = [] - for (var i = 0, pkg; pkg = array[i++]; ) { - pkg = typeof pkg === "string" ? {name: pkg} : pkg - var name = pkg.name - if (!uniq[name]) { - var url = joinPath(pkg.location || name, pkg.main || "main") - url = url.replace(rjsext, "") - ret.push(pkg) - uniq[name] = pkg.location = url - pkg.reg = makeMatcher(name) - } - } - kernel.packages = ret.sort() - }, - urlArgs: function (hash) { - if (typeof hash === "string") { - hash = {"*": hash} - } - avalon.mix(allargs, hash) - kernel.urlArgs = makeIndexArray(allargs, 1) - }, - baseUrl: function (url) { - if (!isAbsUrl(url)) { - var baseElement = head.getElementsByTagName("base")[0] - if (baseElement) { - head.removeChild(baseElement) - } - var node = DOC.createElement("a") - node.href = url - url = getFullUrl(node, "href") - if (baseElement) { - head.insertBefore(baseElement, head.firstChild) - } - } - if (url.length > 3) - kernel.baseUrl = url - }, - shim: function (obj) { - for (var i in obj) { - var value = obj[i] - if (Array.isArray(value)) { - value = obj[i] = { - deps: value - } - } - if (!value.exportsFn && (value.exports || value.init)) { - value.exportsFn = makeExports(value) - } - } - kernel.shim = obj - } - - }) - - - //==============================内部方法================================= - function checkCycle(deps, nick) { - //检测是否存在循环依赖 - for (var i = 0, id; id = deps[i++]; ) { - if (modules[id].state !== 4 && - (id === nick || checkCycle(modules[id].deps, nick))) { - return true - } - } - } - - function checkFail(node, onError, fuckIE) { - var id = trimQuery(node.src) //检测是否死链 - node.onload = node.onreadystatechange = node.onerror = null - if (onError || (fuckIE && modules[id] && !modules[id].state)) { - setTimeout(function () { - head.removeChild(node) - node = null // 处理旧式IE下的循环引用问题 - }) - log("debug: 加载 " + id + " 失败" + onError + " " + (!modules[id].state)) - } else { - return true - } - } - - function checkDeps() { - //检测此JS模块的依赖是否都已安装完毕,是则安装自身 - loop: for (var i = loadings.length, id; id = loadings[--i]; ) { - var obj = modules[id], - deps = obj.deps - if (!deps) - continue - for (var j = 0, key; key = deps[j]; j++) { - if (Object(modules[key]).state !== 4) { - continue loop - } - } - //如果deps是空对象或者其依赖的模块的状态都是2 - if (obj.state !== 4) { - loadings.splice(i, 1) //必须先移除再安装,防止在IE下DOM树建完后手动刷新页面,会多次执行它 - fireFactory(obj.id, obj.deps, obj.factory) - checkDeps() //如果成功,则再执行一次,以防有些模块就差本模块没有安装好 - } - } - } - - var rreadyState = /complete|loaded/ - function loadJS(url, id, callback) { - //通过script节点加载目标模块 - var node = DOC.createElement("script") - node.className = subscribers //让getCurrentScript只处理类名为subscribers的script节点 - var supportLoad = "onload" in node - var onEvent = supportLoad ? "onload" : "onreadystatechange" - function onload() { - var factory = factorys.pop() - factory && factory.require(id) - if (callback) { - callback() - } - if (checkFail(node, false, !supportLoad)) { - log("debug: 已成功加载 " + url) - id && loadings.push(id) - checkDeps() - } - } - var index = 0, loadID - node[onEvent] = supportLoad ? onload : function () { - if (rreadyState.test(node.readyState)) { - ++index - if (index === 1) { - loadID = setTimeout(onload, 500) - } else { - clearTimeout(loadID) - onload() - } - } - } - node.onerror = function () { - checkFail(node, true) - } - - head.insertBefore(node, head.firstChild) //chrome下第二个参数不能为null - node.src = url //插入到head的第一个节点前,防止IE6下head标签没闭合前使用appendChild抛错 - log("debug: 正准备加载 " + url) //更重要的是IE6下可以收窄getCurrentScript的寻找范围 - } - - var resources = innerRequire.plugins = { - //三大常用资源插件 js!, css!, text!, ready! - ready: { - load: noop - }, - js: { - load: function (name, req, onLoad) { - var url = req.url - var id = req.urlNoQuery - var shim = kernel.shim[name.replace(rjsext, "")] - if (shim) { //shim机制 - innerRequire(shim.deps || [], function () { - var args = avalon.slice(arguments) - loadJS(url, id, function () { - onLoad(shim.exportsFn ? shim.exportsFn.apply(0, args) : void 0) - }) - }) - } else { - loadJS(url, id) - } - } - }, - css: { - load: function (name, req, onLoad) { - var url = req.url - var node = DOC.createElement("link") - node.rel = "stylesheet" - node.href = url - head.insertBefore(node, head.firstChild) - log("debug: 已成功加载 " + url) - onLoad() - } - }, - text: { - load: function (name, req, onLoad) { - var url = req.url - var xhr = getXHR() - xhr.onreadystatechange = function () { - if (xhr.readyState === 4) { - var status = xhr.status; - if (status > 399 && status < 600) { - avalon.error(url + " 对应资源不存在或没有开启 CORS") - } else { - log("debug: 已成功加载 " + url) - onLoad(xhr.responseText) - } - } - } - var time = "_=" + (new Date() - 0) - var _url = url.indexOf("?") === -1 ? url + "?" + time : url + "&" + time - xhr.open("GET", _url, true) - if ("withCredentials" in xhr) {//这是处理跨域 - xhr.withCredentials = true - } - xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest")//告诉后端这是AJAX请求 - xhr.send() - log("debug: 正准备加载 " + url) - } - } - } - innerRequire.checkDeps = checkDeps - - var rquery = /(\?[^#]*)$/ - function trimQuery(url) { - return (url || "").replace(rquery, "") - } - - function isAbsUrl(path) { - //http://stackoverflow.com/questions/10687099/how-to-test-if-a-url-string-is-absolute-or-relative - return /^(?:[a-z]+:)?\/\//i.test(String(path)) - } - - function getFullUrl(node, src) { - return"1"[0] ? node[src] : node.getAttribute(src, 4) - } - - function getCurrentScript() { - // inspireb by https://github.com/samyk/jiagra/blob/master/jiagra.js - var stack - try { - a.b.c() //强制报错,以便捕获e.stack - } catch (e) { //safari5的sourceURL,firefox的fileName,它们的效果与e.stack不一样 - stack = e.stack - if (!stack && window.opera) { - //opera 9没有e.stack,但有e.Backtrace,但不能直接取得,需要对e对象转字符串进行抽取 - stack = (String(e).match(/of linked script \S+/g) || []).join(" ") - } - } - if (stack) { - /**e.stack最后一行在所有支持的浏览器大致如下: - *chrome23: - * at http://113.93.50.63/data.js:4:1 - *firefox17: - *@http://113.93.50.63/query.js:4 - *opera12:http://www.oldapps.com/opera.php?system=Windows_XP - *@http://113.93.50.63/data.js:4 - *IE10: - * at Global code (http://113.93.50.63/data.js:4:1) - * //firefox4+ 可以用document.currentScript - */ - stack = stack.split(/[@ ]/g).pop() //取得最后一行,最后一个空格或@之后的部分 - stack = stack[0] === "(" ? stack.slice(1, -1) : stack.replace(/\s/, "") //去掉换行符 - return trimQuery(stack.replace(/(:\d+)?:\d+$/i, "")) //去掉行号与或许存在的出错字符起始位置 - } - var nodes = head.getElementsByTagName("script") //只在head标签中寻找 - for (var i = nodes.length, node; node = nodes[--i]; ) { - if (node.className === subscribers && node.readyState === "interactive") { - var url = getFullUrl(node, "src") - return node.className = trimQuery(url) - } - } - } - - var rcallback = /^callback\d+$/ - function fireFactory(id, deps, factory) { - var module = Object(modules[id]) - module.state = 4 - for (var i = 0, array = [], d; d = deps[i++]; ) { - if (d === "exports") { - var obj = module.exports || (module.exports = {}) - array.push(obj) - } else { - array.push(modules[d].exports) - } - } - try { - var ret = factory.apply(window, array) - } catch (e) { - log("执行[" + id + "]模块的factory抛错: ", e) - } - if (ret !== void 0) { - module.exports = ret - } - if (rcallback.test(id)) { - delete modules[id] - } - delete module.factory - return ret - } - function toUrl(id) { - if (id.indexOf(this.res + "!") === 0) { - id = id.slice(this.res.length + 1) //处理define("css!style",[], function(){})的情况 - } - var url = id - //1. 是否命中paths配置项 - var usePath = 0 - var baseUrl = this.baseUrl - var rootUrl = this.parentUrl || baseUrl - eachIndexArray(id, kernel.paths, function (value, key) { - url = url.replace(key, value) - usePath = 1 - }) - //2. 是否命中packages配置项 - if (!usePath) { - eachIndexArray(id, kernel.packages, function (value, key, item) { - url = url.replace(item.name, item.location) - }) - } - //3. 是否命中map配置项 - if (this.mapUrl) { - eachIndexArray(this.mapUrl, kernel.map, function (array) { - eachIndexArray(url, array, function (mdValue, mdKey) { - url = url.replace(mdKey, mdValue) - rootUrl = baseUrl - }) - }) - } - var ext = this.ext - if (ext && usePath && url.slice(-ext.length) === ext) { - url = url.slice(0, -ext.length) - } - //4. 转换为绝对路径 - if (!isAbsUrl(url)) { - rootUrl = this.built || /^\w/.test(url) ? baseUrl : rootUrl - url = joinPath(rootUrl, url) - } - //5. 还原扩展名,query - var urlNoQuery = url + ext - url = urlNoQuery + this.query - //6. 处理urlArgs - eachIndexArray(id, kernel.urlArgs, function (value) { - url += (url.indexOf("?") === -1 ? "?" : "&") + value; - }) - this.url = url - return this.urlNoQuery = urlNoQuery - } - - function makeIndexArray(hash, useStar, part) { - //创建一个经过特殊算法排好序的数组 - var index = hash2array(hash, useStar, part) - index.sort(descSorterByName) - return index - } - - function makeMatcher(prefix) { - return new RegExp('^' + prefix + '(/|$)') - } - - function makeExports(value) { - return function () { - var ret - if (value.init) { - ret = value.init.apply(window, arguments) - } - return ret || (value.exports && getGlobal(value.exports)) - } - } - - - function hash2array(hash, useStar, part) { - var array = []; - for (var key in hash) { - if (ohasOwn.call(hash, key)) { - var item = { - name: key, - val: hash[key] - } - array.push(item) - item.reg = key === "*" && useStar ? /^/ : makeMatcher(key) - if (part && key !== "*") { - item.reg = new RegExp('\/' + key.replace(/^\//, "") + '(/|$)') - } - } - } - return array - } - - function eachIndexArray(moduleID, array, matcher) { - array = array || [] - for (var i = 0, el; el = array[i++]; ) { - if (el.reg.test(moduleID)) { - matcher(el.val, el.name, el) - return false - } - } - } - // 根据元素的name项进行数组字符数逆序的排序函数 - function descSorterByName(a, b) { - var aaa = a.name - var bbb = b.name - if (bbb === "*") { - return -1 - } - if (aaa === "*") { - return 1 - } - return bbb.length - aaa.length - } - - var rdeuce = /\/\w+\/\.\./ - function joinPath(a, b) { - if (a.charAt(a.length - 1) !== "/") { - a += "/" - } - if (b.slice(0, 2) === "./") { //相对于兄弟路径 - return a + b.slice(2) - } - if (b.slice(0, 2) === "..") { //相对于父路径 - a += b - while (rdeuce.test(a)) { - a = a.replace(rdeuce, "") - } - return a - } - if (b.slice(0, 1) === "/") { - return a + b.slice(1) - } - return a + b - } - - function getGlobal(value) { - if (!value) { - return value - } - var g = window - value.split(".").forEach(function (part) { - g = g[part] - }) - return g - } - - var mainNode = DOC.scripts[DOC.scripts.length - 1] - var dataMain = mainNode.getAttribute("data-main") - if (dataMain) { - plugins.baseUrl(dataMain) - var href = kernel.baseUrl - kernel.baseUrl = href.slice(0, href.lastIndexOf("/") + 1) - loadJS(href.replace(rjsext, "") + ".js") - } else { - var loaderUrl = trimQuery(getFullUrl(mainNode, "src")) - kernel.baseUrl = loaderUrl.slice(0, loaderUrl.lastIndexOf("/") + 1) - } -}// jshint ignore:line - -/********************************************************************* - * DOMReady * - **********************************************************************/ - -var readyList = [], isReady -var fireReady = function(fn) { - isReady = true - if (innerRequire) { - modules["domReady!"].state = 4 - innerRequire.checkDeps() - } - while(fn = readyList.shift()){ - fn(avalon) - } -} - -function doScrollCheck() { - try { //IE下通过doScrollCheck检测DOM树是否建完 - root.doScroll("left") - fireReady() - } catch (e) { - setTimeout(doScrollCheck) - } -} - -if (DOC.readyState === "complete") { - setTimeout(fireReady) //如果在domReady之外加载 -} else if (W3C) { - DOC.addEventListener("DOMContentLoaded", fireReady) -} else { - DOC.attachEvent("onreadystatechange", function() { - if (DOC.readyState === "complete") { - fireReady() - } - }) - try { - var isTop = window.frameElement === null - } catch (e) { - } - if (root.doScroll && isTop && window.external) {//fix IE iframe BUG - doScrollCheck() - } -} -avalon.bind(window, "load", fireReady) - -avalon.ready = function(fn) { - if (!isReady) { - readyList.push(fn) - } else { - fn(avalon) - } -} - -avalon.config({ - loader: true -}) - -avalon.ready(function() { - avalon.scan(DOC.body) -}) - -// Register as a named AMD module, since avalon can be concatenated with other -// files that may use define, but not via a proper concatenation script that -// understands anonymous AMD modules. A named AMD is safest and most robust -// way to register. Lowercase avalon is used because AMD module names are -// derived from file names, and Avalon is normally delivered in a lowercase -// file name. Do this after creating the global so that if an AMD module wants -// to call noConflict to hide this version of avalon, it will work. - -// Note that for maximum portability, libraries that are not avalon should -// declare themselves as anonymous modules, and avoid setting a global if an -// AMD loader is present. avalon is a special case. For more information, see -// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon - if (typeof define === "function" && define.amd) { - define("avalon", [], function() { - return avalon - }) - } -// Map over avalon in case of overwrite - var _avalon = window.avalon - avalon.noConflict = function(deep) { - if (deep && window.avalon === avalon) { - window.avalon = _avalon - } - return avalon - } -// Expose avalon identifiers, even in AMD -// and CommonJS for browser emulators - if (noGlobal === void 0) { - window.avalon = avalon - } - return avalon - -})); \ No newline at end of file diff --git a/apiroute/apiroute-service/src/main/resources/iui-route/js/bootbox/bootbox.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/bootbox/bootbox.min.js deleted file mode 100644 index a7ea24f..0000000 --- a/apiroute/apiroute-service/src/main/resources/iui-route/js/bootbox/bootbox.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/** - * bootbox.js v4.3.0 - * - * http://bootboxjs.com/license.txt - */ -!function(a,b){"use strict";"function"==typeof define&&define.amd?define(["jquery"],b):"object"==typeof exports?module.exports=b(require("jquery")):a.bootbox=b(a.jQuery)}(this,function a(b,c){"use strict";function d(a){var b=q[o.locale];return b?b[a]:q.en[a]}function e(a,c,d){a.stopPropagation(),a.preventDefault();var e=b.isFunction(d)&&d(a)===!1;e||c.modal("hide")}function f(a){var b,c=0;for(b in a)c++;return c}function g(a,c){var d=0;b.each(a,function(a,b){c(a,b,d++)})}function h(a){var c,d;if("object"!=typeof a)throw new Error("Please supply an object of options");if(!a.message)throw new Error("Please specify a message");return a=b.extend({},o,a),a.buttons||(a.buttons={}),a.backdrop=a.backdrop?"static":!1,c=a.buttons,d=f(c),g(c,function(a,e,f){if(b.isFunction(e)&&(e=c[a]={callback:e}),"object"!==b.type(e))throw new Error("button with key "+a+" must be an object");e.label||(e.label=a),e.className||(e.className=2>=d&&f===d-1?"btn-primary":"btn-default")}),a}function i(a,b){var c=a.length,d={};if(1>c||c>2)throw new Error("Invalid argument length");return 2===c||"string"==typeof a[0]?(d[b[0]]=a[0],d[b[1]]=a[1]):d=a[0],d}function j(a,c,d){return b.extend(!0,{},a,i(c,d))}function k(a,b,c,d){var e={className:"bootbox-"+a,buttons:l.apply(null,b)};return m(j(e,d,c),b)}function l(){for(var a={},b=0,c=arguments.length;c>b;b++){var e=arguments[b],f=e.toLowerCase(),g=e.toUpperCase();a[f]={label:d(g)}}return a}function m(a,b){var d={};return g(b,function(a,b){d[b]=!0}),g(a.buttons,function(a){if(d[a]===c)throw new Error("button key "+a+" is not allowed (options are "+b.join("\n")+")")}),a}var n={dialog:"",header:"",footer:"",closeButton:"",form:"
",inputs:{text:"",textarea:"",email:"",select:"",checkbox:"
",date:"",time:"",number:"",password:""}},o={locale:"en",backdrop:!0,animate:!0,className:null,closeButton:!0,show:!0,container:"body"},p={};p.alert=function(){var a;if(a=k("alert",["ok"],["message","callback"],arguments),a.callback&&!b.isFunction(a.callback))throw new Error("alert requires callback property to be a function when provided");return a.buttons.ok.callback=a.onEscape=function(){return b.isFunction(a.callback)?a.callback():!0},p.dialog(a)},p.confirm=function(){var a;if(a=k("confirm",["cancel","confirm"],["message","callback"],arguments),a.buttons.cancel.callback=a.onEscape=function(){return a.callback(!1)},a.buttons.confirm.callback=function(){return a.callback(!0)},!b.isFunction(a.callback))throw new Error("confirm requires a callback");return p.dialog(a)},p.prompt=function(){var a,d,e,f,h,i,k;if(f=b(n.form),d={className:"bootbox-prompt",buttons:l("cancel","confirm"),value:"",inputType:"text"},a=m(j(d,arguments,["title","callback"]),["cancel","confirm"]),i=a.show===c?!0:a.show,a.message=f,a.buttons.cancel.callback=a.onEscape=function(){return a.callback(null)},a.buttons.confirm.callback=function(){var c;switch(a.inputType){case"text":case"textarea":case"email":case"select":case"date":case"time":case"number":case"password":c=h.val();break;case"checkbox":var d=h.find("input:checked");c=[],g(d,function(a,d){c.push(b(d).val())})}return a.callback(c)},a.show=!1,!a.title)throw new Error("prompt requires a title");if(!b.isFunction(a.callback))throw new Error("prompt requires a callback");if(!n.inputs[a.inputType])throw new Error("invalid prompt type");switch(h=b(n.inputs[a.inputType]),a.inputType){case"text":case"textarea":case"email":case"date":case"time":case"number":case"password":h.val(a.value);break;case"select":var o={};if(k=a.inputOptions||[],!k.length)throw new Error("prompt with select requires options");g(k,function(a,d){var e=h;if(d.value===c||d.text===c)throw new Error("given options in wrong format");d.group&&(o[d.group]||(o[d.group]=b("").attr("label",d.group)),e=o[d.group]),e.append("")}),g(o,function(a,b){h.append(b)}),h.val(a.value);break;case"checkbox":var q=b.isArray(a.value)?a.value:[a.value];if(k=a.inputOptions||[],!k.length)throw new Error("prompt with checkbox requires options");if(!k[0].value||!k[0].text)throw new Error("given options in wrong format");h=b("
"),g(k,function(c,d){var e=b(n.inputs[a.inputType]);e.find("input").attr("value",d.value),e.find("label").append(d.text),g(q,function(a,b){b===d.value&&e.find("input").prop("checked",!0)}),h.append(e)})}return a.placeholder&&h.attr("placeholder",a.placeholder),a.pattern&&h.attr("pattern",a.pattern),f.append(h),f.on("submit",function(a){a.preventDefault(),a.stopPropagation(),e.find(".btn-primary").click()}),e=p.dialog(a),e.off("shown.bs.modal"),e.on("shown.bs.modal",function(){h.focus()}),i===!0&&e.modal("show"),e},p.dialog=function(a){a=h(a);var c=b(n.dialog),d=c.find(".modal-dialog"),f=c.find(".modal-body"),i=a.buttons,j="",k={onEscape:a.onEscape};if(g(i,function(a,b){j+="",k[a]=b.callback}),f.find(".bootbox-body").html(a.message),a.animate===!0&&c.addClass("fade"),a.className&&c.addClass(a.className),"large"===a.size&&d.addClass("modal-lg"),"small"===a.size&&d.addClass("modal-sm"),a.title&&f.before(n.header),a.closeButton){var l=b(n.closeButton);a.title?c.find(".modal-header").prepend(l):l.css("margin-top","-10px").prependTo(f)}return a.title&&c.find(".modal-title").html(a.title),j.length&&(f.after(n.footer),c.find(".modal-footer").html(j)),c.on("hidden.bs.modal",function(a){a.target===this&&c.remove()}),c.on("shown.bs.modal",function(){c.find(".btn-primary:first").focus()}),c.on("escape.close.bb",function(a){k.onEscape&&e(a,c,k.onEscape)}),c.on("click",".modal-footer button",function(a){var d=b(this).data("bb-handler");e(a,c,k[d])}),c.on("click",".bootbox-close-button",function(a){e(a,c,k.onEscape)}),c.on("keyup",function(a){27===a.which&&c.trigger("escape.close.bb")}),b(a.container).append(c),c.modal({backdrop:a.backdrop,keyboard:!1,show:!1}),a.show&&c.modal("show"),c},p.setDefaults=function(){var a={};2===arguments.length?a[arguments[0]]=arguments[1]:a=arguments[0],b.extend(o,a)},p.hideAll=function(){return b(".bootbox").modal("hide"),p};var q={br:{OK:"OK",CANCEL:"Cancelar",CONFIRM:"Sim"},cs:{OK:"OK",CANCEL:"Zrušit",CONFIRM:"Potvrdit"},da:{OK:"OK",CANCEL:"Annuller",CONFIRM:"Accepter"},de:{OK:"OK",CANCEL:"Abbrechen",CONFIRM:"Akzeptieren"},el:{OK:"Εντάξει",CANCEL:"Ακύρωση",CONFIRM:"Επιβεβαίωση"},en:{OK:"OK",CANCEL:"Cancel",CONFIRM:"OK"},es:{OK:"OK",CANCEL:"Cancelar",CONFIRM:"Aceptar"},et:{OK:"OK",CANCEL:"Katkesta",CONFIRM:"OK"},fi:{OK:"OK",CANCEL:"Peruuta",CONFIRM:"OK"},fr:{OK:"OK",CANCEL:"Annuler",CONFIRM:"D'accord"},he:{OK:"אישור",CANCEL:"ביטול",CONFIRM:"אישור"},id:{OK:"OK",CANCEL:"Batal",CONFIRM:"OK"},it:{OK:"OK",CANCEL:"Annulla",CONFIRM:"Conferma"},ja:{OK:"OK",CANCEL:"キャンセル",CONFIRM:"確認"},lt:{OK:"Gerai",CANCEL:"Atšaukti",CONFIRM:"Patvirtinti"},lv:{OK:"Labi",CANCEL:"Atcelt",CONFIRM:"Apstiprināt"},nl:{OK:"OK",CANCEL:"Annuleren",CONFIRM:"Accepteren"},no:{OK:"OK",CANCEL:"Avbryt",CONFIRM:"OK"},pl:{OK:"OK",CANCEL:"Anuluj",CONFIRM:"Potwierdź"},pt:{OK:"OK",CANCEL:"Cancelar",CONFIRM:"Confirmar"},ru:{OK:"OK",CANCEL:"Отмена",CONFIRM:"Применить"},sv:{OK:"OK",CANCEL:"Avbryt",CONFIRM:"OK"},tr:{OK:"Tamam",CANCEL:"İptal",CONFIRM:"Onayla"},zh_CN:{OK:"OK",CANCEL:"取消",CONFIRM:"确认"},zh_TW:{OK:"OK",CANCEL:"取消",CONFIRM:"確認"}};return p.init=function(c){return a(c||b)},p}); \ No newline at end of file diff --git a/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap-growl.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap-growl.min.js deleted file mode 100644 index ce6deb1..0000000 --- a/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap-growl.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/* Project: Bootstrap Growl - v2.0.0 | Author: Mouse0270 aka Robert McIntosh | License: MIT License | Website: https://github.com/mouse0270/bootstrap-growl */ -(function(e,t,n,r){var i="growl",s="plugin_"+i,o={element:"body",type:"info",allow_dismiss:true,placement:{from:"top",align:"right"},offset:20,spacing:10,z_index:1031,delay:5e3,timer:1e3,url_target:"_blank",mouse_over:false,animate:{enter:"animated fadeInDown",exit:"animated fadeOutUp"},icon_type:"class",template:''};var u=function(t,n){o=e.extend(true,{},o,n)},a=function(t,n,r){var n={content:{message:typeof n=="object"?n.message:n,title:n.title?n.title:null,icon:n.icon?n.icon:null,url:n.url?n.url:null}};r=e.extend(true,{},n,r);this.settings=e.extend(true,{},o,r);plugin=this;f(r,this.settings,plugin);this.$template=$template},f=function(t,n,r){var i={settings:n,$element:e(n.element),template:n.template};$template=l(i);c($template,i.settings);h($template,i.settings);p($template,i.settings,r)},l=function(t){var n=e(t.settings.template);n.addClass("alert-"+t.settings.type);n.attr("data-growl-position",t.settings.placement.from+"-"+t.settings.placement.align);n.find('[data-growl="dismiss"]').css("display","none");if(t.settings.allow_dismiss){n.find('[data-growl="dismiss"]').css("display","inline-block")}return n},c=function(e,t){e.find('[data-growl="dismiss"]').css({position:"absolute",top:"5px",right:"10px","z-index":t.z_index-1>=1?t.z_index-1:1});if(t.content.icon){if(t.icon_type.toLowerCase()=="class"){e.find('[data-growl="icon"]').addClass(t.content.icon)}else{if(e.find('[data-growl="icon"]').is("img")){e.find('[data-growl="icon"]').attr("src",t.content.icon)}else{e.find('[data-growl="icon"]').append('')}}}if(t.content.title){e.find('[data-growl="title"]').html(t.content.title)}if(t.content.message){e.find('[data-growl="message"]').html(t.content.message)}if(t.content.url){e.find('[data-growl="url"]').attr("href",t.content.url).attr("target",t.url_target);e.find('[data-growl="url"]').css({position:"absolute",top:"0px",left:"0px",width:"100%",height:"100%","z-index":t.z_index-2>=1?t.z_index-2:1})}},h=function(t,n){var r=n.offset,i={position:n.element==="body"?"fixed":"absolute",margin:0,"z-index":n.z_index,display:"inline-block"};e('[data-growl-position="'+n.placement.from+"-"+n.placement.align+'"]').each(function(){return r=Math.max(r,parseInt(e(this).css(n.placement.from))+e(this).outerHeight()+n.spacing)});i[n.placement.from]=r+"px";t.css(i);e(n.element).append(t);switch(n.placement.align){case"center":t.css({left:"50%",marginLeft:-(t.outerWidth()/2)+"px"});break;case"left":t.css("left",n.offset+"px");break;case"right":t.css("right",n.offset+"px");break}t.addClass("growl-animated")},p=function(e,t,n){e.addClass(t.animate.enter);e.find('[data-growl="dismiss"]').on("click",function(){n.close()});e.on("mouseover",function(t){e.addClass("hovering")}).on("mouseout",function(){e.removeClass("hovering")});if(t.delay>=1){e.data("growl-delay",t.delay);var r=setInterval(function(){var i=parseInt(e.data("growl-delay"))-t.timer;console.log();if(!e.hasClass("hovering")&&t.mouse_over=="pause"||t.mouse_over!="pause"){e.data("growl-delay",i)}if(i<=0){clearInterval(r);n.close()}},t.timer)}};a.prototype={update:function(e,t){switch(e){case"icon":if(this.settings.icon_type.toLowerCase()=="class"){this.$template.find('[data-growl="icon"]').removeClass(this.settings.content.icon);this.$template.find('[data-growl="icon"]').addClass(t)}else{if(this.$template.find('[data-growl="icon"]').is("img")){this.$template.find('[data-growl="icon"]')}else{this.$template.find('[data-growl="icon"]').find("img").attr().attr("src",t)}}break;case"url":this.$template.find('[data-growl="url"]').attr("href",t);break;case"type":this.$template.removeClass("alert-"+this.settings.type);this.$template.addClass("alert-"+t);break;default:this.$template.find('[data-growl="'+e+'"]').html(t)}return this},close:function(){var t=this.$template,n=this.settings,r=t.css(n.placement.from),i=false;t.addClass(this.settings.animate.exit);t.nextAll('[data-growl-position="'+this.settings.placement.from+"-"+this.settings.placement.align+'"]').each(function(){e(this).css(n.placement.from,r);r=parseInt(r)+n.spacing+e(this).outerHeight()});t.one("webkitAnimationStart oanimationstart MSAnimationStart animationstart",function(e){i=true});t.one("webkitAnimationEnd oanimationend MSAnimationEnd animationend",function(t){e(this).remove()});setTimeout(function(){console.log(i);if(!i){t.remove()}},100);return this}};e.growl=function(e,t){if(e==false){u(this,t);return false}var n=new a(this,e,t);return n}})(jQuery,window,document) \ No newline at end of file diff --git a/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/css/bootstrap-dt.css b/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/css/bootstrap-dt.css deleted file mode 100644 index 2828337..0000000 --- a/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/css/bootstrap-dt.css +++ /dev/null @@ -1,5804 +0,0 @@ -/*! - * 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; - -webkit-text-size-adjust: 100%; - -ms-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: transparent; -} -a:active, -a:hover { - outline: 0; -} -abbr[title] { - border-bottom: 1px dotted; -} -b, -strong { - font-weight: bold; -} -dfn { - font-style: italic; -} -h1 { - margin: .67em 0; - font-size: 2em; -} -mark { - color: #000; - background: #ff0; -} -small { - font-size: 80%; -} -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} -sup { - top: -.5em; -} -sub { - bottom: -.25em; -} -img { - border: 0; -} -svg:not(:root) { - overflow: hidden; -} -figure { - margin: 1em 40px; -} -hr { - height: 0; - -moz-box-sizing: content-box; - box-sizing: content-box; -} -pre { - overflow: auto; -} -code, -kbd, -pre, -samp { - font-family: monospace, monospace; - font-size: 1em; -} -button, -input, -optgroup, -select, -textarea { - margin: 0; - font: inherit; - color: inherit; -} -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 { - padding: 0; - border: 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-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; -} -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} -fieldset { - padding: .35em .625em .75em; - margin: 0 2px; - border: 1px solid #c0c0c0; -} -legend { - padding: 0; - border: 0; -} -textarea { - overflow: auto; -} -optgroup { - font-weight: bold; -} -table { - border-spacing: 0; - border-collapse: collapse; -} -td, -th { -} -@media print { - * { - color: #000 !important; - text-shadow: none !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; - } -} -.dataTableWrapperDiv div { - -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 { - display: inline-block; - max-width: 100%; - height: auto; - 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; -} -.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; - padding: 0; - margin: -1px; - 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: normal; - 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; - margin-left: -5px; - list-style: none; -} -.list-inline > li { - display: inline-block; - padding-right: 5px; - padding-left: 5px; -} -dl { - margin-top: 0; - margin-bottom: 20px; -} -dt, -dd { - line-height: 1.42857143; -} -dt { - font-weight: bold; -} -dd { - margin-left: 0; -} -@media (min-width: 768px) { - .dl-horizontal dt { - float: left; - width: 160px; - overflow: hidden; - clear: left; - text-align: right; - 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; - text-align: right; - border-right: 5px solid #eee; - border-left: 0; -} -.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; - white-space: nowrap; - background-color: #f9f2f4; - 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; - color: #333; - word-break: break-all; - word-wrap: break-word; - 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 { - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} -@media (min-width: 768px) { - .container { - width: 750px; - } -} -@media (min-width: 992px) { - .container { - width: 970px; - } -} -@media (min-width: 1200px) { - .container { - width: 1170px; - } -} -.container-fluid { - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} -.row { - margin-right: -15px; - margin-left: -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-right: 15px; - padding-left: 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;*/ - background-color:#dbedff; -} -.dataTableTdSelected{ - background-color:#dbedff !important; -} -table col[class*="col-"] { - position: static; - display: table-column; - float: none; -} -table td[class*="col-"], -table th[class*="col-"] { - position: static; - display: table-cell; - float: none; -} -.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-x: scroll; - overflow-y: hidden; - -webkit-overflow-scrolling: touch; - -ms-overflow-style: -ms-autohiding-scrollbar; - border: 1px solid #ddd; - } - .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 { - min-width: 0; - padding: 0; - margin: 0; - border: 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: bold; -} -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; - /* IE8-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; - padding-left: 20px; - margin-top: 10px; - margin-bottom: 10px; -} -.radio label, -.checkbox label { - display: inline; - font-weight: normal; - 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; - font-weight: normal; - vertical-align: middle; - 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; - background-color: #dff0d8; - border-color: #3c763d; -} -.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; - background-color: #fcf8e3; - border-color: #8a6d3b; -} -.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; - background-color: #f2dede; - border-color: #a94442; -} -.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; - padding-left: 0; - margin-top: 0; - margin-bottom: 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 { - padding-top: 7px; - margin-top: 0; - margin-bottom: 0; -} -.form-horizontal .radio, -.form-horizontal .checkbox { - min-height: 27px; -} -.form-horizontal .form-group { - margin-right: -15px; - margin-left: -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; - padding: 6px 12px; - margin-bottom: 0; - font-size: 14px; - font-weight: normal; - line-height: 1.42857143; - text-align: center; - white-space: nowrap; - vertical-align: middle; - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; -} -.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 { - background-image: none; - outline: 0; - -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 { - pointer-events: none; - cursor: not-allowed; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - box-shadow: none; - opacity: .65; -} -.btn.default { - color: #333333; - text-shadow: none; - background-color: #e5e5e5; - height:12px; -} -.btn.default:hover, -.btn.default:focus, -.btn.default:active, -.btn.default.active, -.btn.default[disabled], -.btn.default.disabled { - color: #333333; - background-color: #d8d8d8 !important; - outline: none !important; -} - -.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 { - font-weight: normal; - color: #428bca; - 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-sm { - padding: 2px 10px 8px 10px; -} -.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-right: 0; - padding-left: 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: normal; - 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; - font-size: 14px; - list-style: none; - background-color: #fff; - background-clip: padding-box; - 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); -} -.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: normal; - line-height: 1.42857143; - color: #333; - white-space: nowrap; -} -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus { - color: #262626; - text-decoration: none; - background-color: #f5f5f5; -} -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - color: #fff; - text-decoration: none; - background-color: #428bca; - outline: 0; -} -.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; - cursor: not-allowed; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.open > .dropdown-menu { - display: block; -} -.open > a { - outline: 0; -} -.dropdown-menu-right { - right: 0; - left: auto; -} -.dropdown-menu-left { - right: auto; - left: 0; -} -.dropdown-header { - display: block; - padding: 3px 20px; - font-size: 12px; - line-height: 1.42857143; - color: #999; -} -.dropdown-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 990; -} -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - content: ""; - border-top: 0; - border-bottom: 4px solid; -} -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; -} -@media (min-width: 768px) { - .navbar-right .dropdown-menu { - right: 0; - left: auto; - } - .navbar-right .dropdown-menu-left { - right: auto; - left: 0; - } -} -.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: none; -} -.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-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.btn-group > .btn:last-child:not(:first-child), -.btn-group > .dropdown-toggle:not(:first-child) { - border-top-left-radius: 0; - border-bottom-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-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.btn-group > .btn-group:last-child > .btn:first-child { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} -.btn-group > .btn + .dropdown-toggle { - padding-right: 8px; - padding-left: 8px; -} -.btn-group > .btn-lg + .dropdown-toggle { - padding-right: 12px; - padding-left: 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-top-left-radius: 0; - border-top-right-radius: 0; - border-bottom-left-radius: 4px; -} -.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-left-radius: 0; - border-top-right-radius: 0; -} -.btn-group-justified { - display: table; - width: 100%; - table-layout: fixed; - border-collapse: separate; -} -.btn-group-justified > .btn, -.btn-group-justified > .btn-group { - display: table-cell; - float: none; - 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-right: 0; - padding-left: 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: normal; - 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-top-right-radius: 0; - border-bottom-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-top-left-radius: 0; - border-bottom-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 { - padding-left: 0; - margin-bottom: 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; - cursor: not-allowed; - background-color: transparent; -} -.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; - cursor: default; - background-color: #fff; - border: 1px solid #ddd; - border-bottom-color: transparent; -} -.nav-tabs.nav-justified { - width: 100%; - border-bottom: 0; -} -.nav-tabs.nav-justified > li { - float: none; -} -.nav-tabs.nav-justified > li > a { - margin-bottom: 5px; - text-align: center; -} -.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 { - margin-bottom: 5px; - text-align: center; -} -.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-left-radius: 0; - border-top-right-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; - padding-right: 15px; - padding-left: 15px; - overflow-x: visible; - -webkit-overflow-scrolling: touch; - border-top: 1px solid transparent; - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); -} -.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-right: 0; - padding-left: 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; - height: 50px; - padding: 15px 15px; - font-size: 18px; - line-height: 20px; -} -.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; - padding: 9px 10px; - margin-top: 8px; - margin-right: 15px; - margin-bottom: 8px; - background-color: transparent; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; -} -.navbar-toggle:focus { - outline: none; -} -.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 { - padding: 10px 15px; - margin-top: 8px; - margin-right: -15px; - margin-bottom: 8px; - margin-left: -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); -} -@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; - padding-left: 0; - margin-top: 0; - margin-bottom: 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; - padding-top: 0; - padding-bottom: 0; - margin-right: 0; - margin-left: 0; - border: 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-left-radius: 0; - border-top-right-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-right: 15px; - margin-left: 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 { - color: #555; - background-color: #e7e7e7; -} -@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 { - color: #fff; - background-color: #080808; -} -@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 { - padding: 0 5px; - color: #ccc; - content: "/\00a0"; -} -.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; - margin-left: -1px; - line-height: 1.42857143; - color: #428bca; - text-decoration: none; - background-color: #fff; - border: 1px solid #ddd; -} -.pagination > li:first-child > a, -.pagination > li:first-child > span { - margin-left: 0; - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; -} -.pagination > li:last-child > a, -.pagination > li:last-child > span { - border-top-right-radius: 4px; - border-bottom-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; - cursor: default; - background-color: #428bca; - border-color: #428bca; -} -.pagination > .disabled > span, -.pagination > .disabled > span:hover, -.pagination > .disabled > span:focus, -.pagination > .disabled > a, -.pagination > .disabled > a:hover, -.pagination > .disabled > a:focus { - color: #999; - cursor: not-allowed; - background-color: #fff; - border-color: #ddd; -} -.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-top-left-radius: 6px; - border-bottom-left-radius: 6px; -} -.pagination-lg > li:last-child > a, -.pagination-lg > li:last-child > span { - border-top-right-radius: 6px; - border-bottom-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-top-left-radius: 3px; - border-bottom-left-radius: 3px; -} -.pagination-sm > li:last-child > a, -.pagination-sm > li:last-child > span { - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; -} -.pager { - padding-left: 0; - margin: 20px 0; - text-align: center; - list-style: none; -} -.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; - cursor: not-allowed; - background-color: #fff; -} -.label { - display: inline; - padding: .2em .6em .3em; - font-size: 75%; - font-weight: bold; - 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: #808080; -} -.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: bold; - line-height: 1; - color: #fff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - 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-right: 60px; - padding-left: 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-right: auto; - margin-left: 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: bold; -} -.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 { - color: #3c763d; - background-color: #dff0d8; - border-color: #d6e9c6; -} -.alert-success hr { - border-top-color: #c9e2b3; -} -.alert-success .alert-link { - color: #2b542c; -} -.alert-info { - color: #31708f; - background-color: #d9edf7; - border-color: #bce8f1; -} -.alert-info hr { - border-top-color: #a6e1ec; -} -.alert-info .alert-link { - color: #245269; -} -.alert-warning { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; -} -.alert-warning hr { - border-top-color: #f7e1b5; -} -.alert-warning .alert-link { - color: #66512c; -} -.alert-danger { - color: #a94442; - background-color: #f2dede; - border-color: #ebccd1; -} -.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 { - height: 20px; - margin-bottom: 20px; - overflow: hidden; - 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 { - padding-left: 0; - margin-bottom: 20px; -} -.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-left-radius: 4px; - border-top-right-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-left-radius: 3px; - border-top-right-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-left-radius: 3px; - border-top-right-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-left-radius: 3px; - border-top-right-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 { - margin-bottom: 0; - border: 0; -} -.panel-group { - margin-bottom: 20px; -} -.panel-group .panel { - margin-bottom: 0; - overflow: hidden; - border-radius: 4px; -} -.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: bold; - line-height: 1; - color: #000; - text-shadow: 0 1px 0 #fff; - filter: alpha(opacity=20); - opacity: .2; -} -.close:hover, -.close:focus { - color: #000; - text-decoration: none; - cursor: pointer; - filter: alpha(opacity=50); - opacity: .5; -} -button.close { - -webkit-appearance: none; - padding: 0; - cursor: pointer; - background: transparent; - border: 0; -} -.modal-open { - overflow: hidden; -} -.modal { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1050; - display: none; - overflow: auto; - overflow-y: scroll; - -webkit-overflow-scrolling: touch; - outline: 0; -} -.modal.fade .modal-dialog { - -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; - -webkit-transform: translate(0, -25%); - -ms-transform: translate(0, -25%); - transform: translate(0, -25%); -} -.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; - background-clip: padding-box; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, .2); - border-radius: 6px; - outline: none; - -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); - box-shadow: 0 3px 9px rgba(0, 0, 0, .5); -} -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - /*background-color: #000;*/ - background-color: #fff; -} -.modal-backdrop.fade { - filter: alpha(opacity=0); - opacity: 0; -} -.modal-backdrop.in { - filter: alpha(opacity=50); - opacity: .5; -} -.modal-header { - min-height: 16.42857143px; - padding: 15px; - border-bottom: 1px solid #e5e5e5; -} -.modal-header .close { - margin-top: -2px; -} -.modal-title { - margin: 0; - line-height: 1.42857143; -} -.modal-body { - position: relative; - padding: 20px; -} -.modal-footer { - padding: 19px 20px 20px; - margin-top: 15px; - text-align: right; - border-top: 1px solid #e5e5e5; -} -.modal-footer .btn + .btn { - margin-bottom: 0; - margin-left: 5px; -} -.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; - font-size: 12px; - line-height: 1.4; - visibility: visible; - filter: alpha(opacity=0); - opacity: 0; -} -.tooltip.in { - filter: alpha(opacity=90); - opacity: .9; -} -.tooltip.top { - padding: 5px 0; - margin-top: -3px; -} -.tooltip.right { - padding: 0 5px; - margin-left: 3px; -} -.tooltip.bottom { - padding: 5px 0; - margin-top: 3px; -} -.tooltip.left { - padding: 0 5px; - margin-left: -3px; -} -.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 { - right: 5px; - bottom: 0; - 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; - white-space: normal; - 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); -} -.popover.top { - margin-top: -10px; -} -.popover.right { - margin-left: 10px; -} -.popover.bottom { - margin-top: 10px; -} -.popover.left { - margin-left: -10px; -} -.popover-title { - padding: 8px 14px; - margin: 0; - font-size: 14px; - font-weight: normal; - 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 { - content: ""; - border-width: 10px; -} -.popover.top > .arrow { - bottom: -11px; - left: 50%; - margin-left: -11px; - border-top-color: #999; - border-top-color: rgba(0, 0, 0, .25); - border-bottom-width: 0; -} -.popover.top > .arrow:after { - bottom: 1px; - margin-left: -10px; - content: " "; - border-top-color: #fff; - border-bottom-width: 0; -} -.popover.right > .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-right-color: #999; - border-right-color: rgba(0, 0, 0, .25); - border-left-width: 0; -} -.popover.right > .arrow:after { - bottom: -10px; - left: 1px; - content: " "; - border-right-color: #fff; - border-left-width: 0; -} -.popover.bottom > .arrow { - top: -11px; - left: 50%; - margin-left: -11px; - border-top-width: 0; - border-bottom-color: #999; - border-bottom-color: rgba(0, 0, 0, .25); -} -.popover.bottom > .arrow:after { - top: 1px; - margin-left: -10px; - content: " "; - 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 { - right: 1px; - bottom: -10px; - content: " "; - border-right-width: 0; - border-left-color: #fff; -} -.carousel { - position: relative; -} -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} -.carousel-inner > .item { - position: relative; - display: none; - -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; - bottom: 0; - left: 0; - width: 15%; - font-size: 20px; - color: #fff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, .6); - filter: alpha(opacity=50); - opacity: .5; -} -.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%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); - background-repeat: repeat-x; -} -.carousel-control.right { - right: 0; - left: auto; - 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%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); - background-repeat: repeat-x; -} -.carousel-control:hover, -.carousel-control:focus { - color: #fff; - text-decoration: none; - filter: alpha(opacity=90); - outline: none; - opacity: .9; -} -.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%; - padding-left: 0; - margin-left: -30%; - text-align: center; - list-style: none; -} -.carousel-indicators li { - display: inline-block; - width: 10px; - height: 10px; - margin: 1px; - text-indent: -999px; - cursor: pointer; - background-color: #000 \9; - background-color: rgba(0, 0, 0, 0); - border: 1px solid #fff; - border-radius: 10px; -} -.carousel-indicators .active { - width: 12px; - height: 12px; - margin: 0; - background-color: #fff; -} -.carousel-caption { - position: absolute; - right: 15%; - bottom: 20px; - left: 15%; - 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 { - right: 20%; - left: 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 { - display: table; - content: " "; -} -.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-right: auto; - margin-left: 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; - } -} -/*# sourceMappingURL=bootstrap.css.map */ diff --git a/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/css/bootstrap.min.css b/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/css/bootstrap.min.css deleted file mode 100644 index 679272d..0000000 --- a/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/css/bootstrap.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * 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/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap.js deleted file mode 100644 index 8ae571b..0000000 --- a/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap.js +++ /dev/null @@ -1,1951 +0,0 @@ -/*! - * Bootstrap v3.1.1 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ - -if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') } - -/* ======================================================================== - * Bootstrap: transition.js v3.1.1 - * http://getbootstrap.com/javascript/#transitions - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) - // ============================================================ - - function transitionEnd() { - var el = document.createElement('bootstrap') - - var transEndEventNames = { - 'WebkitTransition' : 'webkitTransitionEnd', - 'MozTransition' : 'transitionend', - 'OTransition' : 'oTransitionEnd otransitionend', - 'transition' : 'transitionend' - } - - for (var name in transEndEventNames) { - if (el.style[name] !== undefined) { - return { end: transEndEventNames[name] } - } - } - - return false // explicit for ie8 ( ._.) - } - - // http://blog.alexmaccaw.com/css-transitions - $.fn.emulateTransitionEnd = function (duration) { - var called = false, $el = this - $(this).one($.support.transition.end, function () { called = true }) - var callback = function () { if (!called) $($el).trigger($.support.transition.end) } - setTimeout(callback, duration) - return this - } - - $(function () { - $.support.transition = transitionEnd() - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: alert.js v3.1.1 - * http://getbootstrap.com/javascript/#alerts - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // ALERT CLASS DEFINITION - // ====================== - - var dismiss = '[data-dismiss="alert"]' - var Alert = function (el) { - $(el).on('click', dismiss, this.close) - } - - Alert.prototype.close = function (e) { - var $this = $(this) - var selector = $this.attr('data-target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 - } - - var $parent = $(selector) - - if (e) e.preventDefault() - - if (!$parent.length) { - $parent = $this.hasClass('alert') ? $this : $this.parent() - } - - $parent.trigger(e = $.Event('close.bs.alert')) - - if (e.isDefaultPrevented()) return - - $parent.removeClass('in') - - function removeElement() { - $parent.trigger('closed.bs.alert').remove() - } - - $.support.transition && $parent.hasClass('fade') ? - $parent - .one($.support.transition.end, removeElement) - .emulateTransitionEnd(150) : - removeElement() - } - - - // ALERT PLUGIN DEFINITION - // ======================= - - var old = $.fn.alert - - $.fn.alert = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.alert') - - if (!data) $this.data('bs.alert', (data = new Alert(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.alert.Constructor = Alert - - - // ALERT NO CONFLICT - // ================= - - $.fn.alert.noConflict = function () { - $.fn.alert = old - return this - } - - - // ALERT DATA-API - // ============== - - $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: button.js v3.1.1 - * http://getbootstrap.com/javascript/#buttons - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // BUTTON PUBLIC CLASS DEFINITION - // ============================== - - var Button = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Button.DEFAULTS, options) - this.isLoading = false - } - - Button.DEFAULTS = { - loadingText: 'loading...' - } - - Button.prototype.setState = function (state) { - var d = 'disabled' - var $el = this.$element - var val = $el.is('input') ? 'val' : 'html' - var data = $el.data() - - state = state + 'Text' - - if (!data.resetText) $el.data('resetText', $el[val]()) - - $el[val](data[state] || this.options[state]) - - // push to event loop to allow forms to submit - setTimeout($.proxy(function () { - if (state == 'loadingText') { - this.isLoading = true - $el.addClass(d).attr(d, d) - } else if (this.isLoading) { - this.isLoading = false - $el.removeClass(d).removeAttr(d) - } - }, this), 0) - } - - Button.prototype.toggle = function () { - var changed = true - var $parent = this.$element.closest('[data-toggle="buttons"]') - - if ($parent.length) { - var $input = this.$element.find('input') - if ($input.prop('type') == 'radio') { - if ($input.prop('checked') && this.$element.hasClass('active')) changed = false - else $parent.find('.active').removeClass('active') - } - if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change') - } - - if (changed) this.$element.toggleClass('active') - } - - - // BUTTON PLUGIN DEFINITION - // ======================== - - var old = $.fn.button - - $.fn.button = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.button') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.button', (data = new Button(this, options))) - - if (option == 'toggle') data.toggle() - else if (option) data.setState(option) - }) - } - - $.fn.button.Constructor = Button - - - // BUTTON NO CONFLICT - // ================== - - $.fn.button.noConflict = function () { - $.fn.button = old - return this - } - - - // BUTTON DATA-API - // =============== - - $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) { - var $btn = $(e.target) - if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') - $btn.button('toggle') - e.preventDefault() - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: carousel.js v3.1.1 - * http://getbootstrap.com/javascript/#carousel - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // CAROUSEL CLASS DEFINITION - // ========================= - - var Carousel = function (element, options) { - this.$element = $(element) - this.$indicators = this.$element.find('.carousel-indicators') - this.options = options - this.paused = - this.sliding = - this.interval = - this.$active = - this.$items = null - - this.options.pause == 'hover' && this.$element - .on('mouseenter', $.proxy(this.pause, this)) - .on('mouseleave', $.proxy(this.cycle, this)) - } - - Carousel.DEFAULTS = { - interval: 5000, - pause: 'hover', - wrap: true - } - - Carousel.prototype.cycle = function (e) { - e || (this.paused = false) - - this.interval && clearInterval(this.interval) - - this.options.interval - && !this.paused - && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) - - return this - } - - Carousel.prototype.getActiveIndex = function () { - this.$active = this.$element.find('.item.active') - this.$items = this.$active.parent().children() - - return this.$items.index(this.$active) - } - - Carousel.prototype.to = function (pos) { - var that = this - var activeIndex = this.getActiveIndex() - - if (pos > (this.$items.length - 1) || pos < 0) return - - if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) - if (activeIndex == pos) return this.pause().cycle() - - return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) - } - - Carousel.prototype.pause = function (e) { - e || (this.paused = true) - - if (this.$element.find('.next, .prev').length && $.support.transition) { - this.$element.trigger($.support.transition.end) - this.cycle(true) - } - - this.interval = clearInterval(this.interval) - - return this - } - - Carousel.prototype.next = function () { - if (this.sliding) return - return this.slide('next') - } - - Carousel.prototype.prev = function () { - if (this.sliding) return - return this.slide('prev') - } - - Carousel.prototype.slide = function (type, next) { - var $active = this.$element.find('.item.active') - var $next = next || $active[type]() - var isCycling = this.interval - var direction = type == 'next' ? 'left' : 'right' - var fallback = type == 'next' ? 'first' : 'last' - var that = this - - if (!$next.length) { - if (!this.options.wrap) return - $next = this.$element.find('.item')[fallback]() - } - - if ($next.hasClass('active')) return this.sliding = false - - var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction }) - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - - this.sliding = true - - isCycling && this.pause() - - if (this.$indicators.length) { - this.$indicators.find('.active').removeClass('active') - this.$element.one('slid.bs.carousel', function () { - var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) - $nextIndicator && $nextIndicator.addClass('active') - }) - } - - if ($.support.transition && this.$element.hasClass('slide')) { - $next.addClass(type) - $next[0].offsetWidth // force reflow - $active.addClass(direction) - $next.addClass(direction) - $active - .one($.support.transition.end, function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { that.$element.trigger('slid.bs.carousel') }, 0) - }) - .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000) - } else { - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger('slid.bs.carousel') - } - - isCycling && this.cycle() - - return this - } - - - // CAROUSEL PLUGIN DEFINITION - // ========================== - - var old = $.fn.carousel - - $.fn.carousel = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.carousel') - var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) - var action = typeof option == 'string' ? option : options.slide - - if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (action) data[action]() - else if (options.interval) data.pause().cycle() - }) - } - - $.fn.carousel.Constructor = Carousel - - - // CAROUSEL NO CONFLICT - // ==================== - - $.fn.carousel.noConflict = function () { - $.fn.carousel = old - return this - } - - - // CAROUSEL DATA-API - // ================= - - $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { - var $this = $(this), href - var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - var options = $.extend({}, $target.data(), $this.data()) - var slideIndex = $this.attr('data-slide-to') - if (slideIndex) options.interval = false - - $target.carousel(options) - - if (slideIndex = $this.attr('data-slide-to')) { - $target.data('bs.carousel').to(slideIndex) - } - - e.preventDefault() - }) - - $(window).on('load', function () { - $('[data-ride="carousel"]').each(function () { - var $carousel = $(this) - $carousel.carousel($carousel.data()) - }) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: collapse.js v3.1.1 - * http://getbootstrap.com/javascript/#collapse - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // COLLAPSE PUBLIC CLASS DEFINITION - // ================================ - - var Collapse = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Collapse.DEFAULTS, options) - this.transitioning = null - - if (this.options.parent) this.$parent = $(this.options.parent) - if (this.options.toggle) this.toggle() - } - - Collapse.DEFAULTS = { - toggle: true - } - - Collapse.prototype.dimension = function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - Collapse.prototype.show = function () { - if (this.transitioning || this.$element.hasClass('in')) return - - var startEvent = $.Event('show.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - var actives = this.$parent && this.$parent.find('> .panel > .in') - - if (actives && actives.length) { - var hasData = actives.data('bs.collapse') - if (hasData && hasData.transitioning) return - actives.collapse('hide') - hasData || actives.data('bs.collapse', null) - } - - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - .addClass('collapsing') - [dimension](0) - - this.transitioning = 1 - - var complete = function () { - this.$element - .removeClass('collapsing') - .addClass('collapse in') - [dimension]('auto') - this.transitioning = 0 - this.$element.trigger('shown.bs.collapse') - } - - if (!$.support.transition) return complete.call(this) - - var scrollSize = $.camelCase(['scroll', dimension].join('-')) - - this.$element - .one($.support.transition.end, $.proxy(complete, this)) - .emulateTransitionEnd(350) - [dimension](this.$element[0][scrollSize]) - } - - Collapse.prototype.hide = function () { - if (this.transitioning || !this.$element.hasClass('in')) return - - var startEvent = $.Event('hide.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - var dimension = this.dimension() - - this.$element - [dimension](this.$element[dimension]()) - [0].offsetHeight - - this.$element - .addClass('collapsing') - .removeClass('collapse') - .removeClass('in') - - this.transitioning = 1 - - var complete = function () { - this.transitioning = 0 - this.$element - .trigger('hidden.bs.collapse') - .removeClass('collapsing') - .addClass('collapse') - } - - if (!$.support.transition) return complete.call(this) - - this.$element - [dimension](0) - .one($.support.transition.end, $.proxy(complete, this)) - .emulateTransitionEnd(350) - } - - Collapse.prototype.toggle = function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - - // COLLAPSE PLUGIN DEFINITION - // ========================== - - var old = $.fn.collapse - - $.fn.collapse = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.collapse') - var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) - - if (!data && options.toggle && option == 'show') option = !option - if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.collapse.Constructor = Collapse - - - // COLLAPSE NO CONFLICT - // ==================== - - $.fn.collapse.noConflict = function () { - $.fn.collapse = old - return this - } - - - // COLLAPSE DATA-API - // ================= - - $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) { - var $this = $(this), href - var target = $this.attr('data-target') - || e.preventDefault() - || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 - var $target = $(target) - var data = $target.data('bs.collapse') - var option = data ? 'toggle' : $this.data() - var parent = $this.attr('data-parent') - var $parent = parent && $(parent) - - if (!data || !data.transitioning) { - if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed') - $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed') - } - - $target.collapse(option) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: dropdown.js v3.1.1 - * http://getbootstrap.com/javascript/#dropdowns - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // DROPDOWN CLASS DEFINITION - // ========================= - - var backdrop = '.dropdown-backdrop' - var toggle = '[data-toggle=dropdown]' - var Dropdown = function (element) { - $(element).on('click.bs.dropdown', this.toggle) - } - - Dropdown.prototype.toggle = function (e) { - var $this = $(this) - - if ($this.is('.disabled, :disabled')) return - - var $parent = getParent($this) - var isActive = $parent.hasClass('open') - - clearMenus() - - if (!isActive) { - if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { - // if mobile we use a backdrop because click events don't delegate - $('