package com.fasterxml.jackson.databind.objectid;
import java.util.*;
import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.databind.*;
public class ObjectWithCreator1261Test
extends BaseMapTest
{
static class Answer
{
public SortedMap<String, Parent> parents;
public Answer() {
parents = new TreeMap<String, Parent>();
}
}
@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "@id")
static class Parent
{
public Map<String, Child> children;
@JsonIdentityReference(alwaysAsId = true)
public Child favoriteChild;
public String name;
protected Parent() { }
public Parent(String name, boolean ignored) {
children = new TreeMap<String, Child>();
this.name = name;
}
}
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "@id")
static class Child
{
public String name;
@JsonIdentityReference(alwaysAsId = true)
public Parent parent;
@JsonIdentityReference(alwaysAsId = true)
public List<Parent> parentAsList;
public String someNullProperty;
protected Child() { }
@JsonCreator
public Child(@JsonProperty("name") String name,
@JsonProperty("someNullProperty") String someNullProperty) {
this.name = name;
this.someNullProperty = someNullProperty;
}
public Child(String n) {
name = n;
}
}
public void testObjectIds1261() throws Exception
{
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
mapper.enable(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY);
Answer initialAnswer = createInitialAnswer();
String initialAnswerString = mapper.writeValueAsString(initialAnswer);
// System.out.println("Initial answer:\n"+initialAnswerString);
JsonNode tree = mapper.readTree(initialAnswerString);
Answer deserializedAnswer = mapper.readValue(initialAnswerString,
Answer.class);
String reserializedAnswerString = mapper
.writeValueAsString(deserializedAnswer);
JsonNode newTree = mapper.readTree(reserializedAnswerString);
if (!tree.equals(newTree)) {
fail("Original and recovered Json are different. Recovered = \n"
+ reserializedAnswerString + "\n");
}
}
private Answer createInitialAnswer() {
Answer answer = new Answer();
String child1Name = "child1";
String child2Name = "child2";
String parent1Name = "parent1";
String parent2Name = "parent2";
Parent parent1 = new Parent(parent1Name, false);
answer.parents.put(parent1Name, parent1);
Child child1 = new Child(child1Name);
child1.parent = parent1;
child1.parentAsList = Collections.singletonList(parent1);
Child child2 = new Child(child2Name);
Parent parent2 = new Parent(parent2Name, false);
child2.parent = parent2;
child2.parentAsList = Collections.singletonList(parent2);
parent1.children.put(child1Name, child1);
parent1.children.put(child2Name, child2);
answer.parents.put(parent2Name, parent2);
return answer;
}
}