39
39
import jakarta .ws .rs .Priorities ;
40
40
import jakarta .ws .rs .RuntimeType ;
41
41
import jakarta .ws .rs .core .MediaType ;
42
+ import jakarta .ws .rs .core .MultivaluedMap ;
42
43
43
44
import org .eclipse .microprofile .config .Config ;
44
45
import org .eclipse .microprofile .config .ConfigProvider ;
60
61
import org .jboss .resteasy .reactive .client .spi .MissingMessageBodyReaderErrorMessageContextualizer ;
61
62
import org .jboss .resteasy .reactive .common .processor .ResteasyReactiveDotNames ;
62
63
import org .jboss .resteasy .reactive .common .processor .transformation .AnnotationStore ;
64
+ import org .jboss .resteasy .reactive .common .util .QuarkusMultivaluedHashMap ;
63
65
64
66
import io .quarkus .arc .deployment .AdditionalBeanBuildItem ;
65
67
import io .quarkus .arc .deployment .CustomScopeAnnotationsBuildItem ;
@@ -331,12 +333,15 @@ void registerProvidersFromAnnotations(CombinedIndexBuildItem indexBuildItem,
331
333
}
332
334
}
333
335
334
- Map <String , GeneratedClassResult > generatedProviders = new HashMap <>();
335
- populateClientExceptionMapperFromAnnotations (generatedClasses , reflectiveClasses , index , generatedProviders );
336
- populateClientRedirectHandlerFromAnnotations (generatedClasses , reflectiveClasses , index , generatedProviders );
336
+ MultivaluedMap <String , GeneratedClassResult > generatedProviders = new QuarkusMultivaluedHashMap <>();
337
+ populateClientExceptionMapperFromAnnotations (generatedClasses , reflectiveClasses , index )
338
+ .forEach (generatedProviders ::add );
339
+ populateClientRedirectHandlerFromAnnotations (generatedClasses , reflectiveClasses , index )
340
+ .forEach (generatedProviders ::add );
337
341
for (AnnotationToRegisterIntoClientContextBuildItem annotation : annotationsToRegisterIntoClientContext ) {
338
- populateClientProviderFromAnnotations (annotation , generatedClasses , reflectiveClasses ,
339
- index , generatedProviders );
342
+ populateClientProviderFromAnnotations (annotation , generatedClasses , reflectiveClasses , index )
343
+ .forEach (generatedProviders ::add );
344
+
340
345
}
341
346
342
347
addGeneratedProviders (index , constructor , annotationsByClassName , generatedProviders );
@@ -551,77 +556,83 @@ && isImplementorOf(index, target.asClass(), RESPONSE_EXCEPTION_MAPPER, Set.of(AP
551
556
}
552
557
}
553
558
554
- private void populateClientExceptionMapperFromAnnotations ( BuildProducer < GeneratedClassBuildItem > generatedClasses ,
555
- BuildProducer <ReflectiveClassBuildItem > reflectiveClasses , IndexView index ,
556
- Map < String , GeneratedClassResult > generatedProviders ) {
559
+ private Map < String , GeneratedClassResult > populateClientExceptionMapperFromAnnotations (
560
+ BuildProducer <GeneratedClassBuildItem > generatedClasses ,
561
+ BuildProducer < ReflectiveClassBuildItem > reflectiveClasses , IndexView index ) {
557
562
563
+ var result = new HashMap <String , GeneratedClassResult >();
558
564
ClientExceptionMapperHandler clientExceptionMapperHandler = new ClientExceptionMapperHandler (
559
565
new GeneratedClassGizmoAdaptor (generatedClasses , true ));
560
566
for (AnnotationInstance instance : index .getAnnotations (CLIENT_EXCEPTION_MAPPER )) {
561
- GeneratedClassResult result = clientExceptionMapperHandler .generateResponseExceptionMapper (instance );
562
- if (result == null ) {
567
+ GeneratedClassResult classResult = clientExceptionMapperHandler .generateResponseExceptionMapper (instance );
568
+ if (classResult == null ) {
563
569
continue ;
564
570
}
565
- if (generatedProviders .containsKey (result .interfaceName )) {
571
+ if (result .containsKey (classResult .interfaceName )) {
566
572
throw new IllegalStateException ("Only a single instance of '" + CLIENT_EXCEPTION_MAPPER
567
- + "' is allowed per REST Client interface. Offending class is '" + result .interfaceName + "'" );
573
+ + "' is allowed per REST Client interface. Offending class is '" + classResult .interfaceName + "'" );
568
574
}
569
- generatedProviders .put (result .interfaceName , result );
570
- reflectiveClasses .produce (ReflectiveClassBuildItem .builder (result .generatedClassName )
575
+ result .put (classResult .interfaceName , classResult );
576
+ reflectiveClasses .produce (ReflectiveClassBuildItem .builder (classResult .generatedClassName )
571
577
.serialization (false ).build ());
572
578
}
579
+ return result ;
573
580
}
574
581
575
- private void populateClientRedirectHandlerFromAnnotations ( BuildProducer < GeneratedClassBuildItem > generatedClasses ,
576
- BuildProducer <ReflectiveClassBuildItem > reflectiveClasses , IndexView index ,
577
- Map < String , GeneratedClassResult > generatedProviders ) {
582
+ private Map < String , GeneratedClassResult > populateClientRedirectHandlerFromAnnotations (
583
+ BuildProducer <GeneratedClassBuildItem > generatedClasses ,
584
+ BuildProducer < ReflectiveClassBuildItem > reflectiveClasses , IndexView index ) {
578
585
586
+ var result = new HashMap <String , GeneratedClassResult >();
579
587
ClientRedirectHandler clientHandler = new ClientRedirectHandler (new GeneratedClassGizmoAdaptor (generatedClasses , true ));
580
588
for (AnnotationInstance instance : index .getAnnotations (CLIENT_REDIRECT_HANDLER )) {
581
- GeneratedClassResult result = clientHandler .generateResponseExceptionMapper (instance );
582
- if (result == null ) {
589
+ GeneratedClassResult classResult = clientHandler .generateResponseExceptionMapper (instance );
590
+ if (classResult == null ) {
583
591
continue ;
584
592
}
585
593
586
- GeneratedClassResult existing = generatedProviders .get (result .interfaceName );
587
- if (existing != null && existing .priority == result .priority ) {
594
+ GeneratedClassResult existing = result .get (classResult .interfaceName );
595
+ if (existing != null && existing .priority == classResult .priority ) {
588
596
throw new IllegalStateException ("Only a single instance of '" + CLIENT_REDIRECT_HANDLER
589
597
+ "' with the same priority is allowed per REST Client interface. "
590
- + "Offending class is '" + result .interfaceName + "'" );
591
- } else if (existing == null || existing .priority < result .priority ) {
592
- generatedProviders .put (result .interfaceName , result );
593
- reflectiveClasses .produce (ReflectiveClassBuildItem .builder (result .generatedClassName )
598
+ + "Offending class is '" + classResult .interfaceName + "'" );
599
+ } else if (existing == null || existing .priority < classResult .priority ) {
600
+ result .put (classResult .interfaceName , classResult );
601
+ reflectiveClasses .produce (ReflectiveClassBuildItem .builder (classResult .generatedClassName )
594
602
.serialization (false ).build ());
595
603
}
596
604
}
605
+ return result ;
597
606
}
598
607
599
- private void populateClientProviderFromAnnotations (AnnotationToRegisterIntoClientContextBuildItem annotationBuildItem ,
608
+ private Map <String , GeneratedClassResult > populateClientProviderFromAnnotations (
609
+ AnnotationToRegisterIntoClientContextBuildItem annotationBuildItem ,
600
610
BuildProducer <GeneratedClassBuildItem > generatedClasses ,
601
- BuildProducer <ReflectiveClassBuildItem > reflectiveClasses , IndexView index ,
602
- Map <String , GeneratedClassResult > generatedProviders ) {
611
+ BuildProducer <ReflectiveClassBuildItem > reflectiveClasses , IndexView index ) {
603
612
613
+ var result = new HashMap <String , GeneratedClassResult >();
604
614
ClientContextResolverHandler handler = new ClientContextResolverHandler (annotationBuildItem .getAnnotation (),
605
615
annotationBuildItem .getExpectedReturnType (),
606
616
new GeneratedClassGizmoAdaptor (generatedClasses , true ));
607
617
for (AnnotationInstance instance : index .getAnnotations (annotationBuildItem .getAnnotation ())) {
608
- GeneratedClassResult result = handler .generateContextResolver (instance );
609
- if (result == null ) {
618
+ GeneratedClassResult classResult = handler .generateContextResolver (instance );
619
+ if (classResult == null ) {
610
620
continue ;
611
621
}
612
- if (generatedProviders .containsKey (result .interfaceName )) {
622
+ if (result .containsKey (classResult .interfaceName )) {
613
623
throw new IllegalStateException ("Only a single instance of '" + annotationBuildItem .getAnnotation ()
614
- + "' is allowed per REST Client interface. Offending class is '" + result .interfaceName + "'" );
624
+ + "' is allowed per REST Client interface. Offending class is '" + classResult .interfaceName + "'" );
615
625
}
616
- generatedProviders .put (result .interfaceName , result );
617
- reflectiveClasses .produce (ReflectiveClassBuildItem .builder (result .generatedClassName )
626
+ result .put (classResult .interfaceName , classResult );
627
+ reflectiveClasses .produce (ReflectiveClassBuildItem .builder (classResult .generatedClassName )
618
628
.serialization (false ).build ());
619
629
}
630
+ return result ;
620
631
}
621
632
622
633
private void addGeneratedProviders (IndexView index , MethodCreator constructor ,
623
634
Map <String , List <AnnotationInstance >> annotationsByClassName ,
624
- Map <String , GeneratedClassResult > generatedProviders ) {
635
+ Map <String , List < GeneratedClassResult > > generatedProviders ) {
625
636
for (Map .Entry <String , List <AnnotationInstance >> annotationsForClass : annotationsByClassName .entrySet ()) {
626
637
ResultHandle map = constructor .newInstance (MethodDescriptor .ofConstructor (HashMap .class ));
627
638
for (AnnotationInstance value : annotationsForClass .getValue ()) {
@@ -641,18 +652,24 @@ private void addGeneratedProviders(IndexView index, MethodCreator constructor,
641
652
if (generatedProviders .containsKey (ifaceName )) {
642
653
// remove the interface from the generated provider since it's going to be handled now
643
654
// the remaining entries will be handled later
644
- GeneratedClassResult result = generatedProviders .remove (ifaceName );
645
- constructor .invokeInterfaceMethod (MAP_PUT , map , constructor .loadClass (result .generatedClassName ),
646
- constructor .load (result .priority ));
655
+ List <GeneratedClassResult > providers = generatedProviders .remove (ifaceName );
656
+ for (GeneratedClassResult classResult : providers ) {
657
+ constructor .invokeInterfaceMethod (MAP_PUT , map , constructor .loadClass (classResult .generatedClassName ),
658
+ constructor .load (classResult .priority ));
659
+ }
660
+
647
661
}
648
662
addProviders (constructor , ifaceName , map );
649
663
}
650
664
651
- for (Map .Entry <String , GeneratedClassResult > entry : generatedProviders .entrySet ()) {
665
+ for (Map .Entry <String , List < GeneratedClassResult > > entry : generatedProviders .entrySet ()) {
652
666
ResultHandle map = constructor .newInstance (MethodDescriptor .ofConstructor (HashMap .class ));
653
- constructor .invokeInterfaceMethod (MAP_PUT , map , constructor .loadClass (entry .getValue ().generatedClassName ),
654
- constructor .load (entry .getValue ().priority ));
655
- addProviders (constructor , entry .getKey (), map );
667
+ for (GeneratedClassResult classResult : entry .getValue ()) {
668
+ constructor .invokeInterfaceMethod (MAP_PUT , map , constructor .loadClass (classResult .generatedClassName ),
669
+ constructor .load (classResult .priority ));
670
+ addProviders (constructor , entry .getKey (), map );
671
+ }
672
+
656
673
}
657
674
}
658
675
0 commit comments