Skip to content

Commit

Permalink
added quarkus side build specifics for indexing and recording of type…
Browse files Browse the repository at this point in the history
…safe client
  • Loading branch information
mskacelik committed Dec 21, 2023
1 parent cf914a6 commit 22a2bbf
Show file tree
Hide file tree
Showing 9 changed files with 156 additions and 23 deletions.
4 changes: 2 additions & 2 deletions .idea/runConfigurations/mvnDebug.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

29 changes: 28 additions & 1 deletion bom/application/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@
<smallrye-health.version>4.0.4</smallrye-health.version>
<smallrye-metrics.version>4.0.0</smallrye-metrics.version>
<smallrye-open-api.version>3.7.0</smallrye-open-api.version>
<smallrye-graphql.version>2.6.1</smallrye-graphql.version>
<smallrye-graphql.version>2.6.2-SNAPSHOT</smallrye-graphql.version>
<smallrye-opentracing.version>3.0.3</smallrye-opentracing.version>
<smallrye-fault-tolerance.version>6.2.6</smallrye-fault-tolerance.version>
<smallrye-jwt.version>4.4.0</smallrye-jwt.version>
<smallrye-context-propagation.version>2.1.0</smallrye-context-propagation.version>
Expand Down Expand Up @@ -3867,6 +3868,32 @@
<artifactId>smallrye-graphql-client-implementation-vertx</artifactId>
<version>${smallrye-graphql.version}</version>
</dependency>
<dependency>
<groupId>io.smallrye</groupId>
<artifactId>smallrye-graphql-client-model-builder</artifactId>
<version>${smallrye-graphql.version}</version>
</dependency>
<dependency>
<groupId>io.smallrye</groupId>
<artifactId>smallrye-graphql-client-model</artifactId>
<version>${smallrye-graphql.version}</version>
</dependency>
<dependency>
<groupId>io.smallrye</groupId>
<artifactId>smallrye-opentracing</artifactId>
<version>${smallrye-opentracing.version}</version>
<exclusions>
<exclusion>
<groupId>org.eclipse.microprofile.config</groupId>
<artifactId>microprofile-config-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.smallrye</groupId>
<artifactId>smallrye-opentracing-contrib</artifactId>
<version>${smallrye-opentracing.version}</version>
</dependency>
<dependency>
<groupId>io.smallrye</groupId>
<artifactId>smallrye-fault-tolerance</artifactId>
Expand Down
8 changes: 8 additions & 0 deletions extensions/smallrye-graphql-client/deployment/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,14 @@
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-graphql-client</artifactId>
</dependency>
<dependency>
<groupId>io.smallrye</groupId>
<artifactId>smallrye-graphql-client-model-builder</artifactId>
</dependency>
<dependency>
<groupId>io.smallrye</groupId>
<artifactId>smallrye-graphql-client-model</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-junit5-internal</artifactId>
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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 {

Expand Down Expand Up @@ -86,6 +92,26 @@ void dynamicClientInjection(BuildProducer<AdditionalBeanBuildItem> additionalBea
autoInject.produce(new AutoInjectAnnotationBuildItem(GRAPHQL_CLIENT));
}

@BuildStep
@Record(RUNTIME_INIT)
void buildExecutionService(CombinedIndexBuildItem index, SmallRyeGraphQLClientRecorder recorder,
BuildProducer<SyntheticBeanBuildItem> syntheticBeans) {
if (!index.getIndex().getAnnotations(GRAPHQL_CLIENT_API).isEmpty()) {
ClientModels clientModel = ClientModelBuilder.build(index.getIndex());
RuntimeValue<ClientModels> 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,
Expand Down Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
@@ -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<Person> people = client.people();
assertEquals("John", people.get(0).getFirstName());
assertEquals("Arthur", people.get(1).getFirstName());
}

}
4 changes: 4 additions & 0 deletions extensions/smallrye-graphql-client/runtime/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-stork</artifactId>
</dependency>
<dependency>
<groupId>io.smallrye</groupId>
<artifactId>smallrye-graphql-client-model</artifactId>
</dependency>
<dependency>
<groupId>io.smallrye</groupId>
<artifactId>smallrye-graphql-client-implementation-vertx</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,30 +5,39 @@
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;

import org.eclipse.microprofile.config.Config;
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
public class SmallRyeGraphQLClientRecorder {

private final Logger logger = Logger.getLogger(SmallRyeGraphQLClientRecorder.class);

public <T> Supplier<T> typesafeClientSupplier(Class<T> targetClassName) {
return () -> {
TypesafeGraphQLClientBuilder builder = TypesafeGraphQLClientBuilder.newBuilder();
return builder.build(targetClassName);
public <T> Function<SyntheticCreationalContext<T>, T> typesafeClientSupplier(Class<T> targetClassName) {
return new Function<>() {
@Override
public T apply(SyntheticCreationalContext<T> context) {
TypesafeGraphQLClientBuilder builder = TypesafeGraphQLClientBuilder.newBuilder();
ClientModels clientModels = context.getInjectedReference(ClientModels.class);
return (((VertxTypesafeGraphQLClientBuilder) builder).clientModels(clientModels)).build(targetClassName);
}
};
}

Expand Down Expand Up @@ -136,4 +145,8 @@ private String getTestingServerUrl() {
return "http://localhost:" + config.getOptionalValue("quarkus.http.test-port", int.class).orElse(8081) + "/graphql";
}

public RuntimeValue<ClientModels> getRuntimeClientModel(ClientModels clientModel) {
return new RuntimeValue<>(clientModel);
}

}

0 comments on commit 22a2bbf

Please sign in to comment.