From 4917c4bddcdc9cda78c04ab9491f220e33086c8f Mon Sep 17 00:00:00 2001 From: Bogdan Kobylynskyi <92bogdan@gmail.com> Date: Sun, 27 Dec 2020 22:38:31 -0600 Subject: [PATCH] Support interfaces to extend other interfaces #468 (#469) --- .../codegen/FreeMarkerTemplatesRegistry.java | 20 +++++++++---------- .../InterfaceDefinitionToDataModelMapper.java | 11 ++++++++++ .../{ => java-lang}/javaClassGraphqlEnum.ftl | 0 .../javaClassGraphqlInterface.ftl | 0 .../javaClassGraphqlOperations.ftl | 0 .../javaClassGraphqlParametrizedInput.ftl | 0 .../javaClassGraphqlRequest.ftl | 0 .../javaClassGraphqlResponse.ftl | 0 .../javaClassGraphqlResponseProjection.ftl | 0 .../{ => java-lang}/javaClassGraphqlType.ftl | 0 .../{ => java-lang}/javaClassGraphqlUnion.ftl | 0 .../codegen/GraphQLCodegenInterfacesTest.java | 3 ++- .../kotlin/GraphQLCodegenInterfacesTest.java | 2 +- .../interfaces/BarBar.java.txt | 13 ++++++++++++ .../kt/interfaces/BarBar.kt.txt | 12 +++++++++++ .../resources/schemas/interfaces.graphqls | 8 ++++++-- 16 files changed, 54 insertions(+), 15 deletions(-) rename src/main/resources/templates/{ => java-lang}/javaClassGraphqlEnum.ftl (100%) rename src/main/resources/templates/{ => java-lang}/javaClassGraphqlInterface.ftl (100%) rename src/main/resources/templates/{ => java-lang}/javaClassGraphqlOperations.ftl (100%) rename src/main/resources/templates/{ => java-lang}/javaClassGraphqlParametrizedInput.ftl (100%) rename src/main/resources/templates/{ => java-lang}/javaClassGraphqlRequest.ftl (100%) rename src/main/resources/templates/{ => java-lang}/javaClassGraphqlResponse.ftl (100%) rename src/main/resources/templates/{ => java-lang}/javaClassGraphqlResponseProjection.ftl (100%) rename src/main/resources/templates/{ => java-lang}/javaClassGraphqlType.ftl (100%) rename src/main/resources/templates/{ => java-lang}/javaClassGraphqlUnion.ftl (100%) create mode 100644 src/test/resources/expected-classes/interfaces/BarBar.java.txt create mode 100644 src/test/resources/expected-classes/kt/interfaces/BarBar.kt.txt diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/FreeMarkerTemplatesRegistry.java b/src/main/java/com/kobylynskyi/graphql/codegen/FreeMarkerTemplatesRegistry.java index 65964495..d9abd0b7 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/FreeMarkerTemplatesRegistry.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/FreeMarkerTemplatesRegistry.java @@ -38,15 +38,15 @@ class FreeMarkerTemplatesRegistry { try { EnumMap javaTemplates = new EnumMap<>(FreeMarkerTemplateType.class); - javaTemplates.put(TYPE, configuration.getTemplate("templates/javaClassGraphqlType.ftl")); - javaTemplates.put(ENUM, configuration.getTemplate("templates/javaClassGraphqlEnum.ftl")); - javaTemplates.put(UNION, configuration.getTemplate("templates/javaClassGraphqlUnion.ftl")); - javaTemplates.put(REQUEST, configuration.getTemplate("templates/javaClassGraphqlRequest.ftl")); - javaTemplates.put(RESPONSE, configuration.getTemplate("templates/javaClassGraphqlResponse.ftl")); - javaTemplates.put(INTERFACE, configuration.getTemplate("templates/javaClassGraphqlInterface.ftl")); - javaTemplates.put(OPERATIONS, configuration.getTemplate("templates/javaClassGraphqlOperations.ftl")); - javaTemplates.put(PARAMETRIZED_INPUT, configuration.getTemplate("templates/javaClassGraphqlParametrizedInput.ftl")); - javaTemplates.put(RESPONSE_PROJECTION, configuration.getTemplate("templates/javaClassGraphqlResponseProjection.ftl")); + javaTemplates.put(TYPE, configuration.getTemplate("templates/java-lang/javaClassGraphqlType.ftl")); + javaTemplates.put(ENUM, configuration.getTemplate("templates/java-lang/javaClassGraphqlEnum.ftl")); + javaTemplates.put(UNION, configuration.getTemplate("templates/java-lang/javaClassGraphqlUnion.ftl")); + javaTemplates.put(REQUEST, configuration.getTemplate("templates/java-lang/javaClassGraphqlRequest.ftl")); + javaTemplates.put(RESPONSE, configuration.getTemplate("templates/java-lang/javaClassGraphqlResponse.ftl")); + javaTemplates.put(INTERFACE, configuration.getTemplate("templates/java-lang/javaClassGraphqlInterface.ftl")); + javaTemplates.put(OPERATIONS, configuration.getTemplate("templates/java-lang/javaClassGraphqlOperations.ftl")); + javaTemplates.put(PARAMETRIZED_INPUT, configuration.getTemplate("templates/java-lang/javaClassGraphqlParametrizedInput.ftl")); + javaTemplates.put(RESPONSE_PROJECTION, configuration.getTemplate("templates/java-lang/javaClassGraphqlResponseProjection.ftl")); templateMap.put(GeneratedLanguage.JAVA, javaTemplates); EnumMap scalaTemplates = new EnumMap<>(FreeMarkerTemplateType.class); @@ -72,8 +72,6 @@ class FreeMarkerTemplatesRegistry { kotlinTemplates.put(PARAMETRIZED_INPUT, configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlParametrizedInput.ftl")); kotlinTemplates.put(RESPONSE_PROJECTION, configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlResponseProjection.ftl")); templateMap.put(GeneratedLanguage.KOTLIN, kotlinTemplates); - - } catch (IOException e) { throw new UnableToLoadFreeMarkerTemplateException(e); } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/InterfaceDefinitionToDataModelMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/InterfaceDefinitionToDataModelMapper.java index 1ecacfa8..5f50ad46 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/InterfaceDefinitionToDataModelMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/InterfaceDefinitionToDataModelMapper.java @@ -5,6 +5,8 @@ import com.kobylynskyi.graphql.codegen.model.definitions.ExtendedInterfaceTypeDe import java.util.HashMap; import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; import static com.kobylynskyi.graphql.codegen.model.DataModelFields.*; @@ -40,6 +42,7 @@ public class InterfaceDefinitionToDataModelMapper { dataModel.put(PACKAGE, DataModelMapper.getModelPackageName(mappingContext)); dataModel.put(CLASS_NAME, dataModelMapper.getModelClassNameWithPrefixAndSuffix(mappingContext, definition)); dataModel.put(JAVA_DOC, definition.getJavaDoc()); + dataModel.put(IMPLEMENTS, getInterfaces(mappingContext, definition)); dataModel.put(ANNOTATIONS, graphQLTypeMapper.getAnnotations(mappingContext, definition)); dataModel.put(FIELDS, fieldDefinitionToParameterMapper.mapFields(mappingContext, definition.getFieldDefinitions(), definition)); dataModel.put(GENERATED_INFO, mappingContext.getGeneratedInformation()); @@ -48,4 +51,12 @@ public class InterfaceDefinitionToDataModelMapper { return dataModel; } + private Set getInterfaces(MappingContext mappingContext, + ExtendedInterfaceTypeDefinition definition) { + return definition.getImplements() + .stream() + .map(anImplement -> graphQLTypeMapper.getLanguageType(mappingContext, anImplement)) + .collect(Collectors.toSet()); + } + } diff --git a/src/main/resources/templates/javaClassGraphqlEnum.ftl b/src/main/resources/templates/java-lang/javaClassGraphqlEnum.ftl similarity index 100% rename from src/main/resources/templates/javaClassGraphqlEnum.ftl rename to src/main/resources/templates/java-lang/javaClassGraphqlEnum.ftl diff --git a/src/main/resources/templates/javaClassGraphqlInterface.ftl b/src/main/resources/templates/java-lang/javaClassGraphqlInterface.ftl similarity index 100% rename from src/main/resources/templates/javaClassGraphqlInterface.ftl rename to src/main/resources/templates/java-lang/javaClassGraphqlInterface.ftl diff --git a/src/main/resources/templates/javaClassGraphqlOperations.ftl b/src/main/resources/templates/java-lang/javaClassGraphqlOperations.ftl similarity index 100% rename from src/main/resources/templates/javaClassGraphqlOperations.ftl rename to src/main/resources/templates/java-lang/javaClassGraphqlOperations.ftl diff --git a/src/main/resources/templates/javaClassGraphqlParametrizedInput.ftl b/src/main/resources/templates/java-lang/javaClassGraphqlParametrizedInput.ftl similarity index 100% rename from src/main/resources/templates/javaClassGraphqlParametrizedInput.ftl rename to src/main/resources/templates/java-lang/javaClassGraphqlParametrizedInput.ftl diff --git a/src/main/resources/templates/javaClassGraphqlRequest.ftl b/src/main/resources/templates/java-lang/javaClassGraphqlRequest.ftl similarity index 100% rename from src/main/resources/templates/javaClassGraphqlRequest.ftl rename to src/main/resources/templates/java-lang/javaClassGraphqlRequest.ftl diff --git a/src/main/resources/templates/javaClassGraphqlResponse.ftl b/src/main/resources/templates/java-lang/javaClassGraphqlResponse.ftl similarity index 100% rename from src/main/resources/templates/javaClassGraphqlResponse.ftl rename to src/main/resources/templates/java-lang/javaClassGraphqlResponse.ftl diff --git a/src/main/resources/templates/javaClassGraphqlResponseProjection.ftl b/src/main/resources/templates/java-lang/javaClassGraphqlResponseProjection.ftl similarity index 100% rename from src/main/resources/templates/javaClassGraphqlResponseProjection.ftl rename to src/main/resources/templates/java-lang/javaClassGraphqlResponseProjection.ftl diff --git a/src/main/resources/templates/javaClassGraphqlType.ftl b/src/main/resources/templates/java-lang/javaClassGraphqlType.ftl similarity index 100% rename from src/main/resources/templates/javaClassGraphqlType.ftl rename to src/main/resources/templates/java-lang/javaClassGraphqlType.ftl diff --git a/src/main/resources/templates/javaClassGraphqlUnion.ftl b/src/main/resources/templates/java-lang/javaClassGraphqlUnion.ftl similarity index 100% rename from src/main/resources/templates/javaClassGraphqlUnion.ftl rename to src/main/resources/templates/java-lang/javaClassGraphqlUnion.ftl diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenInterfacesTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenInterfacesTest.java index d958a071..eb99c4ac 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenInterfacesTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenInterfacesTest.java @@ -43,7 +43,7 @@ class GraphQLCodegenInterfacesTest { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); - assertEquals(Arrays.asList("Bar.java", "Bar1.java", "Foo.java", "Foo1.java"), generatedFileNames); + assertEquals(Arrays.asList("Bar.java", "Bar1.java", "BarBar.java", "Foo.java", "Foo1.java"), generatedFileNames); for (File file : files) { assertSameTrimmedContent(new File(String.format("src/test/resources/expected-classes/interfaces/%s.txt", @@ -51,4 +51,5 @@ class GraphQLCodegenInterfacesTest { file); } } + } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenInterfacesTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenInterfacesTest.java index b4d42701..33819556 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenInterfacesTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenInterfacesTest.java @@ -46,7 +46,7 @@ class GraphQLCodegenInterfacesTest { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); - assertEquals(Arrays.asList("Bar.kt", "Bar1.kt", "Foo.kt", "Foo1.kt"), generatedFileNames); + assertEquals(Arrays.asList("Bar.kt", "Bar1.kt", "BarBar.kt", "Foo.kt", "Foo1.kt"), generatedFileNames); for (File file : files) { assertSameTrimmedContent(new File(String.format("src/test/resources/expected-classes/kt/interfaces/%s.txt", diff --git a/src/test/resources/expected-classes/interfaces/BarBar.java.txt b/src/test/resources/expected-classes/interfaces/BarBar.java.txt new file mode 100644 index 00000000..9cf5faa6 --- /dev/null +++ b/src/test/resources/expected-classes/interfaces/BarBar.java.txt @@ -0,0 +1,13 @@ +package com.kobylynskyi.graphql.interfaces; + + +@javax.annotation.Generated( + value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen", + date = "2020-12-31T23:59:59-0500" +) +public interface BarBar extends Bar{ + + @javax.validation.constraints.NotNull + String getId(); + +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/kt/interfaces/BarBar.kt.txt b/src/test/resources/expected-classes/kt/interfaces/BarBar.kt.txt new file mode 100644 index 00000000..b7e2b2cc --- /dev/null +++ b/src/test/resources/expected-classes/kt/interfaces/BarBar.kt.txt @@ -0,0 +1,12 @@ +package com.kobylynskyi.graphql.interfaces + + +@javax.annotation.Generated( + value = ["com.kobylynskyi.graphql.codegen.GraphQLCodegen"], + date = "2020-12-31T23:59:59-0500" +) +interface BarBar : Bar{ + + val id: String + +} \ No newline at end of file diff --git a/src/test/resources/schemas/interfaces.graphqls b/src/test/resources/schemas/interfaces.graphqls index 1f69d2a3..ae6c06dc 100644 --- a/src/test/resources/schemas/interfaces.graphqls +++ b/src/test/resources/schemas/interfaces.graphqls @@ -7,11 +7,15 @@ interface Bar { id: ID! } -type Foo1 implements Foo{ +type Foo1 implements Foo { id: ID! bars: [Bar1] } -type Bar1 implements Bar{ +type Bar1 implements Bar { + id: ID! +} + +interface BarBar implements Bar { id: ID! } \ No newline at end of file -- GitLab