From e4e5f5a4c1d9d0f103399ee011588ff86bbc48ef Mon Sep 17 00:00:00 2001
From: Haotian Zhang <928016560@qq.com>
Date: Tue, 26 Sep 2023 14:35:38 +0800
Subject: [PATCH] feat:support service contract reporting. (#1141)
---
.licenserc.yaml | 2 +-
CHANGELOG.md | 1 +
pom.xml | 1 +
spring-cloud-starter-tencent-all/pom.xml | 22 ++-
.../adapter/PolarisConfigFileLocator.java | 4 +-
.../PolarisConfigPropertyAutoRefresher.java | 4 +-
.../pom.xml | 54 ++++++
.../contract/PolarisContractReporter.java | 163 ++++++++++++++++++
.../PolarisSwaggerApplicationListener.java | 35 ++++
.../polaris/contract/SwaggerContext.java | 36 ++++
.../contract/config/ContractProperties.java | 50 ++++++
.../config/ExtendedContractProperties.java | 26 +++
.../config/PolarisContractModifier.java | 52 ++++++
.../config/PolarisContractProperties.java | 137 +++++++++++++++
...isContractPropertiesAutoConfiguration.java | 47 +++++
...tractPropertiesBootstrapConfiguration.java | 34 ++++
.../PolarisSwaggerAutoConfiguration.java | 136 +++++++++++++++
.../contract/filter/ApiDocServletFilter.java | 72 ++++++++
.../contract/filter/ApiDocWebFluxFilter.java | 72 ++++++++
.../contract/filter/FilterConstant.java | 64 +++++++
.../polaris/contract/utils/PackageUtil.java | 132 ++++++++++++++
.../api/AbstractOpenApiResourceUtil.java | 37 ++++
.../webflux/api/OpenApiWebFluxUtil.java | 36 ++++
.../webmvc/api/OpenApiWebMvcUtil.java | 35 ++++
...itional-spring-configuration-metadata.json | 40 +++++
.../main/resources/META-INF/spring.factories | 4 +
...ot.autoconfigure.AutoConfiguration.imports | 2 +
.../polaris/PolarisDiscoveryProperties.java | 2 +-
.../cloud/common/constant/OrderConstant.java | 5 +
spring-cloud-tencent-coverage/pom.xml | 6 +-
spring-cloud-tencent-dependencies/pom.xml | 19 ++
.../discovery-callee-service/pom.xml | 8 +-
.../src/main/resources/bootstrap.yml | 2 +
.../discovery-caller-service/pom.xml | 5 +
.../caller/DiscoveryCallerController.java | 2 +-
.../src/main/resources/bootstrap.yml | 2 +
.../RpcEnhancementAutoConfiguration.java | 36 ----
.../plugin/PluginOrderConstant.java | 22 ---
.../assembly/AssemblyMetadataProvider.java | 56 ------
.../assembly/AssemblyRequestContext.java | 125 --------------
.../assembly/AssemblyResponseContext.java | 87 ----------
.../client/AssemblyClientExceptionHook.java | 82 ---------
.../client/AssemblyClientPostHook.java | 83 ---------
.../client/AssemblyClientPreHook.java | 73 --------
.../server/AssemblyServerExceptionHook.java | 76 --------
.../server/AssemblyServerPostHook.java | 75 --------
.../server/AssemblyServerPreHook.java | 70 --------
.../AssemblyClientExceptionHookTest.java | 146 ----------------
.../plugin/AssemblyClientPostHookTest.java | 146 ----------------
.../plugin/AssemblyClientPreHookTest.java | 143 ---------------
.../plugin/AssemblyMetadataProviderTest.java | 57 ------
.../plugin/AssemblyRequestContextTest.java | 83 ---------
.../plugin/AssemblyResponseContextTest.java | 101 -----------
.../AssemblyServerExceptionHookTest.java | 143 ---------------
.../plugin/AssemblyServerPostHookTest.java | 143 ---------------
.../plugin/AssemblyServerPreHookTest.java | 143 ---------------
56 files changed, 1332 insertions(+), 1907 deletions(-)
create mode 100644 spring-cloud-starter-tencent-polaris-contract/pom.xml
create mode 100644 spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/PolarisContractReporter.java
create mode 100644 spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/PolarisSwaggerApplicationListener.java
create mode 100644 spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/SwaggerContext.java
create mode 100644 spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/config/ContractProperties.java
create mode 100644 spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/config/ExtendedContractProperties.java
create mode 100644 spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/config/PolarisContractModifier.java
create mode 100644 spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/config/PolarisContractProperties.java
create mode 100644 spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/config/PolarisContractPropertiesAutoConfiguration.java
create mode 100644 spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/config/PolarisContractPropertiesBootstrapConfiguration.java
create mode 100644 spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/config/PolarisSwaggerAutoConfiguration.java
create mode 100644 spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/filter/ApiDocServletFilter.java
create mode 100644 spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/filter/ApiDocWebFluxFilter.java
create mode 100644 spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/filter/FilterConstant.java
create mode 100644 spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/utils/PackageUtil.java
create mode 100644 spring-cloud-starter-tencent-polaris-contract/src/main/java/org/springdoc/api/AbstractOpenApiResourceUtil.java
create mode 100644 spring-cloud-starter-tencent-polaris-contract/src/main/java/org/springdoc/webflux/api/OpenApiWebFluxUtil.java
create mode 100644 spring-cloud-starter-tencent-polaris-contract/src/main/java/org/springdoc/webmvc/api/OpenApiWebMvcUtil.java
create mode 100644 spring-cloud-starter-tencent-polaris-contract/src/main/resources/META-INF/additional-spring-configuration-metadata.json
create mode 100644 spring-cloud-starter-tencent-polaris-contract/src/main/resources/META-INF/spring.factories
create mode 100644 spring-cloud-starter-tencent-polaris-contract/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
delete mode 100644 spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/AssemblyMetadataProvider.java
delete mode 100644 spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/AssemblyRequestContext.java
delete mode 100644 spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/AssemblyResponseContext.java
delete mode 100644 spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/client/AssemblyClientExceptionHook.java
delete mode 100644 spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/client/AssemblyClientPostHook.java
delete mode 100644 spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/client/AssemblyClientPreHook.java
delete mode 100644 spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/server/AssemblyServerExceptionHook.java
delete mode 100644 spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/server/AssemblyServerPostHook.java
delete mode 100644 spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/server/AssemblyServerPreHook.java
delete mode 100644 spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyClientExceptionHookTest.java
delete mode 100644 spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyClientPostHookTest.java
delete mode 100644 spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyClientPreHookTest.java
delete mode 100644 spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyMetadataProviderTest.java
delete mode 100644 spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyRequestContextTest.java
delete mode 100644 spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyResponseContextTest.java
delete mode 100644 spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyServerExceptionHookTest.java
delete mode 100644 spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyServerPostHookTest.java
delete mode 100644 spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyServerPreHookTest.java
diff --git a/.licenserc.yaml b/.licenserc.yaml
index 32266c414..04f07307a 100644
--- a/.licenserc.yaml
+++ b/.licenserc.yaml
@@ -16,7 +16,7 @@ header:
CONDITIONS OF ANY KIND, either express or implied. See the License for the
specific language governing permissions and limitations under the License.
paths:
- - "**/java/**"
+ - "**/tencent/**"
language:
Java:
extensions:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b6c71a594..00916be01 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,4 +5,5 @@
- [Refactoring:remove invalid @AutoConfigureAfter and @AutoConfigureBefore from discovery client automatic configuration.](https://github.com/Tencent/spring-cloud-tencent/pull/1116)
- [fix:fix feign url bug when using sleuth.](https://github.com/Tencent/spring-cloud-tencent/pull/1120)
- [refactor:optimize the order and condition matching of service registration automatic configuration.](https://github.com/Tencent/spring-cloud-tencent/pull/1131)
+- [feat:support service contract reporting.](https://github.com/Tencent/spring-cloud-tencent/pull/1141)
- [feat: support log path configuration parameters,](https://github.com/Tencent/spring-cloud-tencent/pull/1142)
diff --git a/pom.xml b/pom.xml
index fd7b595ba..cd0597123 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,6 +47,7 @@
spring-cloud-starter-tencent-polaris-ratelimit
spring-cloud-starter-tencent-polaris-circuitbreaker
spring-cloud-starter-tencent-polaris-router
+ spring-cloud-starter-tencent-polaris-contract
spring-cloud-tencent-plugin-starters
spring-cloud-tencent-dependencies
spring-cloud-starter-tencent-all
diff --git a/spring-cloud-starter-tencent-all/pom.xml b/spring-cloud-starter-tencent-all/pom.xml
index 1c45b11d7..fc6470e9a 100644
--- a/spring-cloud-starter-tencent-all/pom.xml
+++ b/spring-cloud-starter-tencent-all/pom.xml
@@ -45,6 +45,11 @@
spring-cloud-starter-tencent-metadata-transfer
+
+ com.tencent.cloud
+ spring-cloud-starter-tencent-polaris-contract
+
+
org.springframework.cloud
@@ -88,12 +93,19 @@
true
-
-
- META-INF/spring/org.springframework.boot.actuate.autoconfigure.web.ManagementContextConfiguration.imports
+
+
+
+ META-INF/spring/org.springframework.boot.actuate.autoconfigure.web.ManagementContextConfiguration.imports
+
-
- META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
+
+
+ META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
+
diff --git a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/adapter/PolarisConfigFileLocator.java b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/adapter/PolarisConfigFileLocator.java
index 21f4f5a78..47e149873 100644
--- a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/adapter/PolarisConfigFileLocator.java
+++ b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/adapter/PolarisConfigFileLocator.java
@@ -101,7 +101,7 @@ public PropertySource> locate(Environment environment) {
private void initCustomPolarisConfigExtensionFiles(CompositePropertySource compositePropertySource) {
if (polarisConfigCustomExtensionLayer == null) {
- LOGGER.debug("[SCT Config] PolarisAdaptorTsfConfigExtensionLayer is not init, ignore the following execution steps");
+ LOGGER.debug("[SCT Config] PolarisConfigCustomExtensionLayer is not init, ignore the following execution steps");
return;
}
polarisConfigCustomExtensionLayer.initConfigFiles(environment, compositePropertySource, polarisPropertySourceManager, configFileService);
@@ -109,7 +109,7 @@ private void initCustomPolarisConfigExtensionFiles(CompositePropertySource compo
private void afterLocatePolarisConfigExtension(CompositePropertySource compositePropertySource) {
if (polarisConfigCustomExtensionLayer == null) {
- LOGGER.debug("[SCT Config] PolarisAdaptorTsfConfigExtensionLayer is not init, ignore the following execution steps");
+ LOGGER.debug("[SCT Config] PolarisConfigCustomExtensionLayer is not init, ignore the following execution steps");
return;
}
polarisConfigCustomExtensionLayer.executeAfterLocateConfigReturning(compositePropertySource);
diff --git a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/adapter/PolarisConfigPropertyAutoRefresher.java b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/adapter/PolarisConfigPropertyAutoRefresher.java
index bdd9e21e2..c698cb6db 100644
--- a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/adapter/PolarisConfigPropertyAutoRefresher.java
+++ b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/adapter/PolarisConfigPropertyAutoRefresher.java
@@ -89,7 +89,7 @@ private void registerPolarisConfigPublishEvent() {
private void customInitRegisterPolarisConfig(PolarisConfigPropertyAutoRefresher polarisConfigPropertyAutoRefresher) {
if (polarisConfigCustomExtensionLayer == null) {
- LOGGER.debug("[SCT Config] PolarisAdaptorTsfConfigExtensionLayer is not init, ignore the following execution steps");
+ LOGGER.debug("[SCT Config] PolarisConfigCustomExtensionLayer is not init, ignore the following execution steps");
return;
}
polarisConfigCustomExtensionLayer.initRegisterConfig(polarisConfigPropertyAutoRefresher);
@@ -139,7 +139,7 @@ public void registerPolarisConfigPublishChangeListener(PolarisPropertySource pol
private void customRegisterPolarisConfigPublishChangeListener(PolarisPropertySource polarisPropertySource) {
if (polarisConfigCustomExtensionLayer == null) {
- LOGGER.debug("[SCT Config] PolarisAdaptorTsfConfigExtensionLayer is not init, ignore the following execution steps");
+ LOGGER.debug("[SCT Config] PolarisConfigCustomExtensionLayer is not init, ignore the following execution steps");
return;
}
polarisConfigCustomExtensionLayer.executeRegisterPublishChangeListener(polarisPropertySource);
diff --git a/spring-cloud-starter-tencent-polaris-contract/pom.xml b/spring-cloud-starter-tencent-polaris-contract/pom.xml
new file mode 100644
index 000000000..316caaf5e
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-contract/pom.xml
@@ -0,0 +1,54 @@
+
+
+
+ spring-cloud-tencent
+ com.tencent.cloud
+ ${revision}
+ ../pom.xml
+
+ 4.0.0
+
+ spring-cloud-starter-tencent-polaris-contract
+ Spring Cloud Starter Tencent Polaris Contract
+
+
+
+
+ com.tencent.cloud
+ spring-cloud-starter-tencent-polaris-discovery
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-webflux
+ true
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+ true
+
+
+
+
+ org.springdoc
+ springdoc-openapi-starter-webmvc-ui
+
+
+
+ org.springdoc
+ springdoc-openapi-starter-webflux-ui
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
diff --git a/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/PolarisContractReporter.java b/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/PolarisContractReporter.java
new file mode 100644
index 000000000..8d4da4995
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/PolarisContractReporter.java
@@ -0,0 +1,163 @@
+/*
+ * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ *
+ * Licensed under the BSD 3-Clause License (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://opensource.org/licenses/BSD-3-Clause
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed
+ * under the License is distributed on an "AS IS" BASIS, WITHOUT 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 com.tencent.cloud.polaris.contract;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.tencent.cloud.common.util.JacksonUtils;
+import com.tencent.cloud.polaris.PolarisDiscoveryProperties;
+import com.tencent.polaris.api.core.ProviderAPI;
+import com.tencent.polaris.api.plugin.server.InterfaceDescriptor;
+import com.tencent.polaris.api.plugin.server.ReportServiceContractRequest;
+import com.tencent.polaris.api.plugin.server.ReportServiceContractResponse;
+import io.swagger.v3.oas.models.OpenAPI;
+import io.swagger.v3.oas.models.Operation;
+import io.swagger.v3.oas.models.PathItem;
+import io.swagger.v3.oas.models.Paths;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springdoc.api.AbstractOpenApiResource;
+import org.springdoc.api.AbstractOpenApiResourceUtil;
+import org.springdoc.webflux.api.OpenApiWebFluxUtil;
+import org.springdoc.webmvc.api.OpenApiWebMvcUtil;
+
+import org.springframework.boot.context.event.ApplicationReadyEvent;
+import org.springframework.context.ApplicationListener;
+import org.springframework.lang.NonNull;
+import org.springframework.util.CollectionUtils;
+
+/**
+ * Polaris contract reporter.
+ *
+ * @author Haotian Zhang
+ */
+public class PolarisContractReporter implements ApplicationListener {
+
+ private final Logger LOG = LoggerFactory.getLogger(PolarisContractReporter.class);
+
+ private final org.springdoc.webmvc.api.MultipleOpenApiResource multipleOpenApiWebMvcResource;
+ private final org.springdoc.webflux.api.MultipleOpenApiResource multipleOpenApiWebFluxResource;
+ private final String groupName;
+
+ private final ProviderAPI providerAPI;
+
+ private final PolarisDiscoveryProperties polarisDiscoveryProperties;
+
+ public PolarisContractReporter(org.springdoc.webmvc.api.MultipleOpenApiResource multipleOpenApiWebMvcResource,
+ org.springdoc.webflux.api.MultipleOpenApiResource multipleOpenApiWebFluxResource,
+ String groupName, ProviderAPI providerAPI,
+ PolarisDiscoveryProperties polarisDiscoveryProperties) {
+ this.multipleOpenApiWebMvcResource = multipleOpenApiWebMvcResource;
+ this.multipleOpenApiWebFluxResource = multipleOpenApiWebFluxResource;
+ this.groupName = groupName;
+ this.providerAPI = providerAPI;
+ this.polarisDiscoveryProperties = polarisDiscoveryProperties;
+ }
+
+ @Override
+ public void onApplicationEvent(@NonNull ApplicationReadyEvent applicationReadyEvent) {
+ try {
+ AbstractOpenApiResource openApiResource = null;
+ if (multipleOpenApiWebMvcResource != null) {
+ openApiResource = OpenApiWebMvcUtil.getOpenApiResourceOrThrow(multipleOpenApiWebMvcResource, groupName);
+ }
+ else if (multipleOpenApiWebFluxResource != null) {
+ openApiResource = OpenApiWebFluxUtil.getOpenApiResourceOrThrow(multipleOpenApiWebFluxResource, groupName);
+ }
+ OpenAPI openAPI = null;
+ if (openApiResource != null) {
+ openAPI = AbstractOpenApiResourceUtil.getOpenApi(openApiResource);
+ }
+ if (openAPI != null) {
+ ReportServiceContractRequest request = new ReportServiceContractRequest();
+ request.setName(polarisDiscoveryProperties.getService());
+ request.setNamespace(polarisDiscoveryProperties.getNamespace());
+ request.setService(polarisDiscoveryProperties.getService());
+ request.setProtocol("http");
+ request.setVersion(polarisDiscoveryProperties.getVersion());
+ List interfaceDescriptorList = getInterfaceDescriptorFromSwagger(openAPI);
+ request.setInterfaceDescriptors(interfaceDescriptorList);
+ ReportServiceContractResponse response = providerAPI.reportServiceContract(request);
+ LOG.info("Service contract [Namespace: {}. Name: {}. Service: {}. Protocol:{}. Version: {}. API counter: {}] is reported.",
+ request.getNamespace(), request.getName(), request.getService(), request.getProtocol(),
+ request.getVersion(), request.getInterfaceDescriptors().size());
+ if (LOG.isDebugEnabled()) {
+ String jsonValue = JacksonUtils.serialize2Json(openAPI);
+ LOG.debug("OpenApi json data: {}", jsonValue);
+ }
+ }
+ else {
+ LOG.warn("OpenAPI or json is null, group:{}", groupName);
+ }
+ }
+ catch (Throwable t) {
+ LOG.error("Report contract failed.", t);
+ }
+ }
+
+ private List getInterfaceDescriptorFromSwagger(OpenAPI openAPI) {
+ List interfaceDescriptorList = new ArrayList<>();
+ Paths paths = openAPI.getPaths();
+ for (Map.Entry p : paths.entrySet()) {
+ PathItem path = p.getValue();
+ Map operationMap = getOperationMapFromPath(path);
+ if (CollectionUtils.isEmpty(operationMap)) {
+ continue;
+ }
+ for (Map.Entry o : operationMap.entrySet()) {
+ InterfaceDescriptor interfaceDescriptor = new InterfaceDescriptor();
+ interfaceDescriptor.setPath(p.getKey());
+ interfaceDescriptor.setMethod(o.getKey());
+ interfaceDescriptor.setContent(JacksonUtils.serialize2Json(p.getValue()));
+ interfaceDescriptorList.add(interfaceDescriptor);
+ }
+ }
+ return interfaceDescriptorList;
+ }
+
+ private Map getOperationMapFromPath(PathItem path) {
+ Map operationMap = new HashMap<>();
+
+ if (path.getGet() != null) {
+ operationMap.put(PathItem.HttpMethod.GET.name(), path.getGet());
+ }
+ if (path.getPut() != null) {
+ operationMap.put(PathItem.HttpMethod.PUT.name(), path.getPut());
+ }
+ if (path.getPost() != null) {
+ operationMap.put(PathItem.HttpMethod.POST.name(), path.getPost());
+ }
+ if (path.getHead() != null) {
+ operationMap.put(PathItem.HttpMethod.HEAD.name(), path.getHead());
+ }
+ if (path.getDelete() != null) {
+ operationMap.put(PathItem.HttpMethod.DELETE.name(), path.getDelete());
+ }
+ if (path.getPatch() != null) {
+ operationMap.put(PathItem.HttpMethod.PATCH.name(), path.getPatch());
+ }
+ if (path.getOptions() != null) {
+ operationMap.put(PathItem.HttpMethod.OPTIONS.name(), path.getOptions());
+ }
+
+ return operationMap;
+ }
+}
diff --git a/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/PolarisSwaggerApplicationListener.java b/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/PolarisSwaggerApplicationListener.java
new file mode 100644
index 000000000..76d4259f0
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/PolarisSwaggerApplicationListener.java
@@ -0,0 +1,35 @@
+/*
+ * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ *
+ * Licensed under the BSD 3-Clause License (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://opensource.org/licenses/BSD-3-Clause
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed
+ * under the License is distributed on an "AS IS" BASIS, WITHOUT 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 com.tencent.cloud.polaris.contract;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;
+import org.springframework.context.ApplicationListener;
+
+public class PolarisSwaggerApplicationListener implements ApplicationListener {
+
+ @Override
+ public void onApplicationEvent(ApplicationEnvironmentPreparedEvent startingEvent) {
+ SpringApplication application = startingEvent.getSpringApplication();
+ Class> mainClass = application.getMainApplicationClass();
+ if (mainClass == null) {
+ return;
+ }
+ SwaggerContext.setAttribute(String.format("$%s", "MainClass"), mainClass);
+ }
+}
diff --git a/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/SwaggerContext.java b/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/SwaggerContext.java
new file mode 100644
index 000000000..b4f247944
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/SwaggerContext.java
@@ -0,0 +1,36 @@
+/*
+ * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ *
+ * Licensed under the BSD 3-Clause License (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://opensource.org/licenses/BSD-3-Clause
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed
+ * under the License is distributed on an "AS IS" BASIS, WITHOUT 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 com.tencent.cloud.polaris.contract;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+public final class SwaggerContext {
+ private static final ConcurrentHashMap attribute = new ConcurrentHashMap<>();
+
+ private SwaggerContext() {
+
+ }
+
+ public static void setAttribute(String key, Object value) {
+ attribute.put(key, value);
+ }
+
+ public static Object getAttribute(String key) {
+ return attribute.get(key);
+ }
+}
diff --git a/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/config/ContractProperties.java b/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/config/ContractProperties.java
new file mode 100644
index 000000000..3e915f5d4
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/config/ContractProperties.java
@@ -0,0 +1,50 @@
+/*
+ * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ *
+ * Licensed under the BSD 3-Clause License (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://opensource.org/licenses/BSD-3-Clause
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed
+ * under the License is distributed on an "AS IS" BASIS, WITHOUT 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 com.tencent.cloud.polaris.contract.config;
+
+/**
+ * Interface for contract properties.
+ *
+ * @author Haotian Zhang
+ */
+public interface ContractProperties {
+
+ boolean isEnabled();
+
+ void setEnabled(boolean enabled);
+
+ String getBasePackage();
+
+ void setBasePackage(String basePackage);
+
+ String getExcludePath();
+
+ void setExcludePath(String excludePath);
+
+ String getGroup();
+
+ void setGroup(String group);
+
+ String getBasePath();
+
+ void setBasePath(String basePath);
+
+ boolean isExposure();
+
+ void setExposure(boolean exposure);
+}
diff --git a/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/config/ExtendedContractProperties.java b/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/config/ExtendedContractProperties.java
new file mode 100644
index 000000000..22830fa81
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/config/ExtendedContractProperties.java
@@ -0,0 +1,26 @@
+/*
+ * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ *
+ * Licensed under the BSD 3-Clause License (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://opensource.org/licenses/BSD-3-Clause
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed
+ * under the License is distributed on an "AS IS" BASIS, WITHOUT 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 com.tencent.cloud.polaris.contract.config;
+
+/**
+ * Extend contract properties.
+ *
+ * @author Haotian Zhang
+ */
+public interface ExtendedContractProperties extends ContractProperties {
+}
diff --git a/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/config/PolarisContractModifier.java b/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/config/PolarisContractModifier.java
new file mode 100644
index 000000000..f48a01d24
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/config/PolarisContractModifier.java
@@ -0,0 +1,52 @@
+/*
+ * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ *
+ * Licensed under the BSD 3-Clause License (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://opensource.org/licenses/BSD-3-Clause
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed
+ * under the License is distributed on an "AS IS" BASIS, WITHOUT 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 com.tencent.cloud.polaris.contract.config;
+
+import java.util.List;
+
+import com.tencent.cloud.common.constant.OrderConstant;
+import com.tencent.cloud.polaris.context.PolarisConfigModifier;
+import com.tencent.polaris.factory.config.ConfigurationImpl;
+import com.tencent.polaris.factory.config.provider.RegisterConfigImpl;
+
+/**
+ * Modifier of service contract.
+ *
+ * @author Haotian Zhang
+ */
+public class PolarisContractModifier implements PolarisConfigModifier {
+
+ private final PolarisContractProperties polarisContractProperties;
+
+ public PolarisContractModifier(PolarisContractProperties polarisContractProperties) {
+ this.polarisContractProperties = polarisContractProperties;
+ }
+
+ @Override
+ public void modify(ConfigurationImpl configuration) {
+ List registerConfigs = configuration.getProvider().getRegisters();
+ for (RegisterConfigImpl registerConfig : registerConfigs) {
+ registerConfig.setReportServiceContractEnable(polarisContractProperties.isEnabled());
+ }
+ }
+
+ @Override
+ public int getOrder() {
+ return OrderConstant.Modifier.SERVICE_CONTRACT_ORDER;
+ }
+}
diff --git a/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/config/PolarisContractProperties.java b/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/config/PolarisContractProperties.java
new file mode 100644
index 000000000..68681ae36
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/config/PolarisContractProperties.java
@@ -0,0 +1,137 @@
+/*
+ * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ *
+ * Licensed under the BSD 3-Clause License (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://opensource.org/licenses/BSD-3-Clause
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed
+ * under the License is distributed on an "AS IS" BASIS, WITHOUT 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 com.tencent.cloud.polaris.contract.config;
+
+import java.util.Objects;
+
+import javax.annotation.Nullable;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * Properties for Polaris contract.
+ *
+ * @author Haotian Zhang
+ */
+@ConfigurationProperties("spring.cloud.polaris.contract")
+public class PolarisContractProperties implements ContractProperties {
+
+ private final ExtendedContractProperties extendContractProperties;
+
+ private boolean enabled = true;
+ /**
+ * Packages to be scanned. Split by ",".
+ */
+ private String basePackage;
+ /**
+ * Paths to be excluded. Split by ",".
+ */
+ private String excludePath;
+ /**
+ * Group to create swagger docket.
+ */
+ private String group = "default";
+ /**
+ * Base paths to be scanned. Split by ",".
+ */
+ private String basePath = "/**";
+
+ private boolean exposure = true;
+
+ public PolarisContractProperties(@Nullable ExtendedContractProperties extendContractProperties) {
+ this.extendContractProperties = extendContractProperties;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ if (Objects.nonNull(extendContractProperties)) {
+ return extendContractProperties.isEnabled();
+ }
+ return enabled;
+ }
+
+ @Override
+ public void setEnabled(boolean enabled) {
+ this.enabled = enabled;
+ }
+
+ @Override
+ public String getBasePackage() {
+ if (Objects.nonNull(extendContractProperties)) {
+ return extendContractProperties.getBasePackage();
+ }
+ return basePackage;
+ }
+
+ @Override
+ public void setBasePackage(String basePackage) {
+ this.basePackage = basePackage;
+ }
+
+ @Override
+ public String getExcludePath() {
+ if (Objects.nonNull(extendContractProperties)) {
+ return extendContractProperties.getExcludePath();
+ }
+ return excludePath;
+ }
+
+ @Override
+ public void setExcludePath(String excludePath) {
+ this.excludePath = excludePath;
+ }
+
+ @Override
+ public String getGroup() {
+ if (Objects.nonNull(extendContractProperties)) {
+ return extendContractProperties.getGroup();
+ }
+ return group;
+ }
+
+ @Override
+ public void setGroup(String group) {
+ this.group = group;
+ }
+
+ @Override
+ public String getBasePath() {
+ if (Objects.nonNull(extendContractProperties)) {
+ return extendContractProperties.getBasePath();
+ }
+ return basePath;
+ }
+
+ @Override
+ public void setBasePath(String basePath) {
+ this.basePath = basePath;
+ }
+
+ @Override
+ public boolean isExposure() {
+ if (Objects.nonNull(extendContractProperties)) {
+ return extendContractProperties.isExposure();
+ }
+ return exposure;
+ }
+
+ @Override
+ public void setExposure(boolean exposure) {
+ this.exposure = exposure;
+ }
+}
diff --git a/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/config/PolarisContractPropertiesAutoConfiguration.java b/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/config/PolarisContractPropertiesAutoConfiguration.java
new file mode 100644
index 000000000..a4d749cb2
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/config/PolarisContractPropertiesAutoConfiguration.java
@@ -0,0 +1,47 @@
+/*
+ * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ *
+ * Licensed under the BSD 3-Clause License (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://opensource.org/licenses/BSD-3-Clause
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed
+ * under the License is distributed on an "AS IS" BASIS, WITHOUT 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 com.tencent.cloud.polaris.contract.config;
+
+import com.tencent.cloud.polaris.context.ConditionalOnPolarisEnabled;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.lang.Nullable;
+
+/**
+ * Auto configuration for Polaris contract properties.
+ *
+ * @author Haotian Zhang
+ */
+@Configuration(proxyBeanMethods = false)
+@ConditionalOnPolarisEnabled
+public class PolarisContractPropertiesAutoConfiguration {
+
+ @Bean
+ @ConditionalOnMissingBean
+ public PolarisContractProperties polarisContractProperties(@Nullable ExtendedContractProperties extendedContractProperties) {
+ return new PolarisContractProperties(extendedContractProperties);
+ }
+
+ @Bean
+ @ConditionalOnMissingBean
+ public PolarisContractModifier polarisContractModifier(PolarisContractProperties polarisContractProperties) {
+ return new PolarisContractModifier(polarisContractProperties);
+ }
+}
diff --git a/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/config/PolarisContractPropertiesBootstrapConfiguration.java b/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/config/PolarisContractPropertiesBootstrapConfiguration.java
new file mode 100644
index 000000000..ceb2d102e
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/config/PolarisContractPropertiesBootstrapConfiguration.java
@@ -0,0 +1,34 @@
+/*
+ * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ *
+ * Licensed under the BSD 3-Clause License (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://opensource.org/licenses/BSD-3-Clause
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed
+ * under the License is distributed on an "AS IS" BASIS, WITHOUT 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 com.tencent.cloud.polaris.contract.config;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+
+/**
+ * Bootstrap configuration for Polaris contract properties.
+ *
+ * @author Haotian Zhang
+ */
+@Configuration(proxyBeanMethods = false)
+@ConditionalOnProperty("spring.cloud.polaris.enabled")
+@Import(PolarisContractPropertiesAutoConfiguration.class)
+public class PolarisContractPropertiesBootstrapConfiguration {
+
+}
diff --git a/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/config/PolarisSwaggerAutoConfiguration.java b/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/config/PolarisSwaggerAutoConfiguration.java
new file mode 100644
index 000000000..c9c05b8fd
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/config/PolarisSwaggerAutoConfiguration.java
@@ -0,0 +1,136 @@
+/*
+ * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ *
+ * Licensed under the BSD 3-Clause License (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://opensource.org/licenses/BSD-3-Clause
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed
+ * under the License is distributed on an "AS IS" BASIS, WITHOUT 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 com.tencent.cloud.polaris.contract.config;
+
+import com.tencent.cloud.polaris.PolarisDiscoveryProperties;
+import com.tencent.cloud.polaris.context.ConditionalOnPolarisEnabled;
+import com.tencent.cloud.polaris.context.PolarisSDKContextManager;
+import com.tencent.cloud.polaris.contract.PolarisContractReporter;
+import com.tencent.cloud.polaris.contract.PolarisSwaggerApplicationListener;
+import com.tencent.cloud.polaris.contract.filter.ApiDocServletFilter;
+import com.tencent.cloud.polaris.contract.filter.ApiDocWebFluxFilter;
+import com.tencent.cloud.polaris.contract.utils.PackageUtil;
+import io.swagger.v3.oas.models.OpenAPI;
+import io.swagger.v3.oas.models.info.Info;
+import io.swagger.v3.oas.models.info.License;
+import org.springdoc.core.configuration.SpringDocConfiguration;
+import org.springdoc.core.models.GroupedOpenApi;
+import org.springdoc.webflux.api.MultipleOpenApiWebFluxResource;
+import org.springdoc.webmvc.api.MultipleOpenApiWebMvcResource;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+import org.springframework.lang.Nullable;
+import org.springframework.util.StringUtils;
+
+import static com.tencent.cloud.polaris.contract.utils.PackageUtil.SPLITTER;
+
+/**
+ * Auto configuration for Polaris swagger.
+ *
+ * @author Haotian Zhang
+ */
+@Configuration(proxyBeanMethods = false)
+@ConditionalOnPolarisEnabled
+@ConditionalOnProperty(name = "spring.cloud.polaris.contract.enabled", havingValue = "true", matchIfMissing = true)
+@Import(SpringDocConfiguration.class)
+public class PolarisSwaggerAutoConfiguration {
+
+ static {
+ // After springboot2.6.x, the default path matching strategy of spring MVC is changed from ANT_PATH_MATCHER
+ // mode to PATH_PATTERN_PARSER mode, causing an error. The solution is to switch to the original ANT_PATH_MATCHER mode.
+ System.setProperty("spring.mvc.pathmatch.matching-strategy", "ant-path-matcher");
+ }
+
+ @Bean
+ public GroupedOpenApi polarisGroupedOpenApi(PolarisContractProperties polarisContractProperties) {
+ String basePackage = PackageUtil.scanPackage(polarisContractProperties.getBasePackage());
+ String[] basePaths = {};
+ if (StringUtils.hasText(polarisContractProperties.getBasePath())) {
+ basePaths = polarisContractProperties.getBasePath().split(SPLITTER);
+ }
+ String[] excludePaths = {};
+ if (StringUtils.hasText(polarisContractProperties.getExcludePath())) {
+ excludePaths = polarisContractProperties.getExcludePath().split(SPLITTER);
+ }
+ return GroupedOpenApi.builder()
+ .packagesToScan(basePackage)
+ .pathsToMatch(basePaths)
+ .pathsToExclude(excludePaths)
+ .group(polarisContractProperties.getGroup())
+ .build();
+ }
+
+ @Bean
+ public OpenAPI polarisOpenAPI() {
+ return new OpenAPI()
+ .info(new Info()
+ .title("Polaris Swagger API")
+ .description("This is to show polaris api description.")
+ .license(new License().name("BSD-3-Clause").url("https://opensource.org/licenses/BSD-3-Clause"))
+ .version("1.0.0"));
+ }
+
+ @Bean
+ @ConditionalOnBean(OpenAPI.class)
+ @ConditionalOnMissingBean
+ public PolarisContractReporter polarisContractReporter(
+ @Nullable MultipleOpenApiWebMvcResource multipleOpenApiWebMvcResource,
+ @Nullable MultipleOpenApiWebFluxResource multipleOpenApiWebFluxResource,
+ PolarisContractProperties polarisContractProperties, PolarisSDKContextManager polarisSDKContextManager,
+ PolarisDiscoveryProperties polarisDiscoveryProperties) {
+ return new PolarisContractReporter(multipleOpenApiWebMvcResource, multipleOpenApiWebFluxResource,
+ polarisContractProperties.getGroup(), polarisSDKContextManager.getProviderAPI(), polarisDiscoveryProperties);
+ }
+
+ @Bean
+ @ConditionalOnMissingBean
+ public PolarisSwaggerApplicationListener polarisSwaggerApplicationListener() {
+ return new PolarisSwaggerApplicationListener();
+ }
+
+ /**
+ * Create when web application type is SERVLET.
+ */
+ @Configuration(proxyBeanMethods = false)
+ @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
+ protected static class SwaggerServletConfig {
+ @Bean
+ public ApiDocServletFilter apiDocServletFilter(PolarisContractProperties polarisContractProperties) {
+ return new ApiDocServletFilter(polarisContractProperties);
+ }
+ }
+
+ /**
+ * Create when web application type is REACTIVE.
+ */
+ @Configuration(proxyBeanMethods = false)
+ @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)
+ protected static class SwaggerReactiveConfig {
+
+ @Bean
+ public ApiDocWebFluxFilter apiDocWebFluxFilter(PolarisContractProperties polarisContractProperties) {
+ return new ApiDocWebFluxFilter(polarisContractProperties);
+ }
+ }
+}
diff --git a/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/filter/ApiDocServletFilter.java b/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/filter/ApiDocServletFilter.java
new file mode 100644
index 000000000..920c1efe1
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/filter/ApiDocServletFilter.java
@@ -0,0 +1,72 @@
+/*
+ * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ *
+ * Licensed under the BSD 3-Clause License (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://opensource.org/licenses/BSD-3-Clause
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed
+ * under the License is distributed on an "AS IS" BASIS, WITHOUT 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 com.tencent.cloud.polaris.contract.filter;
+
+import java.io.IOException;
+
+import com.tencent.cloud.polaris.contract.config.PolarisContractProperties;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+
+import org.springframework.lang.NonNull;
+import org.springframework.web.filter.OncePerRequestFilter;
+
+import static com.tencent.cloud.polaris.contract.filter.FilterConstant.SWAGGER_RESOURCE_PREFIX;
+import static com.tencent.cloud.polaris.contract.filter.FilterConstant.SWAGGER_UI_V2_URL;
+import static com.tencent.cloud.polaris.contract.filter.FilterConstant.SWAGGER_UI_V3_URL;
+import static com.tencent.cloud.polaris.contract.filter.FilterConstant.SWAGGER_V2_API_DOC_URL;
+import static com.tencent.cloud.polaris.contract.filter.FilterConstant.SWAGGER_V3_API_DOC_URL;
+import static com.tencent.cloud.polaris.contract.filter.FilterConstant.SWAGGER_WEBJARS_V2_PREFIX;
+import static com.tencent.cloud.polaris.contract.filter.FilterConstant.SWAGGER_WEBJARS_V3_PREFIX;
+
+/**
+ * Filter to disable api doc controller.
+ *
+ * @author Haotian Zhang
+ */
+public class ApiDocServletFilter extends OncePerRequestFilter {
+
+ private final PolarisContractProperties polarisContractProperties;
+
+ public ApiDocServletFilter(PolarisContractProperties polarisContractProperties) {
+ this.polarisContractProperties = polarisContractProperties;
+ }
+
+ @Override
+ public void doFilterInternal(@NonNull HttpServletRequest httpServletRequest,
+ @NonNull HttpServletResponse httpServletResponse, @NonNull FilterChain filterChain)
+ throws ServletException, IOException {
+ if (!polarisContractProperties.isExposure()) {
+ String path = httpServletRequest.getServletPath();
+ if (path.startsWith(SWAGGER_V2_API_DOC_URL) ||
+ path.startsWith(SWAGGER_V3_API_DOC_URL) ||
+ path.startsWith(SWAGGER_UI_V2_URL) ||
+ path.startsWith(SWAGGER_UI_V3_URL) ||
+ path.startsWith(SWAGGER_RESOURCE_PREFIX) ||
+ path.startsWith(SWAGGER_WEBJARS_V2_PREFIX) ||
+ path.startsWith(SWAGGER_WEBJARS_V3_PREFIX)) {
+ httpServletResponse.setStatus(HttpServletResponse.SC_FORBIDDEN);
+ return;
+ }
+ }
+ filterChain.doFilter(httpServletRequest, httpServletResponse);
+ }
+}
+
diff --git a/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/filter/ApiDocWebFluxFilter.java b/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/filter/ApiDocWebFluxFilter.java
new file mode 100644
index 000000000..ac9c23d8a
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/filter/ApiDocWebFluxFilter.java
@@ -0,0 +1,72 @@
+/*
+ * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ *
+ * Licensed under the BSD 3-Clause License (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://opensource.org/licenses/BSD-3-Clause
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed
+ * under the License is distributed on an "AS IS" BASIS, WITHOUT 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 com.tencent.cloud.polaris.contract.filter;
+
+import com.tencent.cloud.polaris.contract.config.PolarisContractProperties;
+import reactor.core.publisher.Mono;
+
+import org.springframework.core.io.buffer.DataBuffer;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.server.reactive.ServerHttpResponse;
+import org.springframework.lang.NonNull;
+import org.springframework.web.server.ServerWebExchange;
+import org.springframework.web.server.WebFilter;
+import org.springframework.web.server.WebFilterChain;
+
+import static com.tencent.cloud.polaris.contract.filter.FilterConstant.SWAGGER_RESOURCE_PREFIX;
+import static com.tencent.cloud.polaris.contract.filter.FilterConstant.SWAGGER_UI_V2_URL;
+import static com.tencent.cloud.polaris.contract.filter.FilterConstant.SWAGGER_UI_V3_URL;
+import static com.tencent.cloud.polaris.contract.filter.FilterConstant.SWAGGER_V2_API_DOC_URL;
+import static com.tencent.cloud.polaris.contract.filter.FilterConstant.SWAGGER_V3_API_DOC_URL;
+import static com.tencent.cloud.polaris.contract.filter.FilterConstant.SWAGGER_WEBJARS_V2_PREFIX;
+import static com.tencent.cloud.polaris.contract.filter.FilterConstant.SWAGGER_WEBJARS_V3_PREFIX;
+
+/**
+ * Filter to disable api doc controller.
+ *
+ * @author Haotian Zhang
+ */
+public class ApiDocWebFluxFilter implements WebFilter {
+
+ private final PolarisContractProperties polarisContractProperties;
+
+ public ApiDocWebFluxFilter(PolarisContractProperties polarisContractProperties) {
+ this.polarisContractProperties = polarisContractProperties;
+ }
+
+ @Override
+ public Mono filter(ServerWebExchange serverWebExchange, @NonNull WebFilterChain webFilterChain) {
+ if (!polarisContractProperties.isExposure()) {
+ String path = serverWebExchange.getRequest().getURI().getPath();
+ if (path.startsWith(SWAGGER_V2_API_DOC_URL) ||
+ path.startsWith(SWAGGER_V3_API_DOC_URL) ||
+ path.startsWith(SWAGGER_UI_V2_URL) ||
+ path.startsWith(SWAGGER_UI_V3_URL) ||
+ path.startsWith(SWAGGER_RESOURCE_PREFIX) ||
+ path.startsWith(SWAGGER_WEBJARS_V2_PREFIX) ||
+ path.startsWith(SWAGGER_WEBJARS_V3_PREFIX)) {
+ ServerHttpResponse response = serverWebExchange.getResponse();
+ response.setRawStatusCode(HttpStatus.FORBIDDEN.value());
+ DataBuffer dataBuffer = response.bufferFactory().allocateBuffer();
+ return response.writeWith(Mono.just(dataBuffer));
+ }
+ }
+ return webFilterChain.filter(serverWebExchange);
+ }
+}
+
diff --git a/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/filter/FilterConstant.java b/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/filter/FilterConstant.java
new file mode 100644
index 000000000..d95ae14fa
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/filter/FilterConstant.java
@@ -0,0 +1,64 @@
+/*
+ * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ *
+ * Licensed under the BSD 3-Clause License (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://opensource.org/licenses/BSD-3-Clause
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed
+ * under the License is distributed on an "AS IS" BASIS, WITHOUT 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 com.tencent.cloud.polaris.contract.filter;
+
+/**
+ * Constant for filter.
+ *
+ * @author Haotian Zhang
+ */
+public final class FilterConstant {
+
+ /**
+ * Swagger api doc V2 url.
+ */
+ public static final String SWAGGER_V2_API_DOC_URL = "/v2/api-docs";
+
+ /**
+ * Swagger api doc V3 url.
+ */
+ public static final String SWAGGER_V3_API_DOC_URL = "/v3/api-docs";
+
+ /**
+ * Swagger UI V2 url.
+ */
+ public static final String SWAGGER_UI_V2_URL = "/swagger-ui.html";
+
+ /**
+ * Swagger UI V3 url.
+ */
+ public static final String SWAGGER_UI_V3_URL = "/swagger-ui/index.html";
+
+ /**
+ * Swagger resource url prefix.
+ */
+ public static final String SWAGGER_RESOURCE_PREFIX = "/swagger-resource/";
+
+ /**
+ * Swagger webjars V2 url prefix.
+ */
+ public static final String SWAGGER_WEBJARS_V2_PREFIX = "/webjars/springfox-swagger-ui/";
+
+ /**
+ * Swagger webjars V3 url prefix.
+ */
+ public static final String SWAGGER_WEBJARS_V3_PREFIX = "/webjars/swagger-ui/";
+
+ private FilterConstant() {
+ }
+}
diff --git a/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/utils/PackageUtil.java b/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/utils/PackageUtil.java
new file mode 100644
index 000000000..1afcb709d
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/utils/PackageUtil.java
@@ -0,0 +1,132 @@
+/*
+ * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ *
+ * Licensed under the BSD 3-Clause License (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://opensource.org/licenses/BSD-3-Clause
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed
+ * under the License is distributed on an "AS IS" BASIS, WITHOUT 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 com.tencent.cloud.polaris.contract.utils;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+import com.tencent.cloud.polaris.contract.SwaggerContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.util.StringUtils;
+
+/**
+ * Util for package processing.
+ *
+ * @author Haotian Zhang
+ */
+public final class PackageUtil {
+
+ /**
+ * splitter for property.
+ */
+ public static final String SPLITTER = ",";
+ private static final Logger LOG = LoggerFactory.getLogger(PackageUtil.class);
+
+ private PackageUtil() {
+ }
+
+ public static String scanPackage(String configBasePackage) {
+ String validScanPackage;
+ // Externally configured scan package
+ Set configPackageSet = new HashSet<>();
+ if (!StringUtils.isEmpty(configBasePackage)) {
+ configPackageSet.addAll(Arrays.asList(configBasePackage.split(SPLITTER)));
+ }
+ Object mainClz = SwaggerContext.getAttribute(String.format("$%s", "MainClass"));
+ // Verification of the valid path of MainClass
+ if (mainClz != null) {
+ Set autoDetectPackageSet = parseDefaultScanPackage((Class>) mainClz);
+ if (LOG.isInfoEnabled() && !autoDetectPackageSet.isEmpty()) {
+ LOG.info("Auto detect default swagger scan packages: {}",
+ String.join(SPLITTER, autoDetectPackageSet).trim());
+ }
+ Set validScanPackageSet = merge(configPackageSet, autoDetectPackageSet);
+ validScanPackage = String.join(SPLITTER, validScanPackageSet).trim();
+ if (LOG.isInfoEnabled() && !StringUtils.isEmpty(validScanPackage)) {
+ LOG.info("Swagger scan valid packages: {}", validScanPackage);
+ }
+ }
+ else {
+ // If there is no MainClass, the configured path is used for scanning
+ validScanPackage = String.join(SPLITTER, configPackageSet);
+ if (LOG.isWarnEnabled()) {
+ LOG.warn("Cannot detect main class, swagger scanning packages is set to: {}",
+ validScanPackage);
+ }
+ }
+ return validScanPackage;
+ }
+
+ public static Set merge(Set configPackageSet, Set autoDetectPackageSet) {
+ if (configPackageSet == null || configPackageSet.size() == 0) {
+ return autoDetectPackageSet;
+ }
+ return configPackageSet;
+ }
+
+
+ public static Set parseDefaultScanPackage(Class> mainClass) {
+ Set packageSets = new HashSet<>();
+ String defaultPackage = mainClass.getPackage().getName();
+ try {
+ boolean springBootEnv = true;
+ try {
+ Class.forName("org.springframework.boot.autoconfigure.SpringBootApplication");
+ }
+ catch (Throwable t) {
+ LOG.info("Can not load annotation @SpringBootApplication, " +
+ "current environment is not in spring boot framework. ");
+ springBootEnv = false;
+ }
+ if (!springBootEnv) {
+ packageSets.add(defaultPackage);
+ return packageSets;
+ }
+ SpringBootApplication bootAnnotation = mainClass.getAnnotation(SpringBootApplication.class);
+ Class>[] baseClassPackages;
+ String[] basePackages;
+ if (bootAnnotation == null) {
+ packageSets.add(defaultPackage);
+ }
+ else {
+ // baseClassPackages annotation
+ baseClassPackages = bootAnnotation.scanBasePackageClasses();
+ for (Class> clz : baseClassPackages) {
+ packageSets.add(clz.getPackage().getName());
+ }
+ // basePackage annotation
+ basePackages = bootAnnotation.scanBasePackages();
+ packageSets.addAll(Arrays.asList(basePackages));
+ // When basePackage and baseClassPackages are both empty, the package path where the MainClass class is located is used by default.
+ if (packageSets.isEmpty()) {
+ packageSets.add(defaultPackage);
+ }
+ }
+ }
+ catch (Throwable t) {
+ LOG.warn("Swagger scan package is empty and auto detect main class occur exception: {}",
+ t.getMessage());
+
+ }
+ return packageSets;
+ }
+}
diff --git a/spring-cloud-starter-tencent-polaris-contract/src/main/java/org/springdoc/api/AbstractOpenApiResourceUtil.java b/spring-cloud-starter-tencent-polaris-contract/src/main/java/org/springdoc/api/AbstractOpenApiResourceUtil.java
new file mode 100644
index 000000000..8ef24531c
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-contract/src/main/java/org/springdoc/api/AbstractOpenApiResourceUtil.java
@@ -0,0 +1,37 @@
+/*
+ * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ *
+ * Licensed under the BSD 3-Clause License (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://opensource.org/licenses/BSD-3-Clause
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed
+ * under the License is distributed on an "AS IS" BASIS, WITHOUT 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.springdoc.api;
+
+import java.util.Locale;
+
+import io.swagger.v3.oas.models.OpenAPI;
+
+/**
+ * Util for {@link AbstractOpenApiResource}.
+ *
+ * @author Haotian Zhang
+ */
+public final class AbstractOpenApiResourceUtil {
+
+ private AbstractOpenApiResourceUtil() {
+ }
+
+ public static OpenAPI getOpenApi(AbstractOpenApiResource openApiResource) {
+ return openApiResource.getOpenApi(Locale.getDefault());
+ }
+}
diff --git a/spring-cloud-starter-tencent-polaris-contract/src/main/java/org/springdoc/webflux/api/OpenApiWebFluxUtil.java b/spring-cloud-starter-tencent-polaris-contract/src/main/java/org/springdoc/webflux/api/OpenApiWebFluxUtil.java
new file mode 100644
index 000000000..8f146bff4
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-contract/src/main/java/org/springdoc/webflux/api/OpenApiWebFluxUtil.java
@@ -0,0 +1,36 @@
+/*
+ * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ *
+ * Licensed under the BSD 3-Clause License (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://opensource.org/licenses/BSD-3-Clause
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed
+ * under the License is distributed on an "AS IS" BASIS, WITHOUT 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.springdoc.webflux.api;
+
+import org.springdoc.api.AbstractOpenApiResource;
+
+/**
+ * Util for {@link MultipleOpenApiResource}.
+ *
+ * @author Haotian Zhang
+ */
+public final class OpenApiWebFluxUtil {
+
+ private OpenApiWebFluxUtil() {
+ }
+
+ public static AbstractOpenApiResource getOpenApiResourceOrThrow(
+ org.springdoc.webflux.api.MultipleOpenApiResource multipleOpenApiWebFluxResource, String groupName) {
+ return multipleOpenApiWebFluxResource.getOpenApiResourceOrThrow(groupName);
+ }
+}
diff --git a/spring-cloud-starter-tencent-polaris-contract/src/main/java/org/springdoc/webmvc/api/OpenApiWebMvcUtil.java b/spring-cloud-starter-tencent-polaris-contract/src/main/java/org/springdoc/webmvc/api/OpenApiWebMvcUtil.java
new file mode 100644
index 000000000..6e4967cfb
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-contract/src/main/java/org/springdoc/webmvc/api/OpenApiWebMvcUtil.java
@@ -0,0 +1,35 @@
+/*
+ * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ *
+ * Licensed under the BSD 3-Clause License (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://opensource.org/licenses/BSD-3-Clause
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed
+ * under the License is distributed on an "AS IS" BASIS, WITHOUT 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.springdoc.webmvc.api;
+
+import org.springdoc.api.AbstractOpenApiResource;
+
+/**
+ * Util for {@link MultipleOpenApiResource}.
+ *
+ * @author Haotian Zhang
+ */
+public final class OpenApiWebMvcUtil {
+ private OpenApiWebMvcUtil() {
+ }
+
+ public static AbstractOpenApiResource getOpenApiResourceOrThrow(
+ org.springdoc.webmvc.api.MultipleOpenApiResource multipleOpenApiWebMvcResource, String groupName) {
+ return multipleOpenApiWebMvcResource.getOpenApiResourceOrThrow(groupName);
+ }
+}
diff --git a/spring-cloud-starter-tencent-polaris-contract/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-cloud-starter-tencent-polaris-contract/src/main/resources/META-INF/additional-spring-configuration-metadata.json
new file mode 100644
index 000000000..4e5e4b72d
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-contract/src/main/resources/META-INF/additional-spring-configuration-metadata.json
@@ -0,0 +1,40 @@
+{
+ "properties": [
+ {
+ "name": "spring.cloud.polaris.contract.enabled",
+ "type": "java.lang.Boolean",
+ "defaultValue": true,
+ "description": "Enable polaris record contract or not."
+ },
+ {
+ "name": "spring.cloud.polaris.contract.basePackage",
+ "type": "java.lang.String",
+ "defaultValue": "",
+ "description": "Packages to be scanned. Split by \",\"."
+ },
+ {
+ "name": "spring.cloud.polaris.contract.excludePath",
+ "type": "java.lang.String",
+ "defaultValue": "",
+ "description": "Paths to be excluded. Split by \",\"."
+ },
+ {
+ "name": "spring.cloud.polaris.contract.group",
+ "type": "java.lang.String",
+ "defaultValue": "default",
+ "description": "Group to create swagger docket."
+ },
+ {
+ "name": "spring.cloud.polaris.contract.basePath",
+ "type": "java.lang.String",
+ "defaultValue": "/**",
+ "description": "Base paths to be scanned. Split by \",\"."
+ },
+ {
+ "name": "spring.cloud.polaris.contract.exposure",
+ "type": "java.lang.Boolean",
+ "defaultValue": "true",
+ "description": "Enable polaris contract exposure or not."
+ }
+ ]
+}
diff --git a/spring-cloud-starter-tencent-polaris-contract/src/main/resources/META-INF/spring.factories b/spring-cloud-starter-tencent-polaris-contract/src/main/resources/META-INF/spring.factories
new file mode 100644
index 000000000..e725a0ce2
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-contract/src/main/resources/META-INF/spring.factories
@@ -0,0 +1,4 @@
+org.springframework.cloud.bootstrap.BootstrapConfiguration=\
+ com.tencent.cloud.polaris.contract.config.PolarisContractPropertiesAutoConfiguration
+org.springframework.context.ApplicationListener=\
+ com.tencent.cloud.polaris.contract.PolarisSwaggerApplicationListener
diff --git a/spring-cloud-starter-tencent-polaris-contract/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/spring-cloud-starter-tencent-polaris-contract/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
new file mode 100644
index 000000000..c695c214c
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-contract/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -0,0 +1,2 @@
+com.tencent.cloud.polaris.contract.config.PolarisSwaggerAutoConfiguration
+com.tencent.cloud.polaris.contract.config.PolarisContractProperties
diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/PolarisDiscoveryProperties.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/PolarisDiscoveryProperties.java
index 3f83bfd44..0477ebfb9 100644
--- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/PolarisDiscoveryProperties.java
+++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/PolarisDiscoveryProperties.java
@@ -64,7 +64,7 @@ public class PolarisDiscoveryProperties {
/**
* Version number.
*/
- private String version;
+ private String version = "1.0.0";
/**
* Protocol name such as http, https.
diff --git a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/OrderConstant.java b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/OrderConstant.java
index 67c67c0fe..ac7aa169f 100644
--- a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/OrderConstant.java
+++ b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/OrderConstant.java
@@ -171,5 +171,10 @@ public static final class Modifier {
* Order of stat reporter configuration modifier.
*/
public static Integer STAT_REPORTER_ORDER = 1;
+
+ /**
+ * Order of service contract configuration modifier.
+ */
+ public static Integer SERVICE_CONTRACT_ORDER = Integer.MAX_VALUE - 9;
}
}
diff --git a/spring-cloud-tencent-coverage/pom.xml b/spring-cloud-tencent-coverage/pom.xml
index 433df7c72..15aef4a4e 100644
--- a/spring-cloud-tencent-coverage/pom.xml
+++ b/spring-cloud-tencent-coverage/pom.xml
@@ -64,10 +64,14 @@
spring-cloud-starter-tencent-polaris-config
+
+ com.tencent.cloud
+ spring-cloud-starter-tencent-polaris-contract
+
+
com.tencent.cloud
spring-cloud-starter-tencent-discovery-adapter-plugin
- ${revision}
diff --git a/spring-cloud-tencent-dependencies/pom.xml b/spring-cloud-tencent-dependencies/pom.xml
index 30d2ed86f..989cc5558 100644
--- a/spring-cloud-tencent-dependencies/pom.xml
+++ b/spring-cloud-tencent-dependencies/pom.xml
@@ -75,6 +75,7 @@
1.15.0-SNAPSHOT
32.0.1-jre
+ 2.2.0
4.9.0
1.12.19
3.21.7
@@ -151,6 +152,12 @@
${revision}
+
+ com.tencent.cloud
+ spring-cloud-starter-tencent-polaris-contract
+ ${revision}
+
+
com.tencent.cloud
spring-cloud-starter-tencent-all
@@ -197,6 +204,18 @@
+
+ org.springdoc
+ springdoc-openapi-starter-webmvc-ui
+ ${springdoc.version}
+
+
+
+ org.springdoc
+ springdoc-openapi-starter-webflux-ui
+ ${springdoc.version}
+
+
com.google.protobuf
protobuf-java
diff --git a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/pom.xml b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/pom.xml
index 9b974df4c..312b45c1a 100644
--- a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/pom.xml
+++ b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/pom.xml
@@ -19,10 +19,10 @@
spring-boot-starter-webflux
-
-
-
-
+
+ com.tencent.cloud
+ spring-cloud-starter-tencent-polaris-contract
+
com.tencent.cloud
diff --git a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/src/main/resources/bootstrap.yml
index ec34c0c35..1f3a5b9e5 100644
--- a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/src/main/resources/bootstrap.yml
+++ b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/src/main/resources/bootstrap.yml
@@ -11,6 +11,8 @@ spring:
discovery:
enabled: true
register: true
+ contract:
+ exposure: true
stat:
enabled: true
port: 28082
diff --git a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/pom.xml b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/pom.xml
index 6d97ca904..c495c5eeb 100644
--- a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/pom.xml
+++ b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/pom.xml
@@ -24,6 +24,11 @@
spring-cloud-starter-tencent-polaris-discovery
+
+ com.tencent.cloud
+ spring-cloud-starter-tencent-polaris-contract
+
+
diff --git a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/java/com/tencent/cloud/polaris/discovery/service/caller/DiscoveryCallerController.java b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/java/com/tencent/cloud/polaris/discovery/service/caller/DiscoveryCallerController.java
index f2ecaf5e4..166441cd6 100644
--- a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/java/com/tencent/cloud/polaris/discovery/service/caller/DiscoveryCallerController.java
+++ b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/java/com/tencent/cloud/polaris/discovery/service/caller/DiscoveryCallerController.java
@@ -45,7 +45,7 @@ public class DiscoveryCallerController {
* @param value2 value 2
* @return sum
*/
- @GetMapping("/feign")
+ @RequestMapping("/feign")
public int feign(@RequestParam int value1, @RequestParam int value2) {
return discoveryCalleeService.sum(value1, value2);
}
diff --git a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/resources/bootstrap.yml
index 71f388051..bcd78ef70 100644
--- a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/resources/bootstrap.yml
+++ b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/resources/bootstrap.yml
@@ -22,6 +22,8 @@ spring:
heartbeat:
enabled: true
health-check-url: /discovery/service/caller/healthCheck
+ contract:
+ exposure: true
stat:
enabled: true
port: 28081
diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/config/RpcEnhancementAutoConfiguration.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/config/RpcEnhancementAutoConfiguration.java
index 315a46e32..b07e5bdc6 100644
--- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/config/RpcEnhancementAutoConfiguration.java
+++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/config/RpcEnhancementAutoConfiguration.java
@@ -30,12 +30,6 @@
import com.tencent.cloud.rpc.enhancement.plugin.DefaultEnhancedPluginRunner;
import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPlugin;
import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginRunner;
-import com.tencent.cloud.rpc.enhancement.plugin.assembly.client.AssemblyClientExceptionHook;
-import com.tencent.cloud.rpc.enhancement.plugin.assembly.client.AssemblyClientPostHook;
-import com.tencent.cloud.rpc.enhancement.plugin.assembly.client.AssemblyClientPreHook;
-import com.tencent.cloud.rpc.enhancement.plugin.assembly.server.AssemblyServerExceptionHook;
-import com.tencent.cloud.rpc.enhancement.plugin.assembly.server.AssemblyServerPostHook;
-import com.tencent.cloud.rpc.enhancement.plugin.assembly.server.AssemblyServerPreHook;
import com.tencent.cloud.rpc.enhancement.plugin.reporter.ExceptionPolarisReporter;
import com.tencent.cloud.rpc.enhancement.plugin.reporter.SuccessPolarisReporter;
import com.tencent.cloud.rpc.enhancement.resttemplate.EnhancedRestTemplateInterceptor;
@@ -115,36 +109,6 @@ public ExceptionPolarisReporter exceptionPolarisReporter(RpcEnhancementReporterP
return new ExceptionPolarisReporter(properties, polarisSDKContextManager.getConsumerAPI());
}
- @Bean
- public AssemblyClientExceptionHook assemblyClientExceptionHook(PolarisSDKContextManager polarisSDKContextManager, InstanceTransformer instanceTransformer) {
- return new AssemblyClientExceptionHook(polarisSDKContextManager.getAssemblyAPI(), instanceTransformer);
- }
-
- @Bean
- public AssemblyClientPostHook assemblyClientPostHook(PolarisSDKContextManager polarisSDKContextManager, InstanceTransformer instanceTransformer) {
- return new AssemblyClientPostHook(polarisSDKContextManager.getAssemblyAPI(), instanceTransformer);
- }
-
- @Bean
- public AssemblyClientPreHook assemblyClientPreHook(PolarisSDKContextManager polarisSDKContextManager) {
- return new AssemblyClientPreHook(polarisSDKContextManager.getAssemblyAPI());
- }
-
- @Bean
- public AssemblyServerExceptionHook assemblyServerExceptionHook(PolarisSDKContextManager polarisSDKContextManager) {
- return new AssemblyServerExceptionHook(polarisSDKContextManager.getAssemblyAPI());
- }
-
- @Bean
- public AssemblyServerPostHook assemblyServerPostHook(PolarisSDKContextManager polarisSDKContextManager) {
- return new AssemblyServerPostHook(polarisSDKContextManager.getAssemblyAPI());
- }
-
- @Bean
- public AssemblyServerPreHook assemblyServerPreHook(PolarisSDKContextManager polarisSDKContextManager) {
- return new AssemblyServerPreHook(polarisSDKContextManager.getAssemblyAPI());
- }
-
@Configuration(proxyBeanMethods = false)
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
protected static class RpcEnhancementServletFilterConfig {
diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/PluginOrderConstant.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/PluginOrderConstant.java
index 95807dbab..6677dac0a 100644
--- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/PluginOrderConstant.java
+++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/PluginOrderConstant.java
@@ -44,27 +44,5 @@ public static class ClientPluginOrder {
* {@link com.tencent.cloud.polaris.circuitbreaker.reporter.ExceptionCircuitBreakerReporter}.
*/
public static final int CIRCUIT_BREAKER_REPORTER_PLUGIN_ORDER = Ordered.HIGHEST_PRECEDENCE + 2;
-
- /**
- * order for
- * {@link com.tencent.cloud.rpc.enhancement.plugin.assembly.client.AssemblyClientPreHook}
- * and
- * {@link com.tencent.cloud.rpc.enhancement.plugin.assembly.client.AssemblyClientPostHook}
- * and
- * {@link com.tencent.cloud.rpc.enhancement.plugin.assembly.client.AssemblyClientExceptionHook}.
- */
- public static final int ASSEMBLY_PLUGIN_ORDER = Ordered.HIGHEST_PRECEDENCE + 3;
- }
-
- public static class ServerPluginOrder {
- /**
- * order for
- * {@link com.tencent.cloud.rpc.enhancement.plugin.assembly.server.AssemblyServerPreHook}
- * and
- * {@link com.tencent.cloud.rpc.enhancement.plugin.assembly.server.AssemblyServerPostHook}
- * and
- * {@link com.tencent.cloud.rpc.enhancement.plugin.assembly.server.AssemblyServerExceptionHook}.
- */
- public static final int ASSEMBLY_PLUGIN_ORDER = Ordered.HIGHEST_PRECEDENCE + 1;
}
}
diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/AssemblyMetadataProvider.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/AssemblyMetadataProvider.java
deleted file mode 100644
index e937f244b..000000000
--- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/AssemblyMetadataProvider.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
- *
- * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
- *
- * Licensed under the BSD 3-Clause License (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://opensource.org/licenses/BSD-3-Clause
- *
- * Unless required by applicable law or agreed to in writing, software distributed
- * under the License is distributed on an "AS IS" BASIS, WITHOUT 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 com.tencent.cloud.rpc.enhancement.plugin.assembly;
-
-import com.tencent.polaris.api.pojo.ServiceKey;
-import com.tencent.polaris.api.rpc.MetadataProvider;
-
-import org.springframework.cloud.client.ServiceInstance;
-
-/**
- * AssemblyMetadataProvider.
- *
- * @author sean yu
- */
-public class AssemblyMetadataProvider implements MetadataProvider {
-
- private final ServiceInstance serviceInstance;
-
- private final String namespace;
-
- public AssemblyMetadataProvider(ServiceInstance localServiceInstance, String namespace) {
- this.serviceInstance = localServiceInstance;
- this.namespace = namespace;
- }
-
- @Override
- public String getMetadata(String key) {
- return serviceInstance.getMetadata().get(key);
- }
-
- @Override
- public ServiceKey getLocalService() {
- return new ServiceKey(namespace, serviceInstance.getServiceId());
- }
-
- @Override
- public String getLocalIp() {
- return serviceInstance.getHost();
- }
-
-}
diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/AssemblyRequestContext.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/AssemblyRequestContext.java
deleted file mode 100644
index c5a8befa8..000000000
--- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/AssemblyRequestContext.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
- *
- * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
- *
- * Licensed under the BSD 3-Clause License (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://opensource.org/licenses/BSD-3-Clause
- *
- * Unless required by applicable law or agreed to in writing, software distributed
- * under the License is distributed on an "AS IS" BASIS, WITHOUT 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 com.tencent.cloud.rpc.enhancement.plugin.assembly;
-
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-
-import com.google.common.net.HttpHeaders;
-import com.tencent.cloud.rpc.enhancement.plugin.EnhancedRequestContext;
-import com.tencent.polaris.api.pojo.ServiceKey;
-import com.tencent.polaris.api.rpc.RequestContext;
-
-import org.springframework.http.HttpMethod;
-
-/**
- * AssemblyRequestContext.
- *
- * @author sean yu
- */
-public class AssemblyRequestContext implements RequestContext {
-
- private final EnhancedRequestContext requestContext;
-
- private final ServiceKey callerService;
-
- private final String callerIp;
-
- private final Map cookies;
-
- public AssemblyRequestContext(EnhancedRequestContext requestContext, ServiceKey callerService, String callerIp) {
- this.requestContext = requestContext;
- this.callerService = callerService;
- this.callerIp = callerIp;
- this.cookies = new HashMap<>();
- List allCookies =
- Optional.ofNullable(requestContext.getHttpHeaders().get(HttpHeaders.COOKIE))
- .orElse(new ArrayList<>())
- .stream()
- .flatMap(it -> Arrays.stream(it.split(";")))
- .toList();
- allCookies.forEach(cookie -> {
- String[] cookieKV = cookie.split("=");
- if (cookieKV.length == 2) {
- cookies.put(cookieKV[0], cookieKV[1]);
- }
- });
- }
-
- @Override
- public String getMethod() {
- return requestContext.getHttpMethod().name();
- }
-
- @Override
- public void setMethod(String method) {
- requestContext.setHttpMethod(HttpMethod.valueOf(method));
- }
-
- @Override
- public String getHeader(String key) {
- return requestContext.getHttpHeaders().getFirst(key);
- }
-
- @Override
- public void setHeader(String key, String value) {
- requestContext.getHttpHeaders().set(key, value);
- }
-
- @Override
- public Collection listHeaderKeys() {
- return requestContext.getHttpHeaders().keySet();
- }
-
- @Override
- public String getCookie(String key) {
- return this.cookies.get(key);
- }
-
- @Override
- public void setCookie(String key, String value) {
- this.cookies.put(key, value);
- }
-
- @Override
- public Collection listCookieKeys() {
- return this.cookies.keySet();
- }
-
- @Override
- public String getCallerIp() {
- return callerIp;
- }
-
- @Override
- public ServiceKey getCallerService() {
- return callerService;
- }
-
- @Override
- public URI getURI() {
- return requestContext.getUrl();
- }
-
-}
diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/AssemblyResponseContext.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/AssemblyResponseContext.java
deleted file mode 100644
index 4dbfa81d7..000000000
--- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/AssemblyResponseContext.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
- *
- * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
- *
- * Licensed under the BSD 3-Clause License (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://opensource.org/licenses/BSD-3-Clause
- *
- * Unless required by applicable law or agreed to in writing, software distributed
- * under the License is distributed on an "AS IS" BASIS, WITHOUT 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 com.tencent.cloud.rpc.enhancement.plugin.assembly;
-
-import java.util.Collection;
-
-import com.tencent.cloud.rpc.enhancement.plugin.EnhancedResponseContext;
-import com.tencent.cloud.rpc.enhancement.plugin.PolarisEnhancedPluginUtils;
-import com.tencent.polaris.api.pojo.RetStatus;
-import com.tencent.polaris.api.rpc.ResponseContext;
-
-import org.springframework.lang.Nullable;
-
-/**
- * AssemblyResponseContext.
- *
- * @author sean yu
- */
-public class AssemblyResponseContext implements ResponseContext {
-
- private final EnhancedResponseContext responseContext;
-
- private final Throwable throwable;
-
- private final RetStatus retStatus;
-
- public AssemblyResponseContext(@Nullable EnhancedResponseContext responseContext, @Nullable Throwable throwable) {
- this.responseContext = responseContext;
- this.throwable = throwable;
- if (responseContext == null) {
- this.retStatus = PolarisEnhancedPluginUtils.getRetStatusFromRequest(null, null, throwable);
- }
- else {
- this.retStatus = PolarisEnhancedPluginUtils.getRetStatusFromRequest(responseContext.getHttpHeaders(), responseContext.getHttpStatus(), throwable);
- }
- }
-
- @Override
- public Object getRetCode() {
- if (responseContext == null) {
- return null;
- }
- return this.responseContext.getHttpStatus();
- }
-
- @Override
- public String getHeader(String key) {
- if (responseContext == null) {
- return null;
- }
- return this.responseContext.getHttpHeaders().getFirst(key);
- }
-
- @Override
- public Collection listHeaders() {
- if (responseContext == null) {
- return null;
- }
- return this.responseContext.getHttpHeaders().keySet();
- }
-
- @Override
- public Throwable getThrowable() {
- return this.throwable;
- }
-
- @Override
- public RetStatus getRetStatus() {
- return this.retStatus;
- }
-
-}
diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/client/AssemblyClientExceptionHook.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/client/AssemblyClientExceptionHook.java
deleted file mode 100644
index 398485b59..000000000
--- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/client/AssemblyClientExceptionHook.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
- *
- * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
- *
- * Licensed under the BSD 3-Clause License (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://opensource.org/licenses/BSD-3-Clause
- *
- * Unless required by applicable law or agreed to in writing, software distributed
- * under the License is distributed on an "AS IS" BASIS, WITHOUT 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 com.tencent.cloud.rpc.enhancement.plugin.assembly.client;
-
-import com.tencent.cloud.common.metadata.MetadataContext;
-import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPlugin;
-import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginContext;
-import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType;
-import com.tencent.cloud.rpc.enhancement.plugin.PolarisEnhancedPluginUtils;
-import com.tencent.cloud.rpc.enhancement.plugin.assembly.AssemblyMetadataProvider;
-import com.tencent.cloud.rpc.enhancement.plugin.assembly.AssemblyRequestContext;
-import com.tencent.cloud.rpc.enhancement.plugin.assembly.AssemblyResponseContext;
-import com.tencent.cloud.rpc.enhancement.transformer.InstanceTransformer;
-import com.tencent.polaris.api.pojo.ServiceKey;
-import com.tencent.polaris.assembly.api.AssemblyAPI;
-import com.tencent.polaris.assembly.api.pojo.AfterRequest;
-import com.tencent.polaris.assembly.api.pojo.Capability;
-
-import static com.tencent.cloud.rpc.enhancement.plugin.PluginOrderConstant.ClientPluginOrder.ASSEMBLY_PLUGIN_ORDER;
-
-/**
- * AssemblyClientExceptionHook.
- *
- * @author sean yu
- */
-public class AssemblyClientExceptionHook implements EnhancedPlugin {
-
- private final AssemblyAPI assemblyAPI;
-
- private final InstanceTransformer instanceTransformer;
-
- public AssemblyClientExceptionHook(AssemblyAPI assemblyAPI, InstanceTransformer instanceTransformer) {
- this.assemblyAPI = assemblyAPI;
- this.instanceTransformer = instanceTransformer;
- }
-
- @Override
- public EnhancedPluginType getType() {
- return EnhancedPluginType.Client.EXCEPTION;
- }
-
- @Override
- public void run(EnhancedPluginContext context) {
-
- AfterRequest afterRequest = new AfterRequest();
- afterRequest.setCapabilities(new Capability[]{Capability.ALL});
- afterRequest.setRequestContext(new AssemblyRequestContext(
- context.getRequest(),
- new ServiceKey(MetadataContext.LOCAL_NAMESPACE, context.getLocalServiceInstance().getServiceId()),
- context.getLocalServiceInstance().getHost()
- ));
- afterRequest.setResponseContext(new AssemblyResponseContext(null, context.getThrowable()));
- afterRequest.setMetadataProvider(new AssemblyMetadataProvider(context.getLocalServiceInstance(), MetadataContext.LOCAL_NAMESPACE));
- afterRequest.setDelay(context.getDelay());
- afterRequest.setRouteLabels(PolarisEnhancedPluginUtils.getLabelMap(context.getRequest().getHttpHeaders()));
- // TargetService and TargetInstance only exist in client side
- afterRequest.setTargetService(new ServiceKey(MetadataContext.LOCAL_NAMESPACE, context.getTargetServiceInstance().getServiceId()));
- afterRequest.setTargetInstance(instanceTransformer.transform(context.getTargetServiceInstance()));
-
- assemblyAPI.afterCallService(afterRequest);
- }
-
- @Override
- public int getOrder() {
- return ASSEMBLY_PLUGIN_ORDER;
- }
-}
diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/client/AssemblyClientPostHook.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/client/AssemblyClientPostHook.java
deleted file mode 100644
index 9148a0de9..000000000
--- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/client/AssemblyClientPostHook.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
- *
- * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
- *
- * Licensed under the BSD 3-Clause License (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://opensource.org/licenses/BSD-3-Clause
- *
- * Unless required by applicable law or agreed to in writing, software distributed
- * under the License is distributed on an "AS IS" BASIS, WITHOUT 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 com.tencent.cloud.rpc.enhancement.plugin.assembly.client;
-
-import com.tencent.cloud.common.metadata.MetadataContext;
-import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPlugin;
-import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginContext;
-import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType;
-import com.tencent.cloud.rpc.enhancement.plugin.PolarisEnhancedPluginUtils;
-import com.tencent.cloud.rpc.enhancement.plugin.assembly.AssemblyMetadataProvider;
-import com.tencent.cloud.rpc.enhancement.plugin.assembly.AssemblyRequestContext;
-import com.tencent.cloud.rpc.enhancement.plugin.assembly.AssemblyResponseContext;
-import com.tencent.cloud.rpc.enhancement.transformer.InstanceTransformer;
-import com.tencent.polaris.api.pojo.ServiceKey;
-import com.tencent.polaris.assembly.api.AssemblyAPI;
-import com.tencent.polaris.assembly.api.pojo.AfterRequest;
-import com.tencent.polaris.assembly.api.pojo.Capability;
-
-import static com.tencent.cloud.rpc.enhancement.plugin.PluginOrderConstant.ClientPluginOrder.ASSEMBLY_PLUGIN_ORDER;
-
-/**
- * AssemblyClientPostHook.
- *
- * @author sean yu
- */
-public class AssemblyClientPostHook implements EnhancedPlugin {
-
- private final AssemblyAPI assemblyAPI;
-
- private final InstanceTransformer instanceTransformer;
-
- public AssemblyClientPostHook(AssemblyAPI assemblyAPI, InstanceTransformer instanceTransformer) {
- this.assemblyAPI = assemblyAPI;
- this.instanceTransformer = instanceTransformer;
- }
-
- @Override
- public EnhancedPluginType getType() {
- return EnhancedPluginType.Client.POST;
- }
-
- @Override
- public void run(EnhancedPluginContext context) {
-
- AfterRequest afterRequest = new AfterRequest();
- afterRequest.setCapabilities(new Capability[]{Capability.ALL});
- afterRequest.setRequestContext(new AssemblyRequestContext(
- context.getRequest(),
- new ServiceKey(MetadataContext.LOCAL_NAMESPACE, context.getLocalServiceInstance().getServiceId()),
- context.getLocalServiceInstance().getHost()
- ));
- afterRequest.setResponseContext(new AssemblyResponseContext(context.getResponse(), null));
- afterRequest.setMetadataProvider(new AssemblyMetadataProvider(context.getLocalServiceInstance(), MetadataContext.LOCAL_NAMESPACE));
- afterRequest.setDelay(context.getDelay());
- afterRequest.setRouteLabels(PolarisEnhancedPluginUtils.getLabelMap(context.getRequest().getHttpHeaders()));
- // TargetService and TargetInstance only exist in client side
- afterRequest.setTargetService(new ServiceKey(MetadataContext.LOCAL_NAMESPACE, context.getTargetServiceInstance().getServiceId()));
- afterRequest.setTargetInstance(instanceTransformer.transform(context.getTargetServiceInstance()));
-
- assemblyAPI.afterCallService(afterRequest);
- }
-
- @Override
- public int getOrder() {
- return ASSEMBLY_PLUGIN_ORDER;
- }
-
-}
diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/client/AssemblyClientPreHook.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/client/AssemblyClientPreHook.java
deleted file mode 100644
index fde540277..000000000
--- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/client/AssemblyClientPreHook.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
- *
- * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
- *
- * Licensed under the BSD 3-Clause License (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://opensource.org/licenses/BSD-3-Clause
- *
- * Unless required by applicable law or agreed to in writing, software distributed
- * under the License is distributed on an "AS IS" BASIS, WITHOUT 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 com.tencent.cloud.rpc.enhancement.plugin.assembly.client;
-
-import com.tencent.cloud.common.metadata.MetadataContext;
-import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPlugin;
-import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginContext;
-import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType;
-import com.tencent.cloud.rpc.enhancement.plugin.assembly.AssemblyMetadataProvider;
-import com.tencent.cloud.rpc.enhancement.plugin.assembly.AssemblyRequestContext;
-import com.tencent.polaris.api.pojo.ServiceKey;
-import com.tencent.polaris.assembly.api.AssemblyAPI;
-import com.tencent.polaris.assembly.api.pojo.BeforeRequest;
-import com.tencent.polaris.assembly.api.pojo.Capability;
-
-import static com.tencent.cloud.rpc.enhancement.plugin.PluginOrderConstant.ClientPluginOrder.ASSEMBLY_PLUGIN_ORDER;
-
-/**
- * AssemblyClientPreHook.
- *
- * @author sean yu
- */
-public class AssemblyClientPreHook implements EnhancedPlugin {
-
- private final AssemblyAPI assemblyAPI;
-
- public AssemblyClientPreHook(AssemblyAPI assemblyAPI) {
- this.assemblyAPI = assemblyAPI;
- }
-
- @Override
- public EnhancedPluginType getType() {
- return EnhancedPluginType.Client.PRE;
- }
-
- @Override
- public void run(EnhancedPluginContext context) {
-
- BeforeRequest beforeRequest = new BeforeRequest();
- beforeRequest.setCapabilities(new Capability[]{Capability.ALL});
- beforeRequest.setRequestContext(new AssemblyRequestContext(
- context.getRequest(),
- new ServiceKey(MetadataContext.LOCAL_NAMESPACE, context.getLocalServiceInstance().getServiceId()),
- context.getLocalServiceInstance().getHost()
- ));
- beforeRequest.setMetadataProvider(new AssemblyMetadataProvider(context.getLocalServiceInstance(), MetadataContext.LOCAL_NAMESPACE));
- // TargetService only exist in client side
- beforeRequest.setTargetService(new ServiceKey(MetadataContext.LOCAL_NAMESPACE, context.getTargetServiceInstance().getServiceId()));
-
- assemblyAPI.beforeCallService(beforeRequest);
- }
-
- @Override
- public int getOrder() {
- return ASSEMBLY_PLUGIN_ORDER;
- }
-
-}
diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/server/AssemblyServerExceptionHook.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/server/AssemblyServerExceptionHook.java
deleted file mode 100644
index bde03d0d7..000000000
--- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/server/AssemblyServerExceptionHook.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
- *
- * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
- *
- * Licensed under the BSD 3-Clause License (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://opensource.org/licenses/BSD-3-Clause
- *
- * Unless required by applicable law or agreed to in writing, software distributed
- * under the License is distributed on an "AS IS" BASIS, WITHOUT 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 com.tencent.cloud.rpc.enhancement.plugin.assembly.server;
-
-import com.tencent.cloud.common.metadata.MetadataContext;
-import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPlugin;
-import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginContext;
-import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType;
-import com.tencent.cloud.rpc.enhancement.plugin.PolarisEnhancedPluginUtils;
-import com.tencent.cloud.rpc.enhancement.plugin.assembly.AssemblyMetadataProvider;
-import com.tencent.cloud.rpc.enhancement.plugin.assembly.AssemblyRequestContext;
-import com.tencent.cloud.rpc.enhancement.plugin.assembly.AssemblyResponseContext;
-import com.tencent.polaris.api.pojo.ServiceKey;
-import com.tencent.polaris.assembly.api.AssemblyAPI;
-import com.tencent.polaris.assembly.api.pojo.AfterRequest;
-import com.tencent.polaris.assembly.api.pojo.Capability;
-
-import static com.tencent.cloud.rpc.enhancement.plugin.PluginOrderConstant.ServerPluginOrder.ASSEMBLY_PLUGIN_ORDER;
-
-
-/**
- * AssemblyServerExceptionHook.
- *
- * @author sean yu
- */
-public class AssemblyServerExceptionHook implements EnhancedPlugin {
-
- private final AssemblyAPI assemblyAPI;
-
- public AssemblyServerExceptionHook(AssemblyAPI assemblyAPI) {
- this.assemblyAPI = assemblyAPI;
- }
-
- @Override
- public EnhancedPluginType getType() {
- return EnhancedPluginType.Server.EXCEPTION;
- }
-
- @Override
- public void run(EnhancedPluginContext context) {
- AfterRequest afterRequest = new AfterRequest();
- afterRequest.setCapabilities(new Capability[]{Capability.ALL});
- afterRequest.setRequestContext(new AssemblyRequestContext(
- context.getRequest(),
- new ServiceKey(MetadataContext.LOCAL_NAMESPACE, context.getLocalServiceInstance().getServiceId()),
- context.getLocalServiceInstance().getHost()
- ));
- afterRequest.setResponseContext(new AssemblyResponseContext(null, context.getThrowable()));
- afterRequest.setMetadataProvider(new AssemblyMetadataProvider(context.getLocalServiceInstance(), MetadataContext.LOCAL_NAMESPACE));
- afterRequest.setDelay(context.getDelay());
- afterRequest.setRouteLabels(PolarisEnhancedPluginUtils.getLabelMap(context.getRequest().getHttpHeaders()));
-
- assemblyAPI.afterProcess(afterRequest);
- }
-
- @Override
- public int getOrder() {
- return ASSEMBLY_PLUGIN_ORDER;
- }
-
-}
diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/server/AssemblyServerPostHook.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/server/AssemblyServerPostHook.java
deleted file mode 100644
index 855994eb1..000000000
--- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/server/AssemblyServerPostHook.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
- *
- * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
- *
- * Licensed under the BSD 3-Clause License (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://opensource.org/licenses/BSD-3-Clause
- *
- * Unless required by applicable law or agreed to in writing, software distributed
- * under the License is distributed on an "AS IS" BASIS, WITHOUT 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 com.tencent.cloud.rpc.enhancement.plugin.assembly.server;
-
-import com.tencent.cloud.common.metadata.MetadataContext;
-import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPlugin;
-import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginContext;
-import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType;
-import com.tencent.cloud.rpc.enhancement.plugin.PolarisEnhancedPluginUtils;
-import com.tencent.cloud.rpc.enhancement.plugin.assembly.AssemblyMetadataProvider;
-import com.tencent.cloud.rpc.enhancement.plugin.assembly.AssemblyRequestContext;
-import com.tencent.cloud.rpc.enhancement.plugin.assembly.AssemblyResponseContext;
-import com.tencent.polaris.api.pojo.ServiceKey;
-import com.tencent.polaris.assembly.api.AssemblyAPI;
-import com.tencent.polaris.assembly.api.pojo.AfterRequest;
-import com.tencent.polaris.assembly.api.pojo.Capability;
-
-import static com.tencent.cloud.rpc.enhancement.plugin.PluginOrderConstant.ServerPluginOrder.ASSEMBLY_PLUGIN_ORDER;
-
-/**
- * AssemblyServerPostHook.
- *
- * @author sean yu
- */
-public class AssemblyServerPostHook implements EnhancedPlugin {
-
- private final AssemblyAPI assemblyAPI;
-
- public AssemblyServerPostHook(AssemblyAPI assemblyAPI) {
- this.assemblyAPI = assemblyAPI;
- }
-
- @Override
- public EnhancedPluginType getType() {
- return EnhancedPluginType.Server.POST;
- }
-
- @Override
- public void run(EnhancedPluginContext context) {
- AfterRequest afterRequest = new AfterRequest();
- afterRequest.setCapabilities(new Capability[]{Capability.ALL});
- afterRequest.setRequestContext(new AssemblyRequestContext(
- context.getRequest(),
- new ServiceKey(MetadataContext.LOCAL_NAMESPACE, context.getLocalServiceInstance().getServiceId()),
- context.getLocalServiceInstance().getHost()
- ));
- afterRequest.setResponseContext(new AssemblyResponseContext(context.getResponse(), null));
- afterRequest.setMetadataProvider(new AssemblyMetadataProvider(context.getLocalServiceInstance(), MetadataContext.LOCAL_NAMESPACE));
- afterRequest.setDelay(context.getDelay());
- afterRequest.setRouteLabels(PolarisEnhancedPluginUtils.getLabelMap(context.getRequest().getHttpHeaders()));
-
- assemblyAPI.afterProcess(afterRequest);
- }
-
- @Override
- public int getOrder() {
- return ASSEMBLY_PLUGIN_ORDER;
- }
-
-}
diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/server/AssemblyServerPreHook.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/server/AssemblyServerPreHook.java
deleted file mode 100644
index 5b279b80d..000000000
--- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/server/AssemblyServerPreHook.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
- *
- * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
- *
- * Licensed under the BSD 3-Clause License (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://opensource.org/licenses/BSD-3-Clause
- *
- * Unless required by applicable law or agreed to in writing, software distributed
- * under the License is distributed on an "AS IS" BASIS, WITHOUT 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 com.tencent.cloud.rpc.enhancement.plugin.assembly.server;
-
-import com.tencent.cloud.common.metadata.MetadataContext;
-import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPlugin;
-import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginContext;
-import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType;
-import com.tencent.cloud.rpc.enhancement.plugin.assembly.AssemblyMetadataProvider;
-import com.tencent.cloud.rpc.enhancement.plugin.assembly.AssemblyRequestContext;
-import com.tencent.polaris.api.pojo.ServiceKey;
-import com.tencent.polaris.assembly.api.AssemblyAPI;
-import com.tencent.polaris.assembly.api.pojo.BeforeRequest;
-import com.tencent.polaris.assembly.api.pojo.Capability;
-
-import static com.tencent.cloud.rpc.enhancement.plugin.PluginOrderConstant.ServerPluginOrder.ASSEMBLY_PLUGIN_ORDER;
-
-/**
- * AssemblyServerPreHook.
- *
- * @author sean yu
- */
-public class AssemblyServerPreHook implements EnhancedPlugin {
-
- private final AssemblyAPI assemblyAPI;
-
- public AssemblyServerPreHook(AssemblyAPI assemblyAPI) {
- this.assemblyAPI = assemblyAPI;
- }
-
- @Override
- public EnhancedPluginType getType() {
- return EnhancedPluginType.Server.PRE;
- }
-
- @Override
- public void run(EnhancedPluginContext context) {
- BeforeRequest beforeRequest = new BeforeRequest();
- beforeRequest.setCapabilities(new Capability[]{Capability.ALL});
- beforeRequest.setRequestContext(new AssemblyRequestContext(
- context.getRequest(),
- new ServiceKey(MetadataContext.LOCAL_NAMESPACE, context.getLocalServiceInstance().getServiceId()),
- context.getLocalServiceInstance().getHost()
- ));
- beforeRequest.setMetadataProvider(new AssemblyMetadataProvider(context.getLocalServiceInstance(), MetadataContext.LOCAL_NAMESPACE));
-
- assemblyAPI.beforeProcess(beforeRequest);
- }
-
- @Override
- public int getOrder() {
- return ASSEMBLY_PLUGIN_ORDER;
- }
-
-}
diff --git a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyClientExceptionHookTest.java b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyClientExceptionHookTest.java
deleted file mode 100644
index d89006ccd..000000000
--- a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyClientExceptionHookTest.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
- *
- * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
- *
- * Licensed under the BSD 3-Clause License (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://opensource.org/licenses/BSD-3-Clause
- *
- * Unless required by applicable law or agreed to in writing, software distributed
- * under the License is distributed on an "AS IS" BASIS, WITHOUT 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 com.tencent.cloud.rpc.enhancement.plugin;
-
-import java.net.URI;
-
-import com.tencent.cloud.common.metadata.MetadataContext;
-import com.tencent.cloud.common.util.ApplicationContextAwareUtils;
-import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementReporterProperties;
-import com.tencent.cloud.rpc.enhancement.plugin.assembly.client.AssemblyClientExceptionHook;
-import com.tencent.cloud.rpc.enhancement.transformer.InstanceTransformer;
-import com.tencent.polaris.assembly.api.AssemblyAPI;
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.MockedStatic;
-import org.mockito.Mockito;
-import org.mockito.junit.jupiter.MockitoExtension;
-
-import org.springframework.cloud.client.DefaultServiceInstance;
-import org.springframework.context.ApplicationContext;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpMethod;
-
-import static com.tencent.polaris.test.common.Consts.NAMESPACE_TEST;
-import static com.tencent.polaris.test.common.Consts.SERVICE_PROVIDER;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-
-/**
- * AssemblyClientExceptionHookTest.
- *
- * @author sean yu
- */
-@ExtendWith(MockitoExtension.class)
-public class AssemblyClientExceptionHookTest {
-
- private static MockedStatic mockedApplicationContextAwareUtils;
- @InjectMocks
- private AssemblyClientExceptionHook assemblyClientExceptionHook;
- @Mock
- private AssemblyAPI assemblyAPI;
- @Mock
- private InstanceTransformer instanceTransformer;
-
- @BeforeAll
- static void beforeAll() {
- mockedApplicationContextAwareUtils = Mockito.mockStatic(ApplicationContextAwareUtils.class);
- mockedApplicationContextAwareUtils.when(() -> ApplicationContextAwareUtils.getProperties(anyString()))
- .thenReturn("unit-test");
- ApplicationContext applicationContext = mock(ApplicationContext.class);
- RpcEnhancementReporterProperties reporterProperties = mock(RpcEnhancementReporterProperties.class);
- doReturn(reporterProperties)
- .when(applicationContext).getBean(RpcEnhancementReporterProperties.class);
- mockedApplicationContextAwareUtils.when(ApplicationContextAwareUtils::getApplicationContext)
- .thenReturn(applicationContext);
- }
-
- @AfterAll
- static void afterAll() {
- mockedApplicationContextAwareUtils.close();
- }
-
- @BeforeEach
- void setUp() {
- MetadataContext.LOCAL_NAMESPACE = NAMESPACE_TEST;
- MetadataContext.LOCAL_SERVICE = SERVICE_PROVIDER;
- }
-
- @Test
- public void testGetName() {
- assertThat(assemblyClientExceptionHook.getName()).isEqualTo(AssemblyClientExceptionHook.class.getName());
- }
-
- @Test
- public void testType() {
- assertThat(assemblyClientExceptionHook.getType()).isEqualTo(EnhancedPluginType.Client.EXCEPTION);
- }
-
- @Test
- public void testRun() {
- EnhancedPluginContext pluginContext = new EnhancedPluginContext();
- EnhancedRequestContext request = EnhancedRequestContext.builder()
- .httpMethod(HttpMethod.GET)
- .url(URI.create("http://0.0.0.0/"))
- .httpHeaders(new HttpHeaders())
- .build();
- request.toString();
- EnhancedResponseContext response = EnhancedResponseContext.builder()
- .httpStatus(200)
- .build();
- response.toString();
-
- DefaultServiceInstance targetServiceInstance = new DefaultServiceInstance();
- targetServiceInstance.setServiceId(SERVICE_PROVIDER);
-
- DefaultServiceInstance localServiceInstance = new DefaultServiceInstance();
- localServiceInstance.setServiceId(SERVICE_PROVIDER);
-
- pluginContext.setRequest(request);
- pluginContext.setResponse(response);
- pluginContext.setTargetServiceInstance(targetServiceInstance, null);
- pluginContext.setLocalServiceInstance(localServiceInstance);
- pluginContext.setThrowable(new RuntimeException());
-
- assemblyClientExceptionHook.run(pluginContext);
- assemblyClientExceptionHook.getOrder();
- assemblyClientExceptionHook.getName();
- assemblyClientExceptionHook.getType();
- }
-
- @Test
- public void testHandlerThrowable() {
- // mock request
- EnhancedRequestContext request = mock(EnhancedRequestContext.class);
- // mock response
- EnhancedResponseContext response = mock(EnhancedResponseContext.class);
-
- EnhancedPluginContext context = new EnhancedPluginContext();
- context.setRequest(request);
- context.setResponse(response);
- assemblyClientExceptionHook.handlerThrowable(context, new RuntimeException("Mock exception."));
- }
-
-}
diff --git a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyClientPostHookTest.java b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyClientPostHookTest.java
deleted file mode 100644
index 9aa3f0d8e..000000000
--- a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyClientPostHookTest.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
- *
- * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
- *
- * Licensed under the BSD 3-Clause License (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://opensource.org/licenses/BSD-3-Clause
- *
- * Unless required by applicable law or agreed to in writing, software distributed
- * under the License is distributed on an "AS IS" BASIS, WITHOUT 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 com.tencent.cloud.rpc.enhancement.plugin;
-
-import java.net.URI;
-
-import com.tencent.cloud.common.metadata.MetadataContext;
-import com.tencent.cloud.common.util.ApplicationContextAwareUtils;
-import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementReporterProperties;
-import com.tencent.cloud.rpc.enhancement.plugin.assembly.client.AssemblyClientPostHook;
-import com.tencent.cloud.rpc.enhancement.transformer.InstanceTransformer;
-import com.tencent.polaris.assembly.api.AssemblyAPI;
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.MockedStatic;
-import org.mockito.Mockito;
-import org.mockito.junit.jupiter.MockitoExtension;
-
-import org.springframework.cloud.client.DefaultServiceInstance;
-import org.springframework.context.ApplicationContext;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpMethod;
-
-import static com.tencent.polaris.test.common.Consts.NAMESPACE_TEST;
-import static com.tencent.polaris.test.common.Consts.SERVICE_PROVIDER;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-
-/**
- * AssemblyClientPostHookTest.
- *
- * @author sean yu
- */
-@ExtendWith(MockitoExtension.class)
-public class AssemblyClientPostHookTest {
-
- private static MockedStatic mockedApplicationContextAwareUtils;
- @InjectMocks
- private AssemblyClientPostHook assemblyClientPostHook;
- @Mock
- private AssemblyAPI assemblyAPI;
- @Mock
- private InstanceTransformer instanceTransformer;
-
- @BeforeAll
- static void beforeAll() {
- mockedApplicationContextAwareUtils = Mockito.mockStatic(ApplicationContextAwareUtils.class);
- mockedApplicationContextAwareUtils.when(() -> ApplicationContextAwareUtils.getProperties(anyString()))
- .thenReturn("unit-test");
- ApplicationContext applicationContext = mock(ApplicationContext.class);
- RpcEnhancementReporterProperties reporterProperties = mock(RpcEnhancementReporterProperties.class);
- doReturn(reporterProperties)
- .when(applicationContext).getBean(RpcEnhancementReporterProperties.class);
- mockedApplicationContextAwareUtils.when(ApplicationContextAwareUtils::getApplicationContext)
- .thenReturn(applicationContext);
- }
-
- @AfterAll
- static void afterAll() {
- mockedApplicationContextAwareUtils.close();
- }
-
- @BeforeEach
- void setUp() {
- MetadataContext.LOCAL_NAMESPACE = NAMESPACE_TEST;
- MetadataContext.LOCAL_SERVICE = SERVICE_PROVIDER;
- }
-
- @Test
- public void testGetName() {
- assertThat(assemblyClientPostHook.getName()).isEqualTo(AssemblyClientPostHook.class.getName());
- }
-
- @Test
- public void testType() {
- assertThat(assemblyClientPostHook.getType()).isEqualTo(EnhancedPluginType.Client.POST);
- }
-
- @Test
- public void testRun() {
- EnhancedPluginContext pluginContext = new EnhancedPluginContext();
- EnhancedRequestContext request = EnhancedRequestContext.builder()
- .httpMethod(HttpMethod.GET)
- .url(URI.create("http://0.0.0.0/"))
- .httpHeaders(new HttpHeaders())
- .build();
- request.toString();
- EnhancedResponseContext response = EnhancedResponseContext.builder()
- .httpStatus(200)
- .build();
- response.toString();
-
- DefaultServiceInstance targetServiceInstance = new DefaultServiceInstance();
- targetServiceInstance.setServiceId(SERVICE_PROVIDER);
-
- DefaultServiceInstance localServiceInstance = new DefaultServiceInstance();
- localServiceInstance.setServiceId(SERVICE_PROVIDER);
-
- pluginContext.setRequest(request);
- pluginContext.setResponse(response);
- pluginContext.setTargetServiceInstance(targetServiceInstance, null);
- pluginContext.setLocalServiceInstance(localServiceInstance);
- pluginContext.setThrowable(new RuntimeException());
-
- assemblyClientPostHook.run(pluginContext);
- assemblyClientPostHook.getOrder();
- assemblyClientPostHook.getName();
- assemblyClientPostHook.getType();
- }
-
- @Test
- public void testHandlerThrowable() {
- // mock request
- EnhancedRequestContext request = mock(EnhancedRequestContext.class);
- // mock response
- EnhancedResponseContext response = mock(EnhancedResponseContext.class);
-
- EnhancedPluginContext context = new EnhancedPluginContext();
- context.setRequest(request);
- context.setResponse(response);
- assemblyClientPostHook.handlerThrowable(context, new RuntimeException("Mock exception."));
- }
-
-}
diff --git a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyClientPreHookTest.java b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyClientPreHookTest.java
deleted file mode 100644
index f597c1026..000000000
--- a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyClientPreHookTest.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
- *
- * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
- *
- * Licensed under the BSD 3-Clause License (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://opensource.org/licenses/BSD-3-Clause
- *
- * Unless required by applicable law or agreed to in writing, software distributed
- * under the License is distributed on an "AS IS" BASIS, WITHOUT 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 com.tencent.cloud.rpc.enhancement.plugin;
-
-import java.net.URI;
-
-import com.tencent.cloud.common.metadata.MetadataContext;
-import com.tencent.cloud.common.util.ApplicationContextAwareUtils;
-import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementReporterProperties;
-import com.tencent.cloud.rpc.enhancement.plugin.assembly.client.AssemblyClientPreHook;
-import com.tencent.polaris.assembly.api.AssemblyAPI;
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.MockedStatic;
-import org.mockito.Mockito;
-import org.mockito.junit.jupiter.MockitoExtension;
-
-import org.springframework.cloud.client.DefaultServiceInstance;
-import org.springframework.context.ApplicationContext;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpMethod;
-
-import static com.tencent.polaris.test.common.Consts.NAMESPACE_TEST;
-import static com.tencent.polaris.test.common.Consts.SERVICE_PROVIDER;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-
-/**
- * AssemblyClientPreHookTest.
- *
- * @author sean yu
- */
-@ExtendWith(MockitoExtension.class)
-public class AssemblyClientPreHookTest {
-
- private static MockedStatic mockedApplicationContextAwareUtils;
- @InjectMocks
- private AssemblyClientPreHook assemblyClientPreHook;
- @Mock
- private AssemblyAPI assemblyAPI;
-
- @BeforeAll
- static void beforeAll() {
- mockedApplicationContextAwareUtils = Mockito.mockStatic(ApplicationContextAwareUtils.class);
- mockedApplicationContextAwareUtils.when(() -> ApplicationContextAwareUtils.getProperties(anyString()))
- .thenReturn("unit-test");
- ApplicationContext applicationContext = mock(ApplicationContext.class);
- RpcEnhancementReporterProperties reporterProperties = mock(RpcEnhancementReporterProperties.class);
- doReturn(reporterProperties)
- .when(applicationContext).getBean(RpcEnhancementReporterProperties.class);
- mockedApplicationContextAwareUtils.when(ApplicationContextAwareUtils::getApplicationContext)
- .thenReturn(applicationContext);
- }
-
- @AfterAll
- static void afterAll() {
- mockedApplicationContextAwareUtils.close();
- }
-
- @BeforeEach
- void setUp() {
- MetadataContext.LOCAL_NAMESPACE = NAMESPACE_TEST;
- MetadataContext.LOCAL_SERVICE = SERVICE_PROVIDER;
- }
-
- @Test
- public void testGetName() {
- assertThat(assemblyClientPreHook.getName()).isEqualTo(AssemblyClientPreHook.class.getName());
- }
-
- @Test
- public void testType() {
- assertThat(assemblyClientPreHook.getType()).isEqualTo(EnhancedPluginType.Client.PRE);
- }
-
- @Test
- public void testRun() {
- EnhancedPluginContext pluginContext = new EnhancedPluginContext();
- EnhancedRequestContext request = EnhancedRequestContext.builder()
- .httpMethod(HttpMethod.GET)
- .url(URI.create("http://0.0.0.0/"))
- .httpHeaders(new HttpHeaders())
- .build();
- request.toString();
- EnhancedResponseContext response = EnhancedResponseContext.builder()
- .httpStatus(200)
- .build();
- response.toString();
-
- DefaultServiceInstance targetServiceInstance = new DefaultServiceInstance();
- targetServiceInstance.setServiceId(SERVICE_PROVIDER);
-
- DefaultServiceInstance localServiceInstance = new DefaultServiceInstance();
- localServiceInstance.setServiceId(SERVICE_PROVIDER);
-
- pluginContext.setRequest(request);
- pluginContext.setResponse(response);
- pluginContext.setTargetServiceInstance(targetServiceInstance, null);
- pluginContext.setLocalServiceInstance(localServiceInstance);
- pluginContext.setThrowable(new RuntimeException());
-
- assemblyClientPreHook.run(pluginContext);
- assemblyClientPreHook.getOrder();
- assemblyClientPreHook.getName();
- assemblyClientPreHook.getType();
- }
-
- @Test
- public void testHandlerThrowable() {
- // mock request
- EnhancedRequestContext request = mock(EnhancedRequestContext.class);
- // mock response
- EnhancedResponseContext response = mock(EnhancedResponseContext.class);
-
- EnhancedPluginContext context = new EnhancedPluginContext();
- context.setRequest(request);
- context.setResponse(response);
- assemblyClientPreHook.handlerThrowable(context, new RuntimeException("Mock exception."));
- }
-
-}
diff --git a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyMetadataProviderTest.java b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyMetadataProviderTest.java
deleted file mode 100644
index ed94bb3cc..000000000
--- a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyMetadataProviderTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
- *
- * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
- *
- * Licensed under the BSD 3-Clause License (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://opensource.org/licenses/BSD-3-Clause
- *
- * Unless required by applicable law or agreed to in writing, software distributed
- * under the License is distributed on an "AS IS" BASIS, WITHOUT 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 com.tencent.cloud.rpc.enhancement.plugin;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import com.tencent.cloud.rpc.enhancement.plugin.assembly.AssemblyMetadataProvider;
-import com.tencent.polaris.api.pojo.ServiceKey;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.Mockito;
-import org.mockito.junit.jupiter.MockitoExtension;
-
-import org.springframework.cloud.client.ServiceInstance;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.doReturn;
-
-/**
- * AssemblyMetadataProviderTest.
- *
- * @author sean yu
- */
-@ExtendWith(MockitoExtension.class)
-public class AssemblyMetadataProviderTest {
-
- @Test
- public void testAssemblyMetadataProvider() {
- ServiceInstance serviceInstance = Mockito.mock(ServiceInstance.class);
- Map metadata = new HashMap<>() {{
- put("k", "v");
- }};
- doReturn(metadata).when(serviceInstance).getMetadata();
- doReturn("0.0.0.0").when(serviceInstance).getHost();
- doReturn("test").when(serviceInstance).getServiceId();
- AssemblyMetadataProvider assemblyMetadataProvider = new AssemblyMetadataProvider(serviceInstance, "test");
- assertThat(assemblyMetadataProvider.getMetadata("k")).isEqualTo("v");
- assertThat(assemblyMetadataProvider.getLocalIp()).isEqualTo("0.0.0.0");
- assertThat(assemblyMetadataProvider.getLocalService()).isEqualTo(new ServiceKey("test", "test"));
- }
-}
diff --git a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyRequestContextTest.java b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyRequestContextTest.java
deleted file mode 100644
index de8f7f17f..000000000
--- a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyRequestContextTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
- *
- * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
- *
- * Licensed under the BSD 3-Clause License (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://opensource.org/licenses/BSD-3-Clause
- *
- * Unless required by applicable law or agreed to in writing, software distributed
- * under the License is distributed on an "AS IS" BASIS, WITHOUT 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 com.tencent.cloud.rpc.enhancement.plugin;
-
-import java.net.URI;
-import java.util.Arrays;
-import java.util.HashSet;
-
-import com.tencent.cloud.rpc.enhancement.plugin.assembly.AssemblyRequestContext;
-import com.tencent.polaris.api.pojo.ServiceKey;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.junit.jupiter.MockitoExtension;
-
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpMethod;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-/**
- * AssemblyRequestContextTest.
- *
- * @author sean yu
- */
-@ExtendWith(MockitoExtension.class)
-public class AssemblyRequestContextTest {
-
- @Test
- public void testAssemblyRequestContext() {
- URI uri = URI.create("http://0.0.0.0/");
-
- HttpHeaders httpHeaders = new HttpHeaders();
- httpHeaders.add("a", "a");
- httpHeaders.add(HttpHeaders.COOKIE, "cookies-k1=cookies-v1;cookies-k2=cookies-v2");
-
- EnhancedRequestContext enhancedRequestContext = EnhancedRequestContext.builder()
- .httpMethod(HttpMethod.GET)
- .url(uri)
- .httpHeaders(httpHeaders)
- .build();
-
- ServiceKey callerService = new ServiceKey("test", "test");
- AssemblyRequestContext assemblyRequestContext = new AssemblyRequestContext(
- enhancedRequestContext,
- callerService,
- "0.0.0.0"
- );
-
- assertThat(assemblyRequestContext.getURI()).isEqualTo(uri);
-
- assertThat(assemblyRequestContext.getHeader("a")).isEqualTo("a");
- assemblyRequestContext.setHeader("b", "b");
- assertThat(assemblyRequestContext.listHeaderKeys()).isEqualTo(new HashSet<>(Arrays.asList(HttpHeaders.COOKIE, "a", "b")));
-
- assertThat(assemblyRequestContext.getMethod()).isEqualTo(HttpMethod.GET.toString());
- assemblyRequestContext.setMethod(HttpMethod.OPTIONS.name());
- assertThat(assemblyRequestContext.getMethod()).isEqualTo(HttpMethod.OPTIONS.toString());
-
- assertThat(assemblyRequestContext.getCookie("cookies-k1")).isEqualTo("cookies-v1");
- assertThat(assemblyRequestContext.getCookie("cookies-k2")).isEqualTo("cookies-v2");
- assemblyRequestContext.setCookie("cookies-k3", "cookies-v3");
- assertThat(assemblyRequestContext.listCookieKeys()).isEqualTo(new HashSet<>(Arrays.asList("cookies-k1", "cookies-k2", "cookies-k3")));
-
- assertThat(assemblyRequestContext.getCallerService()).isEqualTo(callerService);
- assertThat(assemblyRequestContext.getCallerIp()).isEqualTo("0.0.0.0");
- }
-
-}
diff --git a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyResponseContextTest.java b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyResponseContextTest.java
deleted file mode 100644
index c428e3a21..000000000
--- a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyResponseContextTest.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
- *
- * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
- *
- * Licensed under the BSD 3-Clause License (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://opensource.org/licenses/BSD-3-Clause
- *
- * Unless required by applicable law or agreed to in writing, software distributed
- * under the License is distributed on an "AS IS" BASIS, WITHOUT 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 com.tencent.cloud.rpc.enhancement.plugin;
-
-import java.net.SocketTimeoutException;
-import java.util.HashSet;
-import java.util.List;
-
-import com.tencent.cloud.common.util.ApplicationContextAwareUtils;
-import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementReporterProperties;
-import com.tencent.cloud.rpc.enhancement.plugin.assembly.AssemblyResponseContext;
-import com.tencent.polaris.api.pojo.RetStatus;
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.MockedStatic;
-import org.mockito.Mockito;
-import org.mockito.junit.jupiter.MockitoExtension;
-
-import org.springframework.context.ApplicationContext;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpStatus;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-
-/**
- * AssemblyResponseContextTest.
- *
- * @author sean yu
- */
-@ExtendWith(MockitoExtension.class)
-public class AssemblyResponseContextTest {
-
- private static MockedStatic mockedApplicationContextAwareUtils;
-
- @BeforeAll
- static void beforeAll() {
- mockedApplicationContextAwareUtils = Mockito.mockStatic(ApplicationContextAwareUtils.class);
- mockedApplicationContextAwareUtils.when(() -> ApplicationContextAwareUtils.getProperties(anyString()))
- .thenReturn("unit-test");
- ApplicationContext applicationContext = mock(ApplicationContext.class);
- RpcEnhancementReporterProperties reporterProperties = mock(RpcEnhancementReporterProperties.class);
- doReturn(reporterProperties)
- .when(applicationContext).getBean(RpcEnhancementReporterProperties.class);
- mockedApplicationContextAwareUtils.when(ApplicationContextAwareUtils::getApplicationContext)
- .thenReturn(applicationContext);
- }
-
- @AfterAll
- static void afterAll() {
- mockedApplicationContextAwareUtils.close();
- }
-
- @Test
- public void testAssemblyResponseContext() {
-
- HttpHeaders httpHeaders = new HttpHeaders();
- httpHeaders.add("a", "a");
-
- EnhancedResponseContext enhancedResponseContext = EnhancedResponseContext.builder()
- .httpHeaders(httpHeaders)
- .httpStatus(HttpStatus.OK.value())
- .build();
-
- AssemblyResponseContext assemblyResponseContext = new AssemblyResponseContext(enhancedResponseContext, null);
- assertThat(assemblyResponseContext.getHeader("a")).isEqualTo("a");
- assertThat(assemblyResponseContext.getRetCode()).isEqualTo(HttpStatus.OK.value());
- assertThat(assemblyResponseContext.getThrowable()).isEqualTo(null);
- assertThat(assemblyResponseContext.getRetStatus()).isEqualTo(RetStatus.RetSuccess);
- assertThat(assemblyResponseContext.listHeaders()).isEqualTo(new HashSet<>(List.of("a")));
-
- Throwable e = new SocketTimeoutException();
- assemblyResponseContext = new AssemblyResponseContext(null, e);
- assertThat(assemblyResponseContext.getHeader("a")).isEqualTo(null);
- assertThat(assemblyResponseContext.getRetCode()).isEqualTo(null);
- assertThat(assemblyResponseContext.getThrowable()).isEqualTo(e);
- assertThat(assemblyResponseContext.getRetStatus()).isEqualTo(RetStatus.RetTimeout);
- assertThat(assemblyResponseContext.listHeaders()).isEqualTo(null);
-
- }
-
-}
diff --git a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyServerExceptionHookTest.java b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyServerExceptionHookTest.java
deleted file mode 100644
index ff04c578a..000000000
--- a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyServerExceptionHookTest.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
- *
- * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
- *
- * Licensed under the BSD 3-Clause License (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://opensource.org/licenses/BSD-3-Clause
- *
- * Unless required by applicable law or agreed to in writing, software distributed
- * under the License is distributed on an "AS IS" BASIS, WITHOUT 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 com.tencent.cloud.rpc.enhancement.plugin;
-
-import java.net.URI;
-
-import com.tencent.cloud.common.metadata.MetadataContext;
-import com.tencent.cloud.common.util.ApplicationContextAwareUtils;
-import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementReporterProperties;
-import com.tencent.cloud.rpc.enhancement.plugin.assembly.server.AssemblyServerExceptionHook;
-import com.tencent.polaris.assembly.api.AssemblyAPI;
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.MockedStatic;
-import org.mockito.Mockito;
-import org.mockito.junit.jupiter.MockitoExtension;
-
-import org.springframework.cloud.client.DefaultServiceInstance;
-import org.springframework.context.ApplicationContext;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpMethod;
-
-import static com.tencent.polaris.test.common.Consts.NAMESPACE_TEST;
-import static com.tencent.polaris.test.common.Consts.SERVICE_PROVIDER;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-
-/**
- * AssemblyServerExceptionHookTest.
- *
- * @author sean yu
- */
-@ExtendWith(MockitoExtension.class)
-public class AssemblyServerExceptionHookTest {
-
- private static MockedStatic mockedApplicationContextAwareUtils;
- @InjectMocks
- private AssemblyServerExceptionHook assemblyServerExceptionHook;
- @Mock
- private AssemblyAPI assemblyAPI;
-
- @BeforeAll
- static void beforeAll() {
- mockedApplicationContextAwareUtils = Mockito.mockStatic(ApplicationContextAwareUtils.class);
- mockedApplicationContextAwareUtils.when(() -> ApplicationContextAwareUtils.getProperties(anyString()))
- .thenReturn("unit-test");
- ApplicationContext applicationContext = mock(ApplicationContext.class);
- RpcEnhancementReporterProperties reporterProperties = mock(RpcEnhancementReporterProperties.class);
- doReturn(reporterProperties)
- .when(applicationContext).getBean(RpcEnhancementReporterProperties.class);
- mockedApplicationContextAwareUtils.when(ApplicationContextAwareUtils::getApplicationContext)
- .thenReturn(applicationContext);
- }
-
- @AfterAll
- static void afterAll() {
- mockedApplicationContextAwareUtils.close();
- }
-
- @BeforeEach
- void setUp() {
- MetadataContext.LOCAL_NAMESPACE = NAMESPACE_TEST;
- MetadataContext.LOCAL_SERVICE = SERVICE_PROVIDER;
- }
-
- @Test
- public void testGetName() {
- assertThat(assemblyServerExceptionHook.getName()).isEqualTo(AssemblyServerExceptionHook.class.getName());
- }
-
- @Test
- public void testType() {
- assertThat(assemblyServerExceptionHook.getType()).isEqualTo(EnhancedPluginType.Server.EXCEPTION);
- }
-
- @Test
- public void testRun() {
- EnhancedPluginContext pluginContext = new EnhancedPluginContext();
- EnhancedRequestContext request = EnhancedRequestContext.builder()
- .httpMethod(HttpMethod.GET)
- .url(URI.create("http://0.0.0.0/"))
- .httpHeaders(new HttpHeaders())
- .build();
- request.toString();
- EnhancedResponseContext response = EnhancedResponseContext.builder()
- .httpStatus(200)
- .build();
- response.toString();
-
- DefaultServiceInstance targetServiceInstance = new DefaultServiceInstance();
- targetServiceInstance.setServiceId(SERVICE_PROVIDER);
-
- DefaultServiceInstance localServiceInstance = new DefaultServiceInstance();
- localServiceInstance.setServiceId(SERVICE_PROVIDER);
-
- pluginContext.setRequest(request);
- pluginContext.setResponse(response);
- pluginContext.setTargetServiceInstance(targetServiceInstance, null);
- pluginContext.setLocalServiceInstance(localServiceInstance);
- pluginContext.setThrowable(new RuntimeException());
-
- assemblyServerExceptionHook.run(pluginContext);
- assemblyServerExceptionHook.getOrder();
- assemblyServerExceptionHook.getName();
- assemblyServerExceptionHook.getType();
- }
-
- @Test
- public void testHandlerThrowable() {
- // mock request
- EnhancedRequestContext request = mock(EnhancedRequestContext.class);
- // mock response
- EnhancedResponseContext response = mock(EnhancedResponseContext.class);
-
- EnhancedPluginContext context = new EnhancedPluginContext();
- context.setRequest(request);
- context.setResponse(response);
- assemblyServerExceptionHook.handlerThrowable(context, new RuntimeException("Mock exception."));
- }
-
-}
diff --git a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyServerPostHookTest.java b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyServerPostHookTest.java
deleted file mode 100644
index a15cd5796..000000000
--- a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyServerPostHookTest.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
- *
- * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
- *
- * Licensed under the BSD 3-Clause License (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://opensource.org/licenses/BSD-3-Clause
- *
- * Unless required by applicable law or agreed to in writing, software distributed
- * under the License is distributed on an "AS IS" BASIS, WITHOUT 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 com.tencent.cloud.rpc.enhancement.plugin;
-
-import java.net.URI;
-
-import com.tencent.cloud.common.metadata.MetadataContext;
-import com.tencent.cloud.common.util.ApplicationContextAwareUtils;
-import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementReporterProperties;
-import com.tencent.cloud.rpc.enhancement.plugin.assembly.server.AssemblyServerPostHook;
-import com.tencent.polaris.assembly.api.AssemblyAPI;
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.MockedStatic;
-import org.mockito.Mockito;
-import org.mockito.junit.jupiter.MockitoExtension;
-
-import org.springframework.cloud.client.DefaultServiceInstance;
-import org.springframework.context.ApplicationContext;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpMethod;
-
-import static com.tencent.polaris.test.common.Consts.NAMESPACE_TEST;
-import static com.tencent.polaris.test.common.Consts.SERVICE_PROVIDER;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-
-/**
- * AssemblyServerPostHookTest.
- *
- * @author sean yu
- */
-@ExtendWith(MockitoExtension.class)
-public class AssemblyServerPostHookTest {
-
- private static MockedStatic mockedApplicationContextAwareUtils;
- @InjectMocks
- private AssemblyServerPostHook assemblyServerPostHook;
- @Mock
- private AssemblyAPI assemblyAPI;
-
- @BeforeAll
- static void beforeAll() {
- mockedApplicationContextAwareUtils = Mockito.mockStatic(ApplicationContextAwareUtils.class);
- mockedApplicationContextAwareUtils.when(() -> ApplicationContextAwareUtils.getProperties(anyString()))
- .thenReturn("unit-test");
- ApplicationContext applicationContext = mock(ApplicationContext.class);
- RpcEnhancementReporterProperties reporterProperties = mock(RpcEnhancementReporterProperties.class);
- doReturn(reporterProperties)
- .when(applicationContext).getBean(RpcEnhancementReporterProperties.class);
- mockedApplicationContextAwareUtils.when(ApplicationContextAwareUtils::getApplicationContext)
- .thenReturn(applicationContext);
- }
-
- @AfterAll
- static void afterAll() {
- mockedApplicationContextAwareUtils.close();
- }
-
- @BeforeEach
- void setUp() {
- MetadataContext.LOCAL_NAMESPACE = NAMESPACE_TEST;
- MetadataContext.LOCAL_SERVICE = SERVICE_PROVIDER;
- }
-
- @Test
- public void testGetName() {
- assertThat(assemblyServerPostHook.getName()).isEqualTo(AssemblyServerPostHook.class.getName());
- }
-
- @Test
- public void testType() {
- assertThat(assemblyServerPostHook.getType()).isEqualTo(EnhancedPluginType.Server.POST);
- }
-
- @Test
- public void testRun() {
- EnhancedPluginContext pluginContext = new EnhancedPluginContext();
- EnhancedRequestContext request = EnhancedRequestContext.builder()
- .httpMethod(HttpMethod.GET)
- .url(URI.create("http://0.0.0.0/"))
- .httpHeaders(new HttpHeaders())
- .build();
- request.toString();
- EnhancedResponseContext response = EnhancedResponseContext.builder()
- .httpStatus(200)
- .build();
- response.toString();
-
- DefaultServiceInstance targetServiceInstance = new DefaultServiceInstance();
- targetServiceInstance.setServiceId(SERVICE_PROVIDER);
-
- DefaultServiceInstance localServiceInstance = new DefaultServiceInstance();
- localServiceInstance.setServiceId(SERVICE_PROVIDER);
-
- pluginContext.setRequest(request);
- pluginContext.setResponse(response);
- pluginContext.setTargetServiceInstance(targetServiceInstance, null);
- pluginContext.setLocalServiceInstance(localServiceInstance);
- pluginContext.setThrowable(new RuntimeException());
-
- assemblyServerPostHook.run(pluginContext);
- assemblyServerPostHook.getOrder();
- assemblyServerPostHook.getName();
- assemblyServerPostHook.getType();
- }
-
- @Test
- public void testHandlerThrowable() {
- // mock request
- EnhancedRequestContext request = mock(EnhancedRequestContext.class);
- // mock response
- EnhancedResponseContext response = mock(EnhancedResponseContext.class);
-
- EnhancedPluginContext context = new EnhancedPluginContext();
- context.setRequest(request);
- context.setResponse(response);
- assemblyServerPostHook.handlerThrowable(context, new RuntimeException("Mock exception."));
- }
-
-}
diff --git a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyServerPreHookTest.java b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyServerPreHookTest.java
deleted file mode 100644
index 8bfe4c9a0..000000000
--- a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/AssemblyServerPreHookTest.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
- *
- * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
- *
- * Licensed under the BSD 3-Clause License (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://opensource.org/licenses/BSD-3-Clause
- *
- * Unless required by applicable law or agreed to in writing, software distributed
- * under the License is distributed on an "AS IS" BASIS, WITHOUT 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 com.tencent.cloud.rpc.enhancement.plugin;
-
-import java.net.URI;
-
-import com.tencent.cloud.common.metadata.MetadataContext;
-import com.tencent.cloud.common.util.ApplicationContextAwareUtils;
-import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementReporterProperties;
-import com.tencent.cloud.rpc.enhancement.plugin.assembly.server.AssemblyServerPreHook;
-import com.tencent.polaris.assembly.api.AssemblyAPI;
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.MockedStatic;
-import org.mockito.Mockito;
-import org.mockito.junit.jupiter.MockitoExtension;
-
-import org.springframework.cloud.client.DefaultServiceInstance;
-import org.springframework.context.ApplicationContext;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpMethod;
-
-import static com.tencent.polaris.test.common.Consts.NAMESPACE_TEST;
-import static com.tencent.polaris.test.common.Consts.SERVICE_PROVIDER;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-
-/**
- * AssemblyServerPreHookTest.
- *
- * @author sean yu
- */
-@ExtendWith(MockitoExtension.class)
-public class AssemblyServerPreHookTest {
-
- private static MockedStatic mockedApplicationContextAwareUtils;
- @InjectMocks
- private AssemblyServerPreHook assemblyServerPreHook;
- @Mock
- private AssemblyAPI assemblyAPI;
-
- @BeforeAll
- static void beforeAll() {
- mockedApplicationContextAwareUtils = Mockito.mockStatic(ApplicationContextAwareUtils.class);
- mockedApplicationContextAwareUtils.when(() -> ApplicationContextAwareUtils.getProperties(anyString()))
- .thenReturn("unit-test");
- ApplicationContext applicationContext = mock(ApplicationContext.class);
- RpcEnhancementReporterProperties reporterProperties = mock(RpcEnhancementReporterProperties.class);
- doReturn(reporterProperties)
- .when(applicationContext).getBean(RpcEnhancementReporterProperties.class);
- mockedApplicationContextAwareUtils.when(ApplicationContextAwareUtils::getApplicationContext)
- .thenReturn(applicationContext);
- }
-
- @AfterAll
- static void afterAll() {
- mockedApplicationContextAwareUtils.close();
- }
-
- @BeforeEach
- void setUp() {
- MetadataContext.LOCAL_NAMESPACE = NAMESPACE_TEST;
- MetadataContext.LOCAL_SERVICE = SERVICE_PROVIDER;
- }
-
- @Test
- public void testGetName() {
- assertThat(assemblyServerPreHook.getName()).isEqualTo(AssemblyServerPreHook.class.getName());
- }
-
- @Test
- public void testType() {
- assertThat(assemblyServerPreHook.getType()).isEqualTo(EnhancedPluginType.Server.PRE);
- }
-
- @Test
- public void testRun() {
- EnhancedPluginContext pluginContext = new EnhancedPluginContext();
- EnhancedRequestContext request = EnhancedRequestContext.builder()
- .httpMethod(HttpMethod.GET)
- .url(URI.create("http://0.0.0.0/"))
- .httpHeaders(new HttpHeaders())
- .build();
- request.toString();
- EnhancedResponseContext response = EnhancedResponseContext.builder()
- .httpStatus(200)
- .build();
- response.toString();
-
- DefaultServiceInstance targetServiceInstance = new DefaultServiceInstance();
- targetServiceInstance.setServiceId(SERVICE_PROVIDER);
-
- DefaultServiceInstance localServiceInstance = new DefaultServiceInstance();
- localServiceInstance.setServiceId(SERVICE_PROVIDER);
-
- pluginContext.setRequest(request);
- pluginContext.setResponse(response);
- pluginContext.setTargetServiceInstance(targetServiceInstance, null);
- pluginContext.setLocalServiceInstance(localServiceInstance);
- pluginContext.setThrowable(new RuntimeException());
-
- assemblyServerPreHook.run(pluginContext);
- assemblyServerPreHook.getOrder();
- assemblyServerPreHook.getName();
- assemblyServerPreHook.getType();
- }
-
- @Test
- public void testHandlerThrowable() {
- // mock request
- EnhancedRequestContext request = mock(EnhancedRequestContext.class);
- // mock response
- EnhancedResponseContext response = mock(EnhancedResponseContext.class);
-
- EnhancedPluginContext context = new EnhancedPluginContext();
- context.setRequest(request);
- context.setResponse(response);
- assemblyServerPreHook.handlerThrowable(context, new RuntimeException("Mock exception."));
- }
-
-}