Skip to content

Commit 44e9b5c

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

File tree

14 files changed

+99
-33
lines changed

14 files changed

+99
-33
lines changed

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

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -74,12 +74,12 @@ void produceCompositeProviders(AuthenticationRecorder recorder,
7474
beanProducer.produce(SyntheticBeanBuildItem.configure(CompositeAuthenticationProvider.class)
7575
.scope(Dependent.class)
7676
.addQualifier()
77-
.annotation(Authentication.class)
77+
.annotation(OpenApiSpec.class)
7878
.addValue("openApiSpecId", openApiSpecId)
7979
.done()
8080
.addInjectionPoint(
8181
ParameterizedType.create(Instance.class, ClassType.create(AuthProvider.class)),
82-
AnnotationInstance.builder(Authentication.class)
82+
AnnotationInstance.builder(OpenApiSpec.class)
8383
.add("openApiSpecId", openApiSpecId)
8484
.build())
8585
.createWith(recorder.recordCompositeProvider(openApiSpecId))
@@ -91,12 +91,11 @@ void produceCompositeProviders(AuthenticationRecorder recorder,
9191
@BuildStep
9292
@Record(ExecutionTime.STATIC_INIT)
9393
void produceOauthAuthentication(CombinedIndexBuildItem beanArchiveBuildItem,
94-
Capabilities capabilities,
9594
BuildProducer<AuthProviderBuildItem> authenticationProviders,
9695
BuildProducer<SyntheticBeanBuildItem> beanProducer,
9796
AuthenticationRecorder recorder) {
9897
Collection<AnnotationInstance> authenticationMarkers = beanArchiveBuildItem.getIndex()
99-
.getAnnotations(OAUTH_AUTHENTICATION_MARKER);
98+
.getAnnotationsWithRepeatable(OAUTH_AUTHENTICATION_MARKER, beanArchiveBuildItem.getIndex());
10099

101100
Map<String, List<AnnotationInstance>> operationsBySpec = getOperationsBySpec(beanArchiveBuildItem);
102101

@@ -108,7 +107,11 @@ void produceOauthAuthentication(CombinedIndexBuildItem beanArchiveBuildItem,
108107
beanProducer.produce(SyntheticBeanBuildItem.configure(AuthProvider.class)
109108
.scope(Dependent.class)
110109
.addQualifier()
111-
.annotation(Authentication.class)
110+
.annotation(AuthName.class)
111+
.addValue("name", name)
112+
.done()
113+
.addQualifier()
114+
.annotation(OpenApiSpec.class)
112115
.addValue("openApiSpecId", openApiSpecId)
113116
.done()
114117
.addInjectionPoint(ClassType.create(OidcClientRequestFilterDelegate.class),
@@ -132,7 +135,7 @@ void produceBasicAuthentication(CombinedIndexBuildItem beanArchiveBuildItem,
132135
AuthenticationRecorder recorder) {
133136

134137
Collection<AnnotationInstance> authenticationMarkers = beanArchiveBuildItem.getIndex()
135-
.getAnnotations(BASIC_AUTHENTICATION_MARKER);
138+
.getAnnotationsWithRepeatable(BASIC_AUTHENTICATION_MARKER, beanArchiveBuildItem.getIndex());
136139

137140
Map<String, List<AnnotationInstance>> operationsBySpec = getOperationsBySpec(beanArchiveBuildItem);
138141
for (AnnotationInstance authenticationMarker : authenticationMarkers) {
@@ -146,7 +149,11 @@ void produceBasicAuthentication(CombinedIndexBuildItem beanArchiveBuildItem,
146149
beanProducer.produce(SyntheticBeanBuildItem.configure(AuthProvider.class)
147150
.scope(Dependent.class)
148151
.addQualifier()
149-
.annotation(Authentication.class)
152+
.annotation(AuthName.class)
153+
.addValue("name", name)
154+
.done()
155+
.addQualifier()
156+
.annotation(OpenApiSpec.class)
150157
.addValue("openApiSpecId", openApiSpecId)
151158
.done()
152159
.createWith(recorder.recordBasicAuthProvider(
@@ -166,7 +173,7 @@ void produceBearerAuthentication(CombinedIndexBuildItem beanArchiveBuildItem,
166173
AuthenticationRecorder recorder) {
167174

168175
Collection<AnnotationInstance> authenticationMarkers = beanArchiveBuildItem.getIndex()
169-
.getAnnotations(BEARER_AUTHENTICATION_MARKER);
176+
.getAnnotationsWithRepeatable(BEARER_AUTHENTICATION_MARKER, beanArchiveBuildItem.getIndex());
170177

171178
Map<String, List<AnnotationInstance>> operationsBySpec = getOperationsBySpec(beanArchiveBuildItem);
172179
for (AnnotationInstance authenticationMarker : authenticationMarkers) {
@@ -179,7 +186,11 @@ void produceBearerAuthentication(CombinedIndexBuildItem beanArchiveBuildItem,
179186
beanProducer.produce(SyntheticBeanBuildItem.configure(AuthProvider.class)
180187
.scope(Dependent.class)
181188
.addQualifier()
182-
.annotation(Authentication.class)
189+
.annotation(AuthName.class)
190+
.addValue("name", name)
191+
.done()
192+
.addQualifier()
193+
.annotation(OpenApiSpec.class)
183194
.addValue("openApiSpecId", openApiSpecId)
184195
.done()
185196
.createWith(recorder.recordBearerAuthProvider(
@@ -201,7 +212,7 @@ void produceApiKeyAuthentication(CombinedIndexBuildItem beanArchiveBuildItem,
201212
AuthenticationRecorder recorder) {
202213

203214
Collection<AnnotationInstance> authenticationMarkers = beanArchiveBuildItem.getIndex()
204-
.getAnnotations(API_KEY_AUTHENTICATION_MARKER);
215+
.getAnnotationsWithRepeatable(API_KEY_AUTHENTICATION_MARKER, beanArchiveBuildItem.getIndex());
205216
Map<String, List<AnnotationInstance>> operationsBySpec = getOperationsBySpec(beanArchiveBuildItem);
206217
for (AnnotationInstance authenticationMarker : authenticationMarkers) {
207218
String name = authenticationMarker.value("name").asString();
@@ -216,7 +227,11 @@ void produceApiKeyAuthentication(CombinedIndexBuildItem beanArchiveBuildItem,
216227
beanProducer.produce(SyntheticBeanBuildItem.configure(AuthProvider.class)
217228
.scope(Dependent.class)
218229
.addQualifier()
219-
.annotation(Authentication.class)
230+
.annotation(AuthName.class)
231+
.addValue("name", name)
232+
.done()
233+
.addQualifier()
234+
.annotation(OpenApiSpec.class)
220235
.addValue("openApiSpecId", openApiSpecId)
221236
.done()
222237
.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)