package io.ebeaninternal.server.text.json;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.text.json.JsonContext;
import io.ebean.text.json.JsonWriteBeanVisitor;
import io.ebean.text.json.JsonWriteOptions;
import io.ebean.text.json.JsonWriter;
import org.tests.model.basic.Address;
import org.tests.model.basic.Contact;
import org.tests.model.basic.Country;
import org.tests.model.basic.Customer;
import org.tests.model.basic.ResetBasicData;
import org.junit.Test;
import java.math.BigDecimal;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
public class TestJsonWriteVisitor extends BaseTestCase {
@Test
public void test() {
ResetBasicData.reset();
List<Customer> list = Ebean.find(Customer.class)
.select("id, name, status")
.fetch("billingAddress", "line1, city")
.fetch("billingAddress.country", "*")
.fetch("contacts", "firstName,email")
.order().desc("id")
.findList();
JsonContext json = Ebean.json();
JsonWriteOptions options = new JsonWriteOptions();
options.setRootPathVisitor(new CustomerVisitor());
options.setPathVisitor("billingAddress", new BillingVisitor());
options.setPathVisitor("billingAddress.country", new CountryVisitor());
options.setPathVisitor("contacts", new ContactVisitor());
String jsonContent = json.toJson(list, options);
assertThat(jsonContent).contains("customerExtra");
assertThat(jsonContent).contains("contactExtra");
assertThat(jsonContent).contains("billingExtra");
assertThat(jsonContent).contains("countryExtra");
}
class CustomerVisitor implements JsonWriteBeanVisitor<Customer> {
@Override
public void visit(Customer bean, JsonWriter jsonWriter) {
jsonWriter.writeStringField("customerExtra", "extra4");
jsonWriter.writeStartObject("startObj");
jsonWriter.writeBooleanField("yesno", true);
jsonWriter.writeEndObject();
jsonWriter.writeFieldName("secObj");
jsonWriter.writeStartObject();
jsonWriter.writeBooleanField("yesno", false);
jsonWriter.writeEndObject();
jsonWriter.writeStartArray("startList");
jsonWriter.writeBoolean(true);
jsonWriter.writeString("one");
jsonWriter.writeNumber(1);
jsonWriter.writeNumber(2L);
jsonWriter.writeNumber(new BigDecimal("34.45"));
jsonWriter.writeNull();
jsonWriter.writeEndArray();
jsonWriter.writeFieldName("secondList");
jsonWriter.writeStartArray();
jsonWriter.writeNumber(3L);
jsonWriter.writeRawValue("\"rawVal\"");
jsonWriter.writeEndArray();
jsonWriter.writeRaw(",\"rawField\":{\"ra\":42}");
}
}
class ContactVisitor implements JsonWriteBeanVisitor<Contact> {
@Override
public void visit(Contact bean, JsonWriter jsonWriter) {
jsonWriter.writeStringField("contactExtra", "extra3");
}
}
class BillingVisitor implements JsonWriteBeanVisitor<Address> {
@Override
public void visit(Address bean, JsonWriter jsonWriter) {
jsonWriter.writeStringField("billingExtra", "extra1");
}
}
class CountryVisitor implements JsonWriteBeanVisitor<Country> {
@Override
public void visit(Country bean, JsonWriter jsonWriter) {
jsonWriter.writeStringField("countryExtra", "extra2");
}
}
}