From 2faea7c3d293e0a530cedcb9647ecfe4cc2df770 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=A6=E5=A2=83=E8=BF=B7=E7=A6=BB?= Date: Tue, 18 Aug 2020 19:47:15 +0800 Subject: [PATCH] add suffix after the default value of the base type(long) (#292) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add sbt plugin * rm log to file * update * update readme * update readme * update readme * update client example * update client example * update log * update client example * add scalaiform * add scalaiform and publish * support schemaFinderConfig and parentInterfacesConfig * update readme license, convert GraphQLCodegen to Def * update readme * Create scala.yml * update scala ci * update scala ci * rm scala ci * rm scala ci * use publishLocal * ci support ivy cache * ci support ivy cache * fix support ivy cache * change example project level * change example project level * fix path for ci * fix workflows * move generate code to src_managed_graphql * change generate code location to src_managed_graphql * add sbt-test for plugin * fix workflows * fix workflows * change generate code location to src_managed_graphql * add watch resource, refactor plugins * add developer for publish * add key apiAsyncReturnType and apiAsyncReturnListType, refactor code, update sbt-test with two options * add resolvers * add resolvers for ci * add resolvers for ci * add resolvers for ci * Remove redundant dependencies * fix support ivy local * Update github.yml * fix support ivy local * update ci * fix compile failed when generate code not found in classpath. test in the standard way * Update github.yml * 1. update default option code 2. update client example 3. update version to 2.3.0 * update version to 2.3.0 * Merge branch 'master' of github.com:jxnu-liguobin/graphql-java-codegen * pre release 2.4.0 * next dev 2.4.1-SNAPSHOT fix example support with v2.4.0 add typename * add use case with proxy * add comment * add Support code * update README * add scope on conf key * add release plugin * add release plugin * Setting version to 2.4.2 * Setting version to 2.4.3-SNAPSHOT * add release plugin (not release) * upgrade sbt version, update example Deprecated api * refactor sbt plugin * refactor sbt plugin * :recycle: Changes for upcoming release 3.0.0 (#276) * Setting version to 3.0.0 * fix conflict, release3.0.0 * append migration * append migration * fix default value, cannot assign a int value to Long(boxing type) * fix default value, cannot assign a int value to Long(boxing type) * use new file * use conversion instead of reflect --- .../graphql/codegen/mapper/ValueMapper.java | 18 +- .../codegen/GraphQLCodegenDefaultsTest.java | 19 ++ .../defaults/InputWithDefaultsDTO.java.txt | 220 ++++++++++++++++++ .../defaults/MyEnumDTO.java.txt | 24 ++ .../defaults/SomeObjectDTO.java.txt | 51 ++++ .../schemas/defaults-with-Long.graphqls | 27 +++ src/test/resources/schemas/defaults.graphqls | 2 +- 7 files changed, 358 insertions(+), 3 deletions(-) create mode 100644 src/test/resources/expected-classes/defaults/InputWithDefaultsDTO.java.txt create mode 100644 src/test/resources/expected-classes/defaults/MyEnumDTO.java.txt create mode 100644 src/test/resources/expected-classes/defaults/SomeObjectDTO.java.txt create mode 100644 src/test/resources/schemas/defaults-with-Long.graphqls diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/ValueMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/ValueMapper.java index 9f6fad44..98702f42 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/ValueMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/ValueMapper.java @@ -39,7 +39,7 @@ public class ValueMapper { return ValueFormatter.format(mapBoolean((BooleanValue) value), formatter); } if (value instanceof IntValue) { - return ValueFormatter.format(mapInt((IntValue) value), formatter); + return ValueFormatter.format(mapInt(mappingContext, (IntValue) value, graphQLType), formatter); } if (value instanceof FloatValue) { return ValueFormatter.format(mapFloat((FloatValue) value), formatter); @@ -65,7 +65,21 @@ public class ValueMapper { return value.isValue() ? "true" : "false"; } - private static String mapInt(IntValue value) { + private static String mapInt(MappingContext mappingContext, IntValue value, Type graphQLType) { + //default java basic type is `int`. so, default value like 123 that must wrap or append suffix `L` when it be defined as `int` in graphql schema. + //`int` cannot assign to `Long`, also `double` cannot assign to `Float`, but graphql Float default mapping is Double in java, so, not modify `mapFloat`. + if (graphQLType instanceof TypeName) { + String customType = mappingContext.getCustomTypesMapping().get("Long"); + String typeName = ((TypeName) graphQLType).getName(); + if ("Long".equals(typeName) && ("java.lang.Long".equals(customType) || "Long".equals(customType))) { + return String.valueOf(value.getValue()).concat("L"); + } + } + + if (graphQLType instanceof NonNullType) { + // unwrapping NonNullType + return mapInt(mappingContext, value, ((NonNullType) graphQLType).getType()); + } return String.valueOf(value.getValue()); } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenDefaultsTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenDefaultsTest.java index 9147d24e..1aa01517 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenDefaultsTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenDefaultsTest.java @@ -8,11 +8,13 @@ import org.junit.jupiter.api.Test; import java.io.File; import java.util.Arrays; +import java.util.HashMap; import java.util.List; import java.util.Objects; import static com.kobylynskyi.graphql.codegen.TestUtils.assertSameTrimmedContent; import static java.util.Collections.singletonList; +import static java.util.Collections.singletonMap; import static java.util.stream.Collectors.toList; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -66,4 +68,21 @@ class GraphQLCodegenDefaultsTest { file); } } + + @Test + void generate_CheckFiles_OnLongDefault() throws Exception { + mappingConfig.setCustomTypesMapping(new HashMap<>(singletonMap("Long", "java.lang.Long"))); + mappingConfig.setModelNameSuffix("DTO"); + new GraphQLCodegen(singletonList("src/test/resources/schemas/defaults-with-Long.graphqls"), + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); + List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); + assertEquals(Arrays.asList("InputWithDefaultsDTO.java", "MyEnumDTO.java", "SomeObjectDTO.java"), generatedFileNames); + + for (File file : files) { + assertSameTrimmedContent(new File(String.format("src/test/resources/expected-classes/defaults/%s.txt", + file.getName())), + file); + } + } } diff --git a/src/test/resources/expected-classes/defaults/InputWithDefaultsDTO.java.txt b/src/test/resources/expected-classes/defaults/InputWithDefaultsDTO.java.txt new file mode 100644 index 00000000..8d92b971 --- /dev/null +++ b/src/test/resources/expected-classes/defaults/InputWithDefaultsDTO.java.txt @@ -0,0 +1,220 @@ +package com.kobylynskyi.graphql.testdefaults; + + +/** + * This input has all possible types + */ +@javax.annotation.Generated( + value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen", + date = "2020-12-31T23:59:59-0500" +) +public class InputWithDefaultsDTO implements java.io.Serializable { + + private Double floatVal = 1.23; + private Boolean booleanVal = false; + private Integer intVal = 42; + private String stringVal = "my-default"; + private MyEnumDTO enumVal = MyEnumDTO.ONE; + @javax.validation.constraints.NotNull + private MyEnumDTO nonNullEnumVal = MyEnumDTO.TWO; + private SomeObjectDTO objectWithNullDefault = null; + private SomeObjectDTO objectWithNonNullDefault; + private java.util.List intList = java.util.Arrays.asList(1, 2, 3); + private java.util.List intListEmptyDefault = java.util.Collections.emptyList(); + @javax.validation.constraints.NotNull + private java.util.List objectListEmptyDefault = java.util.Collections.emptyList(); + private java.lang.Long longValue = 123456L; + + public InputWithDefaultsDTO() { + } + + public InputWithDefaultsDTO(Double floatVal, Boolean booleanVal, Integer intVal, String stringVal, MyEnumDTO enumVal, MyEnumDTO nonNullEnumVal, SomeObjectDTO objectWithNullDefault, SomeObjectDTO objectWithNonNullDefault, java.util.List intList, java.util.List intListEmptyDefault, java.util.List objectListEmptyDefault, java.lang.Long longValue) { + this.floatVal = floatVal; + this.booleanVal = booleanVal; + this.intVal = intVal; + this.stringVal = stringVal; + this.enumVal = enumVal; + this.nonNullEnumVal = nonNullEnumVal; + this.objectWithNullDefault = objectWithNullDefault; + this.objectWithNonNullDefault = objectWithNonNullDefault; + this.intList = intList; + this.intListEmptyDefault = intListEmptyDefault; + this.objectListEmptyDefault = objectListEmptyDefault; + this.longValue = longValue; + } + + public Double getFloatVal() { + return floatVal; + } + public void setFloatVal(Double floatVal) { + this.floatVal = floatVal; + } + + public Boolean getBooleanVal() { + return booleanVal; + } + public void setBooleanVal(Boolean booleanVal) { + this.booleanVal = booleanVal; + } + + public Integer getIntVal() { + return intVal; + } + public void setIntVal(Integer intVal) { + this.intVal = intVal; + } + + public String getStringVal() { + return stringVal; + } + public void setStringVal(String stringVal) { + this.stringVal = stringVal; + } + + public MyEnumDTO getEnumVal() { + return enumVal; + } + public void setEnumVal(MyEnumDTO enumVal) { + this.enumVal = enumVal; + } + + public MyEnumDTO getNonNullEnumVal() { + return nonNullEnumVal; + } + public void setNonNullEnumVal(MyEnumDTO nonNullEnumVal) { + this.nonNullEnumVal = nonNullEnumVal; + } + + public SomeObjectDTO getObjectWithNullDefault() { + return objectWithNullDefault; + } + public void setObjectWithNullDefault(SomeObjectDTO objectWithNullDefault) { + this.objectWithNullDefault = objectWithNullDefault; + } + + public SomeObjectDTO getObjectWithNonNullDefault() { + return objectWithNonNullDefault; + } + public void setObjectWithNonNullDefault(SomeObjectDTO objectWithNonNullDefault) { + this.objectWithNonNullDefault = objectWithNonNullDefault; + } + + public java.util.List getIntList() { + return intList; + } + public void setIntList(java.util.List intList) { + this.intList = intList; + } + + public java.util.List getIntListEmptyDefault() { + return intListEmptyDefault; + } + public void setIntListEmptyDefault(java.util.List intListEmptyDefault) { + this.intListEmptyDefault = intListEmptyDefault; + } + + public java.util.List getObjectListEmptyDefault() { + return objectListEmptyDefault; + } + public void setObjectListEmptyDefault(java.util.List objectListEmptyDefault) { + this.objectListEmptyDefault = objectListEmptyDefault; + } + + public java.lang.Long getLongValue() { + return longValue; + } + public void setLongValue(java.lang.Long longValue) { + this.longValue = longValue; + } + + + + public static InputWithDefaultsDTO.Builder builder() { + return new InputWithDefaultsDTO.Builder(); + } + + public static class Builder { + + private Double floatVal = 1.23; + private Boolean booleanVal = false; + private Integer intVal = 42; + private String stringVal = "my-default"; + private MyEnumDTO enumVal = MyEnumDTO.ONE; + private MyEnumDTO nonNullEnumVal = MyEnumDTO.TWO; + private SomeObjectDTO objectWithNullDefault = null; + private SomeObjectDTO objectWithNonNullDefault; + private java.util.List intList = java.util.Arrays.asList(1, 2, 3); + private java.util.List intListEmptyDefault = java.util.Collections.emptyList(); + private java.util.List objectListEmptyDefault = java.util.Collections.emptyList(); + private java.lang.Long longValue = 123456L; + + public Builder() { + } + + public Builder setFloatVal(Double floatVal) { + this.floatVal = floatVal; + return this; + } + + public Builder setBooleanVal(Boolean booleanVal) { + this.booleanVal = booleanVal; + return this; + } + + public Builder setIntVal(Integer intVal) { + this.intVal = intVal; + return this; + } + + public Builder setStringVal(String stringVal) { + this.stringVal = stringVal; + return this; + } + + public Builder setEnumVal(MyEnumDTO enumVal) { + this.enumVal = enumVal; + return this; + } + + public Builder setNonNullEnumVal(MyEnumDTO nonNullEnumVal) { + this.nonNullEnumVal = nonNullEnumVal; + return this; + } + + public Builder setObjectWithNullDefault(SomeObjectDTO objectWithNullDefault) { + this.objectWithNullDefault = objectWithNullDefault; + return this; + } + + public Builder setObjectWithNonNullDefault(SomeObjectDTO objectWithNonNullDefault) { + this.objectWithNonNullDefault = objectWithNonNullDefault; + return this; + } + + public Builder setIntList(java.util.List intList) { + this.intList = intList; + return this; + } + + public Builder setIntListEmptyDefault(java.util.List intListEmptyDefault) { + this.intListEmptyDefault = intListEmptyDefault; + return this; + } + + public Builder setObjectListEmptyDefault(java.util.List objectListEmptyDefault) { + this.objectListEmptyDefault = objectListEmptyDefault; + return this; + } + + public Builder setLongValue(java.lang.Long longValue) { + this.longValue = longValue; + return this; + } + + + public InputWithDefaultsDTO build() { + return new InputWithDefaultsDTO(floatVal, booleanVal, intVal, stringVal, enumVal, nonNullEnumVal, objectWithNullDefault, objectWithNonNullDefault, intList, intListEmptyDefault, objectListEmptyDefault, longValue); + } + + } +} diff --git a/src/test/resources/expected-classes/defaults/MyEnumDTO.java.txt b/src/test/resources/expected-classes/defaults/MyEnumDTO.java.txt new file mode 100644 index 00000000..52a4f5b1 --- /dev/null +++ b/src/test/resources/expected-classes/defaults/MyEnumDTO.java.txt @@ -0,0 +1,24 @@ +package com.kobylynskyi.graphql.testdefaults; + +@javax.annotation.Generated( + value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen", + date = "2020-12-31T23:59:59-0500" +) +public enum MyEnumDTO { + + ONE("ONE"), + TWO("TWO"), + THREE("THREE"); + + private final String graphqlName; + + private MyEnumDTO(String graphqlName) { + this.graphqlName = graphqlName; + } + + @Override + public String toString() { + return this.graphqlName; + } + +} \ No newline at end of file diff --git a/src/test/resources/expected-classes/defaults/SomeObjectDTO.java.txt b/src/test/resources/expected-classes/defaults/SomeObjectDTO.java.txt new file mode 100644 index 00000000..6acb509f --- /dev/null +++ b/src/test/resources/expected-classes/defaults/SomeObjectDTO.java.txt @@ -0,0 +1,51 @@ +package com.kobylynskyi.graphql.testdefaults; + + +@javax.annotation.Generated( + value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen", + date = "2020-12-31T23:59:59-0500" +) +public class SomeObjectDTO implements java.io.Serializable { + + @javax.validation.constraints.NotNull + private String name; + + public SomeObjectDTO() { + } + + public SomeObjectDTO(String name) { + this.name = name; + } + + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + + + public static SomeObjectDTO.Builder builder() { + return new SomeObjectDTO.Builder(); + } + + public static class Builder { + + private String name; + + public Builder() { + } + + public Builder setName(String name) { + this.name = name; + return this; + } + + + public SomeObjectDTO build() { + return new SomeObjectDTO(name); + } + + } +} diff --git a/src/test/resources/schemas/defaults-with-Long.graphqls b/src/test/resources/schemas/defaults-with-Long.graphqls new file mode 100644 index 00000000..806a408f --- /dev/null +++ b/src/test/resources/schemas/defaults-with-Long.graphqls @@ -0,0 +1,27 @@ + +# This input has all possible types +input InputWithDefaults { + floatVal: Float = 1.23 + booleanVal: Boolean = false + intVal: Int = 42 + stringVal: String = "my-default" + enumVal: MyEnum = ONE + nonNullEnumVal: MyEnum! = TWO + objectWithNullDefault: SomeObject = null + objectWithNonNullDefault: SomeObject = { name: "Bob" } + intList: [Int] = [1, 2, 3] + intListEmptyDefault: [Int] = [] + objectListEmptyDefault: [SomeObject]! = [] + longValue: Long = 123456 +} + +input SomeObject { + name: String! +} + +enum MyEnum { + ONE, TWO, THREE +} + + +scalar Long \ No newline at end of file diff --git a/src/test/resources/schemas/defaults.graphqls b/src/test/resources/schemas/defaults.graphqls index fb5391d4..ef1bc5c0 100644 --- a/src/test/resources/schemas/defaults.graphqls +++ b/src/test/resources/schemas/defaults.graphqls @@ -20,4 +20,4 @@ input SomeObject { enum MyEnum { ONE, TWO, THREE -} +} \ No newline at end of file -- GitLab