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>.