Skip to content

Commit e7d9e63

Browse files
authored
Merge pull request #9 from taboola/additional_func
Adding communication interceptor
2 parents dcd1cf9 + 7261fad commit e7d9e63

File tree

10 files changed

+116
-6
lines changed

10 files changed

+116
-6
lines changed

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
## Rest API SDK Core
22

33
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.taboola/api-java-client-core/badge.svg?style=plastic)](https://maven-badges.herokuapp.com/maven-central/com.taboola/api-java-client-core)
4-
[![Build Status](https://travis-ci.com/taboola/api-java-client-core.svg?branch=master)](https://travis-ci.com/taboola/api-java-client-core)
54

65
### Table of Contents
76
1. [Getting Started](#1-getting-started)

src/main/java/com/taboola/rest/api/RestAPIClient.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818
import com.taboola.rest.api.internal.config.SerializationConfig;
1919
import com.taboola.rest.api.internal.config.UserAgentHeader;
2020
import com.taboola.rest.api.internal.serialization.SerializationMapperCreator;
21+
import com.taboola.rest.api.model.CommunicationInterceptor;
2122
import com.taboola.rest.api.model.HttpLoggingLevel;
23+
import com.taboola.rest.api.model.NoOpCommunicationInterceptor;
2224
import com.taboola.rest.api.model.RequestHeader;
2325
import com.taboola.rest.api.model.StringResponseFactory;
2426

@@ -57,6 +59,7 @@ public static class RestAPIClientBuilder {
5759
private static final String DEFAULT_USER_AGENT_SUFFIX = "UNDEFINED";
5860
private static final String DEFAULT_USER_AGENT_PREFIX = "UNDEFINED";
5961
private static final ExceptionFactory DEFAULT_EXCEPTION_FACTORY = new DefaultExceptionFactory();
62+
private static final CommunicationInterceptor DEFAULT_COMMUNICATION_INTERCEPTOR = new NoOpCommunicationInterceptor();
6063

6164
private String baseUrl;
6265
private Long writeTimeoutMillis;
@@ -74,6 +77,7 @@ public static class RestAPIClientBuilder {
7477
private ObjectMapper objectMapper;
7578
private final StringResponseFactories stringResponseFactories = new StringResponseFactories();
7679
private HttpLoggingLevel loggingLevel;
80+
private CommunicationInterceptor communicationInterceptor;
7781

7882
public RestAPIClientBuilder setLoggingLevel(HttpLoggingLevel loggingLevel) {
7983
this.loggingLevel = loggingLevel;
@@ -150,6 +154,11 @@ public RestAPIClientBuilder setObjectMapper(ObjectMapper objectMapper) {
150154
return this;
151155
}
152156

157+
public RestAPIClientBuilder setCommunicationInterceptor(CommunicationInterceptor communicationInterceptor) {
158+
this.communicationInterceptor = communicationInterceptor;
159+
return this;
160+
}
161+
153162
public RestAPIClientBuilder addStringBodyResponseFactory(Class<?> clazz, StringResponseFactory stringResponseFactory) {
154163
stringResponseFactories.addFactory(clazz, stringResponseFactory);
155164
return this;
@@ -160,7 +169,7 @@ public RestAPIClient build() {
160169
String finalUserAgent = String.format("%s/%s/%s (%s)", userAgentPrefix, restAPIVersion, VERSION, userAgentSuffix);
161170
Collection<RequestHeader> headers = getAllHeaders(this.headers, finalUserAgent);
162171
CommunicationConfig config = new CommunicationConfig(baseUrl, connectionTimeoutMillis, readTimeoutMillis, writeTimeoutMillis, maxIdleConnections,
163-
keepAliveDurationMillis, headers, debug, exceptionFactory, objectMapper, stringResponseFactories, loggingLevel);
172+
keepAliveDurationMillis, headers, debug, exceptionFactory, objectMapper, stringResponseFactories, loggingLevel, communicationInterceptor);
164173
return new RestAPIClient(new CommunicationFactory(config));
165174
}
166175

@@ -231,6 +240,10 @@ private void organizeState() {
231240
if (loggingLevel == null) {
232241
loggingLevel = HttpLoggingLevel.BASIC;
233242
}
243+
244+
if(communicationInterceptor == null) {
245+
communicationInterceptor = DEFAULT_COMMUNICATION_INTERCEPTOR;
246+
}
234247
}
235248
}
236249

src/main/java/com/taboola/rest/api/internal/CommunicationFactory.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.taboola.rest.api.internal.config.CommunicationConfig;
66
import com.taboola.rest.api.internal.interceptors.CommunicationInterceptor;
77
import com.taboola.rest.api.internal.interceptors.HeadersInterceptor;
8+
import com.taboola.rest.api.internal.interceptors.ImmutableRequestResponseInterceptor;
89
import com.taboola.rest.api.model.HttpLoggingLevel;
910

1011
import okhttp3.ConnectionPool;
@@ -58,6 +59,7 @@ private OkHttpClient createOkHttpClient(CommunicationConfig config) {
5859
return new OkHttpClient.Builder()
5960
.addInterceptor(new HeadersInterceptor(config.getHeaders()))
6061
.addInterceptor(createLoggingInterceptor(config))
62+
.addInterceptor(new ImmutableRequestResponseInterceptor(config.getCommunicationInterceptor()))
6163
.readTimeout(config.getReadTimeoutMillis(), TimeUnit.MILLISECONDS)
6264
.writeTimeout(config.getWriteTimeoutMillis(), TimeUnit.MILLISECONDS)
6365
.connectTimeout(config.getConnectionTimeoutMillis(), TimeUnit.MILLISECONDS)

src/main/java/com/taboola/rest/api/internal/config/CommunicationConfig.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.fasterxml.jackson.databind.ObjectMapper;
77
import com.taboola.rest.api.exceptions.factories.ExceptionFactory;
88
import com.taboola.rest.api.internal.StringResponseFactories;
9+
import com.taboola.rest.api.model.CommunicationInterceptor;
910
import com.taboola.rest.api.model.HttpLoggingLevel;
1011
import com.taboola.rest.api.model.RequestHeader;
1112

@@ -29,11 +30,13 @@ public class CommunicationConfig {
2930
private final ObjectMapper objectMapper;
3031
private final StringResponseFactories stringResponseFactories;
3132
private final HttpLoggingLevel loggingLevel;
33+
private final CommunicationInterceptor communicationInterceptor;
3234

3335
public CommunicationConfig(String baseUrl, Long connectionTimeoutMillis, Long readTimeoutMillis,
3436
Long writeTimeoutMillis, Integer maxIdleConnections, Long keepAliveDurationMillis,
3537
Collection<RequestHeader> headers, boolean debug, ExceptionFactory exceptionFactory,
36-
ObjectMapper objectMapper, StringResponseFactories stringResponseFactories, HttpLoggingLevel loggingLevel) {
38+
ObjectMapper objectMapper, StringResponseFactories stringResponseFactories, HttpLoggingLevel loggingLevel,
39+
CommunicationInterceptor communicationInterceptor) {
3740
this.baseUrl = baseUrl;
3841
this.connectionTimeoutMillis = connectionTimeoutMillis;
3942
this.readTimeoutMillis = readTimeoutMillis;
@@ -46,6 +49,7 @@ public CommunicationConfig(String baseUrl, Long connectionTimeoutMillis, Long re
4649
this.objectMapper = objectMapper;
4750
this.stringResponseFactories = stringResponseFactories;
4851
this.loggingLevel = loggingLevel;
52+
this.communicationInterceptor = communicationInterceptor;
4953
}
5054

5155
public String getBaseUrl() {
@@ -96,6 +100,10 @@ public HttpLoggingLevel getLoggingLevel() {
96100
return loggingLevel;
97101
}
98102

103+
public CommunicationInterceptor getCommunicationInterceptor() {
104+
return communicationInterceptor;
105+
}
106+
99107
@Override
100108
public String toString() {
101109
return "CommunicationConfig{" +
@@ -111,6 +119,7 @@ public String toString() {
111119
", objectMapper=" + objectMapper +
112120
", stringResponseFactories=" + stringResponseFactories +
113121
", loggingLevel=" + loggingLevel +
122+
", communicationInterceptor=" + communicationInterceptor +
114123
'}';
115124
}
116125
}

src/main/java/com/taboola/rest/api/internal/config/SerializationConfig.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@ public class SerializationConfig {
77
private Map<Class<?>, Class<?>> mixins;
88
private boolean shouldIgnoreAnySetterAnnotation;
99
private boolean shouldDisableReadUnknownEnumValuesAsDefaultValue;
10+
private boolean shouldUseSnakeCase;
1011

1112
public SerializationConfig() {
1213
mixins = new HashMap<>();
1314
shouldIgnoreAnySetterAnnotation = false;
1415
shouldDisableReadUnknownEnumValuesAsDefaultValue = false;
16+
shouldUseSnakeCase = false;
1517
}
1618

1719
public SerializationConfig setMixins(Map<Class<?>, Class<?>> mixins) {
@@ -29,6 +31,11 @@ public SerializationConfig setShouldDisableReadUnknownEnumValuesAsDefaultValue()
2931
return this;
3032
}
3133

34+
public SerializationConfig setShouldUseSnakeCase() {
35+
this.shouldUseSnakeCase = true;
36+
return this;
37+
}
38+
3239
public Map<Class<?>, Class<?>> getMixins() {
3340
return mixins;
3441
}
@@ -39,12 +46,16 @@ public boolean shouldIgnoreAnySetterAnnotation() {
3946
public boolean shouldDisableReadUnknownEnumValuesAsDefaultValue() {
4047
return shouldDisableReadUnknownEnumValuesAsDefaultValue;
4148
}
49+
public boolean shouldUseSnakeCase() {
50+
return shouldUseSnakeCase;
51+
}
4252

4353
@Override
4454
public String toString() {
4555
return "SerializationConfig{" +
4656
"mixins=" + mixins +
4757
", shouldIgnoreAnySetterAnnotation=" + shouldIgnoreAnySetterAnnotation +
58+
", shouldUseSnakeCase=" + shouldUseSnakeCase +
4859
'}';
4960
}
5061
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.taboola.rest.api.internal.interceptors;
2+
3+
import okhttp3.Interceptor;
4+
import okhttp3.Response;
5+
6+
import java.io.IOException;
7+
import java.util.Objects;
8+
9+
import com.taboola.rest.api.model.CommunicationInterceptor;
10+
11+
/**
12+
* Created by vladi.m
13+
* Date 20/11/2023
14+
* Time 15:20
15+
* Copyright Taboola
16+
*/
17+
public class ImmutableRequestResponseInterceptor implements Interceptor {
18+
19+
private final CommunicationInterceptor interceptor;
20+
21+
public ImmutableRequestResponseInterceptor(CommunicationInterceptor interceptor) {
22+
Objects.requireNonNull(interceptor);
23+
this.interceptor = interceptor;
24+
}
25+
26+
@Override
27+
public Response intercept(Chain chain) throws IOException {
28+
interceptor.before(chain.request());
29+
Response response = null;
30+
try {
31+
response = chain.proceed(chain.request());
32+
return response;
33+
} finally {
34+
interceptor.after(chain.request(), response);
35+
}
36+
}
37+
}

src/main/java/com/taboola/rest/api/internal/serialization/SerializationMapperCreator.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@
99
public class SerializationMapperCreator {
1010
public static ObjectMapper createObjectMapper(SerializationConfig serializationConfig) {
1111
ObjectMapper objectMapper = new ObjectMapper();
12-
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
12+
if(serializationConfig.shouldUseSnakeCase()) {
13+
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
14+
} else {
15+
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
16+
}
1317
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
1418
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
1519

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.taboola.rest.api.model;
2+
3+
import okhttp3.Request;
4+
import okhttp3.Response;
5+
6+
/**
7+
* Created by vladi.m
8+
* Date 02/02/2024
9+
* Time 10:01
10+
* Copyright Taboola
11+
*/
12+
public interface CommunicationInterceptor {
13+
14+
void before(final Request request);
15+
16+
void after(final Request request, final Response response);
17+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.taboola.rest.api.model;
2+
3+
import okhttp3.Request;
4+
import okhttp3.Response;
5+
6+
/**
7+
* Created by vladi.m
8+
* Date 02/02/2024
9+
* Time 10:35
10+
* Copyright Taboola
11+
*/
12+
public class NoOpCommunicationInterceptor implements CommunicationInterceptor{
13+
@Override
14+
public void before(Request request) {}
15+
16+
@Override
17+
public void after(Request request, Response response) {}
18+
}

src/test/java/com/taboola/rest/api/internal/CommunicationFactoryTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
import com.taboola.rest.api.internal.config.CommunicationConfig;
1313
import com.taboola.rest.api.internal.config.UserAgentHeader;
1414
import com.taboola.rest.api.model.HttpLoggingLevel;
15+
import com.taboola.rest.api.model.NoOpCommunicationInterceptor;
1516

16-
import okhttp3.logging.HttpLoggingInterceptor;
1717
import retrofit2.http.GET;
1818
import retrofit2.http.Header;
1919
import retrofit2.http.Headers;
@@ -39,7 +39,7 @@ public void beforeTest() {
3939
CommunicationConfig communicationConfig = new CommunicationConfig("http://localhost",
4040
1L, 1L, 1L, 1, 60L,
4141
Collections.singleton(new UserAgentHeader("Dummy-Agent")),true, new DefaultExceptionFactory(),
42-
new ObjectMapper(), new StringResponseFactories(), HttpLoggingLevel.BASIC);
42+
new ObjectMapper(), new StringResponseFactories(), HttpLoggingLevel.BASIC, new NoOpCommunicationInterceptor());
4343
testInstance = new CommunicationFactory(communicationConfig);
4444
}
4545

0 commit comments

Comments
 (0)