Skip to content

Commit 1d00b99

Browse files
dariuszkucsmyrick
authored andcommitted
upgrade to graphql-java 13 (#242)
* WIP upgrade to graphql java 12 * upgrade to graphql-java 13 * refactor directive wiring factory to not depend on graphql-java * fix directive logic * update interface/union type resolvers to use code registry * simplify hooks interface * add missing directive wiring tests * Fix ktlint issue
1 parent 2961b64 commit 1d00b99

File tree

52 files changed

+995
-821
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+995
-821
lines changed

example/src/main/kotlin/com/expedia/graphql/sample/Application.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
package com.expedia.graphql.sample
22

3-
import com.expedia.graphql.DirectiveWiringHelper
43
import com.expedia.graphql.SchemaGeneratorConfig
54
import com.expedia.graphql.TopLevelObject
5+
import com.expedia.graphql.directives.KotlinDirectiveWiringFactory
66
import com.expedia.graphql.execution.KotlinDataFetcherFactoryProvider
77
import com.expedia.graphql.hooks.SchemaGeneratorHooks
88
import com.expedia.graphql.sample.datafetchers.CustomDataFetcherFactoryProvider
99
import com.expedia.graphql.sample.datafetchers.SpringDataFetcherFactory
10-
import com.expedia.graphql.sample.directives.DirectiveWiringFactory
11-
import com.expedia.graphql.sample.directives.LowercaseDirectiveWiring
10+
import com.expedia.graphql.sample.directives.CustomDirectiveWiringFactory
1211
import com.expedia.graphql.sample.exceptions.CustomDataFetcherExceptionHandler
1312
import com.expedia.graphql.sample.extension.CustomSchemaGeneratorHooks
1413
import com.expedia.graphql.sample.mutation.Mutation
@@ -35,11 +34,11 @@ class Application {
3534
private val logger = LoggerFactory.getLogger(Application::class.java)
3635

3736
@Bean
38-
fun wiringFactory() = DirectiveWiringFactory()
37+
fun wiringFactory() = CustomDirectiveWiringFactory()
3938

4039
@Bean
41-
fun hooks(validator: Validator, wiringFactory: DirectiveWiringFactory) =
42-
CustomSchemaGeneratorHooks(validator, DirectiveWiringHelper(wiringFactory, mapOf("lowercase" to LowercaseDirectiveWiring())))
40+
fun hooks(validator: Validator, wiringFactory: KotlinDirectiveWiringFactory) =
41+
CustomSchemaGeneratorHooks(validator, wiringFactory)
4342

4443
@Bean
4544
fun dataFetcherFactoryProvider(springDataFetcherFactory: SpringDataFetcherFactory, hooks: SchemaGeneratorHooks) =
@@ -59,6 +58,7 @@ class Application {
5958
.includeExtendedScalarTypes(true)
6059
.includeIntrospectionTypes(true)
6160
.includeSchemaDefintion(true)
61+
.includeDirectives(true)
6262
)
6363

6464
@Bean

example/src/main/kotlin/com/expedia/graphql/sample/directives/CakeOnlyDirectiveWiring.kt

Lines changed: 0 additions & 25 deletions
This file was deleted.
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.expedia.graphql.sample.directives
2+
3+
import com.expedia.graphql.directives.KotlinFieldDirectiveEnvironment
4+
import com.expedia.graphql.directives.KotlinSchemaDirectiveWiring
5+
import graphql.schema.DataFetcher
6+
import graphql.schema.GraphQLFieldDefinition
7+
8+
class CakeOnlySchemaDirectiveWiring : KotlinSchemaDirectiveWiring {
9+
10+
@Throws(RuntimeException::class)
11+
override fun onField(environment: KotlinFieldDirectiveEnvironment): GraphQLFieldDefinition {
12+
val field = environment.element
13+
val originalDataFetcher: DataFetcher<Any> = environment.getDataFetcher()
14+
15+
val cakeOnlyFetcher = DataFetcher<Any> { dataEnv ->
16+
val strArg: String? = dataEnv.getArgument(environment.element.arguments[0].name) as String?
17+
if (!"cake".equals(other = strArg, ignoreCase = true)) {
18+
throw RuntimeException("The cake is a lie!")
19+
}
20+
originalDataFetcher.get(dataEnv)
21+
}
22+
environment.setDataFetcher(cakeOnlyFetcher)
23+
return field
24+
}
25+
}

example/src/main/kotlin/com/expedia/graphql/sample/directives/CustomDirective.kt

Lines changed: 0 additions & 11 deletions
This file was deleted.
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.expedia.graphql.sample.directives
2+
3+
import com.expedia.graphql.directives.KotlinDirectiveWiringFactory
4+
import com.expedia.graphql.directives.KotlinSchemaDirectiveEnvironment
5+
import com.expedia.graphql.directives.KotlinSchemaDirectiveWiring
6+
import com.google.common.base.CaseFormat
7+
import graphql.schema.GraphQLDirectiveContainer
8+
import kotlin.reflect.KClass
9+
10+
class CustomDirectiveWiringFactory : KotlinDirectiveWiringFactory(manualWiring = mapOf<String, KotlinSchemaDirectiveWiring>("lowercase" to LowercaseSchemaDirectiveWiring())) {
11+
12+
private val stringEvalDirectiveWiring = StringEvalSchemaDirectiveWiring()
13+
private val caleOnlyDirectiveWiring = CakeOnlySchemaDirectiveWiring()
14+
15+
override fun getSchemaDirectiveWiring(environment: KotlinSchemaDirectiveEnvironment<GraphQLDirectiveContainer>): KotlinSchemaDirectiveWiring? = when {
16+
environment.directive.name == getDirectiveName(StringEval::class) -> stringEvalDirectiveWiring
17+
environment.directive.name == getDirectiveName(CakeOnly::class) -> caleOnlyDirectiveWiring
18+
else -> null
19+
}
20+
}
21+
22+
internal fun getDirectiveName(kClass: KClass<out Annotation>): String =
23+
CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_CAMEL, kClass.simpleName!!)

example/src/main/kotlin/com/expedia/graphql/sample/directives/DirectiveWiring.kt

Lines changed: 0 additions & 15 deletions
This file was deleted.

example/src/main/kotlin/com/expedia/graphql/sample/directives/DirectiveWiringFactory.kt

Lines changed: 0 additions & 19 deletions
This file was deleted.

example/src/main/kotlin/com/expedia/graphql/sample/directives/LowercaseDirectiveWiring.kt

Lines changed: 0 additions & 19 deletions
This file was deleted.
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.expedia.graphql.sample.directives
2+
3+
import com.expedia.graphql.directives.KotlinFieldDirectiveEnvironment
4+
import com.expedia.graphql.directives.KotlinSchemaDirectiveWiring
5+
import graphql.schema.DataFetcher
6+
import graphql.schema.DataFetcherFactories
7+
import graphql.schema.DataFetchingEnvironment
8+
import graphql.schema.GraphQLFieldDefinition
9+
import java.util.function.BiFunction
10+
11+
class LowercaseSchemaDirectiveWiring : KotlinSchemaDirectiveWiring {
12+
13+
override fun onField(environment: KotlinFieldDirectiveEnvironment): GraphQLFieldDefinition {
14+
val field = environment.element
15+
val originalDataFetcher: DataFetcher<Any> = environment.getDataFetcher()
16+
17+
val lowerCaseFetcher = DataFetcherFactories.wrapDataFetcher(
18+
originalDataFetcher,
19+
BiFunction<DataFetchingEnvironment, Any, Any>{ _, value -> value.toString().toLowerCase() }
20+
)
21+
environment.setDataFetcher(lowerCaseFetcher)
22+
return field
23+
}
24+
}

example/src/main/kotlin/com/expedia/graphql/sample/directives/SimpleDirective.kt

Lines changed: 0 additions & 44 deletions
This file was deleted.

example/src/main/kotlin/com/expedia/graphql/sample/directives/StringEvalDirectiveWiring.kt

Lines changed: 0 additions & 56 deletions
This file was deleted.
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.expedia.graphql.sample.directives
2+
3+
import com.expedia.graphql.directives.KotlinFieldDirectiveEnvironment
4+
import com.expedia.graphql.directives.KotlinSchemaDirectiveEnvironment
5+
import com.expedia.graphql.directives.KotlinSchemaDirectiveWiring
6+
import graphql.schema.DataFetcher
7+
import graphql.schema.DataFetchingEnvironmentImpl.newDataFetchingEnvironment
8+
import graphql.schema.GraphQLArgument
9+
import graphql.schema.GraphQLFieldDefinition
10+
11+
class StringEvalSchemaDirectiveWiring : KotlinSchemaDirectiveWiring {
12+
private val directiveName = getDirectiveName(StringEval::class)
13+
14+
override fun onField(environment: KotlinFieldDirectiveEnvironment): GraphQLFieldDefinition {
15+
val field = environment.element
16+
val originalDataFetcher: DataFetcher<Any> = environment.getDataFetcher()
17+
18+
val defaultValueFetcher = DataFetcher<Any> { dataEnv ->
19+
val newArguments = HashMap(dataEnv.arguments)
20+
environment.element.arguments.associateWith {
21+
dataEnv.getArgument(it.name) as String?
22+
}.forEach { (graphQLArgumentType, value) ->
23+
if (graphQLArgumentType.getDirective(directiveName).getArgument(StringEval::lowerCase.name).value as Boolean) {
24+
newArguments[graphQLArgumentType.name] = value?.toLowerCase()
25+
}
26+
if (value.isNullOrEmpty()) {
27+
newArguments[graphQLArgumentType.name] = graphQLArgumentType.defaultValue
28+
}
29+
}
30+
val newEnv = newDataFetchingEnvironment(dataEnv)
31+
.arguments(newArguments)
32+
.build()
33+
originalDataFetcher.get(newEnv)
34+
}
35+
environment.setDataFetcher(defaultValueFetcher)
36+
return field
37+
}
38+
39+
override fun onArgument(environment: KotlinSchemaDirectiveEnvironment<GraphQLArgument>): GraphQLArgument {
40+
val argument = environment.element
41+
val directive = environment.directive
42+
43+
val default = directive.getArgument(StringEval::default.name).value as String
44+
return if (default.isNotEmpty()) {
45+
argument.transform { it.defaultValue(default) }
46+
} else {
47+
argument
48+
}
49+
}
50+
}

0 commit comments

Comments
 (0)