package com.fasterxml.jackson.databind.objectid;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.databind.*;
public class TestObjectId extends BaseMapTest
{
@JsonPropertyOrder({"a", "b"})
static class Wrapper {
public ColumnMetadata a, b;
}
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id")
static class ColumnMetadata {
private final String name;
private final String type;
private final String comment;
@JsonCreator
public ColumnMetadata(
@JsonProperty("name") String name,
@JsonProperty("type") String type,
@JsonProperty("comment") String comment
) {
this.name = name;
this.type = type;
this.comment = comment;
}
@JsonProperty("name")
public String getName() {
return name;
}
@JsonProperty("type")
public String getType() {
return type;
}
@JsonProperty("comment")
public String getComment() {
return comment;
}
}
/* Problem in which always-as-id reference may prevent initial
* serialization of a POJO.
*/
static class Company {
public List<Employee> employees;
public void add(Employee e) {
if (employees == null) {
employees = new ArrayList<Employee>();
}
employees.add(e);
}
}
@JsonIdentityInfo(property="id",
generator=ObjectIdGenerators.PropertyGenerator.class)
public static class Employee {
public int id;
public String name;
@JsonIdentityReference(alwaysAsId=true)
public Employee manager;
@JsonIdentityReference(alwaysAsId=true)
public List<Employee> reports;
public Employee() { }
public Employee(int id, String name, Employee manager) {
this.id = id;
this.name = name;
this.manager = manager;
reports = new ArrayList<Employee>();
}
public Employee addReport(Employee e) {
reports.add(e);
return this;
}
}
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id")
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class")
public static class BaseEntity { }
public static class Foo extends BaseEntity {
public BaseEntity ref;
}
public static class Bar extends BaseEntity
{
public Foo next;
}
// for [databind#1083]
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
property = "type",
defaultImpl = JsonMapSchema.class)
@JsonSubTypes({
@JsonSubTypes.Type(value = JsonMapSchema.class, name = "map"),
@JsonSubTypes.Type(value = JsonJdbcSchema.class, name = "jdbc") })
public static abstract class JsonSchema {
public String name;
}
static class JsonMapSchema extends JsonSchema { }
static class JsonJdbcSchema extends JsonSchema { }
/*
/**********************************************************
/* Test methods
/**********************************************************
*/
private final ObjectMapper MAPPER = new ObjectMapper();
public void testColumnMetadata() throws Exception
{
ColumnMetadata col = new ColumnMetadata("Billy", "employee", "comment");
Wrapper w = new Wrapper();
w.a = col;
w.b = col;
String json = MAPPER.writeValueAsString(w);
Wrapper deserialized = MAPPER.readValue(json, Wrapper.class);
assertNotNull(deserialized);
assertNotNull(deserialized.a);
assertNotNull(deserialized.b);
assertEquals("Billy", deserialized.a.getName());
assertEquals("employee", deserialized.a.getType());
assertEquals("comment", deserialized.a.getComment());
assertSame(deserialized.a, deserialized.b);
}
// For [databind#188]
public void testMixedRefsIssue188() throws Exception
{
Company comp = new Company();
Employee e1 = new Employee(1, "First", null);
Employee e2 = new Employee(2, "Second", e1);
e1.addReport(e2);
comp.add(e1);
comp.add(e2);
String json = MAPPER.writeValueAsString(comp);
assertEquals("{\"employees\":["
+"{\"id\":1,\"name\":\"First\",\"manager\":null,\"reports\":[2]},"
+"{\"id\":2,\"name\":\"Second\",\"manager\":1,\"reports\":[]}"
+"]}",
json);
}
public void testObjectAndTypeId() throws Exception
{
final ObjectMapper mapper = new ObjectMapper();
Bar inputRoot = new Bar();
Foo inputChild = new Foo();
inputRoot.next = inputChild;
inputChild.ref = inputRoot;
String json = mapper.writerWithDefaultPrettyPrinter()
.writeValueAsString(inputRoot);
BaseEntity resultRoot = mapper.readValue(json, BaseEntity.class);
assertNotNull(resultRoot);
assertTrue(resultRoot instanceof Bar);
Bar first = (Bar) resultRoot;
assertNotNull(first.next);
assertTrue(first.next instanceof Foo);
Foo second = (Foo) first.next;
assertNotNull(second.ref);
assertSame(first, second.ref);
}
public static class JsonRoot {
public final List<JsonSchema> schemas = new ArrayList<JsonSchema>();
}
public void testWithFieldsInBaseClass1083() throws Exception {
final String json = aposToQuotes("{'schemas': [{\n"
+ " 'name': 'FoodMart'\n"
+ "}]}\n");
MAPPER.readValue(json, JsonRoot.class);
}
}