Skip to content

Commit 57b2e1e

Browse files
Read type mappings from a custom dgs.codegen.typemappings file for dependencies (#735)
* Read type mappings from a dgs.codegen.typemappings file for dependencies containing schemas. * Clean up and refactor code based on feedback. * Add tests.
1 parent 6105224 commit 57b2e1e

File tree

4 files changed

+77
-15
lines changed

4 files changed

+77
-15
lines changed

graphql-dgs-codegen-core/src/main/kotlin/com/netflix/graphql/dgs/codegen/CodeGen.kt

+26-15
Original file line numberDiff line numberDiff line change
@@ -35,21 +35,7 @@ import com.squareup.javapoet.JavaFile
3535
import com.squareup.javapoet.TypeSpec
3636
import com.squareup.kotlinpoet.FileSpec
3737
import com.squareup.kotlinpoet.KModifier
38-
import graphql.language.Definition
39-
import graphql.language.DirectivesContainer
40-
import graphql.language.Document
41-
import graphql.language.EnumTypeDefinition
42-
import graphql.language.FieldDefinition
43-
import graphql.language.InputObjectTypeDefinition
44-
import graphql.language.InterfaceTypeDefinition
45-
import graphql.language.NamedNode
46-
import graphql.language.ObjectTypeDefinition
47-
import graphql.language.ObjectTypeExtensionDefinition
48-
import graphql.language.ScalarTypeDefinition
49-
import graphql.language.Type
50-
import graphql.language.TypeDefinition
51-
import graphql.language.TypeName
52-
import graphql.language.UnionTypeDefinition
38+
import graphql.language.*
5339
import graphql.parser.InvalidSyntaxException
5440
import graphql.parser.MultiSourceReader
5541
import graphql.parser.Parser
@@ -63,6 +49,8 @@ import java.io.Reader
6349
import java.lang.annotation.RetentionPolicy
6450
import java.nio.file.Path
6551
import java.nio.file.Paths
52+
import java.util.*
53+
import java.util.jar.JarFile
6654
import java.util.zip.ZipFile
6755
import javax.lang.model.element.Modifier
6856
import com.squareup.kotlinpoet.AnnotationSpec as KAnnotationSpec
@@ -83,6 +71,8 @@ class CodeGen(private val config: CodeGenConfig) {
8371
)
8472

8573
fun generate(): CodeGenResult {
74+
loadTypeMappingsFromDependencies()
75+
8676
val codeGenResult = when (config.language) {
8777
Language.JAVA -> generateJava()
8878
Language.KOTLIN -> generateKotlin()
@@ -156,9 +146,30 @@ class CodeGen(private val config: CodeGenConfig) {
156146
}
157147
}
158148
}
149+
159150
return document
160151
}
161152

153+
private fun loadTypeMappingsFromDependencies() {
154+
// process type mappings from dependencies
155+
config.schemaJarFilesFromDependencies.forEach { file ->
156+
JarFile(file).use { jarFile ->
157+
val typeMappingsFile = jarFile.getJarEntry("META-INF/dgs.codegen.typemappings")
158+
if (typeMappingsFile != null) {
159+
jarFile.getInputStream(typeMappingsFile).use { typeMappingInput ->
160+
val props = Properties()
161+
props.load(typeMappingInput)
162+
163+
// Add the new type mappings from dependencies to existing type mappings.
164+
// The user provided config overrides mappings from the dependencies.
165+
@Suppress("UNCHECKED_CAST")
166+
config.typeMapping = (props as Map<String, String>).plus(config.typeMapping)
167+
}
168+
}
169+
}
170+
}
171+
}
172+
162173
/**
163174
* Loads the given [MultiSourceReader.Builder] references with the sources that will be used to provide
164175
* the schema information for the parser.

graphql-dgs-codegen-core/src/test/kotlin/com/netflix/graphql/dgs/codegen/CodeGenTest.kt

+50
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import org.junit.jupiter.params.provider.ArgumentsSource
4242
import org.junit.jupiter.params.provider.MethodSource
4343
import org.junit.jupiter.params.provider.ValueSource
4444
import java.io.Serializable
45+
import java.nio.file.Paths
4546
import java.util.stream.Stream
4647

4748
class CodeGenTest {
@@ -4990,4 +4991,53 @@ It takes a title and such.
49904991
"com.netflix.graphql.dgs.codegen.tests.generated.types.com.netflix.graphql.dgs.codegen.tests.generated.types.B"
49914992
)
49924993
}
4994+
4995+
@Test
4996+
fun `Codegen should pick up type mappings for schema from JAR files in dependencies`() {
4997+
val typeMappingDependency = Paths.get("src/test/resources/dependencies/testDependency.jar").toAbsolutePath().toFile()
4998+
val schema = """
4999+
type Query {
5000+
person: Person
5001+
}
5002+
scalar BigDecimal
5003+
5004+
type Person {
5005+
firstname: String
5006+
data: BigDecimal
5007+
}
5008+
""".trimIndent()
5009+
5010+
val result = CodeGen(
5011+
CodeGenConfig(
5012+
schemas = setOf(schema),
5013+
schemaJarFilesFromDependencies = listOf(typeMappingDependency)
5014+
)
5015+
).generate()
5016+
assertThat(result.javaDataTypes[0].typeSpec.fieldSpecs[1].type.toString() == "java.math.BigDecimal")
5017+
}
5018+
5019+
@Test
5020+
fun `Codegen should use user specfied typemappings to override type mappings from typemappings in dependencies`() {
5021+
val typeMappingDependency = Paths.get("src/test/resources/dependencies/testDependency.jar").toAbsolutePath().toFile()
5022+
val schema = """
5023+
type Query {
5024+
person: Person
5025+
}
5026+
scalar BigDecimal
5027+
5028+
type Person {
5029+
firstname: String
5030+
data: BigDecimal
5031+
}
5032+
""".trimIndent()
5033+
5034+
val result = CodeGen(
5035+
CodeGenConfig(
5036+
schemas = setOf(schema),
5037+
schemaJarFilesFromDependencies = listOf(typeMappingDependency),
5038+
typeMapping = mapOf("BigDecimal" to "java.lang.String")
5039+
)
5040+
).generate()
5041+
assertThat(result.javaDataTypes[0].typeSpec.fieldSpecs[1].type.toString() == "java.lang.String")
5042+
}
49935043
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
BigDecimal:java.math.BigDecimal
Binary file not shown.

0 commit comments

Comments
 (0)