You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by ni...@apache.org on 2017/12/25 10:36:34 UTC
[incubator-servicecomb-saga] 10/14: added interceptor for rest
template
This is an automated email from the ASF dual-hosted git repository.
ningjiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-saga.git
commit e518e09cb9837fe510bf3fd01f5528338b4e46ef
Author: Eric Lee <da...@huawei.com>
AuthorDate: Sat Dec 23 16:19:18 2017 +0800
added interceptor for rest template
Signed-off-by: Eric Lee <da...@huawei.com>
---
omega/omega-transport/pom.xml | 57 ++++++++++++++++++++++
.../saga/omega/transport/RestTemplateConfig.java | 20 ++++++++
.../TransactionClientHttpRequestInterceptor.java | 27 ++++++++++
.../saga/omega/transport/UniqueIdGenerator.java | 12 +++++
...ransactionClientHttpRequestInterceptorTest.java | 57 ++++++++++++++++++++++
.../omega/transport/UniqueIdGeneratorTest.java | 24 +++++++++
omega/pom.xml | 1 +
7 files changed, 198 insertions(+)
diff --git a/omega/omega-transport/pom.xml b/omega/omega-transport/pom.xml
new file mode 100644
index 0000000..ed501ff
--- /dev/null
+++ b/omega/omega-transport/pom.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <artifactId>omega</artifactId>
+ <groupId>io.servicecomb.saga</groupId>
+ <version>0.0.3-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+
+ <artifactId>omega-transport</artifactId>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-web</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>io.servicecomb.saga</groupId>
+ <artifactId>omega-context</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>io.servicecomb.saga</groupId>
+ <artifactId>saga-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>io.servicecomb.saga</groupId>
+ <artifactId>omega-transaction</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.hamcrest</groupId>
+ <artifactId>hamcrest-all</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-test</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>com.github.tomakehurst</groupId>
+ <artifactId>wiremock-standalone</artifactId>
+ </dependency>
+ </dependencies>
+</project>
\ No newline at end of file
diff --git a/omega/omega-transport/src/main/java/io/servicecomb/saga/omega/transport/RestTemplateConfig.java b/omega/omega-transport/src/main/java/io/servicecomb/saga/omega/transport/RestTemplateConfig.java
new file mode 100644
index 0000000..da2a66e
--- /dev/null
+++ b/omega/omega-transport/src/main/java/io/servicecomb/saga/omega/transport/RestTemplateConfig.java
@@ -0,0 +1,20 @@
+package io.servicecomb.saga.omega.transport;
+
+import java.util.List;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.client.ClientHttpRequestInterceptor;
+import org.springframework.web.client.RestTemplate;
+
+@Configuration
+public class RestTemplateConfig {
+ @Bean
+ public RestTemplate restTemplate() {
+ RestTemplate template = new RestTemplate();
+ List<ClientHttpRequestInterceptor> interceptors = template.getInterceptors();
+ interceptors.add(new TransactionClientHttpRequestInterceptor());
+ template.setInterceptors(interceptors);
+ return template;
+ }
+}
diff --git a/omega/omega-transport/src/main/java/io/servicecomb/saga/omega/transport/TransactionClientHttpRequestInterceptor.java b/omega/omega-transport/src/main/java/io/servicecomb/saga/omega/transport/TransactionClientHttpRequestInterceptor.java
new file mode 100644
index 0000000..7b2a34f
--- /dev/null
+++ b/omega/omega-transport/src/main/java/io/servicecomb/saga/omega/transport/TransactionClientHttpRequestInterceptor.java
@@ -0,0 +1,27 @@
+package io.servicecomb.saga.omega.transport;
+
+import java.io.IOException;
+
+import org.springframework.http.HttpRequest;
+import org.springframework.http.client.ClientHttpRequestExecution;
+import org.springframework.http.client.ClientHttpRequestInterceptor;
+import org.springframework.http.client.ClientHttpResponse;
+
+import io.servicecomb.saga.core.IdGenerator;
+
+public class TransactionClientHttpRequestInterceptor implements ClientHttpRequestInterceptor {
+
+ public static String TRANSACTION_ID_KEY = "X-Transaction-Id";
+
+ private IdGenerator<String> randomIdGenerator = new UniqueIdGenerator();
+
+ @Override
+ public ClientHttpResponse intercept(HttpRequest request, byte[] body,
+ ClientHttpRequestExecution execution) throws IOException {
+ if (!request.getHeaders().containsKey(TRANSACTION_ID_KEY)) {
+ String txId = randomIdGenerator.nextId();
+ request.getHeaders().add(TRANSACTION_ID_KEY, txId);
+ }
+ return execution.execute(request, body);
+ }
+}
diff --git a/omega/omega-transport/src/main/java/io/servicecomb/saga/omega/transport/UniqueIdGenerator.java b/omega/omega-transport/src/main/java/io/servicecomb/saga/omega/transport/UniqueIdGenerator.java
new file mode 100644
index 0000000..fcf4c69
--- /dev/null
+++ b/omega/omega-transport/src/main/java/io/servicecomb/saga/omega/transport/UniqueIdGenerator.java
@@ -0,0 +1,12 @@
+package io.servicecomb.saga.omega.transport;
+
+import java.util.UUID;
+
+import io.servicecomb.saga.core.IdGenerator;
+
+public class UniqueIdGenerator implements IdGenerator<String> {
+ @Override
+ public String nextId() {
+ return UUID.randomUUID().toString();
+ }
+}
diff --git a/omega/omega-transport/src/test/java/io/servicecomb/saga/omega/transport/TransactionClientHttpRequestInterceptorTest.java b/omega/omega-transport/src/test/java/io/servicecomb/saga/omega/transport/TransactionClientHttpRequestInterceptorTest.java
new file mode 100644
index 0000000..e0a180d
--- /dev/null
+++ b/omega/omega-transport/src/test/java/io/servicecomb/saga/omega/transport/TransactionClientHttpRequestInterceptorTest.java
@@ -0,0 +1,57 @@
+package io.servicecomb.saga.omega.transport;
+
+import static io.servicecomb.saga.omega.transport.TransactionClientHttpRequestInterceptor.TRANSACTION_ID_KEY;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.hamcrest.core.Is.is;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpRequest;
+import org.springframework.http.client.ClientHttpRequestExecution;
+import org.springframework.http.client.ClientHttpRequestInterceptor;
+import org.springframework.http.client.ClientHttpResponse;
+
+@RunWith(JUnit4.class)
+public class TransactionClientHttpRequestInterceptorTest {
+
+ private HttpRequest request = mock(HttpRequest.class);
+
+ private ClientHttpRequestExecution execution = mock(ClientHttpRequestExecution.class);
+
+ private ClientHttpResponse response = mock(ClientHttpResponse.class);
+
+ private ClientHttpRequestInterceptor clientHttpRequestInterceptor = new TransactionClientHttpRequestInterceptor();
+
+ @Test
+ public void newTransactionIdInHeaderIfNonExists() throws IOException {
+ when(request.getHeaders()).thenReturn(new HttpHeaders());
+
+ when(execution.execute(request, null)).thenReturn(response);
+
+ clientHttpRequestInterceptor.intercept(request, null, execution);
+
+ assertThat(request.getHeaders().getOrDefault(TRANSACTION_ID_KEY, null), is(notNullValue()));
+ }
+
+ @Test
+ public void sameTransactionIdInHeaderIfAlreadyExists() throws IOException {
+ HttpHeaders headers = new HttpHeaders();
+ headers.add(TRANSACTION_ID_KEY, "txId");
+ when(request.getHeaders()).thenReturn(headers);
+ when(execution.execute(request, null)).thenReturn(response);
+
+ clientHttpRequestInterceptor.intercept(request, null, execution);
+
+ List<String> expected = Collections.singletonList("txId");
+ assertThat(request.getHeaders().getOrDefault(TRANSACTION_ID_KEY, null), is(expected));
+ }
+}
\ No newline at end of file
diff --git a/omega/omega-transport/src/test/java/io/servicecomb/saga/omega/transport/UniqueIdGeneratorTest.java b/omega/omega-transport/src/test/java/io/servicecomb/saga/omega/transport/UniqueIdGeneratorTest.java
new file mode 100644
index 0000000..9e84b38
--- /dev/null
+++ b/omega/omega-transport/src/test/java/io/servicecomb/saga/omega/transport/UniqueIdGeneratorTest.java
@@ -0,0 +1,24 @@
+package io.servicecomb.saga.omega.transport;
+
+import static org.hamcrest.core.Is.is;
+import static org.junit.Assert.assertThat;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.junit.Test;
+
+public class UniqueIdGeneratorTest {
+
+ private UniqueIdGenerator idGenerator = new UniqueIdGenerator();
+
+ @Test
+ public void nextIdIsUnique() {
+ Set<String> ids = new HashSet<>();
+ for (int i = 0; i < 10; i++) {
+ String id = idGenerator.nextId();
+ ids.add(id);
+ }
+ assertThat(ids.size(), is(10));
+ }
+}
\ No newline at end of file
diff --git a/omega/pom.xml b/omega/pom.xml
index 10389e4..7028f46 100644
--- a/omega/pom.xml
+++ b/omega/pom.xml
@@ -32,6 +32,7 @@
<module>omega-transaction</module>
<module>omega-context</module>
<module>omega-spring-tx</module>
+ <module>omega-transport</module>
</modules>
<dependencyManagement>
--
To stop receiving notification emails like this one, please contact
"commits@servicecomb.apache.org" <co...@servicecomb.apache.org>.