Skip to content

Commit c0af5f7

Browse files
authored
Merge pull request #770 from PierreBtz/pbeitz/om-customization
[feat] Add a way to customize the client object mapper
2 parents dc6e71a + 3ad8d82 commit c0af5f7

File tree

8 files changed

+87
-16
lines changed

8 files changed

+87
-16
lines changed

src/main/java/org/zendesk/client/v2/Zendesk.java

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import org.asynchttpclient.Response;
4141
import org.asynchttpclient.request.body.multipart.FilePart;
4242
import org.asynchttpclient.request.body.multipart.StringPart;
43+
import org.jetbrains.annotations.VisibleForTesting;
4344
import org.slf4j.Logger;
4445
import org.slf4j.LoggerFactory;
4546
import org.zendesk.client.v2.model.AgentRole;
@@ -165,7 +166,8 @@ private Zendesk(
165166
String username,
166167
String password,
167168
Map<String, String> headers,
168-
int cbpPageSize) {
169+
int cbpPageSize,
170+
Function<ObjectMapper, ObjectMapper> objectMapperCustomizer) {
169171
this.logger = LoggerFactory.getLogger(Zendesk.class);
170172
this.closeClient = client == null;
171173
this.oauthToken = null;
@@ -188,15 +190,16 @@ private Zendesk(
188190
headers.putIfAbsent(USER_AGENT_HEADER, new DefaultUserAgent().toString());
189191
this.headers = Collections.unmodifiableMap(headers);
190192
this.cbpPageSize = cbpPageSize;
191-
this.mapper = createMapper();
193+
this.mapper = createMapper(objectMapperCustomizer);
192194
}
193195

194196
private Zendesk(
195197
AsyncHttpClient client,
196198
String url,
197199
String oauthToken,
198200
Map<String, String> headers,
199-
int cbpPageSize) {
201+
int cbpPageSize,
202+
Function<ObjectMapper, ObjectMapper> objectMapperCustomizer) {
200203
this.logger = LoggerFactory.getLogger(Zendesk.class);
201204
this.closeClient = client == null;
202205
this.realm = null;
@@ -212,7 +215,7 @@ private Zendesk(
212215
headers.putIfAbsent(USER_AGENT_HEADER, new DefaultUserAgent().toString());
213216
this.headers = Collections.unmodifiableMap(headers);
214217
this.cbpPageSize = cbpPageSize;
215-
this.mapper = createMapper();
218+
this.mapper = createMapper(objectMapperCustomizer);
216219
}
217220

218221
//////////////////////////////////////////////////////////////////////
@@ -4206,7 +4209,19 @@ private TemplateUri getSearchUri(Map<String, Object> params, String query, Strin
42064209
return templateUri;
42074210
}
42084211

4212+
/**
4213+
* This method did not allow for any customization and its public visibility was likely only for
4214+
* tests. If you rely on it for some reason, please report a new issue to discuss options. To
4215+
* customize the ObjectMapper, use the {@link Builder#customizeObjectMapper(Function)} method.
4216+
*/
4217+
@Deprecated(since = "1.3.0", forRemoval = true)
42094218
public static ObjectMapper createMapper() {
4219+
return createMapper(Function.identity());
4220+
}
4221+
4222+
@VisibleForTesting
4223+
public static ObjectMapper createMapper(
4224+
Function<ObjectMapper, ObjectMapper> objectMapperCustomizer) {
42104225
ObjectMapper mapper = new ObjectMapper();
42114226
mapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);
42124227
mapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING);
@@ -4215,6 +4230,11 @@ public static ObjectMapper createMapper() {
42154230
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
42164231
mapper.setDateFormat(new StdDateFormat());
42174232
mapper.enable(DeserializationFeature.USE_LONG_FOR_INTS);
4233+
return objectMapperCustomizer.apply(mapper);
4234+
}
4235+
4236+
@VisibleForTesting
4237+
ObjectMapper getMapper() {
42184238
return mapper;
42194239
}
42204240

@@ -4279,11 +4299,13 @@ public static class Builder {
42794299
private String token = null;
42804300
private String oauthToken = null;
42814301
private int cbpPageSize = DEFAULT_CBP_PAGE_SIZE;
4302+
private Function<ObjectMapper, ObjectMapper> objectMapperCustomizer;
42824303
private final Map<String, String> headers;
42834304

42844305
public Builder(String url) {
42854306
this.url = url;
42864307
this.headers = new HashMap<>();
4308+
objectMapperCustomizer = Function.identity();
42874309
}
42884310

42894311
public Builder setClient(AsyncHttpClient client) {
@@ -4339,13 +4361,30 @@ public Builder setCbpPageSize(int cbpPageSize) {
43394361
return this;
43404362
}
43414363

4364+
/**
4365+
* Customize the ObjectMapper used by this Zendesk client. Careful, the customizer function will
4366+
* be applied after the default configuration for this library.
4367+
*
4368+
* @param customizer a function that takes an ObjectMapper and returns a customized ObjectMapper
4369+
* @return this builder instance
4370+
* @since 1.3.0
4371+
*/
4372+
public Builder customizeObjectMapper(Function<ObjectMapper, ObjectMapper> customizer) {
4373+
if (customizer != null) {
4374+
this.objectMapperCustomizer = customizer;
4375+
}
4376+
return this;
4377+
}
4378+
43424379
public Zendesk build() {
43434380
if (token != null) {
4344-
return new Zendesk(client, url, username + "/token", token, headers, cbpPageSize);
4381+
return new Zendesk(
4382+
client, url, username + "/token", token, headers, cbpPageSize, objectMapperCustomizer);
43454383
} else if (oauthToken != null) {
4346-
return new Zendesk(client, url, oauthToken, headers, cbpPageSize);
4384+
return new Zendesk(client, url, oauthToken, headers, cbpPageSize, objectMapperCustomizer);
43474385
}
4348-
return new Zendesk(client, url, username, password, headers, cbpPageSize);
4386+
return new Zendesk(
4387+
client, url, username, password, headers, cbpPageSize, objectMapperCustomizer);
43494388
}
43504389
}
43514390
}

src/test/java/org/zendesk/client/v2/SearchTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import java.io.UnsupportedEncodingException;
1414
import java.util.Arrays;
1515
import java.util.Random;
16+
import java.util.function.Function;
1617
import org.apache.commons.text.RandomStringGenerator;
1718
import org.junit.After;
1819
import org.junit.Before;
@@ -46,7 +47,7 @@ public class SearchTest {
4647

4748
private Zendesk client;
4849
// use a mapper that is identical to what the client will use
49-
private ObjectMapper objectMapper = Zendesk.createMapper();
50+
private ObjectMapper objectMapper = Zendesk.createMapper(Function.identity());
5051

5152
@Before
5253
public void setUp() throws Exception {

src/test/java/org/zendesk/client/v2/UserTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.Arrays;
2020
import java.util.Collections;
2121
import java.util.List;
22+
import java.util.function.Function;
2223
import org.apache.commons.text.RandomStringGenerator;
2324
import org.junit.After;
2425
import org.junit.Before;
@@ -50,7 +51,7 @@ public class UserTest {
5051

5152
private Zendesk client;
5253
// use a mapper that is identical to what the client will use
53-
private ObjectMapper objectMapper = Zendesk.createMapper();
54+
private ObjectMapper objectMapper = Zendesk.createMapper(Function.identity());
5455

5556
@Before
5657
public void setUp() throws Exception {
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package org.zendesk.client.v2;
2+
3+
import static org.hamcrest.CoreMatchers.is;
4+
import static org.hamcrest.MatcherAssert.assertThat;
5+
6+
import com.fasterxml.jackson.annotation.JsonInclude;
7+
import org.junit.Test;
8+
9+
public class ZendeskTest {
10+
11+
@Test
12+
public void customizeMapper() {
13+
var builder = new Zendesk.Builder("dummy");
14+
builder.customizeObjectMapper(
15+
om -> om.setSerializationInclusion(JsonInclude.Include.NON_EMPTY));
16+
17+
try (var zd = builder.build()) {
18+
var mapper = zd.getMapper();
19+
assertThat(
20+
mapper.getSerializationConfig().getDefaultPropertyInclusion(),
21+
is(
22+
JsonInclude.Value.construct(
23+
JsonInclude.Include.NON_EMPTY, JsonInclude.Include.NON_EMPTY)));
24+
}
25+
}
26+
}

src/test/java/org/zendesk/client/v2/model/LocaleTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static org.hamcrest.CoreMatchers.is;
44
import static org.hamcrest.MatcherAssert.assertThat;
55

6+
import java.util.function.Function;
67
import org.junit.Test;
78
import org.zendesk.client.v2.Zendesk;
89

@@ -19,7 +20,7 @@ public void testLocaleDeserialization() throws Exception {
1920
+ "\"updated_at\": \"2023-09-21T19:23:16Z\""
2021
+ "}";
2122

22-
Locale locale = Zendesk.createMapper().readValue(json, Locale.class);
23+
Locale locale = Zendesk.createMapper(Function.identity()).readValue(json, Locale.class);
2324

2425
assertThat(locale.getUrl(), is("https://acme.zendesk.com/api/v2/locales/en-US.json"));
2526
assertThat(locale.getId(), is(1L));

src/test/java/org/zendesk/client/v2/model/StatusTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import com.fasterxml.jackson.databind.ObjectMapper;
77
import com.fasterxml.jackson.databind.ObjectReader;
8+
import java.util.function.Function;
89
import org.junit.Test;
910
import org.zendesk.client.v2.Zendesk;
1011

@@ -15,15 +16,15 @@
1516
public class StatusTest {
1617
@Test
1718
public void serializeAsLowercase() throws Exception {
18-
ObjectMapper mapper = Zendesk.createMapper();
19+
ObjectMapper mapper = Zendesk.createMapper(Function.identity());
1920
assertThat(
2021
mapper.writeValueAsString(Status.PENDING),
2122
is("\"" + Status.PENDING.name().toLowerCase() + "\""));
2223
}
2324

2425
@Test
2526
public void deserializeFromLowercase() throws Exception {
26-
ObjectMapper mapper = Zendesk.createMapper();
27+
ObjectMapper mapper = Zendesk.createMapper(Function.identity());
2728
ObjectReader reader = mapper.readerFor(Status.class);
2829
assertThat(
2930
reader.readValue("\"" + Status.PENDING.name().toLowerCase() + "\""),

src/test/java/org/zendesk/client/v2/model/TicketTest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import java.util.Calendar;
77
import java.util.Date;
88
import java.util.Random;
9+
import java.util.function.Function;
910
import org.junit.Test;
1011
import org.zendesk.client.v2.Zendesk;
1112

@@ -17,7 +18,7 @@ public class TicketTest {
1718

1819
@Test
1920
public void serializeWithNullSafeUpdate() throws Exception {
20-
ObjectMapper mapper = Zendesk.createMapper();
21+
ObjectMapper mapper = Zendesk.createMapper(Function.identity());
2122
Ticket ticket = createSampleTicket();
2223
assertThat(mapper.writeValueAsString(ticket))
2324
.doesNotContain("\"safe_update\"")
@@ -26,7 +27,7 @@ public void serializeWithNullSafeUpdate() throws Exception {
2627

2728
@Test
2829
public void serializeWithFalseSafeUpdate() throws Exception {
29-
ObjectMapper mapper = Zendesk.createMapper();
30+
ObjectMapper mapper = Zendesk.createMapper(Function.identity());
3031
Ticket ticket = createSampleTicket();
3132
ticket.setSafeUpdate(false);
3233
assertThat(mapper.writeValueAsString(ticket))
@@ -36,7 +37,7 @@ public void serializeWithFalseSafeUpdate() throws Exception {
3637

3738
@Test
3839
public void serializeWithSafeUpdate() throws Exception {
39-
ObjectMapper mapper = Zendesk.createMapper();
40+
ObjectMapper mapper = Zendesk.createMapper(Function.identity());
4041
Ticket ticket = createSampleTicket();
4142
ticket.setSafeUpdate(true);
4243
assertThat(mapper.writeValueAsString(ticket))

src/test/java/org/zendesk/client/v2/model/TimeZoneTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import java.util.Arrays;
1111
import java.util.Collections;
1212
import java.util.List;
13+
import java.util.function.Function;
1314
import org.apache.commons.text.RandomStringGenerator;
1415
import org.junit.*;
1516
import org.zendesk.client.v2.Zendesk;
@@ -31,7 +32,7 @@ public class TimeZoneTest {
3132
@Rule public WireMockClassRule zendeskApiMock = zendeskApiClass;
3233

3334
private Zendesk client;
34-
private final ObjectMapper objectMapper = Zendesk.createMapper();
35+
private final ObjectMapper objectMapper = Zendesk.createMapper(Function.identity());
3536

3637
@Before
3738
public void setUp() {

0 commit comments

Comments
 (0)