diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaGraphQLTypeMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaGraphQLTypeMapper.java index 08499e6d0..177e74fe5 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaGraphQLTypeMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaGraphQLTypeMapper.java @@ -101,7 +101,7 @@ public NamedDefinition getLanguageType(MappingContext mappingContext, String gra serializeUsingObjectMapper = true; } - return new NamedDefinition(langTypeName, graphQLType, mappingContext.getInterfacesName().contains(graphQLType), + return new NamedDefinition(langTypeName, graphQLType, isInterfaceOrUnion(mappingContext, graphQLType), mandatory, primitiveCanBeUsed, serializeUsingObjectMapper); } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/GraphQLTypeMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/GraphQLTypeMapper.java index c2baadbdf..b83360aee 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/GraphQLTypeMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/GraphQLTypeMapper.java @@ -177,7 +177,8 @@ public NamedDefinition getLanguageType(MappingContext mappingContext, Type gr } else if (graphqlType instanceof ListType) { NamedDefinition mappedCollectionType = getLanguageType(mappingContext, ((ListType) graphqlType).getType(), name, parentTypeName, false, true); - if (mappedCollectionType.isInterface() && mappingContext.getInterfacesName().contains(parentTypeName)) { + if (mappedCollectionType.isInterfaceOrUnion() && + isInterfaceOrUnion(mappingContext, parentTypeName)) { mappedCollectionType.setJavaName( wrapSuperTypeIntoList(mappingContext, mappedCollectionType.getJavaName(), mandatory)); } else { @@ -223,7 +224,7 @@ public NamedDefinition getLanguageType(MappingContext mappingContext, String gra serializeFieldsUsingObjectMapper.contains(graphQLType) || serializeFieldsUsingObjectMapper.contains(parentTypeName + "." + name); - return new NamedDefinition(langTypeName, graphQLType, mappingContext.getInterfacesName().contains(graphQLType), + return new NamedDefinition(langTypeName, graphQLType, isInterfaceOrUnion(mappingContext, graphQLType), mandatory, primitiveCanBeUsed, serializeUsingObjectMapper); } @@ -247,4 +248,9 @@ public String getResponseReturnType(MappingContext mappingContext, return computedTypeName; } + protected boolean isInterfaceOrUnion(MappingContext mappingContext, String graphQLType) { + return mappingContext.getInterfacesName().contains(graphQLType) || + mappingContext.getUnionsNames().contains(graphQLType); + } + } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java index 2bd3a17d1..557e73d6e 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java @@ -29,6 +29,7 @@ public class MappingContext implements GraphQLCodegenConfiguration { private final ExtendedDocument document; private final Set typesUnionsInterfacesNames; private final Set interfacesName; + private final Set unionsName; private final Set operationsName; private final Map> interfaceChildren; private final GeneratedInformation generatedInformation; @@ -47,6 +48,7 @@ private MappingContext(File outputDirectory, this.document = document; this.typesUnionsInterfacesNames = document.getTypesUnionsInterfacesNames(); this.interfacesName = document.getInterfacesNames(); + this.unionsName = document.getUnionsNames(); this.interfaceChildren = document.getInterfaceChildren(); this.generatedInformation = generatedInformation; this.operationsName = document.getOperationsNames(); @@ -346,6 +348,10 @@ public Set getInterfacesName() { return interfacesName; } + public Set getUnionsNames() { + return unionsName; + } + public Set getOperationsName() { return operationsName; } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/NamedDefinition.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/NamedDefinition.java index ab8658dde..def48a797 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/NamedDefinition.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/NamedDefinition.java @@ -7,17 +7,17 @@ public class NamedDefinition { private String javaName; private String graphqlTypeName; - private boolean isInterface; + private boolean isInterfaceOrUnion; private boolean mandatory; private boolean primitiveCanBeUsed; private boolean serializeUsingObjectMapper; public NamedDefinition(String javaName, String graphqlTypeName, - boolean isInterface, boolean mandatory, + boolean isInterfaceOrUnion, boolean mandatory, boolean primitiveCanBeUsed, boolean serializeUsingObjectMapper) { this.javaName = javaName; this.graphqlTypeName = graphqlTypeName; - this.isInterface = isInterface; + this.isInterfaceOrUnion = isInterfaceOrUnion; this.mandatory = mandatory; this.primitiveCanBeUsed = primitiveCanBeUsed; this.serializeUsingObjectMapper = serializeUsingObjectMapper; @@ -39,12 +39,12 @@ public void setGraphqlTypeName(String graphqlTypeName) { this.graphqlTypeName = graphqlTypeName; } - public boolean isInterface() { - return isInterface; + public boolean isInterfaceOrUnion() { + return isInterfaceOrUnion; } - public void setInterface(boolean anInterface) { - isInterface = anInterface; + public void setInterfaceOrUnion(boolean interfaceOrUnion) { + isInterfaceOrUnion = interfaceOrUnion; } public boolean isMandatory() { diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedDocument.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedDocument.java index 7a694c7dd..dbe2deb4c 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedDocument.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedDocument.java @@ -88,6 +88,12 @@ public Set getInterfacesNames() { .collect(Collectors.toSet()); } + public Set getUnionsNames() { + return unionDefinitions.stream() + .map(ExtendedDefinition::getName) + .collect(Collectors.toSet()); + } + public Set getOperationsNames() { return operationDefinitions.stream() .map(ExtendedObjectTypeDefinition::getFieldDefinitions) diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenUnionResolverTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenUnionResolverTest.java index 97784f456..bdfbf6a1c 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenUnionResolverTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenUnionResolverTest.java @@ -30,11 +30,6 @@ void init() { mappingConfig.setGenerateJacksonTypeIdResolver(true); } - private List generate(String s) throws IOException { - return new JavaGraphQLCodegen(singletonList(s), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); - } - @AfterEach void cleanup() { Utils.deleteDir(outputBuildDir); @@ -48,8 +43,8 @@ void generate_CheckFiles_with_model_package() throws Exception { File outputJavaClassesDir = new File("build/generated/com/kobylynskyi/graphql/unionresolver"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); - List expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.java", "UnionMemberA.java", - "UnionMemberB.java", "UnionToResolve.java"); + List expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.java", "ResultObject.java", + "UnionMemberA.java", "UnionMemberB.java", "UnionToResolve.java"); assertEquals(expectedClasses, generatedFileNames); for (File file : files) { @@ -70,8 +65,8 @@ void generate_CheckFiles_without_model_package_and_with_prefix_and_suffix() thro File outputJavaClassesDir = new File("build/generated"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); - List expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.java", "MyUnionMemberASuffix.java", - "MyUnionMemberBSuffix.java", "MyUnionToResolveSuffix.java"); + List expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.java", "MyResultObjectSuffix.java", + "MyUnionMemberASuffix.java", "MyUnionMemberBSuffix.java", "MyUnionToResolveSuffix.java"); assertEquals(expectedClasses, generatedFileNames); for (File file : files) { @@ -82,4 +77,10 @@ void generate_CheckFiles_without_model_package_and_with_prefix_and_suffix() thro file); } } + + private void generate(String path) throws IOException { + new JavaGraphQLCodegen(singletonList(path), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); + } + } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenUnionResolverTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenUnionResolverTest.java index e33c2f5ab..efe5fe257 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenUnionResolverTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenUnionResolverTest.java @@ -32,11 +32,6 @@ void init() { mappingConfig.setGeneratedLanguage(GeneratedLanguage.KOTLIN); } - private List generate(String s) throws IOException { - return new KotlinGraphQLCodegen(singletonList(s), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); - } - @AfterEach void cleanup() { Utils.deleteDir(outputBuildDir); @@ -50,8 +45,8 @@ void generate_CheckFiles_with_model_package() throws Exception { File outputJavaClassesDir = new File("build/generated/com/kobylynskyi/graphql/unionresolver"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); - List expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.kt", "UnionMemberA.kt", - "UnionMemberB.kt", "UnionToResolve.kt"); + List expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.kt", "ResultObject.kt", + "UnionMemberA.kt", "UnionMemberB.kt", "UnionToResolve.kt"); assertEquals(expectedClasses, generatedFileNames); for (File file : files) { @@ -72,8 +67,8 @@ void generate_CheckFiles_without_model_package_and_with_prefix_and_suffix() thro File outputJavaClassesDir = new File("build/generated"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); - List expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.kt", "MyUnionMemberASuffix.kt", - "MyUnionMemberBSuffix.kt", "MyUnionToResolveSuffix.kt"); + List expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.kt", "MyResultObjectSuffix.kt", + "MyUnionMemberASuffix.kt", "MyUnionMemberBSuffix.kt", "MyUnionToResolveSuffix.kt"); assertEquals(expectedClasses, generatedFileNames); for (File file : files) { @@ -85,4 +80,10 @@ void generate_CheckFiles_without_model_package_and_with_prefix_and_suffix() thro file); } } + + private void generate(String path) throws IOException { + new KotlinGraphQLCodegen(singletonList(path), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); + } + } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenUnionResolverTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenUnionResolverTest.java index c585ccd0c..1efa8b065 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenUnionResolverTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenUnionResolverTest.java @@ -32,11 +32,6 @@ void init() { mappingConfig.setGeneratedLanguage(GeneratedLanguage.SCALA); } - private List generate(String s) throws IOException { - return new ScalaGraphQLCodegen(singletonList(s), outputBuildDir, mappingConfig, - TestUtils.getStaticGeneratedInfo()).generate(); - } - @AfterEach void cleanup() { Utils.deleteDir(outputBuildDir); @@ -50,8 +45,8 @@ void generate_CheckFiles_with_model_package() throws Exception { File outputJavaClassesDir = new File("build/generated/com/kobylynskyi/graphql/unionresolver"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); - List expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.scala", "UnionMemberA.scala", - "UnionMemberB.scala", "UnionToResolve.scala"); + List expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.scala", "ResultObject.scala", + "UnionMemberA.scala", "UnionMemberB.scala", "UnionToResolve.scala"); assertEquals(expectedClasses, generatedFileNames); for (File file : files) { @@ -72,8 +67,8 @@ void generate_CheckFiles_without_model_package_and_with_prefix_and_suffix() thro File outputJavaClassesDir = new File("build/generated"); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); - List expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.scala", "MyUnionMemberASuffix.scala", - "MyUnionMemberBSuffix.scala", "MyUnionToResolveSuffix.scala"); + List expectedClasses = Arrays.asList("GraphqlJacksonTypeIdResolver.scala", "MyResultObjectSuffix.scala", + "MyUnionMemberASuffix.scala", "MyUnionMemberBSuffix.scala", "MyUnionToResolveSuffix.scala"); assertEquals(expectedClasses, generatedFileNames); for (File file : files) { @@ -85,4 +80,10 @@ void generate_CheckFiles_without_model_package_and_with_prefix_and_suffix() thro file); } } + + private void generate(String path) throws IOException { + new ScalaGraphQLCodegen(singletonList(path), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); + } + } diff --git a/src/test/resources/expected-classes/jackson-resolver-union/ResultObject.java.txt b/src/test/resources/expected-classes/jackson-resolver-union/ResultObject.java.txt new file mode 100644 index 000000000..a4aa0ed2d --- /dev/null +++ b/src/test/resources/expected-classes/jackson-resolver-union/ResultObject.java.txt @@ -0,0 +1,12 @@ +package com.kobylynskyi.graphql.unionresolver; + + +@javax.annotation.Generated( + value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen", + date = "2020-12-31T23:59:59-0500" +) +public interface ResultObject { + + java.util.List getList(); + +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/jackson-resolver-union/without-model-package/MyResultObjectSuffix.java.txt b/src/test/resources/expected-classes/jackson-resolver-union/without-model-package/MyResultObjectSuffix.java.txt new file mode 100644 index 000000000..2ee4011e0 --- /dev/null +++ b/src/test/resources/expected-classes/jackson-resolver-union/without-model-package/MyResultObjectSuffix.java.txt @@ -0,0 +1,9 @@ +@javax.annotation.Generated( + value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen", + date = "2020-12-31T23:59:59-0500" +) +public interface MyResultObjectSuffix { + + java.util.List getList(); + +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/kt/jackson-resolver-union/ResultObject.kt.txt b/src/test/resources/expected-classes/kt/jackson-resolver-union/ResultObject.kt.txt new file mode 100644 index 000000000..e09549ab7 --- /dev/null +++ b/src/test/resources/expected-classes/kt/jackson-resolver-union/ResultObject.kt.txt @@ -0,0 +1,12 @@ +package com.kobylynskyi.graphql.unionresolver + + +@javax.annotation.Generated( + value = ["com.kobylynskyi.graphql.codegen.GraphQLCodegen"], + date = "2020-12-31T23:59:59-0500" +) +interface ResultObject { + + val list: List? + +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/kt/jackson-resolver-union/without-model-package/MyResultObjectSuffix.kt.txt b/src/test/resources/expected-classes/kt/jackson-resolver-union/without-model-package/MyResultObjectSuffix.kt.txt new file mode 100644 index 000000000..71f2ad729 --- /dev/null +++ b/src/test/resources/expected-classes/kt/jackson-resolver-union/without-model-package/MyResultObjectSuffix.kt.txt @@ -0,0 +1,9 @@ +@javax.annotation.Generated( + value = ["com.kobylynskyi.graphql.codegen.GraphQLCodegen"], + date = "2020-12-31T23:59:59-0500" +) +interface MyResultObjectSuffix { + + val list: List? + +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/jackson-resolver-union/ResultObject.scala.txt b/src/test/resources/expected-classes/scala/jackson-resolver-union/ResultObject.scala.txt new file mode 100644 index 000000000..f9ad137de --- /dev/null +++ b/src/test/resources/expected-classes/scala/jackson-resolver-union/ResultObject.scala.txt @@ -0,0 +1,12 @@ +package com.kobylynskyi.graphql.unionresolver + + +@javax.annotation.Generated( + value = Array("com.kobylynskyi.graphql.codegen.GraphQLCodegen"), + date = "2020-12-31T23:59:59-0500" +) +trait ResultObject { + + val list: scala.Seq[_ <: UnionToResolve] + +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/jackson-resolver-union/without-model-package/MyResultObjectSuffix.scala.txt b/src/test/resources/expected-classes/scala/jackson-resolver-union/without-model-package/MyResultObjectSuffix.scala.txt new file mode 100644 index 000000000..19d9d82d5 --- /dev/null +++ b/src/test/resources/expected-classes/scala/jackson-resolver-union/without-model-package/MyResultObjectSuffix.scala.txt @@ -0,0 +1,9 @@ +@javax.annotation.Generated( + value = Array("com.kobylynskyi.graphql.codegen.GraphQLCodegen"), + date = "2020-12-31T23:59:59-0500" +) +trait MyResultObjectSuffix { + + val list: scala.Seq[_ <: MyUnionToResolveSuffix] + +} \ No newline at end of file diff --git a/src/test/resources/schemas/union-resolver.graphqls b/src/test/resources/schemas/union-resolver.graphqls index 914317336..2f12f328c 100644 --- a/src/test/resources/schemas/union-resolver.graphqls +++ b/src/test/resources/schemas/union-resolver.graphqls @@ -1,3 +1,7 @@ +interface ResultObject { + list: [UnionToResolve!] +} + type UnionMemberA { someField: Int }