blob: 8e5e0597c342bbd76fae5bc06a1e90a4bd5d63ff [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.johnzon.mapper;
import org.junit.Assert;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.SortedMap;
import java.util.TreeMap;
public class ObjectConverterTest {
@Test
public void testObjectConverter() {
Contact contact = new Contact();
contact.linkedPersons.addAll(Arrays.asList(new Person("f1", "l1"), new Person("f2", "l2")));
contact.linkedPersonsArray = new Person[] { new Person("f3", "l3"), new Person("f4", "l4") };
contact.personMap.put("cinq", new Person("f5", "l5"));
contact.personMap.put("six", new Person("f6", "l6"));
MapperBuilder mapperBuilder = new MapperBuilder();
mapperBuilder.addConverter(Person.class, new PersonConverter());
Mapper mapper = mapperBuilder.setAccessModeName("both").setAttributeOrder(new Comparator<String>() {
@Override
public int compare(final String o1, final String o2) {
return o1.compareTo(o2);
}
}).build();
String s = mapper.writeObjectAsString(contact);
Contact c = mapper.readObject(s, Contact.class);
String expected = "{\"linkedPersons\":[\"f1|l1\",\"f2|l2\"],\"linkedPersonsArray\":[\"f3|l3\",\"f4|l4\"],\"personMap\":{\"cinq\":\"f5|l5\",\"six\":\"f6|l6\"}}";
Assert.assertEquals(expected, s);
Assert.assertEquals(contact, c);
}
public static class PersonConverter implements Converter<Person> {
@Override
public String toString(Person instance) {
if (instance == null) {
return null;
}
return instance.getFirstName() + "|" + instance.getLastName();
}
@Override
public Person fromString(String text) {
if (text == null) {
return null;
}
String[] split = text.split("\\|");
if (split.length == 2) {
return new Person(split[0], split[1]);
}
return null;
}
}
public static class Contact {
@JohnzonConverter(PersonConverter.class)
private List<Person> linkedPersons = new ArrayList<Person>();
@JohnzonConverter(PersonConverter.class)
private Person[] linkedPersonsArray;
@JohnzonConverter(PersonConverter.class)
private SortedMap<String, Person> personMap = new TreeMap<String, Person>();
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
final Contact contact = Contact.class.cast(o);
return linkedPersons.equals(contact.linkedPersons) && personMap.equals(contact.personMap)
&& Arrays.equals(linkedPersonsArray, contact.linkedPersonsArray);
}
@Override
public int hashCode() {
int result = linkedPersons.hashCode();
result = 31 * result + Arrays.hashCode(linkedPersonsArray);
return result;
}
@Override
public String toString() {
return "Contact{" +
"linkedPersons=" + linkedPersons +
", linkedPersonsArray=" + Arrays.toString(linkedPersonsArray) +
", personMap=" + personMap +
'}';
}
}
public static class Person {
private String firstName;
private String lastName;
//no default constructor on purpose
private Person(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof Person)) {
return false;
}
Person person = (Person) o;
if (firstName != null ? !firstName.equals(person.firstName) : person.firstName != null) {
return false;
}
if (lastName != null ? !lastName.equals(person.lastName) : person.lastName != null) {
return false;
}
return true;
}
@Override
public int hashCode() {
int result = firstName != null ? firstName.hashCode() : 0;
result = 31 * result + (lastName != null ? lastName.hashCode() : 0);
return result;
}
@Override
public String toString() {
return "Person{" +
"firstName='" + firstName + '\'' +
", lastName='" + lastName + '\'' +
'}';
}
}
}