Skip to content

Commit 11d6702

Browse files
committed
Expose Wrapped dataFetcher
1 parent 4f7480c commit 11d6702

File tree

1 file changed

+33
-22
lines changed

1 file changed

+33
-22
lines changed

src/main/kotlin/com/coxautodev/graphql/tools/MethodFieldResolver.kt

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@ import java.util.*
1717
/**
1818
* @author Andrew Potter
1919
*/
20-
internal class MethodFieldResolver(field: FieldDefinition, search: FieldResolverScanner.Search, options: SchemaParserOptions, val method: Method): FieldResolver(field, search, options, method.declaringClass) {
20+
internal class MethodFieldResolver(field: FieldDefinition, search: FieldResolverScanner.Search, options: SchemaParserOptions, val method: Method) : FieldResolver(field, search, options, method.declaringClass) {
2121

2222
companion object {
2323
fun isBatched(method: Method, search: FieldResolverScanner.Search): Boolean {
24-
if(method.getAnnotation(Batched::class.java) != null) {
25-
if(!search.allowBatched) {
24+
if (method.getAnnotation(Batched::class.java) != null) {
25+
if (!search.allowBatched) {
2626
throw ResolverError("The @Batched annotation is only allowed on non-root resolver methods, but it was found on ${search.type.name}#${method.name}!")
2727
}
2828

@@ -43,8 +43,8 @@ internal class MethodFieldResolver(field: FieldDefinition, search: FieldResolver
4343
}.registerModule(Jdk8Module()).registerKotlinModule()
4444

4545
// Add source argument if this is a resolver (but not a root resolver)
46-
if(this.search.requiredFirstParameterType != null) {
47-
val expectedType = if(batched) Iterable::class.java else this.search.requiredFirstParameterType
46+
if (this.search.requiredFirstParameterType != null) {
47+
val expectedType = if (batched) Iterable::class.java else this.search.requiredFirstParameterType
4848

4949
args.add { environment ->
5050
val source = environment.getSource<Any>()
@@ -59,23 +59,24 @@ internal class MethodFieldResolver(field: FieldDefinition, search: FieldResolver
5959
// Add an argument for each argument defined in the GraphQL schema
6060
this.field.inputValueDefinitions.forEachIndexed { index, definition ->
6161

62-
val genericParameterType = this.getJavaMethodParameterType(index) ?: throw ResolverError("Missing method type at position ${this.getJavaMethodParameterIndex(index)}, this is most likely a bug with graphql-java-tools")
62+
val genericParameterType = this.getJavaMethodParameterType(index)
63+
?: throw ResolverError("Missing method type at position ${this.getJavaMethodParameterIndex(index)}, this is most likely a bug with graphql-java-tools")
6364

6465
val isNonNull = definition.type is NonNullType
6566
val isOptional = this.genericType.getRawClass(genericParameterType) == Optional::class.java
6667

67-
val typeReference = object: TypeReference<Any>() {
68+
val typeReference = object : TypeReference<Any>() {
6869
override fun getType() = genericParameterType
6970
}
7071

7172
args.add { environment ->
72-
val value = environment.arguments[definition.name] ?: if(isNonNull) {
73+
val value = environment.arguments[definition.name] ?: if (isNonNull) {
7374
throw ResolverError("Missing required argument with name '${definition.name}', this is most likely a bug with graphql-java-tools")
7475
} else {
7576
null
7677
}
7778

78-
if(value == null && isOptional) {
79+
if (value == null && isOptional) {
7980
return@add Optional.empty<Any>()
8081
}
8182

@@ -84,16 +85,16 @@ internal class MethodFieldResolver(field: FieldDefinition, search: FieldResolver
8485
}
8586

8687
// Add DataFetchingEnvironment/Context argument
87-
if(this.additionalLastArgument) {
88+
if (this.additionalLastArgument) {
8889
val lastArgumentType = this.method.parameterTypes.last()
89-
when(lastArgumentType) {
90+
when (lastArgumentType) {
9091
null -> throw ResolverError("Expected at least one argument but got none, this is most likely a bug with graphql-java-tools")
9192
options.contextClass -> args.add { environment -> environment.getContext() }
9293
else -> args.add { environment -> environment }
9394
}
9495
}
9596

96-
return if(batched) {
97+
return if (batched) {
9798
BatchedMethodFieldResolverDataFetcher(getSourceResolver(), this.method, args, options)
9899
} else {
99100
MethodFieldResolverDataFetcher(getSourceResolver(), this.method, args, options)
@@ -109,14 +110,14 @@ internal class MethodFieldResolver(field: FieldDefinition, search: FieldResolver
109110
} + listOf(returnValueMatch)
110111
}
111112

112-
private fun getIndexOffset() = if(resolverInfo is NormalResolverInfo) 1 else 0
113+
private fun getIndexOffset() = if (resolverInfo is NormalResolverInfo) 1 else 0
113114
private fun getJavaMethodParameterIndex(index: Int) = index + getIndexOffset()
114115

115116
private fun getJavaMethodParameterType(index: Int): JavaType? {
116117
val methodIndex = getJavaMethodParameterIndex(index)
117118
val parameters = method.parameterTypes
118119

119-
return if(parameters.size > methodIndex) {
120+
return if (parameters.size > methodIndex) {
120121
method.genericParameterTypes[getJavaMethodParameterIndex(index)]
121122
} else {
122123
null
@@ -126,14 +127,14 @@ internal class MethodFieldResolver(field: FieldDefinition, search: FieldResolver
126127
override fun toString() = "MethodFieldResolver{method=$method}"
127128
}
128129

129-
open class MethodFieldResolverDataFetcher(private val sourceResolver: SourceResolver, method: Method, private val args: List<ArgumentPlaceholder>, private val options: SchemaParserOptions): DataFetcher<Any> {
130+
open class MethodFieldResolverDataFetcher(private val sourceResolver: SourceResolver, method: Method, private val args: List<ArgumentPlaceholder>, private val options: SchemaParserOptions) : DataFetcher<Any> {
130131

131132
// Convert to reflactasm reflection
132133
private val methodAccess = MethodAccess.get(method.declaringClass)!!
133134
private val methodIndex = methodAccess.getIndex(method.name, *method.parameterTypes)
134135

135136
private class CompareGenericWrappers {
136-
companion object: Comparator<GenericWrapper> {
137+
companion object : Comparator<GenericWrapper> {
137138
override fun compare(w1: GenericWrapper, w2: GenericWrapper): Int = when {
138139
w1.type.isAssignableFrom(w2.type) -> 1
139140
else -> -1
@@ -149,21 +150,31 @@ open class MethodFieldResolverDataFetcher(private val sourceResolver: SourceReso
149150
result
150151
} else {
151152
val wrapper = options
152-
.genericWrappers
153-
.filter { it.type.isInstance(result) }
154-
.sortedWith(CompareGenericWrappers)
155-
.firstOrNull()
153+
.genericWrappers
154+
.filter { it.type.isInstance(result) }
155+
.sortedWith(CompareGenericWrappers)
156+
.firstOrNull()
156157
if (wrapper == null) {
157158
result
158159
} else {
159160
wrapper.transformer.invoke(result, environment)
160161
}
161162
}
162163
}
164+
165+
/**
166+
* Function that return the object used to fetch the data
167+
* It can be a DataFetcher or an entity
168+
*/
169+
@Suppress("unused")
170+
open fun getWrappedFetchingObject(environment: DataFetchingEnvironment): Any {
171+
return sourceResolver(environment)
172+
}
163173
}
164174

165-
class BatchedMethodFieldResolverDataFetcher(sourceResolver: SourceResolver, method: Method, args: List<ArgumentPlaceholder>, options: SchemaParserOptions): MethodFieldResolverDataFetcher(sourceResolver, method, args, options) {
166-
@Batched override fun get(environment: DataFetchingEnvironment) = super.get(environment)
175+
class BatchedMethodFieldResolverDataFetcher(sourceResolver: SourceResolver, method: Method, args: List<ArgumentPlaceholder>, options: SchemaParserOptions) : MethodFieldResolverDataFetcher(sourceResolver, method, args, options) {
176+
@Batched
177+
override fun get(environment: DataFetchingEnvironment) = super.get(environment)
167178
}
168179

169180
internal typealias ArgumentPlaceholder = (DataFetchingEnvironment) -> Any?

0 commit comments

Comments
 (0)