diff --git a/.idea/runConfigurations/mvnDebug.xml b/.idea/runConfigurations/mvnDebug.xml
index 522dd94a4e082..7dcbd5d87588e 100644
--- a/.idea/runConfigurations/mvnDebug.xml
+++ b/.idea/runConfigurations/mvnDebug.xml
@@ -4,10 +4,10 @@
-
+
-
+
diff --git a/bom/application/pom.xml b/bom/application/pom.xml
index 2cffaf49cbffc..8bff6f09ab3ba 100644
--- a/bom/application/pom.xml
+++ b/bom/application/pom.xml
@@ -55,7 +55,8 @@
4.0.4
4.0.0
3.7.0
- 2.6.1
+ 2.6.2-SNAPSHOT
+ 3.0.3
6.2.6
4.4.0
2.1.0
@@ -3867,6 +3868,32 @@
smallrye-graphql-client-implementation-vertx
${smallrye-graphql.version}
+
+ io.smallrye
+ smallrye-graphql-client-model-builder
+ ${smallrye-graphql.version}
+
+
+ io.smallrye
+ smallrye-graphql-client-model
+ ${smallrye-graphql.version}
+
+
+ io.smallrye
+ smallrye-opentracing
+ ${smallrye-opentracing.version}
+
+
+ org.eclipse.microprofile.config
+ microprofile-config-api
+
+
+
+
+ io.smallrye
+ smallrye-opentracing-contrib
+ ${smallrye-opentracing.version}
+
io.smallrye
smallrye-fault-tolerance
diff --git a/extensions/smallrye-graphql-client/deployment/pom.xml b/extensions/smallrye-graphql-client/deployment/pom.xml
index c955fb72b1a02..57b4bf0cc5c4e 100644
--- a/extensions/smallrye-graphql-client/deployment/pom.xml
+++ b/extensions/smallrye-graphql-client/deployment/pom.xml
@@ -37,6 +37,14 @@
io.quarkus
quarkus-smallrye-graphql-client
+
+ io.smallrye
+ smallrye-graphql-client-model-builder
+
+
+ io.smallrye
+ smallrye-graphql-client-model
+
io.quarkus
quarkus-junit5-internal
diff --git a/extensions/smallrye-graphql-client/deployment/src/main/java/io/quarkus/smallrye/graphql/client/deployment/SmallRyeGraphQLClientFinalIndexBuildItem.java b/extensions/smallrye-graphql-client/deployment/src/main/java/io/quarkus/smallrye/graphql/client/deployment/SmallRyeGraphQLClientFinalIndexBuildItem.java
new file mode 100644
index 0000000000000..bef82c88f1752
--- /dev/null
+++ b/extensions/smallrye-graphql-client/deployment/src/main/java/io/quarkus/smallrye/graphql/client/deployment/SmallRyeGraphQLClientFinalIndexBuildItem.java
@@ -0,0 +1,18 @@
+package io.quarkus.smallrye.graphql.client.deployment;
+
+import org.jboss.jandex.IndexView;
+
+import io.quarkus.builder.item.SimpleBuildItem;
+
+final class SmallRyeGraphQLClientFinalIndexBuildItem extends SimpleBuildItem {
+
+ private final IndexView index;
+
+ public SmallRyeGraphQLClientFinalIndexBuildItem(IndexView index) {
+ this.index = index;
+ }
+
+ public IndexView getFinalIndex() {
+ return index;
+ }
+}
diff --git a/extensions/smallrye-graphql-client/deployment/src/main/java/io/quarkus/smallrye/graphql/client/deployment/SmallRyeGraphQLClientProcessor.java b/extensions/smallrye-graphql-client/deployment/src/main/java/io/quarkus/smallrye/graphql/client/deployment/SmallRyeGraphQLClientProcessor.java
index f67f6f98b4a63..99a82cee78355 100644
--- a/extensions/smallrye-graphql-client/deployment/src/main/java/io/quarkus/smallrye/graphql/client/deployment/SmallRyeGraphQLClientProcessor.java
+++ b/extensions/smallrye-graphql-client/deployment/src/main/java/io/quarkus/smallrye/graphql/client/deployment/SmallRyeGraphQLClientProcessor.java
@@ -9,10 +9,12 @@
import java.util.Map;
import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Singleton;
import org.jboss.jandex.AnnotationInstance;
import org.jboss.jandex.AnnotationValue;
import org.jboss.jandex.ClassInfo;
+import org.jboss.jandex.ClassType;
import org.jboss.jandex.DotName;
import org.jboss.jandex.MethodInfo;
import org.jboss.jandex.Type;
@@ -26,16 +28,20 @@
import io.quarkus.deployment.annotations.BuildProducer;
import io.quarkus.deployment.annotations.BuildStep;
import io.quarkus.deployment.annotations.Record;
+import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
import io.quarkus.deployment.builditem.ExtensionSslNativeSupportBuildItem;
import io.quarkus.deployment.builditem.FeatureBuildItem;
import io.quarkus.deployment.builditem.nativeimage.NativeImageProxyDefinitionBuildItem;
import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
import io.quarkus.deployment.builditem.nativeimage.ReflectiveHierarchyBuildItem;
import io.quarkus.deployment.builditem.nativeimage.ServiceProviderBuildItem;
+import io.quarkus.runtime.RuntimeValue;
import io.quarkus.smallrye.graphql.client.runtime.GraphQLClientSupport;
import io.quarkus.smallrye.graphql.client.runtime.GraphQLClientsConfig;
import io.quarkus.smallrye.graphql.client.runtime.SmallRyeGraphQLClientRecorder;
import io.quarkus.vertx.core.deployment.CoreVertxBuildItem;
+import io.smallrye.graphql.client.model.ClientModelBuilder;
+import io.smallrye.graphql.client.model.ClientModels;
public class SmallRyeGraphQLClientProcessor {
@@ -86,6 +92,26 @@ void dynamicClientInjection(BuildProducer additionalBea
autoInject.produce(new AutoInjectAnnotationBuildItem(GRAPHQL_CLIENT));
}
+ @BuildStep
+ @Record(RUNTIME_INIT)
+ void buildExecutionService(CombinedIndexBuildItem index, SmallRyeGraphQLClientRecorder recorder,
+ BuildProducer syntheticBeans) {
+ if (!index.getIndex().getAnnotations(GRAPHQL_CLIENT_API).isEmpty()) {
+ ClientModels clientModel = ClientModelBuilder.build(index.getIndex());
+ RuntimeValue modelRuntimeClientModel = recorder.getRuntimeClientModel(clientModel);
+ DotName supportClassName = DotName.createSimple(ClientModels.class.getName());
+ SyntheticBeanBuildItem bean = SyntheticBeanBuildItem
+ .configure(supportClassName)
+ .addType(supportClassName)
+ .scope(Singleton.class)
+ .runtimeValue(modelRuntimeClientModel)
+ .setRuntimeInit()
+ .unremovable()
+ .done();
+ syntheticBeans.produce(bean);
+ }
+ }
+
@BuildStep
@Record(STATIC_INIT)
void initializeTypesafeClient(BeanArchiveIndexBuildItem index,
@@ -118,7 +144,8 @@ void initializeTypesafeClient(BeanArchiveIndexBuildItem index,
SyntheticBeanBuildItem bean = SyntheticBeanBuildItem.configure(apiClassInfo.name())
.addType(apiClassInfo.name())
.scope(ApplicationScoped.class)
- .supplier(recorder.typesafeClientSupplier(apiClass))
+ .addInjectionPoint(ClassType.create(DotName.createSimple(ClientModels.class)))
+ .createWith(recorder.typesafeClientSupplier(apiClass))
.unremovable()
.done();
syntheticBeans.produce(bean);
diff --git a/extensions/smallrye-graphql-client/deployment/src/test/java/io/quarkus/smallrye/graphql/client/deployment/TypesafeGraphQLClientMapTest.java b/extensions/smallrye-graphql-client/deployment/src/test/java/io/quarkus/smallrye/graphql/client/deployment/TypesafeGraphQLClientMapTest.java
index 5a43226981042..75384f8d211d7 100644
--- a/extensions/smallrye-graphql-client/deployment/src/test/java/io/quarkus/smallrye/graphql/client/deployment/TypesafeGraphQLClientMapTest.java
+++ b/extensions/smallrye-graphql-client/deployment/src/test/java/io/quarkus/smallrye/graphql/client/deployment/TypesafeGraphQLClientMapTest.java
@@ -2,22 +2,20 @@
import static org.junit.jupiter.api.Assertions.assertEquals;
-import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
+import jakarta.inject.Inject;
+
import org.eclipse.microprofile.graphql.GraphQLApi;
import org.eclipse.microprofile.graphql.Query;
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
-import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import io.quarkus.test.QuarkusUnitTest;
-import io.quarkus.test.common.http.TestHTTPResource;
import io.smallrye.graphql.client.typesafe.api.GraphQLClientApi;
-import io.smallrye.graphql.client.vertx.typesafe.VertxTypesafeGraphQLClientBuilder;
/**
* Verify the support of Map usage. The server-side endpoint contains queries that return maps,
@@ -31,17 +29,8 @@ public class TypesafeGraphQLClientMapTest {
.addClasses(MapClientApi.class, MapApi.class, Foo.class, ComplexToComplexMapWrapper.class)
.addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml"));
- @TestHTTPResource
- URL url;
-
- private static MapClientApi client;
-
- @BeforeEach
- public void prepare() {
- client = new VertxTypesafeGraphQLClientBuilder()
- .endpoint(url.toString() + "graphql")
- .build(MapClientApi.class);
- }
+ @Inject
+ private MapClientApi client;
@GraphQLApi
public static class MapApi {
diff --git a/extensions/smallrye-graphql-client/deployment/src/test/java/io/quarkus/smallrye/graphql/client/deployment/TypesafeGraphQLClientProgrammaticUsageWithClientModelTest.java b/extensions/smallrye-graphql-client/deployment/src/test/java/io/quarkus/smallrye/graphql/client/deployment/TypesafeGraphQLClientProgrammaticUsageWithClientModelTest.java
new file mode 100644
index 0000000000000..ec091a6a82cad
--- /dev/null
+++ b/extensions/smallrye-graphql-client/deployment/src/test/java/io/quarkus/smallrye/graphql/client/deployment/TypesafeGraphQLClientProgrammaticUsageWithClientModelTest.java
@@ -0,0 +1,47 @@
+package io.quarkus.smallrye.graphql.client.deployment;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.List;
+
+import org.jboss.jandex.Index;
+import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+import io.quarkus.smallrye.graphql.client.deployment.model.Person;
+import io.quarkus.smallrye.graphql.client.deployment.model.TestingGraphQLApi;
+import io.quarkus.smallrye.graphql.client.deployment.model.TestingGraphQLClientApi;
+import io.quarkus.test.QuarkusUnitTest;
+import io.quarkus.test.common.http.TestHTTPResource;
+import io.smallrye.graphql.client.model.ClientModelBuilder;
+import io.smallrye.graphql.client.typesafe.api.GraphQLClientApi;
+import io.smallrye.graphql.client.typesafe.api.TypesafeGraphQLClientBuilder;
+import io.smallrye.graphql.client.vertx.typesafe.VertxTypesafeGraphQLClientBuilder;
+
+public class TypesafeGraphQLClientProgrammaticUsageWithClientModelTest {
+
+ @RegisterExtension
+ static QuarkusUnitTest test = new QuarkusUnitTest()
+ .withApplicationRoot((jar) -> jar
+ .addClasses(TestingGraphQLApi.class, TestingGraphQLClientApi.class, Person.class)
+ .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml"));
+
+ @TestHTTPResource
+ URL url;
+
+ @Test
+ public void performQuery() throws IOException {
+ Index index = Index.of(GraphQLClientApi.class, TestingGraphQLClientApi.class, Person.class);
+ TestingGraphQLClientApi client = ((VertxTypesafeGraphQLClientBuilder) TypesafeGraphQLClientBuilder.newBuilder())
+ .clientModels(ClientModelBuilder.build(index))
+ .endpoint(url.toString() + "/graphql")
+ .build(TestingGraphQLClientApi.class);
+ List people = client.people();
+ assertEquals("John", people.get(0).getFirstName());
+ assertEquals("Arthur", people.get(1).getFirstName());
+ }
+
+}
diff --git a/extensions/smallrye-graphql-client/runtime/pom.xml b/extensions/smallrye-graphql-client/runtime/pom.xml
index 791536d393639..c0d0087a8cc88 100644
--- a/extensions/smallrye-graphql-client/runtime/pom.xml
+++ b/extensions/smallrye-graphql-client/runtime/pom.xml
@@ -34,6 +34,10 @@
io.quarkus
quarkus-smallrye-stork
+
+ io.smallrye
+ smallrye-graphql-client-model
+
io.smallrye
smallrye-graphql-client-implementation-vertx
diff --git a/extensions/smallrye-graphql-client/runtime/src/main/java/io/quarkus/smallrye/graphql/client/runtime/SmallRyeGraphQLClientRecorder.java b/extensions/smallrye-graphql-client/runtime/src/main/java/io/quarkus/smallrye/graphql/client/runtime/SmallRyeGraphQLClientRecorder.java
index 15557e6a41195..27ff5b5af7262 100644
--- a/extensions/smallrye-graphql-client/runtime/src/main/java/io/quarkus/smallrye/graphql/client/runtime/SmallRyeGraphQLClientRecorder.java
+++ b/extensions/smallrye-graphql-client/runtime/src/main/java/io/quarkus/smallrye/graphql/client/runtime/SmallRyeGraphQLClientRecorder.java
@@ -5,6 +5,7 @@
import java.util.List;
import java.util.Map;
import java.util.Optional;
+import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collectors;
@@ -12,12 +13,16 @@
import org.eclipse.microprofile.config.ConfigProvider;
import org.jboss.logging.Logger;
+import io.quarkus.arc.SyntheticCreationalContext;
import io.quarkus.runtime.LaunchMode;
+import io.quarkus.runtime.RuntimeValue;
import io.quarkus.runtime.annotations.Recorder;
import io.smallrye.graphql.client.impl.GraphQLClientConfiguration;
import io.smallrye.graphql.client.impl.GraphQLClientsConfiguration;
+import io.smallrye.graphql.client.model.ClientModels;
import io.smallrye.graphql.client.typesafe.api.TypesafeGraphQLClientBuilder;
import io.smallrye.graphql.client.vertx.VertxManager;
+import io.smallrye.graphql.client.vertx.typesafe.VertxTypesafeGraphQLClientBuilder;
import io.vertx.core.Vertx;
@Recorder
@@ -25,10 +30,14 @@ public class SmallRyeGraphQLClientRecorder {
private final Logger logger = Logger.getLogger(SmallRyeGraphQLClientRecorder.class);
- public Supplier typesafeClientSupplier(Class targetClassName) {
- return () -> {
- TypesafeGraphQLClientBuilder builder = TypesafeGraphQLClientBuilder.newBuilder();
- return builder.build(targetClassName);
+ public Function, T> typesafeClientSupplier(Class targetClassName) {
+ return new Function<>() {
+ @Override
+ public T apply(SyntheticCreationalContext context) {
+ TypesafeGraphQLClientBuilder builder = TypesafeGraphQLClientBuilder.newBuilder();
+ ClientModels clientModels = context.getInjectedReference(ClientModels.class);
+ return (((VertxTypesafeGraphQLClientBuilder) builder).clientModels(clientModels)).build(targetClassName);
+ }
};
}
@@ -136,4 +145,8 @@ private String getTestingServerUrl() {
return "http://localhost:" + config.getOptionalValue("quarkus.http.test-port", int.class).orElse(8081) + "/graphql";
}
+ public RuntimeValue getRuntimeClientModel(ClientModels clientModel) {
+ return new RuntimeValue<>(clientModel);
+ }
+
}