From 027b0fc25007abf971be9609a0353fbc7edd8ee6 Mon Sep 17 00:00:00 2001 From: Qi Liu Date: Mon, 14 May 2018 16:44:18 -0700 Subject: [PATCH] Enhance type mapping in union This would allow mapping abstract class or interface to GraphQL types, and returning actual concrete classes in the union. --- .../graphql/tools/DictionaryTypeResolver.kt | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/com/coxautodev/graphql/tools/DictionaryTypeResolver.kt b/src/main/kotlin/com/coxautodev/graphql/tools/DictionaryTypeResolver.kt index 98add995..02398bb0 100644 --- a/src/main/kotlin/com/coxautodev/graphql/tools/DictionaryTypeResolver.kt +++ b/src/main/kotlin/com/coxautodev/graphql/tools/DictionaryTypeResolver.kt @@ -12,10 +12,21 @@ import graphql.schema.TypeResolver * @author Andrew Potter */ abstract class DictionaryTypeResolver(private val dictionary: BiMap, TypeDefinition<*>>, private val types: Map) : TypeResolver { + private fun getTypeName(clazz: Class): String? { + val name = dictionary[clazz]?.name + + if (name == null && clazz.superclass != null) { + return getTypeName(clazz.superclass) + } + + return name + } override fun getType(env: TypeResolutionEnvironment): GraphQLObjectType? { val clazz = env.getObject().javaClass - val name = dictionary[clazz]?.name ?: clazz.simpleName + val name = clazz.interfaces.fold(getTypeName(clazz), { name, interfaceClazz -> + name ?: getTypeName(interfaceClazz) + }) ?: clazz.simpleName return types[name] ?: throw TypeResolverError(getError(name)) }