Skip to content

Commit 5e48fd9

Browse files
committed
add AuthName qualifier to fix mutliple synthetic bean with same signature issue
1 parent 334c66f commit 5e48fd9

File tree

14 files changed

+115
-36
lines changed

14 files changed

+115
-36
lines changed

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

Lines changed: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,23 @@
1313
import org.jboss.jandex.DotName;
1414
import org.jboss.jandex.ParameterizedType;
1515

16-
import io.quarkiverse.openapi.generator.*;
17-
import io.quarkiverse.openapi.generator.markers.*;
18-
import io.quarkiverse.openapi.generator.providers.*;
16+
import io.quarkiverse.openapi.generator.AuthName;
17+
import io.quarkiverse.openapi.generator.AuthenticationRecorder;
18+
import io.quarkiverse.openapi.generator.ClassicOidcClientRequestFilterDelegate;
19+
import io.quarkiverse.openapi.generator.OidcClient;
20+
import io.quarkiverse.openapi.generator.OpenApiGeneratorConfig;
21+
import io.quarkiverse.openapi.generator.OpenApiSpec;
22+
import io.quarkiverse.openapi.generator.ReactiveOidcClientRequestFilterDelegate;
23+
import io.quarkiverse.openapi.generator.markers.ApiKeyAuthenticationMarker;
24+
import io.quarkiverse.openapi.generator.markers.BasicAuthenticationMarker;
25+
import io.quarkiverse.openapi.generator.markers.BearerAuthenticationMarker;
26+
import io.quarkiverse.openapi.generator.markers.OauthAuthenticationMarker;
27+
import io.quarkiverse.openapi.generator.markers.OperationMarker;
28+
import io.quarkiverse.openapi.generator.providers.ApiKeyIn;
29+
import io.quarkiverse.openapi.generator.providers.AuthProvider;
30+
import io.quarkiverse.openapi.generator.providers.CompositeAuthenticationProvider;
1931
import io.quarkiverse.openapi.generator.providers.OAuth2AuthenticationProvider.OidcClientRequestFilterDelegate;
32+
import io.quarkiverse.openapi.generator.providers.OperationAuthInfo;
2033
import io.quarkus.arc.deployment.AdditionalBeanBuildItem;
2134
import io.quarkus.arc.deployment.SyntheticBeanBuildItem;
2235
import io.quarkus.deployment.Capabilities;
@@ -74,12 +87,12 @@ void produceCompositeProviders(AuthenticationRecorder recorder,
7487
beanProducer.produce(SyntheticBeanBuildItem.configure(CompositeAuthenticationProvider.class)
7588
.scope(Dependent.class)
7689
.addQualifier()
77-
.annotation(Authentication.class)
90+
.annotation(OpenApiSpec.class)
7891
.addValue("openApiSpecId", openApiSpecId)
7992
.done()
8093
.addInjectionPoint(
8194
ParameterizedType.create(Instance.class, ClassType.create(AuthProvider.class)),
82-
AnnotationInstance.builder(Authentication.class)
95+
AnnotationInstance.builder(OpenApiSpec.class)
8396
.add("openApiSpecId", openApiSpecId)
8497
.build())
8598
.createWith(recorder.recordCompositeProvider(openApiSpecId))
@@ -91,12 +104,11 @@ void produceCompositeProviders(AuthenticationRecorder recorder,
91104
@BuildStep
92105
@Record(ExecutionTime.STATIC_INIT)
93106
void produceOauthAuthentication(CombinedIndexBuildItem beanArchiveBuildItem,
94-
Capabilities capabilities,
95107
BuildProducer<AuthProviderBuildItem> authenticationProviders,
96108
BuildProducer<SyntheticBeanBuildItem> beanProducer,
97109
AuthenticationRecorder recorder) {
98110
Collection<AnnotationInstance> authenticationMarkers = beanArchiveBuildItem.getIndex()
99-
.getAnnotations(OAUTH_AUTHENTICATION_MARKER);
111+
.getAnnotationsWithRepeatable(OAUTH_AUTHENTICATION_MARKER, beanArchiveBuildItem.getIndex());
100112

101113
Map<String, List<AnnotationInstance>> operationsBySpec = getOperationsBySpec(beanArchiveBuildItem);
102114

@@ -108,7 +120,11 @@ void produceOauthAuthentication(CombinedIndexBuildItem beanArchiveBuildItem,
108120
beanProducer.produce(SyntheticBeanBuildItem.configure(AuthProvider.class)
109121
.scope(Dependent.class)
110122
.addQualifier()
111-
.annotation(Authentication.class)
123+
.annotation(AuthName.class)
124+
.addValue("name", name)
125+
.done()
126+
.addQualifier()
127+
.annotation(OpenApiSpec.class)
112128
.addValue("openApiSpecId", openApiSpecId)
113129
.done()
114130
.addInjectionPoint(ClassType.create(OidcClientRequestFilterDelegate.class),
@@ -132,7 +148,7 @@ void produceBasicAuthentication(CombinedIndexBuildItem beanArchiveBuildItem,
132148
AuthenticationRecorder recorder) {
133149

134150
Collection<AnnotationInstance> authenticationMarkers = beanArchiveBuildItem.getIndex()
135-
.getAnnotations(BASIC_AUTHENTICATION_MARKER);
151+
.getAnnotationsWithRepeatable(BASIC_AUTHENTICATION_MARKER, beanArchiveBuildItem.getIndex());
136152

137153
Map<String, List<AnnotationInstance>> operationsBySpec = getOperationsBySpec(beanArchiveBuildItem);
138154
for (AnnotationInstance authenticationMarker : authenticationMarkers) {
@@ -146,7 +162,11 @@ void produceBasicAuthentication(CombinedIndexBuildItem beanArchiveBuildItem,
146162
beanProducer.produce(SyntheticBeanBuildItem.configure(AuthProvider.class)
147163
.scope(Dependent.class)
148164
.addQualifier()
149-
.annotation(Authentication.class)
165+
.annotation(AuthName.class)
166+
.addValue("name", name)
167+
.done()
168+
.addQualifier()
169+
.annotation(OpenApiSpec.class)
150170
.addValue("openApiSpecId", openApiSpecId)
151171
.done()
152172
.createWith(recorder.recordBasicAuthProvider(
@@ -166,7 +186,7 @@ void produceBearerAuthentication(CombinedIndexBuildItem beanArchiveBuildItem,
166186
AuthenticationRecorder recorder) {
167187

168188
Collection<AnnotationInstance> authenticationMarkers = beanArchiveBuildItem.getIndex()
169-
.getAnnotations(BEARER_AUTHENTICATION_MARKER);
189+
.getAnnotationsWithRepeatable(BEARER_AUTHENTICATION_MARKER, beanArchiveBuildItem.getIndex());
170190

171191
Map<String, List<AnnotationInstance>> operationsBySpec = getOperationsBySpec(beanArchiveBuildItem);
172192
for (AnnotationInstance authenticationMarker : authenticationMarkers) {
@@ -179,7 +199,11 @@ void produceBearerAuthentication(CombinedIndexBuildItem beanArchiveBuildItem,
179199
beanProducer.produce(SyntheticBeanBuildItem.configure(AuthProvider.class)
180200
.scope(Dependent.class)
181201
.addQualifier()
182-
.annotation(Authentication.class)
202+
.annotation(AuthName.class)
203+
.addValue("name", name)
204+
.done()
205+
.addQualifier()
206+
.annotation(OpenApiSpec.class)
183207
.addValue("openApiSpecId", openApiSpecId)
184208
.done()
185209
.createWith(recorder.recordBearerAuthProvider(
@@ -201,7 +225,7 @@ void produceApiKeyAuthentication(CombinedIndexBuildItem beanArchiveBuildItem,
201225
AuthenticationRecorder recorder) {
202226

203227
Collection<AnnotationInstance> authenticationMarkers = beanArchiveBuildItem.getIndex()
204-
.getAnnotations(API_KEY_AUTHENTICATION_MARKER);
228+
.getAnnotationsWithRepeatable(API_KEY_AUTHENTICATION_MARKER, beanArchiveBuildItem.getIndex());
205229
Map<String, List<AnnotationInstance>> operationsBySpec = getOperationsBySpec(beanArchiveBuildItem);
206230
for (AnnotationInstance authenticationMarker : authenticationMarkers) {
207231
String name = authenticationMarker.value("name").asString();
@@ -216,7 +240,11 @@ void produceApiKeyAuthentication(CombinedIndexBuildItem beanArchiveBuildItem,
216240
beanProducer.produce(SyntheticBeanBuildItem.configure(AuthProvider.class)
217241
.scope(Dependent.class)
218242
.addQualifier()
219-
.annotation(Authentication.class)
243+
.annotation(AuthName.class)
244+
.addValue("name", name)
245+
.done()
246+
.addQualifier()
247+
.annotation(OpenApiSpec.class)
220248
.addValue("openApiSpecId", openApiSpecId)
221249
.done()
222250
.createWith(recorder.recordApiKeyAuthProvider(

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
@@ -22,7 +22,7 @@ package {apiPackage}.auth;
2222
public class CompositeAuthenticationProvider implements jakarta.ws.rs.client.ClientRequestFilter {
2323

2424
@jakarta.inject.Inject
25-
@io.quarkiverse.openapi.generator.Authentication(openApiSpecId="{configKey}")
25+
@io.quarkiverse.openapi.generator.OpenApiSpec(openApiSpecId="{configKey}")
2626
io.quarkiverse.openapi.generator.providers.CompositeAuthenticationProvider compositeProvider;
2727

2828
@java.lang.Override

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.Authentication(openApiSpecId="{configKey}") 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="{configKey}") io.quarkiverse.openapi.generator.providers.CompositeAuthenticationProvider compositeProvider, io.quarkiverse.openapi.generator.OpenApiGeneratorConfig generatorConfig, io.quarkiverse.openapi.generator.providers.HeadersProvider headersProvider) {
77
super(compositeProvider, generatorConfig, headersProvider);
88
}
99

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static io.quarkiverse.openapi.generator.providers.ApiKeyIn.header;
44

5+
import jakarta.annotation.Priority;
56
import jakarta.inject.Inject;
67

78
import org.jboss.shrinkwrap.api.ShrinkWrap;
@@ -11,25 +12,27 @@
1112
import org.junit.jupiter.api.Test;
1213
import org.junit.jupiter.api.extension.RegisterExtension;
1314

14-
import io.quarkiverse.openapi.generator.Authentication;
15+
import io.quarkiverse.openapi.generator.OpenApiSpec;
1516
import io.quarkiverse.openapi.generator.markers.ApiKeyAuthenticationMarker;
1617
import io.quarkiverse.openapi.generator.markers.BasicAuthenticationMarker;
1718
import io.quarkiverse.openapi.generator.markers.OauthAuthenticationMarker;
1819
import io.quarkiverse.openapi.generator.providers.*;
1920
import io.quarkus.test.QuarkusUnitTest;
2021

21-
public class AuthenticationProviderTest {
22+
public class OpenApiSpecProviderTest {
2223

2324
@RegisterExtension
2425
static final QuarkusUnitTest unitTest = new QuarkusUnitTest()
2526
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)
2627
.addClass(LocalAuthenticationProvider.class)
2728
.addAsResource(
28-
new StringAsset("quarkus.oidc-client.oauth_auth.auth-server-url=localhost\n"),
29+
new StringAsset("quarkus.oidc-client.oauth_auth.auth-server-url=localhost\n" +
30+
"quarkus.oidc-client.oauth_auth1.auth-server-url=localhost\n" +
31+
"quarkus.oidc-client.oauth_auth2.auth-server-url=localhost\n"),
2932
"application.properties"));
3033

3134
@Test
32-
public void test() {
35+
public void checkCompositeProvider() {
3336
Assertions.assertEquals(1, spec1CompositeProvider.getAuthenticationProviders().size());
3437
Assertions.assertEquals(1, spec2CompositeProvider.getAuthenticationProviders().size());
3538
Assertions.assertEquals(1, spec3CompositeProvider.getAuthenticationProviders().size());
@@ -51,22 +54,38 @@ public void test() {
5154

5255
}
5356

57+
@Test
58+
public void checkCompositeProviderWithMultipleAuth() {
59+
Assertions.assertEquals(4, multiCompositeProvider.getAuthenticationProviders().size());
60+
}
61+
5462
@Inject
55-
@Authentication(openApiSpecId = "spec_1")
63+
@OpenApiSpec(openApiSpecId = "spec_1")
5664
CompositeAuthenticationProvider spec1CompositeProvider;
5765

58-
@Authentication(openApiSpecId = "spec_2")
66+
@Inject
67+
@OpenApiSpec(openApiSpecId = "spec_2")
5968
CompositeAuthenticationProvider spec2CompositeProvider;
6069

61-
@Authentication(openApiSpecId = "spec_3")
70+
@Inject
71+
@OpenApiSpec(openApiSpecId = "spec_3")
6272
CompositeAuthenticationProvider spec3CompositeProvider;
6373

64-
@jakarta.annotation.Priority(jakarta.ws.rs.Priorities.AUTHENTICATION)
74+
@Inject
75+
@OpenApiSpec(openApiSpecId = "spec_multi")
76+
CompositeAuthenticationProvider multiCompositeProvider;
77+
78+
@Priority(jakarta.ws.rs.Priorities.AUTHENTICATION)
6579
@OauthAuthenticationMarker(name = "oauth_auth", openApiSpecId = "spec_1")
6680
@BasicAuthenticationMarker(name = "basic_auth", openApiSpecId = "spec_2")
6781
@ApiKeyAuthenticationMarker(name = "api_key", openApiSpecId = "spec_3", apiKeyIn = header, apiKeyName = "api_key")
82+
83+
@OauthAuthenticationMarker(name = "oauth_auth1", openApiSpecId = "spec_multi")
84+
@OauthAuthenticationMarker(name = "oauth_auth2", openApiSpecId = "spec_multi")
85+
@BasicAuthenticationMarker(name = "basic_auth1", openApiSpecId = "spec_multi")
86+
@BasicAuthenticationMarker(name = "basic_auth2", openApiSpecId = "spec_multi")
6887
public static class LocalAuthenticationProvider {
6988

7089
}
7190

72-
}
91+
}

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
@@ -14,7 +14,7 @@
1414
import org.junit.jupiter.api.Test;
1515
import org.junit.jupiter.api.extension.RegisterExtension;
1616

17-
import io.quarkiverse.openapi.generator.Authentication;
17+
import io.quarkiverse.openapi.generator.OpenApiSpec;
1818
import io.quarkiverse.openapi.generator.annotations.GeneratedClass;
1919
import io.quarkiverse.openapi.generator.markers.BasicAuthenticationMarker;
2020
import io.quarkiverse.openapi.generator.markers.OauthAuthenticationMarker;
@@ -48,10 +48,10 @@ public void test() {
4848
}
4949

5050
@Inject
51-
@Authentication(openApiSpecId = "petstore_json")
51+
@OpenApiSpec(openApiSpecId = "petstore_json")
5252
CompositeAuthenticationProvider compositeProvider;
5353
@Inject
54-
@Authentication(openApiSpecId = "other_spec_json")
54+
@OpenApiSpec(openApiSpecId = "other_spec_json")
5555
CompositeAuthenticationProvider otherProvider;
5656

5757
@RegisterRestClient(baseUri = "http://localhost/api/v3", configKey = "petstore_json")
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package io.quarkiverse.openapi.generator;
2+
3+
import static java.lang.annotation.ElementType.*;
4+
import static java.lang.annotation.RetentionPolicy.RUNTIME;
5+
6+
import java.lang.annotation.Retention;
7+
import java.lang.annotation.Target;
8+
9+
import jakarta.enterprise.util.AnnotationLiteral;
10+
import jakarta.inject.Qualifier;
11+
12+
@Qualifier
13+
@Retention(RUNTIME)
14+
@Target({ METHOD, FIELD, PARAMETER, TYPE })
15+
public @interface AuthName {
16+
17+
String name();
18+
19+
final class Literal extends AnnotationLiteral<AuthName> implements AuthName {
20+
public Literal(String name) {
21+
this.name = name;
22+
}
23+
24+
final String name;
25+
26+
@Override
27+
public String name() {
28+
return name;
29+
}
30+
}
31+
}

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import jakarta.enterprise.inject.Instance;
88
import jakarta.enterprise.util.TypeLiteral;
99

10-
import io.quarkiverse.openapi.generator.Authentication.Literal;
10+
import io.quarkiverse.openapi.generator.OpenApiSpec.Literal;
1111
import io.quarkiverse.openapi.generator.providers.*;
1212
import io.quarkiverse.openapi.generator.providers.OAuth2AuthenticationProvider.OidcClientRequestFilterDelegate;
1313
import io.quarkus.arc.SyntheticCreationalContext;
@@ -27,7 +27,6 @@ public Function<SyntheticCreationalContext<CompositeAuthenticationProvider>, Com
2727
return ctx -> {
2828
List<AuthProvider> providers = ctx.getInjectedReference(new TypeLiteral<Instance<AuthProvider>>() {
2929
}, new Literal(openApiSpec)).stream().toList();
30-
System.out.println(providers.size());
3130
return new CompositeAuthenticationProvider(providers);
3231
};
3332
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ protected java.util.Optional<String> clientId() {
3939
return java.util.Optional.of(clientId);
4040
}
4141

42+
@Override
4243
public void filter(ClientRequestContext requestContext) throws IOException {
4344
try {
4445
String accessToken = this.getAccessToken();

client/runtime/src/main/java/io/quarkiverse/openapi/generator/Authentication.java renamed to client/runtime/src/main/java/io/quarkiverse/openapi/generator/OpenApiSpec.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@
1212
@Qualifier
1313
@Retention(RUNTIME)
1414
@Target({ METHOD, FIELD, PARAMETER, TYPE })
15-
public @interface Authentication {
15+
public @interface OpenApiSpec {
1616

1717
String openApiSpecId();
1818

19-
final class Literal extends AnnotationLiteral<Authentication> implements Authentication {
19+
final class Literal extends AnnotationLiteral<OpenApiSpec> implements OpenApiSpec {
2020
public Literal(String openApiSpecId) {
2121
this.openApiSpecId = openApiSpecId;
2222
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ protected java.util.Optional<String> clientId() {
4141
return java.util.Optional.of(clientId);
4242
}
4343

44+
@Override
4445
protected void initTokens() {
4546
if (earlyTokenAcquisition) {
4647
LOG.debug("Token acquisition will be delayed until this filter is executed to avoid blocking an IO thread");

0 commit comments

Comments
 (0)