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 <dagang...@huawei.com> AuthorDate: Sat Dec 23 16:19:18 2017 +0800 added interceptor for rest template Signed-off-by: Eric Lee <dagang...@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" <commits@servicecomb.apache.org>.