Skip to content

Commit 6c98ae8

Browse files
committed
Deprecate costume context class option
And minimize use of deprecated api
1 parent f91caf0 commit 6c98ae8

14 files changed

+68
-97
lines changed

src/main/kotlin/graphql/kickstart/tools/SchemaClassScanner.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ internal class SchemaClassScanner(
386386
val methods = clazz.methods
387387

388388
val filteredMethods = methods.filter {
389-
it.name == name || it.name == "get${name.capitalize()}"
389+
it.name == name || it.name == "get${name.replaceFirstChar(Char::titlecase)}"
390390
}.sortedBy { it.name.length }
391391
return filteredMethods.find {
392392
!it.isSynthetic

src/main/kotlin/graphql/kickstart/tools/SchemaParser.kt

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ class SchemaParser internal constructor(
174174
.name(inputDefinition.name)
175175
.definition(inputDefinition)
176176
.description(getDocumentation(inputDefinition, options))
177-
.defaultValue(buildDefaultValue(inputDefinition.defaultValue))
177+
.apply { inputDefinition.defaultValue?.let { v -> defaultValueLiteral(v) } }
178178
.type(determineInputType(inputDefinition.type, inputObjects, referencingInputObjects))
179179
.withDirectives(*buildDirectives(inputDefinition.directives, Introspection.DirectiveLocation.INPUT_FIELD_DEFINITION))
180180
builder.field(fieldBuilder.build())
@@ -288,7 +288,7 @@ class SchemaParser internal constructor(
288288
.definition(argumentDefinition)
289289
.description(getDocumentation(argumentDefinition, options))
290290
.type(determineInputType(argumentDefinition.type, inputObjects, setOf()))
291-
.apply { buildDefaultValue(argumentDefinition.defaultValue)?.let { defaultValue(it) } }
291+
.apply { argumentDefinition.defaultValue?.let { defaultValueLiteral(it) } }
292292
.withDirectives(*buildDirectives(argumentDefinition.directives, Introspection.DirectiveLocation.ARGUMENT_DEFINITION))
293293

294294
field.argument(argumentBuilder.build())
@@ -364,20 +364,6 @@ class SchemaParser internal constructor(
364364
return nonNullValueList[0]
365365
}
366366

367-
private fun buildDefaultValue(value: Value<*>?): Any? {
368-
return when (value) {
369-
null -> null
370-
is IntValue -> value.value.toInt()
371-
is FloatValue -> value.value.toDouble()
372-
is StringValue -> value.value
373-
is EnumValue -> value.name
374-
is BooleanValue -> value.isValue
375-
is ArrayValue -> value.values.map { buildDefaultValue(it) }
376-
is ObjectValue -> value.objectFields.associate { it.name to buildDefaultValue(it.value) }
377-
else -> throw SchemaError("Unrecognized default value: $value")
378-
}
379-
}
380-
381367
private fun determineOutputType(typeDefinition: Type<*>, inputObjects: List<GraphQLInputObjectType>) =
382368
determineType(GraphQLOutputType::class, typeDefinition, permittedTypesForObject, inputObjects) as GraphQLOutputType
383369

src/main/kotlin/graphql/kickstart/tools/SchemaParserOptions.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,12 @@ data class SchemaParserOptions internal constructor(
6464
private var includeUnusedTypes = false
6565
private var useCommentsForDescriptions = true
6666

67+
@Deprecated("Replaced with graphql.GraphQLContext")
6768
fun contextClass(contextClass: Class<*>) = this.apply {
6869
this.contextClass = contextClass
6970
}
7071

72+
@Deprecated("Replaced with graphql.GraphQLContext")
7173
fun contextClass(contextClass: KClass<*>) = this.apply {
7274
this.contextClass = contextClass.java
7375
}

src/main/kotlin/graphql/kickstart/tools/resolver/FieldResolverScanner.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package graphql.kickstart.tools.resolver
22

3+
import graphql.GraphQLContext
34
import graphql.Scalars
45
import graphql.kickstart.tools.ResolverInfo
56
import graphql.kickstart.tools.RootResolverInfo
@@ -25,7 +26,7 @@ internal class FieldResolverScanner(val options: SchemaParserOptions) {
2526

2627
private val log = LoggerFactory.getLogger(javaClass)
2728

28-
private val allowedLastArgumentTypes = listOfNotNull(DataFetchingEnvironment::class.java, options.contextClass)
29+
private val allowedLastArgumentTypes = listOfNotNull(DataFetchingEnvironment::class.java, GraphQLContext::class.java, options.contextClass)
2930

3031
fun findFieldResolver(field: FieldDefinition, resolverInfo: ResolverInfo): FieldResolver {
3132
val searches = resolverInfo.getFieldSearches()
@@ -72,7 +73,7 @@ internal class FieldResolverScanner(val options: SchemaParserOptions) {
7273
}
7374
}
7475

75-
private fun findResolverMethod(field: FieldDefinition, search: Search): java.lang.reflect.Method? {
76+
private fun findResolverMethod(field: FieldDefinition, search: Search): Method? {
7677
val methods = getAllMethods(search.type)
7778
val argumentCount = field.inputValueDefinitions.size + if (search.requiredFirstParameterType != null) 1 else 0
7879
val name = field.name
@@ -113,7 +114,7 @@ internal class FieldResolverScanner(val options: SchemaParserOptions) {
113114

114115
private fun isBoolean(type: GraphQLLangType) = type.unwrap().let { it is TypeName && it.name == Scalars.GraphQLBoolean.name }
115116

116-
private fun verifyMethodArguments(method: java.lang.reflect.Method, requiredCount: Int, search: Search): Boolean {
117+
private fun verifyMethodArguments(method: Method, requiredCount: Int, search: Search): Boolean {
117118
val appropriateFirstParameter = if (search.requiredFirstParameterType != null) {
118119
method.genericParameterTypes.firstOrNull()?.let {
119120
it == search.requiredFirstParameterType || method.declaringClass.typeParameters.contains(it)
@@ -130,15 +131,15 @@ internal class FieldResolverScanner(val options: SchemaParserOptions) {
130131
return correctParameterCount && appropriateFirstParameter
131132
}
132133

133-
private fun getMethodParameterCount(method: java.lang.reflect.Method): Int {
134+
private fun getMethodParameterCount(method: Method): Int {
134135
return try {
135136
method.kotlinFunction?.valueParameters?.size ?: method.parameterCount
136137
} catch (e: InternalError) {
137138
method.parameterCount
138139
}
139140
}
140141

141-
private fun getMethodLastParameter(method: java.lang.reflect.Method): Type? {
142+
private fun getMethodLastParameter(method: Method): Type? {
142143
return try {
143144
method.kotlinFunction?.valueParameters?.lastOrNull()?.type?.javaType
144145
?: method.parameterTypes.lastOrNull()

src/main/kotlin/graphql/kickstart/tools/resolver/MethodFieldResolver.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package graphql.kickstart.tools.resolver
22

33
import com.fasterxml.jackson.core.type.TypeReference
4+
import graphql.GraphQLContext
45
import graphql.TrivialDataFetcher
56
import graphql.kickstart.tools.*
67
import graphql.kickstart.tools.SchemaParserOptions.GenericWrapper
@@ -95,6 +96,7 @@ internal class MethodFieldResolver(
9596
when (this.method.parameterTypes.last()) {
9697
null -> throw ResolverError("Expected at least one argument but got none, this is most likely a bug with graphql-java-tools")
9798
options.contextClass -> args.add { environment -> environment.getContext() }
99+
GraphQLContext::class.java -> args.add { environment -> environment.graphQlContext }
98100
else -> args.add { environment -> environment }
99101
}
100102
}

src/test/kotlin/graphql/kickstart/tools/DirectiveTest.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -138,9 +138,9 @@ class DirectiveTest {
138138
val parentType = environment.fieldsContainer
139139

140140
val originalDataFetcher = environment.codeRegistry.getDataFetcher(parentType, field)
141-
val wrappedDataFetcher = DataFetcherFactories.wrapDataFetcher(originalDataFetcher, { _, value ->
142-
(value as? String)?.toUpperCase()
143-
})
141+
val wrappedDataFetcher = DataFetcherFactories.wrapDataFetcher(originalDataFetcher) { _, value ->
142+
(value as? String)?.uppercase()
143+
}
144144

145145
environment.codeRegistry.dataFetcher(parentType, field, wrappedDataFetcher)
146146

src/test/kotlin/graphql/kickstart/tools/EndToEndSpecHelper.kt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -366,25 +366,23 @@ class Mutation : GraphQLMutationResolver {
366366
}
367367
}
368368

369-
class OnItemCreatedContext(val newItem: Item)
370-
371369
class Subscription : GraphQLSubscriptionResolver {
372370
fun onItemCreated(env: DataFetchingEnvironment) =
373371
Publisher<Item> { subscriber ->
374-
subscriber.onNext(env.getContext<OnItemCreatedContext>().newItem)
372+
subscriber.onNext(env.graphQlContext["newItem"])
375373
// subscriber.onComplete()
376374
}
377375

378376
fun onItemCreatedCoroutineChannel(env: DataFetchingEnvironment): ReceiveChannel<Item> {
379377
val channel = Channel<Item>(1)
380-
channel.offer(env.getContext<OnItemCreatedContext>().newItem)
378+
channel.trySend(env.graphQlContext["newItem"])
381379
return channel
382380
}
383381

384382
suspend fun onItemCreatedCoroutineChannelAndSuspendFunction(env: DataFetchingEnvironment): ReceiveChannel<Item> {
385383
return coroutineScope {
386384
val channel = Channel<Item>(1)
387-
channel.offer(env.getContext<OnItemCreatedContext>().newItem)
385+
channel.trySend(env.graphQlContext["newItem"])
388386
channel
389387
}
390388
}

src/test/kotlin/graphql/kickstart/tools/EndToEndTest.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ class EndToEndTest {
7575

7676
val result = gql.execute(ExecutionInput.newExecutionInput()
7777
.query(closure.invoke())
78-
.context(OnItemCreatedContext(newItem))
78+
.graphQLContext(mapOf("newItem" to newItem))
7979
.variables(mapOf()))
8080

8181
val data = result.getData() as Publisher<ExecutionResult>
@@ -597,7 +597,7 @@ class EndToEndTest {
597597

598598
val result = gql.execute(ExecutionInput.newExecutionInput()
599599
.query(closure.invoke())
600-
.context(OnItemCreatedContext(newItem))
600+
.graphQLContext(mapOf("newItem" to newItem))
601601
.variables(mapOf()))
602602

603603
val data = result.getData() as Publisher<ExecutionResult>
@@ -625,7 +625,7 @@ class EndToEndTest {
625625

626626
val result = gql.execute(ExecutionInput.newExecutionInput()
627627
.query(closure.invoke())
628-
.context(OnItemCreatedContext(newItem))
628+
.graphQLContext(mapOf("newItem" to newItem))
629629
.variables(mapOf()))
630630

631631
val data = result.getData() as Publisher<ExecutionResult>

src/test/kotlin/graphql/kickstart/tools/MethodFieldResolverDataFetcherTest.kt

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package graphql.kickstart.tools
22

33
import graphql.ExecutionResult
4+
import graphql.GraphQLContext
45
import graphql.execution.*
56
import graphql.execution.instrumentation.SimpleInstrumentation
67
import graphql.kickstart.tools.resolver.FieldResolverError
@@ -79,8 +80,8 @@ class MethodFieldResolverDataFetcherTest {
7980
val channel = Channel<String>(10)
8081

8182
init {
82-
channel.offer("A")
83-
channel.offer("B")
83+
channel.trySend("A")
84+
channel.trySend("B")
8485
}
8586

8687
@Suppress("UNUSED_PARAMETER")
@@ -176,20 +177,19 @@ class MethodFieldResolverDataFetcherTest {
176177

177178
@Test
178179
fun `data fetcher passes environment if method has extra argument even if context is specified`() {
179-
val options = SchemaParserOptions.newOptions().contextClass(ContextClass::class).build()
180-
val resolver = createFetcher("active", options = options, resolver = object : GraphQLResolver<DataClass> {
180+
val context = GraphQLContext.newContext().build()
181+
val resolver = createFetcher("active", resolver = object : GraphQLResolver<DataClass> {
181182
fun isActive(dataClass: DataClass, env: DataFetchingEnvironment): Boolean = env is DataFetchingEnvironment
182183
})
183184

184-
assertEquals(resolver.get(createEnvironment(DataClass(), context = ContextClass())), true)
185+
assertEquals(resolver.get(createEnvironment(DataClass(), context = context)), true)
185186
}
186187

187188
@Test
188189
fun `data fetcher passes context if method has extra argument and context is specified`() {
189-
val context = ContextClass()
190-
val options = SchemaParserOptions.newOptions().contextClass(ContextClass::class).build()
191-
val resolver = createFetcher("active", options = options, resolver = object : GraphQLResolver<DataClass> {
192-
fun isActive(dataClass: DataClass, ctx: ContextClass): Boolean {
190+
val context = GraphQLContext.newContext().build()
191+
val resolver = createFetcher("active", resolver = object : GraphQLResolver<DataClass> {
192+
fun isActive(dataClass: DataClass, ctx: GraphQLContext): Boolean {
193193
return ctx == context
194194
}
195195
})
@@ -243,7 +243,7 @@ class MethodFieldResolverDataFetcherTest {
243243
private val channel = Channel<String>(10)
244244

245245
init {
246-
channel.offer("A")
246+
channel.trySend("A")
247247
channel.close(IllegalStateException("Channel error"))
248248
}
249249

@@ -281,11 +281,11 @@ class MethodFieldResolverDataFetcherTest {
281281
return FieldResolverScanner(options).findFieldResolver(field, resolverInfo).createDataFetcher()
282282
}
283283

284-
private fun createEnvironment(source: Any = Object(), arguments: Map<String, Any> = emptyMap(), context: Any? = null): DataFetchingEnvironment {
284+
private fun createEnvironment(source: Any = Object(), arguments: Map<String, Any> = emptyMap(), context: GraphQLContext? = null): DataFetchingEnvironment {
285285
return DataFetchingEnvironmentImpl.newDataFetchingEnvironment(buildExecutionContext())
286286
.source(source)
287287
.arguments(arguments)
288-
.context(context)
288+
.graphQLContext(context)
289289
.build()
290290
}
291291

src/test/kotlin/graphql/kickstart/tools/MethodFieldResolverTest.kt

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ class MethodFieldResolverTest {
4545
testNull(input: null)
4646
}
4747
""")
48-
.context(Object())
4948
.root(Object()))
5049

5150
assertEquals(result.getData(), mapOf(
@@ -88,7 +87,6 @@ class MethodFieldResolverTest {
8887
testNull(input: null)
8988
}
9089
""")
91-
.context(Object())
9290
.root(Object()))
9391

9492
assertEquals(result.getData(), mapOf(
@@ -124,7 +122,6 @@ class MethodFieldResolverTest {
124122
}
125123
""")
126124
.variables(mapOf("input" to "FooBar"))
127-
.context(Object())
128125
.root(Object()))
129126

130127
assertEquals(result.getData(), mapOf("test" to 6))
@@ -156,7 +153,6 @@ class MethodFieldResolverTest {
156153
}
157154
""")
158155
.variables(mapOf("input" to listOf("Foo", "Bar")))
159-
.context(Object())
160156
.root(Object()))
161157

162158
assertEquals(result.getData(), mapOf("test" to 6))
@@ -204,7 +200,6 @@ class MethodFieldResolverTest {
204200
}
205201
""")
206202
.variables(mapOf("input" to listOf("Foo", "Bar")))
207-
.context(Object())
208203
.root(Object()))
209204

210205
assertEquals(result.getData(), mapOf("test" to 6))

0 commit comments

Comments
 (0)