From 1a0db172cf0b2c8bdcb36c738621df79df1edb4e Mon Sep 17 00:00:00 2001 From: vokl0313 Date: Fri, 14 Jun 2019 22:49:18 +0300 Subject: [PATCH] apitool parser complex map types parsing --- .../apitool/TypeJsonDeserializer.java | 5 +- .../internal/apitool/ComplexMapTypesTest.java | 60 +++++++++++++++++++ 2 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 modules/jooby-apitool/src/test/java/org/jooby/internal/apitool/ComplexMapTypesTest.java diff --git a/modules/jooby-apitool/src/main/java/org/jooby/internal/apitool/TypeJsonDeserializer.java b/modules/jooby-apitool/src/main/java/org/jooby/internal/apitool/TypeJsonDeserializer.java index 3159d7ce97..2414964c06 100644 --- a/modules/jooby-apitool/src/main/java/org/jooby/internal/apitool/TypeJsonDeserializer.java +++ b/modules/jooby-apitool/src/main/java/org/jooby/internal/apitool/TypeJsonDeserializer.java @@ -213,7 +213,6 @@ import java.lang.reflect.Array; import java.lang.reflect.Type; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; class TypeJsonDeserializer extends JsonDeserializer { @@ -243,8 +242,8 @@ private static List parse(final ClassLoader loader, final String type, fin if (ch == '<') { Type owner = BytecodeRouteParser.loadType(loader, singleType.toString()); List parameters = parse(loader, type, i + 1); - return Arrays.asList( - Types.newParameterizedType(owner, parameters.toArray(new Type[parameters.size()]))); + types.add(Types.newParameterizedType(owner, parameters.toArray(new Type[parameters.size()]))); + return types; } else if (ch == ',') { Type element = BytecodeRouteParser.loadType(loader, singleType.toString()); types.add(element); diff --git a/modules/jooby-apitool/src/test/java/org/jooby/internal/apitool/ComplexMapTypesTest.java b/modules/jooby-apitool/src/test/java/org/jooby/internal/apitool/ComplexMapTypesTest.java new file mode 100644 index 0000000000..d7cc5b2e1a --- /dev/null +++ b/modules/jooby-apitool/src/test/java/org/jooby/internal/apitool/ComplexMapTypesTest.java @@ -0,0 +1,60 @@ +package org.jooby.internal.apitool; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.inject.util.Types; +import org.junit.Test; + +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.UUID; + +import static org.junit.Assert.assertEquals; + +public class ComplexMapTypesTest { + + public static class TypeWrapper { + private Type type; + + public Type getType() { + return type; + } + + public void setType(Type type) { + this.type = type; + } + } + + @Test + public void shouldDeserializeMapWithListProperly() throws Exception { + ObjectMapper mapper = BytecodeRouteParser.mapper; + TypeWrapper expected = new TypeWrapper(); + ParameterizedType type = Types.mapOf(UUID.class, Types.listOf(Integer.class)); + expected.setType(type); + String json = mapper.writeValueAsString(expected); + TypeWrapper actual = mapper.readValue(json, TypeWrapper.class); + assertEquals(expected.getType(), actual.getType()); + } + + @Test + public void shouldDeserializeMapWithMapWithListProperly() throws Exception { + ObjectMapper mapper = BytecodeRouteParser.mapper; + TypeWrapper expected = new TypeWrapper(); + ParameterizedType type = Types.mapOf(UUID.class, Types.mapOf(UUID.class, Types.listOf(Integer.class))); + expected.setType(type); + String json = mapper.writeValueAsString(expected); + TypeWrapper actual = mapper.readValue(json, TypeWrapper.class); + assertEquals(expected.getType(), actual.getType()); + } + + @Test + public void shouldDeserializeListWithMapWithListProperly() throws Exception { + ObjectMapper mapper = BytecodeRouteParser.mapper; + TypeWrapper expected = new TypeWrapper(); + ParameterizedType type = Types.listOf(Types.mapOf(UUID.class, Types.mapOf(UUID.class, Types.listOf(Integer.class)))); + expected.setType(type); + String json = mapper.writeValueAsString(expected); + TypeWrapper actual = mapper.readValue(json, TypeWrapper.class); + assertEquals(expected.getType(), actual.getType()); + } + +}