-
Notifications
You must be signed in to change notification settings - Fork 19
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'master' of https://github.com/taboola/backstage-api-jav…
- Loading branch information
Showing
9 changed files
with
234 additions
and
43 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -18,4 +18,8 @@ dependency-reduced-pom.xml | |
*.ipr | ||
*.iws | ||
*.idea | ||
*.log | ||
*.log | ||
|
||
# Mac OS | ||
|
||
.DS_Store |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
40 changes: 40 additions & 0 deletions
40
src/main/java/com/taboola/backstage/internal/config/SerializationConfig.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
package com.taboola.backstage.internal.config; | ||
|
||
import java.util.HashMap; | ||
import java.util.Map; | ||
|
||
public class SerializationConfig { | ||
private Map<Class<?>, Class<?>> mixins; | ||
private boolean shouldIgnoreAnySetterAnnotation; | ||
|
||
public SerializationConfig() { | ||
mixins = new HashMap<>(); | ||
shouldIgnoreAnySetterAnnotation = false; | ||
} | ||
|
||
public SerializationConfig setMixins(Map<Class<?>, Class<?>> mixins) { | ||
this.mixins = mixins; | ||
return this; | ||
} | ||
|
||
public SerializationConfig setShouldIgnoreAnySetterAnnotation() { | ||
this.shouldIgnoreAnySetterAnnotation = true; | ||
return this; | ||
} | ||
|
||
public Map<Class<?>, Class<?>> getMixins() { | ||
return mixins; | ||
} | ||
|
||
public boolean shouldIgnoreAnySetterAnnotation() { | ||
return shouldIgnoreAnySetterAnnotation; | ||
} | ||
|
||
@Override | ||
public String toString() { | ||
return "SerializationConfig{" + | ||
"mixins=" + mixins + | ||
", shouldIgnoreAnySetterAnnotation=" + shouldIgnoreAnySetterAnnotation + | ||
'}'; | ||
} | ||
} |
17 changes: 17 additions & 0 deletions
17
...om/taboola/backstage/internal/serialization/IgnoreAnySetterSerializationIntrospector.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
package com.taboola.backstage.internal.serialization; | ||
|
||
import com.fasterxml.jackson.databind.introspect.Annotated; | ||
import com.fasterxml.jackson.databind.introspect.AnnotatedMethod; | ||
import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector; | ||
|
||
public class IgnoreAnySetterSerializationIntrospector extends JacksonAnnotationIntrospector { | ||
@Override | ||
public boolean hasAnySetterAnnotation(AnnotatedMethod am) { | ||
return false; | ||
} | ||
|
||
@Override | ||
public Boolean hasAnySetter(Annotated a) { | ||
return false; | ||
} | ||
} |
23 changes: 23 additions & 0 deletions
23
src/main/java/com/taboola/backstage/internal/serialization/SerializationMapperCreator.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
package com.taboola.backstage.internal.serialization; | ||
|
||
import com.fasterxml.jackson.annotation.JsonInclude; | ||
import com.fasterxml.jackson.databind.DeserializationFeature; | ||
import com.fasterxml.jackson.databind.ObjectMapper; | ||
import com.fasterxml.jackson.databind.PropertyNamingStrategy; | ||
import com.taboola.backstage.internal.config.SerializationConfig; | ||
|
||
public class SerializationMapperCreator { | ||
public static ObjectMapper createObjectMapper(SerializationConfig serializationConfig) { | ||
ObjectMapper objectMapper = new ObjectMapper(); | ||
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES); | ||
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); | ||
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); | ||
serializationConfig.getMixins().forEach(objectMapper::addMixIn); | ||
|
||
if (serializationConfig.shouldIgnoreAnySetterAnnotation()) { | ||
objectMapper.setAnnotationIntrospector(new IgnoreAnySetterSerializationIntrospector()); | ||
} | ||
|
||
return objectMapper; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
15 changes: 15 additions & 0 deletions
15
src/test/java/com/taboola/backstage/internal/config/SerializationConfigTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
package com.taboola.backstage.internal.config; | ||
|
||
import org.junit.Assert; | ||
import org.junit.Test; | ||
|
||
public class SerializationConfigTest { | ||
|
||
@Test | ||
public void serializationConfig_defaultConstructor_configInitializedWithDefaultValues() { | ||
SerializationConfig serializationConfig = new SerializationConfig(); | ||
Assert.assertNotNull("Missing mixin", serializationConfig.getMixins()); | ||
Assert.assertEquals("Mixin is not empty by default", 0, serializationConfig.getMixins().size()); | ||
Assert.assertFalse("Wrong default value for shouldIgnoreAnySetterAnnotation", serializationConfig.shouldIgnoreAnySetterAnnotation()); | ||
} | ||
} |
88 changes: 88 additions & 0 deletions
88
...est/java/com/taboola/backstage/internal/serialization/SerializationMapperCreatorTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,88 @@ | ||
package com.taboola.backstage.internal.serialization; | ||
|
||
import com.fasterxml.jackson.annotation.JsonAnySetter; | ||
import com.fasterxml.jackson.annotation.JsonIgnore; | ||
import com.fasterxml.jackson.annotation.JsonProperty; | ||
import com.fasterxml.jackson.databind.ObjectMapper; | ||
import com.fasterxml.jackson.databind.PropertyNamingStrategy; | ||
import com.taboola.backstage.internal.config.SerializationConfig; | ||
import com.taboola.backstage.internal.serialization.SerializationMapperCreator; | ||
import org.junit.Assert; | ||
import org.junit.Rule; | ||
import org.junit.Test; | ||
import org.junit.rules.ExpectedException; | ||
|
||
import java.io.IOException; | ||
import java.util.HashMap; | ||
import java.util.Map; | ||
|
||
public class SerializationMapperCreatorTest { | ||
|
||
@Rule | ||
public ExpectedException expectedException = ExpectedException.none(); | ||
|
||
@Test | ||
public void createObjectMapper_defaultSerializationConfig_objectMapperWithDefaultValues() { | ||
ObjectMapper objectMapper = SerializationMapperCreator.createObjectMapper(new SerializationConfig()); | ||
|
||
Assert.assertEquals("Invalid property naming strategy", PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES, objectMapper.getPropertyNamingStrategy()); | ||
Assert.assertEquals("Invalid mixin count", 0, objectMapper.mixInCount()); | ||
} | ||
|
||
@Test | ||
public void createObjectMapper_serializationConfigWithMixins_objectMapperIsCreatedWithMixins() { | ||
Map<Class<?>, Class<?>> mixins = new HashMap<>(); | ||
mixins.put(SampleApi.class, SampleMixIn.class); | ||
SerializationConfig serializationConfig = new SerializationConfig().setMixins(mixins); | ||
ObjectMapper objectMapper = SerializationMapperCreator.createObjectMapper(serializationConfig); | ||
|
||
Assert.assertEquals("Invalid mixin count", 1, objectMapper.mixInCount()); | ||
Assert.assertEquals("Invalid property naming strategy", SampleMixIn.class, objectMapper.findMixInClassFor(SampleApi.class)); | ||
} | ||
|
||
@Test | ||
public void createObjectMapper_defaultSerializationConfigAndApiObjectHasAnySetter_anySetterIsCalledOnSerialization() throws IOException { | ||
expectedException.expect(Exception.class); | ||
expectedException.expectMessage("unknown field"); | ||
ObjectMapper objectMapper = SerializationMapperCreator.createObjectMapper(new SerializationConfig()); | ||
|
||
objectMapper.readValue("{ \"id\": 1, \"test\": \"test\" }", SampleApi.class); | ||
} | ||
|
||
@Test | ||
public void createObjectMapper_serializationConfigWithoutAnySetterAndApiObjectHasAnySetter_anySetterIsCalledOnSerialization() throws IOException { | ||
expectedException.expect(Exception.class); | ||
expectedException.expectMessage("unknown field"); | ||
ObjectMapper objectMapper = SerializationMapperCreator.createObjectMapper(new SerializationConfig()); | ||
|
||
objectMapper.readValue("{ \"id\": 1, \"test\": \"test\" }", SampleApi.class); | ||
} | ||
|
||
@Test | ||
public void createObjectMapper_serializationConfigWithIgnoreAnySetterAndApiObjectHasAnySetter_anySetterIgnored() throws IOException { | ||
SerializationConfig serializationConfig = new SerializationConfig().setShouldIgnoreAnySetterAnnotation(); | ||
ObjectMapper objectMapper = SerializationMapperCreator.createObjectMapper(serializationConfig); | ||
|
||
SampleApi sampleApi = objectMapper.readValue("{ \"id\": 1, \"test\": \"test\" }", SampleApi.class); | ||
Assert.assertEquals("Id parsed incorrectly", 1, sampleApi.id); | ||
Assert.assertNull("Name is parsed incorrectly", sampleApi.name); | ||
} | ||
|
||
private static class SampleApi { | ||
@JsonProperty("id") | ||
int id; | ||
|
||
@JsonProperty("name") | ||
String name; | ||
|
||
@JsonAnySetter | ||
public void handlerUnknownSetter(String field, Object value) throws Exception { | ||
throw new Exception("unknown field"); | ||
} | ||
} | ||
|
||
private abstract class SampleMixIn { | ||
@JsonIgnore | ||
private String name; | ||
} | ||
} |