Skip to content

Commit c9f4308

Browse files
authored
Merge pull request #1046 from ricardozanini/issue-1038
Fix #1038 - Do not register duplicated AuthProviders SyntheticBeans
2 parents a963396 + 6c85744 commit c9f4308

File tree

8 files changed

+106
-46
lines changed

8 files changed

+106
-46
lines changed

client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/GeneratorProcessor.java

Lines changed: 89 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import io.quarkiverse.openapi.generator.oidc.providers.OAuth2AuthenticationProvider;
3434
import io.quarkiverse.openapi.generator.providers.ApiKeyIn;
3535
import io.quarkiverse.openapi.generator.providers.AuthProvider;
36-
import io.quarkiverse.openapi.generator.providers.CompositeAuthenticationProvider;
36+
import io.quarkiverse.openapi.generator.providers.BaseCompositeAuthenticationProvider;
3737
import io.quarkiverse.openapi.generator.providers.OperationAuthInfo;
3838
import io.quarkus.arc.deployment.AdditionalBeanBuildItem;
3939
import io.quarkus.arc.deployment.SyntheticBeanBuildItem;
@@ -110,12 +110,17 @@ void produceCompositeProviders(AuthenticationRecorder recorder, List<AuthProvide
110110
Map<String, List<AuthProviderBuildItem>> providersBySpec = authProviders.stream()
111111
.collect(Collectors.groupingBy(AuthProviderBuildItem::getOpenApiSpecId));
112112
providersBySpec.forEach((openApiSpecId, providers) -> {
113-
beanProducer.produce(SyntheticBeanBuildItem.configure(CompositeAuthenticationProvider.class).scope(Dependent.class)
114-
.addQualifier().annotation(OpenApiSpec.class).addValue("openApiSpecId", openApiSpecId).done()
115-
.addInjectionPoint(ParameterizedType.create(Instance.class, ClassType.create(AuthProvider.class)),
113+
beanProducer.produce(SyntheticBeanBuildItem.configure(BaseCompositeAuthenticationProvider.class)
114+
.scope(Dependent.class)
115+
.addQualifier()
116+
.annotation(OpenApiSpec.class)
117+
.addValue("openApiSpecId", openApiSpecId)
118+
.done()
119+
.addInjectionPoint(
120+
ParameterizedType.create(Instance.class, ClassType.create(AuthProvider.class)),
116121
AnnotationInstance.builder(OpenApiSpec.class).add("openApiSpecId", openApiSpecId).build())
117-
.createWith(recorder.recordCompositeProvider(openApiSpecId)).done());
118-
122+
.createWith(recorder.recordCompositeProvider(openApiSpecId))
123+
.done());
119124
});
120125
}
121126

@@ -131,7 +136,13 @@ void produceOauthAuthentication(CombinedIndexBuildItem beanArchiveBuildItem,
131136
}
132137
LOGGER.debug("{} class found in runtime, producing OAuth bean generation", ABSTRACT_TOKEN_PRODUCER);
133138
Collection<AnnotationInstance> authenticationMarkers = beanArchiveBuildItem.getIndex()
134-
.getAnnotationsWithRepeatable(OAUTH_AUTHENTICATION_MARKER, beanArchiveBuildItem.getIndex());
139+
.getAnnotationsWithRepeatable(OAUTH_AUTHENTICATION_MARKER, beanArchiveBuildItem.getIndex())
140+
.stream()
141+
.collect(Collectors.toMap(
142+
AnnotationInstance::equivalenceHashCode,
143+
marker -> marker,
144+
(existing, duplicate) -> existing))
145+
.values();
135146

136147
Map<String, List<AnnotationInstance>> operationsBySpec = getOperationsBySpec(beanArchiveBuildItem);
137148

@@ -140,13 +151,21 @@ void produceOauthAuthentication(CombinedIndexBuildItem beanArchiveBuildItem,
140151
String openApiSpecId = authenticationMarker.value("openApiSpecId").asString();
141152
List<OperationAuthInfo> operations = getOperations(operationsBySpec, openApiSpecId, name);
142153
authenticationProviders.produce(new AuthProviderBuildItem(openApiSpecId, name));
143-
beanProducer.produce(SyntheticBeanBuildItem.configure(AuthProvider.class).scope(Dependent.class).addQualifier()
144-
.annotation(AuthName.class).addValue("name", name).done().addQualifier().annotation(OpenApiSpec.class)
145-
.addValue("openApiSpecId", openApiSpecId).done()
154+
beanProducer.produce(SyntheticBeanBuildItem.configure(AuthProvider.class)
155+
.scope(Dependent.class)
156+
.addQualifier()
157+
.annotation(AuthName.class)
158+
.addValue("name", name)
159+
.done()
160+
.addQualifier()
161+
.annotation(OpenApiSpec.class)
162+
.addValue("openApiSpecId", openApiSpecId)
163+
.done()
146164
.addInjectionPoint(ClassType.create(OAuth2AuthenticationProvider.OidcClientRequestFilterDelegate.class),
147165
AnnotationInstance.builder(OidcClient.class).add("name", sanitizeAuthName(name)).build())
148166
.createWith(oidcRecorder.recordOauthAuthProvider(sanitizeAuthName(name), openApiSpecId, operations))
149-
.unremovable().done());
167+
.unremovable()
168+
.done());
150169
}
151170
}
152171

