Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,8 @@
import io.quarkus.rest.client.reactive.runtime.RestClientReactiveCDIWrapperBase;
import io.quarkus.rest.client.reactive.runtime.RestClientReactiveConfig;
import io.quarkus.rest.client.reactive.runtime.RestClientRecorder;
import io.quarkus.rest.client.reactive.spi.ClientRequestFilterBuildItem;
import io.quarkus.rest.client.reactive.spi.ClientResponseFilterBuildItem;
import io.quarkus.rest.client.reactive.spi.RestClientAnnotationsTransformerBuildItem;
import io.quarkus.restclient.config.RegisteredRestClient;
import io.quarkus.restclient.config.RestClientsBuildTimeConfig;
Expand Down Expand Up @@ -281,6 +283,8 @@ public void registerProvidersInstances(CombinedIndexBuildItem indexBuildItem,
void registerProvidersFromAnnotations(CombinedIndexBuildItem indexBuildItem,
List<RegisterProviderAnnotationInstanceBuildItem> registerProviderAnnotationInstances,
List<AnnotationToRegisterIntoClientContextBuildItem> annotationsToRegisterIntoClientContext,
List<ClientRequestFilterBuildItem> clientRequestFilters,
List<ClientResponseFilterBuildItem> clientResponseFilters,
BuildProducer<GeneratedBeanBuildItem> generatedBeansProducer,
BuildProducer<GeneratedClassBuildItem> generatedClassesProducer,
BuildProducer<UnremovableBeanBuildItem> unremovableBeansProducer,
Expand Down Expand Up @@ -325,20 +329,22 @@ void registerProvidersFromAnnotations(CombinedIndexBuildItem indexBuildItem,
continue;
}

DotName providerDotName = providerClass.name();
int priority = getAnnotatedPriority(index, providerDotName.toString(), Priorities.USER);

constructor.invokeVirtualMethod(
MethodDescriptor.ofMethod(AnnotationRegisteredProviders.class, "addGlobalProvider",
void.class, Class.class,
int.class),
constructor.getThis(), constructor.loadClassFromTCCL(providerDotName.toString()),
constructor.load(priority));
registerGlobalProvider(providerClass.name(), index, constructor, reflectiveClassesProducer);
}
}

// when the server is not included, providers are not automatically registered for reflection,
// so we need to always do it for the client to be on the safe side
reflectiveClassesProducer.produce(ReflectiveClassBuildItem.builder(providerDotName.toString()).build());
Set<DotName> providersFromBuildItems = new HashSet<>();
providersFromBuildItems.addAll(clientRequestFilters.stream().map(ClientRequestFilterBuildItem::getClassName)
.map(DotName::createSimple).collect(
Collectors.toSet()));
providersFromBuildItems.addAll(clientResponseFilters.stream().map(ClientResponseFilterBuildItem::getClassName)
.map(DotName::createSimple).collect(
Collectors.toSet()));
if (!providersFromBuildItems.isEmpty()) {
for (DotName dotName : providersFromBuildItems) {
registerGlobalProvider(dotName, index, constructor, reflectiveClassesProducer);
}
unremovableBeansProducer.produce(UnremovableBeanBuildItem.beanTypes(providersFromBuildItems));
}

MultivaluedMap<String, GeneratedClassResult> generatedProviders = new QuarkusMultivaluedHashMap<>();
Expand All @@ -361,6 +367,23 @@ void registerProvidersFromAnnotations(CombinedIndexBuildItem indexBuildItem,
unremovableBeansProducer.produce(UnremovableBeanBuildItem.beanClassNames(annotationRegisteredProvidersImpl));
}

private void registerGlobalProvider(DotName providerClassName,
IndexView index, MethodCreator methodCreator,
BuildProducer<ReflectiveClassBuildItem> reflectiveClassesProducer) {
int priority = getAnnotatedPriority(index, providerClassName.toString(), Priorities.USER);

methodCreator.invokeVirtualMethod(
MethodDescriptor.ofMethod(AnnotationRegisteredProviders.class, "addGlobalProvider",
void.class, Class.class,
int.class),
methodCreator.getThis(), methodCreator.loadClassFromTCCL(providerClassName.toString()),
methodCreator.load(priority));

// when the server is not included, providers are not automatically registered for reflection,
// so we need to always do it for the client to be on the safe side
reflectiveClassesProducer.produce(ReflectiveClassBuildItem.builder(providerClassName.toString()).build());
}

@BuildStep
AdditionalBeanBuildItem registerProviderBeans(CombinedIndexBuildItem combinedIndex) {
IndexView index = combinedIndex.getIndex();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package io.quarkus.rest.client.reactive.spi;

import io.quarkus.builder.item.MultiBuildItem;

/**
* Used to make a register a global {@link jakarta.ws.rs.client.ClientRequestFilter}
*/
public final class ClientRequestFilterBuildItem extends MultiBuildItem {

private final String className;

public ClientRequestFilterBuildItem(String className) {
this.className = className;
}

public String getClassName() {
return className;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package io.quarkus.rest.client.reactive.spi;

import io.quarkus.builder.item.MultiBuildItem;

/**
* Used to make a register a global {@link jakarta.ws.rs.client.ClientResponseFilter}
*/
public final class ClientResponseFilterBuildItem extends MultiBuildItem {

private final String className;

public ClientResponseFilterBuildItem(String className) {
this.className = className;
}

public String getClassName() {
return className;
}
}
Loading