blob: bdca9be88b31b4e33f19708e2a6c5d7763e983f2 [file] [log] [blame]
/**
* Licensed 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.jsonb;
import static org.junit.Assert.assertEquals;
import jakarta.json.bind.Jsonb;
import jakarta.json.bind.JsonbBuilder;
import jakarta.json.bind.JsonbConfig;
import jakarta.json.bind.adapter.JsonbAdapter;
import jakarta.json.bind.config.PropertyOrderStrategy;
import org.junit.Test;
public class GenericAdapterTest {
@Test
public void testJOHNZON223() throws Exception {
final JsonbConfig config = new JsonbConfig()
.withPropertyOrderStrategy(PropertyOrderStrategy.LEXICOGRAPHICAL)
.withAdapters(new EnumAdapter());
try (final Jsonb jsonb = JsonbBuilder.create(config)) {
// setup bean
final MyBean expectedBean = new MyBean();
expectedBean.myEnum1 = new EnumHolder<>(MyEnum1.VALUE1);
expectedBean.myEnum2 = new EnumHolder<>(MyEnum2.VALUE2);
// write to string
final String jsonString = jsonb.toJson(expectedBean);
assertEquals(
"{\"myEnum1\":\"org.apache.johnzon.jsonb.GenericAdapterTest$MyEnum1.VALUE1\"," +
"\"myEnum2\":\"org.apache.johnzon.jsonb.GenericAdapterTest$MyEnum2.VALUE2\"}",
jsonString);
// read from string
final MyBean actualBean = jsonb.fromJson(jsonString, MyBean.class);
assertEquals("MyBean [myEnum1=EnumHolder [value=VALUE1], myEnum2=EnumHolder [value=VALUE2]]",
String.valueOf(actualBean));
}
}
public static class MyBean {
public EnumHolder<MyEnum1> myEnum1;
public EnumHolder<MyEnum2> myEnum2;
@Override
public String toString() {
return String.format("MyBean [myEnum1=%s, myEnum2=%s]", this.myEnum1, this.myEnum2);
}
}
public static class EnumHolder<E extends Enum<E>> {
public Enum<E> value;
public EnumHolder(final Enum<E> value) {
this.value = value;
}
@Override
public String toString() {
return String.format("EnumHolder [value=%s]", this.value);
}
public static EnumHolder<?> valueOf(final String value) {
final EnumHolder<?> result;
try {
final int idx = value.lastIndexOf(".");
final Class clazz = Class.forName(value.substring(0, idx));
return new EnumHolder<>(Enum.valueOf(clazz, value.substring(idx + 1)));
} catch (final ClassNotFoundException e) {
throw new IllegalStateException(e);
}
}
}
public enum MyEnum1 {
VALUE1
}
public enum MyEnum2 {
VALUE2
}
private static class EnumAdapter implements JsonbAdapter<EnumHolder, String> {
@Override
public String adaptToJson(final EnumHolder obj) {
return obj != null && obj.value != null
? obj.value.getClass().getName() + "." + obj.value.name()
: null;
}
@Override
public EnumHolder adaptFromJson(final String obj) {
return EnumHolder.valueOf(obj);
}
}
}