@@ -157,7 +176,13 @@ void produceBasicAuthentication(CombinedIndexBuildItem beanArchiveBuildItem,
157176
AuthenticationRecorder recorder) {
158177

159178
Collection<AnnotationInstance> authenticationMarkers = beanArchiveBuildItem.getIndex()
160-
.getAnnotationsWithRepeatable(BASIC_AUTHENTICATION_MARKER, beanArchiveBuildItem.getIndex());
179+
.getAnnotationsWithRepeatable(BASIC_AUTHENTICATION_MARKER, beanArchiveBuildItem.getIndex())
180+
.stream()
181+
.collect(Collectors.toMap(
182+
AnnotationInstance::equivalenceHashCode,
183+
marker -> marker,
184+
(existing, duplicate) -> existing))
185+
.values();
161186

162187
Map<String, List<AnnotationInstance>> operationsBySpec = getOperationsBySpec(beanArchiveBuildItem);
163188
for (AnnotationInstance authenticationMarker : authenticationMarkers) {
@@ -167,12 +192,18 @@ void produceBasicAuthentication(CombinedIndexBuildItem beanArchiveBuildItem,
167192
List<OperationAuthInfo> operations = getOperations(operationsBySpec, openApiSpecId, name);
168193

169194
authenticationProviders.produce(new AuthProviderBuildItem(openApiSpecId, name));
170-
171-
beanProducer.produce(SyntheticBeanBuildItem.configure(AuthProvider.class).scope(Dependent.class).addQualifier()
172-
.annotation(AuthName.class).addValue("name", name).done().addQualifier().annotation(OpenApiSpec.class)
173-
.addValue("openApiSpecId", openApiSpecId).done()
195+
beanProducer.produce(SyntheticBeanBuildItem.configure(AuthProvider.class)
196+
.scope(Dependent.class)
197+
.addQualifier()
198+
.annotation(AuthName.class)
199+
.addValue("name", name).done()
200+
.addQualifier()
201+
.annotation(OpenApiSpec.class)
202+
.addValue("openApiSpecId", openApiSpecId)
203+
.done()
174204
.createWith(recorder.recordBasicAuthProvider(sanitizeAuthName(name), openApiSpecId, operations))
175-
.unremovable().done());
205+
.unremovable()
206+
.done());
176207
}
177208
}
178209

@@ -183,7 +214,13 @@ void produceBearerAuthentication(CombinedIndexBuildItem beanArchiveBuildItem,
183214
AuthenticationRecorder recorder) {
184215

185216
Collection<AnnotationInstance> authenticationMarkers = beanArchiveBuildItem.getIndex()
186-
.getAnnotationsWithRepeatable(BEARER_AUTHENTICATION_MARKER, beanArchiveBuildItem.getIndex());
217+
.getAnnotationsWithRepeatable(BEARER_AUTHENTICATION_MARKER, beanArchiveBuildItem.getIndex())
218+
.stream()
219+
.collect(Collectors.toMap(
220+
AnnotationInstance::equivalenceHashCode,
221+
marker -> marker,
222+
(existing, duplicate) -> existing))
223+
.values();
187224

188225
Map<String, List<AnnotationInstance>> operationsBySpec = getOperationsBySpec(beanArchiveBuildItem);
189226
for (AnnotationInstance authenticationMarker : authenticationMarkers) {
@@ -193,11 +230,19 @@ void produceBearerAuthentication(CombinedIndexBuildItem beanArchiveBuildItem,
193230

194231
List<OperationAuthInfo> operations = getOperations(operationsBySpec, openApiSpecId, name);
195232
authenticationProviders.produce(new AuthProviderBuildItem(openApiSpecId, name));
196-
beanProducer.produce(SyntheticBeanBuildItem.configure(AuthProvider.class).scope(Dependent.class).addQualifier()
197-
.annotation(AuthName.class).addValue("name", name).done().addQualifier().annotation(OpenApiSpec.class)
198-
.addValue("openApiSpecId", openApiSpecId).done()
233+
beanProducer.produce(SyntheticBeanBuildItem.configure(AuthProvider.class)
234+
.scope(Dependent.class)
235+
.addQualifier()
236+
.annotation(AuthName.class)
237+
.addValue("name", name)
238+
.done()
239+
.addQualifier()
240+
.annotation(OpenApiSpec.class)
241+
.addValue("openApiSpecId", openApiSpecId)
242+
.done()
199243
.createWith(recorder.recordBearerAuthProvider(sanitizeAuthName(name), scheme, openApiSpecId, operations))
200-
.unremovable().done());
244+
.unremovable()
245+
.done());
201246

202247
}
203248
}
@@ -209,7 +254,14 @@ void produceApiKeyAuthentication(CombinedIndexBuildItem beanArchiveBuildItem,
209254
AuthenticationRecorder recorder) {
210255

211256
Collection<AnnotationInstance> authenticationMarkers = beanArchiveBuildItem.getIndex()
212-
.getAnnotationsWithRepeatable(API_KEY_AUTHENTICATION_MARKER, beanArchiveBuildItem.getIndex());
257+
.getAnnotationsWithRepeatable(API_KEY_AUTHENTICATION_MARKER, beanArchiveBuildItem.getIndex())
258+
.stream()
259+
.collect(Collectors.toMap(
260+
AnnotationInstance::equivalenceHashCode,
261+
marker -> marker,
262+
(existing, duplicate) -> existing))
263+
.values();
264+
213265
Map<String, List<AnnotationInstance>> operationsBySpec = getOperationsBySpec(beanArchiveBuildItem);
214266
for (AnnotationInstance authenticationMarker : authenticationMarkers) {
215267
String name = authenticationMarker.value("name").asString();
@@ -220,12 +272,20 @@ void produceApiKeyAuthentication(CombinedIndexBuildItem beanArchiveBuildItem,
220272
List<OperationAuthInfo> operations = getOperations(operationsBySpec, openApiSpecId, name);
221273

222274
authenticationProviders.produce(new AuthProviderBuildItem(openApiSpecId, name));
223-
224-
beanProducer.produce(SyntheticBeanBuildItem.configure(AuthProvider.class).scope(Dependent.class).addQualifier()
225-
.annotation(AuthName.class).addValue("name", name).done().addQualifier().annotation(OpenApiSpec.class)
226-
.addValue("openApiSpecId", openApiSpecId).done().createWith(recorder
227-
.recordApiKeyAuthProvider(sanitizeAuthName(name), openApiSpecId, apiKeyIn, apiKeyName, operations))
228-
.unremovable().done());
275+
beanProducer.produce(SyntheticBeanBuildItem.configure(AuthProvider.class)
276+
.scope(Dependent.class)
277+
.addQualifier()
278+
.annotation(AuthName.class)
279+
.addValue("name", name)
280+
.done()
281+
.addQualifier()
282+
.annotation(OpenApiSpec.class)
283+
.addValue("openApiSpecId", openApiSpecId)
284+
.done()
285+
.createWith(recorder.recordApiKeyAuthProvider(sanitizeAuthName(name), openApiSpecId, apiKeyIn, apiKeyName,
286+
operations))
287+
.unremovable()
288+
.done());
229289
}
230290

231291
}

client/deployment/src/main/resources/templates/libraries/microprofile/auth/compositeAuthenticationProvider.qute

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public class CompositeAuthenticationProvider implements jakarta.ws.rs.client.Cli
2323

2424
@jakarta.inject.Inject
2525
@io.quarkiverse.openapi.generator.OpenApiSpec(openApiSpecId="{quarkus-generator.openApiSpecId}")
26-
io.quarkiverse.openapi.generator.providers.CompositeAuthenticationProvider compositeProvider;
26+
io.quarkiverse.openapi.generator.providers.BaseCompositeAuthenticationProvider compositeProvider;
2727

2828
@java.lang.Override
2929
public void filter(jakarta.ws.rs.client.ClientRequestContext context) throws java.io.IOException {

client/deployment/src/main/resources/templates/libraries/microprofile/auth/headersFactory.qute

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package {apiPackage}.auth;
33
public class AuthenticationPropagationHeadersFactory extends io.quarkiverse.openapi.generator.providers.AbstractAuthenticationPropagationHeadersFactory {
44

55
@jakarta.inject.Inject
6-
public AuthenticationPropagationHeadersFactory(@io.quarkiverse.openapi.generator.OpenApiSpec(openApiSpecId="{quarkus-generator.openApiSpecId}") io.quarkiverse.openapi.generator.providers.CompositeAuthenticationProvider compositeProvider, io.quarkiverse.openapi.generator.OpenApiGeneratorConfig generatorConfig, io.quarkiverse.openapi.generator.providers.HeadersProvider headersProvider) {
6+
public AuthenticationPropagationHeadersFactory(@io.quarkiverse.openapi.generator.OpenApiSpec(openApiSpecId="{quarkus-generator.openApiSpecId}") io.quarkiverse.openapi.generator.providers.BaseCompositeAuthenticationProvider compositeProvider, io.quarkiverse.openapi.generator.OpenApiGeneratorConfig generatorConfig, io.quarkiverse.openapi.generator.providers.HeadersProvider headersProvider) {
77
super(compositeProvider, generatorConfig, headersProvider);
88
}
99

client/deployment/src/test/java/io/quarkiverse/openapi/generator/deployment/authentication/OpenApiSpecProviderTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020
import io.quarkiverse.openapi.generator.oidc.providers.OAuth2AuthenticationProvider;
2121
import io.quarkiverse.openapi.generator.providers.ApiKeyAuthenticationProvider;
2222
import io.quarkiverse.openapi.generator.providers.AuthProvider;
23+
import io.quarkiverse.openapi.generator.providers.BaseCompositeAuthenticationProvider;
2324
import io.quarkiverse.openapi.generator.providers.BasicAuthenticationProvider;
24-
import io.quarkiverse.openapi.generator.providers.CompositeAuthenticationProvider;
2525
import io.quarkus.test.QuarkusUnitTest;
2626

2727
public class OpenApiSpecProviderTest {
@@ -41,19 +41,19 @@ public class OpenApiSpecProviderTest {
4141

4242
@Inject
4343
@OpenApiSpec(openApiSpecId = "spec_1")
44-
CompositeAuthenticationProvider spec1CompositeProvider;
44+
BaseCompositeAuthenticationProvider spec1CompositeProvider;
4545

4646
@Inject
4747
@OpenApiSpec(openApiSpecId = "spec_2")
48-
CompositeAuthenticationProvider spec2CompositeProvider;
48+
BaseCompositeAuthenticationProvider spec2CompositeProvider;
4949

5050
@Inject
5151
@OpenApiSpec(openApiSpecId = "spec_3")
52-
CompositeAuthenticationProvider spec3CompositeProvider;
52+
BaseCompositeAuthenticationProvider spec3CompositeProvider;
5353

5454
@Inject
5555
@OpenApiSpec(openApiSpecId = "spec_multi")
56-
CompositeAuthenticationProvider multiCompositeProvider;
56+
BaseCompositeAuthenticationProvider multiCompositeProvider;
5757

5858
@Test
5959
public void checkCompositeProvider() {

client/deployment/src/test/java/io/quarkiverse/openapi/generator/deployment/authentication/OperationTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import io.quarkiverse.openapi.generator.markers.BasicAuthenticationMarker;
2121
import io.quarkiverse.openapi.generator.markers.OauthAuthenticationMarker;
2222
import io.quarkiverse.openapi.generator.markers.OperationMarker;
23-
import io.quarkiverse.openapi.generator.providers.CompositeAuthenticationProvider;
23+
import io.quarkiverse.openapi.generator.providers.BaseCompositeAuthenticationProvider;
2424
import io.quarkiverse.openapi.generator.providers.OperationAuthInfo;
2525
import io.quarkus.test.QuarkusUnitTest;
2626

@@ -40,10 +40,10 @@ public class OperationTest {
4040

4141
@Inject
4242
@OpenApiSpec(openApiSpecId = "petstore_json")
43-
CompositeAuthenticationProvider compositeProvider;
43+
BaseCompositeAuthenticationProvider compositeProvider;
4444
@Inject
4545
@OpenApiSpec(openApiSpecId = "other_spec_json")
46-
CompositeAuthenticationProvider otherProvider;
46+
BaseCompositeAuthenticationProvider otherProvider;
4747

4848
@Test
4949
public void test() {

client/runtime/src/main/java/io/quarkiverse/openapi/generator/AuthenticationRecorder.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,22 @@
1010
import io.quarkiverse.openapi.generator.providers.ApiKeyAuthenticationProvider;
1111
import io.quarkiverse.openapi.generator.providers.ApiKeyIn;
1212
import io.quarkiverse.openapi.generator.providers.AuthProvider;
13+
import io.quarkiverse.openapi.generator.providers.BaseCompositeAuthenticationProvider;
1314
import io.quarkiverse.openapi.generator.providers.BasicAuthenticationProvider;
1415
import io.quarkiverse.openapi.generator.providers.BearerAuthenticationProvider;
15-
import io.quarkiverse.openapi.generator.providers.CompositeAuthenticationProvider;
1616
import io.quarkiverse.openapi.generator.providers.OperationAuthInfo;
1717
import io.quarkus.arc.SyntheticCreationalContext;
1818
import io.quarkus.runtime.annotations.Recorder;
1919

2020
@Recorder
2121
public class AuthenticationRecorder {
2222

23-
public Function<SyntheticCreationalContext<CompositeAuthenticationProvider>, CompositeAuthenticationProvider> recordCompositeProvider(
23+
public Function<SyntheticCreationalContext<BaseCompositeAuthenticationProvider>, BaseCompositeAuthenticationProvider> recordCompositeProvider(
2424
String openApiSpec) {
2525
return ctx -> {
2626
List<AuthProvider> providers = ctx.getInjectedReference(new TypeLiteral<Instance<AuthProvider>>() {
2727
}, new Literal(openApiSpec)).stream().toList();
28-
return new CompositeAuthenticationProvider(providers);
28+
return new BaseCompositeAuthenticationProvider(providers);
2929
};
3030
}
3131

client/runtime/src/main/java/io/quarkiverse/openapi/generator/providers/AbstractAuthenticationPropagationHeadersFactory.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@ public abstract class AbstractAuthenticationPropagationHeadersFactory implements
1919
private static final String HEADER_NAME_PREFIX_FOR_TOKEN_PROPAGATION = "QCG_%s";
2020
private static final String HEADER_NAME_FOR_TOKEN_PROPAGATION = "QCG_%s_%s_%s";
2121

22-
protected CompositeAuthenticationProvider compositeProvider;
22+
protected BaseCompositeAuthenticationProvider compositeProvider;
2323
protected OpenApiGeneratorConfig generatorConfig;
2424
protected HeadersProvider headersProvider;
2525

26-
protected AbstractAuthenticationPropagationHeadersFactory(CompositeAuthenticationProvider compositeProvider,
26+
protected AbstractAuthenticationPropagationHeadersFactory(BaseCompositeAuthenticationProvider compositeProvider,
2727
OpenApiGeneratorConfig generatorConfig,
2828
HeadersProvider headersProvider) {
2929
this.compositeProvider = compositeProvider;
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@
1616
* Composition of supported {@link ClientRequestFilter} defined by a given OpenAPI interface.
1717
* This class is used as the base class of generated code.
1818
*/
19-
public class CompositeAuthenticationProvider implements ClientRequestFilter {
19+
public class BaseCompositeAuthenticationProvider implements ClientRequestFilter {
2020

2121
private final List<AuthProvider> authProviders;
2222

23-
public CompositeAuthenticationProvider(List<AuthProvider> authProviders) {
23+
public BaseCompositeAuthenticationProvider(List<AuthProvider> authProviders) {
2424
this.authProviders = List.copyOf(authProviders);
2525
}
2626

0 commit comments

Comments
 (0)