From d7e24b32ac14025e4007b71fedb00e371638e1c4 Mon Sep 17 00:00:00 2001
From: Haotian Zhang <928016560@qq.com>
Date: Fri, 22 Sep 2023 19:32:10 +0800
Subject: [PATCH 1/2] feat:support service contract reporting.
---
CHANGELOG.md | 3 +-
pom.xml | 1 +
spring-cloud-starter-tencent-all/pom.xml | 22 +-
.../adapter/PolarisConfigFileLocator.java | 4 +-
.../PolarisConfigPropertyAutoRefresher.java | 4 +-
.../pom.xml | 69 ++++++
.../contract/PolarisContractReporter.java | 150 ++++++++++++
.../PolarisSwaggerApplicationListener.java | 35 +++
.../polaris/contract/SwaggerContext.java | 36 +++
.../contract/config/ContractProperties.java | 46 ++++
.../config/ExtendedContractProperties.java | 26 +++
.../config/PolarisContractModifier.java | 52 +++++
.../config/PolarisContractProperties.java | 122 ++++++++++
...isContractPropertiesAutoConfiguration.java | 54 +++++
...tractPropertiesBootstrapConfiguration.java | 34 +++
.../PolarisSwaggerAutoConfiguration.java | 142 ++++++++++++
.../polaris/contract/utils/PackageUtil.java | 214 ++++++++++++++++++
...WebMvcPatternsRequestConditionWrapper.java | 85 +++++++
.../spring/web/WebMvcRequestHandler.java | 172 ++++++++++++++
.../main/resources/META-INF/spring.factories | 7 +
.../polaris/PolarisDiscoveryProperties.java | 2 +-
.../cloud/common/constant/OrderConstant.java | 5 +
spring-cloud-tencent-coverage/pom.xml | 6 +-
spring-cloud-tencent-dependencies/pom.xml | 26 +++
.../discovery-caller-service/pom.xml | 5 +
.../caller/DiscoveryCallerController.java | 2 +-
.../RpcEnhancementAutoConfiguration.java | 36 ---
.../plugin/PluginOrderConstant.java | 22 --
.../assembly/AssemblyMetadataProvider.java | 56 -----
.../assembly/AssemblyRequestContext.java | 126 -----------
.../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 ------------
46 files changed, 1311 insertions(+), 1904 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/utils/PackageUtil.java
create mode 100644 spring-cloud-starter-tencent-polaris-contract/src/main/java/springfox/documentation/spring/web/WebMvcPatternsRequestConditionWrapper.java
create mode 100644 spring-cloud-starter-tencent-polaris-contract/src/main/java/springfox/documentation/spring/web/WebMvcRequestHandler.java
create mode 100644 spring-cloud-starter-tencent-polaris-contract/src/main/resources/META-INF/spring.factories
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/CHANGELOG.md b/CHANGELOG.md
index 241575198..d61a882fa 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,4 +7,5 @@
- [Refactoring:remove invalid @AutoConfigureAfter and @AutoConfigureBefore from discovery client automatic configuration.](https://github.com/Tencent/spring-cloud-tencent/pull/1115)
- [feat: support log path configuration parameters.](https://github.com/Tencent/spring-cloud-tencent/pull/1128)
- [refactor:optimize the order and condition matching of service registration automatic configuration.](https://github.com/Tencent/spring-cloud-tencent/pull/1129)
-- [feat: add circuit breaker actuator.](https://github.com/Tencent/spring-cloud-tencent/pull/1136)
\ No newline at end of file
+- [feat: add circuit breaker actuator.](https://github.com/Tencent/spring-cloud-tencent/pull/1136)
+- [feat:support service contract reporting.](https://github.com/Tencent/spring-cloud-tencent/pull/1139)
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index dab311801..09ad0369b 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..c17c92b32
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-contract/pom.xml
@@ -0,0 +1,69 @@
+
+
+
+ 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
+
+
+
+
+ io.springfox
+ springfox-boot-starter
+
+
+ swagger-models
+ io.swagger
+
+
+ swagger-annotations
+ io.swagger
+
+
+
+
+
+ io.swagger
+ swagger-models
+
+
+
+ io.swagger
+ swagger-annotations
+
+
+
+ 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..dd421b45b
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/PolarisContractReporter.java
@@ -0,0 +1,150 @@
+/*
+ * 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.models.HttpMethod;
+import io.swagger.models.Operation;
+import io.swagger.models.Path;
+import io.swagger.models.Swagger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import springfox.documentation.service.Documentation;
+import springfox.documentation.spring.web.DocumentationCache;
+import springfox.documentation.spring.web.json.JsonSerializer;
+import springfox.documentation.swagger2.mappers.ServiceModelToSwagger2Mapper;
+
+import org.springframework.boot.context.event.ApplicationReadyEvent;
+import org.springframework.context.ApplicationListener;
+import org.springframework.lang.NonNull;
+import org.springframework.util.CollectionUtils;
+
+public class PolarisContractReporter implements ApplicationListener {
+
+ private final Logger LOG = LoggerFactory.getLogger(PolarisContractReporter.class);
+ private final ServiceModelToSwagger2Mapper swagger2Mapper;
+ private final DocumentationCache documentationCache;
+ private final JsonSerializer jsonSerializer;
+ private final String groupName;
+
+ private final ProviderAPI providerAPI;
+
+ private final PolarisDiscoveryProperties polarisDiscoveryProperties;
+
+ public PolarisContractReporter(DocumentationCache documentationCache, ServiceModelToSwagger2Mapper swagger2Mapper,
+ JsonSerializer jsonSerializer, String groupName, ProviderAPI providerAPI,
+ PolarisDiscoveryProperties polarisDiscoveryProperties) {
+ this.swagger2Mapper = swagger2Mapper;
+ this.documentationCache = documentationCache;
+ this.jsonSerializer = jsonSerializer;
+ this.groupName = groupName;
+ this.providerAPI = providerAPI;
+ this.polarisDiscoveryProperties = polarisDiscoveryProperties;
+ }
+
+ @Override
+ public void onApplicationEvent(@NonNull ApplicationReadyEvent applicationReadyEvent) {
+ try {
+ Documentation documentation = documentationCache.documentationByGroup(groupName);
+ Swagger swagger = swagger2Mapper.mapDocumentation(documentation);
+ if (swagger != 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(swagger);
+ 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(swagger);
+ LOG.debug("OpenApi json data: {}", jsonValue);
+ }
+ }
+ else {
+ LOG.warn("Swagger or json is null, documentationCache keys:{}, group:{}", documentationCache.all()
+ .keySet(), groupName);
+ }
+ }
+ catch (Throwable t) {
+ LOG.error("Report contract failed.", t);
+ }
+ }
+
+ private List getInterfaceDescriptorFromSwagger(Swagger swagger) {
+ List interfaceDescriptorList = new ArrayList<>();
+ Map paths = swagger.getPaths();
+ for (Map.Entry p : paths.entrySet()) {
+ Path 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(Path path) {
+ Map operationMap = new HashMap<>();
+
+ if (path.getGet() != null) {
+ operationMap.put(HttpMethod.GET.name(), path.getGet());
+ }
+ if (path.getPut() != null) {
+ operationMap.put(HttpMethod.PUT.name(), path.getPut());
+ }
+ if (path.getPost() != null) {
+ operationMap.put(HttpMethod.POST.name(), path.getPost());
+ }
+ if (path.getHead() != null) {
+ operationMap.put(HttpMethod.HEAD.name(), path.getHead());
+ }
+ if (path.getDelete() != null) {
+ operationMap.put(HttpMethod.DELETE.name(), path.getDelete());
+ }
+ if (path.getPatch() != null) {
+ operationMap.put(HttpMethod.PATCH.name(), path.getPatch());
+ }
+ if (path.getOptions() != null) {
+ operationMap.put(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..32970b067
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/config/ContractProperties.java
@@ -0,0 +1,46 @@
+/*
+ * 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);
+}
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..edafa77fc
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/config/PolarisContractProperties.java
@@ -0,0 +1,122 @@
+/*
+ * 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 = "/**";
+
+ 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;
+ }
+}
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..26e3df589
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/config/PolarisContractPropertiesAutoConfiguration.java
@@ -0,0 +1,54 @@
+/*
+ * 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 javax.annotation.Nullable;
+
+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;
+
+/**
+ * Auto configuration for Polaris contract properties.
+ *
+ * @author Haotian Zhang
+ */
+@Configuration(proxyBeanMethods = false)
+@ConditionalOnPolarisEnabled
+public class PolarisContractPropertiesAutoConfiguration {
+
+ 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
+ @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..6de32368a
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/config/PolarisSwaggerAutoConfiguration.java
@@ -0,0 +1,142 @@
+/*
+ * 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.time.LocalDate;
+import java.util.Date;
+import java.util.List;
+import java.util.function.Predicate;
+
+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.utils.PackageUtil;
+import springfox.boot.starter.autoconfigure.OpenApiAutoConfiguration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.service.Contact;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.DocumentationCache;
+import springfox.documentation.spring.web.json.JsonSerializer;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.mappers.ServiceModelToSwagger2Mapper;
+
+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;
+
+@Configuration(proxyBeanMethods = false)
+@ConditionalOnPolarisEnabled
+@ConditionalOnProperty(name = "spring.cloud.polaris.contract.enabled", havingValue = "true", matchIfMissing = true)
+@Import(OpenApiAutoConfiguration.class)
+public class PolarisSwaggerAutoConfiguration {
+
+
+ @Bean
+ public Docket polarisDocket(PolarisContractProperties polarisContractProperties) {
+ List> excludePathList = PackageUtil.getExcludePathPredicates(polarisContractProperties.getExcludePath());
+ List> basePathList = PackageUtil.getBasePathPredicates(polarisContractProperties.getBasePath());
+ String basePackage = PackageUtil.scanPackage(polarisContractProperties.getBasePackage());
+
+ Predicate basePathListOr = null;
+ for (Predicate basePathPredicate : basePathList) {
+ if (basePathListOr == null) {
+ basePathListOr = basePathPredicate;
+ }
+ else {
+ basePathListOr = basePathListOr.or(basePathPredicate);
+ }
+ }
+
+ Predicate excludePathListOr = null;
+ for (Predicate excludePathPredicate : excludePathList) {
+ if (excludePathListOr == null) {
+ excludePathListOr = excludePathPredicate;
+ }
+ else {
+ excludePathListOr = excludePathListOr.or(excludePathPredicate);
+ }
+ }
+
+ Predicate pathsPredicate = basePathListOr;
+
+ if (excludePathListOr != null) {
+ excludePathListOr = excludePathListOr.negate();
+ pathsPredicate = pathsPredicate.and(excludePathListOr);
+ }
+
+ return new Docket(DocumentationType.SWAGGER_2)
+ .select()
+ .apis(PackageUtil.basePackage(basePackage))
+ .paths(pathsPredicate)
+ .build()
+ .groupName(polarisContractProperties.getGroup())
+ .enable(polarisContractProperties.isEnabled())
+ .directModelSubstitute(LocalDate.class, Date.class)
+ .apiInfo(new ApiInfoBuilder()
+ .title("Polaris Swagger API")
+ .description("This is to show polaris api description.")
+ .license("BSD-3-Clause")
+ .licenseUrl("https://opensource.org/licenses/BSD-3-Clause")
+ .termsOfServiceUrl("")
+ .version("1.0.0")
+ .contact(new Contact("", "", ""))
+ .build());
+ }
+
+ @Bean
+ @ConditionalOnBean(Docket.class)
+ @ConditionalOnMissingBean
+ public PolarisContractReporter polarisApiMetadataGrapher(DocumentationCache documentationCache,
+ ServiceModelToSwagger2Mapper swagger2Mapper, JsonSerializer jsonSerializer,
+ PolarisContractProperties polarisContractProperties, PolarisSDKContextManager polarisSDKContextManager,
+ PolarisDiscoveryProperties polarisDiscoveryProperties) {
+ return new PolarisContractReporter(documentationCache, swagger2Mapper, jsonSerializer,
+ 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 {
+
+ }
+
+ /**
+ * Create when web application type is REACTIVE.
+ */
+ @Configuration(proxyBeanMethods = false)
+ @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)
+ protected static class SwaggerReactiveConfig {
+
+
+ }
+}
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..7ce8a7ec2
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-contract/src/main/java/com/tencent/cloud/polaris/contract/utils/PackageUtil.java
@@ -0,0 +1,214 @@
+/*
+ * 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.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.function.Predicate;
+
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
+import com.tencent.cloud.polaris.contract.SwaggerContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import springfox.documentation.RequestHandler;
+import springfox.documentation.builders.PathSelectors;
+
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.util.StringUtils;
+
+import static com.google.common.base.Optional.fromNullable;
+
+/**
+ * Util for package processing.
+ *
+ * @author Haotian Zhang
+ */
+public final class PackageUtil {
+
+ private static final Logger LOG = LoggerFactory.getLogger(PackageUtil.class);
+
+ private static final String SPLITTER = ",";
+
+
+ private PackageUtil() {
+ }
+
+ public static Predicate basePackage(String basePackage) {
+ return input -> declaringClass(input).transform(handlerPackage(basePackage, SPLITTER)).or(false);
+ }
+
+ public static Optional> declaringClass(RequestHandler input) {
+ if (input == null) {
+ return Optional.absent();
+ }
+ return fromNullable(input.declaringClass());
+ }
+
+ public static Function, Boolean> handlerPackage(String basePackage, String splitter) {
+ return input -> {
+ try {
+ if (StringUtils.isEmpty(basePackage)) {
+ return false;
+ }
+ String[] packages = basePackage.trim().split(splitter);
+ // Loop to determine matching
+ for (String strPackage : packages) {
+ if (input == null) {
+ continue;
+ }
+ Package pkg = input.getPackage();
+ if (pkg == null) {
+ continue;
+ }
+ String name = pkg.getName();
+ if (StringUtils.isEmpty(name)) {
+ continue;
+ }
+ boolean isMatch = name.startsWith(strPackage);
+ if (isMatch) {
+ return true;
+ }
+ }
+ }
+ catch (Exception e) {
+ LOG.error("handler package error", e);
+ }
+ return false;
+ };
+ }
+
+ public static List> getExcludePathPredicates(String excludePath) {
+ List> excludePathList = new ArrayList<>();
+ if (StringUtils.isEmpty(excludePath)) {
+ return excludePathList;
+ }
+ String[] exs = excludePath.split(SPLITTER);
+ for (String ex : exs) {
+ if (!StringUtils.isEmpty(ex)) {
+ excludePathList.add(PathSelectors.ant(ex));
+ }
+ }
+ return excludePathList;
+ }
+
+ public static List> getBasePathPredicates(String basePath) {
+ List> basePathList = new ArrayList<>();
+ if (!StringUtils.isEmpty(basePath)) {
+ String[] bps = basePath.split(SPLITTER);
+ for (String bp : bps) {
+ if (!StringUtils.isEmpty(bp)) {
+ basePathList.add(PathSelectors.ant(bp));
+ }
+ }
+ }
+ if (basePathList.isEmpty()) {
+ basePathList.add(PathSelectors.ant("/**"));
+ }
+ return basePathList;
+ }
+
+ 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/springfox/documentation/spring/web/WebMvcPatternsRequestConditionWrapper.java b/spring-cloud-starter-tencent-polaris-contract/src/main/java/springfox/documentation/spring/web/WebMvcPatternsRequestConditionWrapper.java
new file mode 100644
index 000000000..d92a6d4dd
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-contract/src/main/java/springfox/documentation/spring/web/WebMvcPatternsRequestConditionWrapper.java
@@ -0,0 +1,85 @@
+/*
+ * 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 springfox.documentation.spring.web;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.springframework.web.servlet.mvc.condition.PatternsRequestCondition;
+
+import static springfox.documentation.spring.web.paths.Paths.maybeChompLeadingSlash;
+import static springfox.documentation.spring.web.paths.Paths.maybeChompTrailingSlash;
+
+public class WebMvcPatternsRequestConditionWrapper
+ implements springfox.documentation.spring.wrapper.PatternsRequestCondition {
+ private final String contextPath;
+ private final PatternsRequestCondition condition;
+
+ public WebMvcPatternsRequestConditionWrapper(
+ String contextPath,
+ PatternsRequestCondition condition) {
+
+ this.contextPath = contextPath;
+ this.condition = condition;
+ }
+
+ @Override
+ public springfox.documentation.spring.wrapper.PatternsRequestCondition combine(
+ springfox.documentation.spring.wrapper.PatternsRequestCondition other) {
+ if (other instanceof WebMvcPatternsRequestConditionWrapper && !this.equals(other)) {
+ return new WebMvcPatternsRequestConditionWrapper(
+ contextPath,
+ condition.combine(((WebMvcPatternsRequestConditionWrapper) other).condition));
+ }
+ return this;
+ }
+
+ @Override
+ public Set getPatterns() {
+ // polaris add start
+ if (this.condition == null) {
+ return new HashSet<>();
+ }
+ // polaris add end
+ return this.condition.getPatterns().stream()
+ .map(p -> String.format("%s/%s", maybeChompTrailingSlash(contextPath), maybeChompLeadingSlash(p)))
+ .collect(Collectors.toSet());
+ }
+
+
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof WebMvcPatternsRequestConditionWrapper) {
+ return this.condition.equals(((WebMvcPatternsRequestConditionWrapper) o).condition);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return this.condition.hashCode();
+ }
+
+
+ @Override
+ public String toString() {
+ return this.condition.toString();
+ }
+}
+
diff --git a/spring-cloud-starter-tencent-polaris-contract/src/main/java/springfox/documentation/spring/web/WebMvcRequestHandler.java b/spring-cloud-starter-tencent-polaris-contract/src/main/java/springfox/documentation/spring/web/WebMvcRequestHandler.java
new file mode 100644
index 000000000..5704b3d51
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-contract/src/main/java/springfox/documentation/spring/web/WebMvcRequestHandler.java
@@ -0,0 +1,172 @@
+/*
+ *
+ * Copyright 2016-2017 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ */
+package springfox.documentation.spring.web;
+
+import java.lang.annotation.Annotation;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import java.util.StringJoiner;
+
+import com.fasterxml.classmate.ResolvedType;
+import springfox.documentation.RequestHandler;
+import springfox.documentation.RequestHandlerKey;
+import springfox.documentation.service.ResolvedMethodParameter;
+import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver;
+import springfox.documentation.spring.wrapper.NameValueExpression;
+import springfox.documentation.spring.wrapper.PatternsRequestCondition;
+
+import org.springframework.core.annotation.AnnotationUtils;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
+
+import static java.util.Optional.ofNullable;
+
+public class WebMvcRequestHandler implements RequestHandler {
+ private final String contextPath;
+ private final HandlerMethodResolver methodResolver;
+ private final RequestMappingInfo requestMapping;
+ private final HandlerMethod handlerMethod;
+
+ public WebMvcRequestHandler(
+ String contextPath,
+ HandlerMethodResolver methodResolver,
+ RequestMappingInfo requestMapping,
+ HandlerMethod handlerMethod) {
+ this.contextPath = contextPath;
+ this.methodResolver = methodResolver;
+ this.requestMapping = requestMapping;
+ this.handlerMethod = handlerMethod;
+ }
+
+ @Override
+ public HandlerMethod getHandlerMethod() {
+ return handlerMethod;
+ }
+
+ @Override
+ public RequestHandler combine(RequestHandler other) {
+ return this;
+ }
+
+ @Override
+ public Class> declaringClass() {
+ return handlerMethod.getBeanType();
+ }
+
+ @Override
+ public boolean isAnnotatedWith(Class extends Annotation> annotation) {
+ return null != AnnotationUtils.findAnnotation(handlerMethod.getMethod(), annotation);
+ }
+
+ @Override
+ public PatternsRequestCondition getPatternsCondition() {
+ return new WebMvcPatternsRequestConditionWrapper(
+ contextPath,
+ requestMapping.getPatternsCondition());
+ }
+
+ @Override
+ public String groupName() {
+ return ControllerNamingUtils.controllerNameAsGroup(handlerMethod);
+ }
+
+ @Override
+ public String getName() {
+ return handlerMethod.getMethod().getName();
+ }
+
+ @Override
+ public Set supportedMethods() {
+ return requestMapping.getMethodsCondition().getMethods();
+ }
+
+ @Override
+ public Set produces() {
+ return requestMapping.getProducesCondition().getProducibleMediaTypes();
+ }
+
+ @Override
+ public Set consumes() {
+ return requestMapping.getConsumesCondition().getConsumableMediaTypes();
+ }
+
+ @Override
+ public Set> headers() {
+ return WebMvcNameValueExpressionWrapper.from(requestMapping.getHeadersCondition().getExpressions());
+ }
+
+ @Override
+ public Set> params() {
+ return WebMvcNameValueExpressionWrapper.from(requestMapping.getParamsCondition().getExpressions());
+ }
+
+ @Override
+ public Optional findAnnotation(Class annotation) {
+ return ofNullable(AnnotationUtils.findAnnotation(handlerMethod.getMethod(), annotation));
+ }
+
+ @Override
+ public RequestHandlerKey key() {
+ // polaris add start
+ Set patterns = new HashSet<>();
+ if (requestMapping.getPatternsCondition() != null && requestMapping.getPatternsCondition()
+ .getPatterns() != null) {
+ patterns = requestMapping.getPatternsCondition().getPatterns();
+ }
+ // polaris add end
+ return new RequestHandlerKey(
+ patterns,
+ requestMapping.getMethodsCondition().getMethods(),
+ requestMapping.getConsumesCondition().getConsumableMediaTypes(),
+ requestMapping.getProducesCondition().getProducibleMediaTypes());
+ }
+
+ @Override
+ public springfox.documentation.spring.wrapper.RequestMappingInfo> getRequestMapping() {
+ return new WebMvcRequestMappingInfoWrapper(requestMapping);
+ }
+
+ @Override
+ public List getParameters() {
+ return methodResolver.methodParameters(handlerMethod);
+ }
+
+ @Override
+ public ResolvedType getReturnType() {
+ return methodResolver.methodReturnType(handlerMethod);
+ }
+
+ @Override
+ public Optional findControllerAnnotation(Class annotation) {
+ return ofNullable(AnnotationUtils.findAnnotation(handlerMethod.getBeanType(), annotation));
+ }
+
+ @Override
+ public String toString() {
+ return new StringJoiner(", ", WebMvcRequestHandler.class.getSimpleName() + "{", "}")
+ .add("requestMapping=" + requestMapping)
+ .add("handlerMethod=" + handlerMethod)
+ .add("key=" + key())
+ .toString();
+ }
+}
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..86a23f5be
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-contract/src/main/resources/META-INF/spring.factories
@@ -0,0 +1,7 @@
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+ com.tencent.cloud.polaris.contract.config.PolarisSwaggerAutoConfiguration,\
+ com.tencent.cloud.polaris.contract.config.PolarisContractProperties
+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-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 6cce1e8c6..80852a9dd 100644
--- a/spring-cloud-tencent-dependencies/pom.xml
+++ b/spring-cloud-tencent-dependencies/pom.xml
@@ -76,6 +76,8 @@
1.15.0-SNAPSHOT
32.0.1-jre
1.2.11
+ 3.0.0
+ 1.5.24
4.5.1
1.12.10
3.21.7
@@ -154,6 +156,12 @@
${revision}
+
+ com.tencent.cloud
+ spring-cloud-starter-tencent-polaris-contract
+ ${revision}
+
+
com.tencent.cloud
spring-cloud-starter-tencent-all
@@ -212,6 +220,24 @@
${logback.version}
+
+ io.springfox
+ springfox-boot-starter
+ ${springfox.swagger2.version}
+
+
+
+ io.swagger
+ swagger-models
+ ${io.swagger.version}
+
+
+
+ io.swagger
+ swagger-annotations
+ ${io.swagger.version}
+
+
com.google.protobuf
protobuf-java
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 aadcea9ee..69e5c1e64 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
@@ -28,6 +28,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-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 968d8a0e2..3b52a6ade 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 dfcaa2ed8..000000000
--- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/AssemblyRequestContext.java
+++ /dev/null
@@ -1,126 +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 java.util.stream.Collectors;
-
-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(";")))
- .collect(Collectors.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 8a216977e..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 d3c96e899..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.Arrays;
-import java.util.HashSet;
-
-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<>(Arrays.asList("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."));
- }
-
-}
From 9c0b2e51cd0e0ad0156e8c6dbc0bfe260e8f44f6 Mon Sep 17 00:00:00 2001
From: Haotian Zhang <928016560@qq.com>
Date: Mon, 25 Sep 2023 14:43:30 +0800
Subject: [PATCH 2/2] feat:support service contract reporting.
---
.licenserc.yaml | 2 +-
...isContractPropertiesAutoConfiguration.java | 6 -----
.../PolarisSwaggerAutoConfiguration.java | 5 ++++
...WebMvcPatternsRequestConditionWrapper.java | 25 +++++++++++--------
.../spring/web/WebMvcRequestHandler.java | 3 +++
5 files changed, 24 insertions(+), 17 deletions(-)
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/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
index 26e3df589..d3e0edb35 100644
--- 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
@@ -34,12 +34,6 @@
@ConditionalOnPolarisEnabled
public class PolarisContractPropertiesAutoConfiguration {
- 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
@ConditionalOnMissingBean
public PolarisContractProperties polarisContractProperties(@Nullable ExtendedContractProperties extendedContractProperties) {
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
index 6de32368a..c4c720ea9 100644
--- 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
@@ -51,6 +51,11 @@
@Import(OpenApiAutoConfiguration.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 Docket polarisDocket(PolarisContractProperties polarisContractProperties) {
diff --git a/spring-cloud-starter-tencent-polaris-contract/src/main/java/springfox/documentation/spring/web/WebMvcPatternsRequestConditionWrapper.java b/spring-cloud-starter-tencent-polaris-contract/src/main/java/springfox/documentation/spring/web/WebMvcPatternsRequestConditionWrapper.java
index d92a6d4dd..d2be96b42 100644
--- a/spring-cloud-starter-tencent-polaris-contract/src/main/java/springfox/documentation/spring/web/WebMvcPatternsRequestConditionWrapper.java
+++ b/spring-cloud-starter-tencent-polaris-contract/src/main/java/springfox/documentation/spring/web/WebMvcPatternsRequestConditionWrapper.java
@@ -1,18 +1,20 @@
/*
- * 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.
+ * Copyright 2015 the original author or authors.
*
- * 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
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
*
- * 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 springfox.documentation.spring.web;
@@ -26,6 +28,9 @@
import static springfox.documentation.spring.web.paths.Paths.maybeChompLeadingSlash;
import static springfox.documentation.spring.web.paths.Paths.maybeChompTrailingSlash;
+/**
+ * Modified to be compatible with spring-boot-actuator.
+ */
public class WebMvcPatternsRequestConditionWrapper
implements springfox.documentation.spring.wrapper.PatternsRequestCondition {
private final String contextPath;
diff --git a/spring-cloud-starter-tencent-polaris-contract/src/main/java/springfox/documentation/spring/web/WebMvcRequestHandler.java b/spring-cloud-starter-tencent-polaris-contract/src/main/java/springfox/documentation/spring/web/WebMvcRequestHandler.java
index 5704b3d51..3f58ddcdb 100644
--- a/spring-cloud-starter-tencent-polaris-contract/src/main/java/springfox/documentation/spring/web/WebMvcRequestHandler.java
+++ b/spring-cloud-starter-tencent-polaris-contract/src/main/java/springfox/documentation/spring/web/WebMvcRequestHandler.java
@@ -41,6 +41,9 @@
import static java.util.Optional.ofNullable;
+/**
+ * Modified to be compatible with spring-boot-actuator.
+ */
public class WebMvcRequestHandler implements RequestHandler {
private final String contextPath;
private final HandlerMethodResolver methodResolver;