Skip to content

Commit e750fda

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

File tree

14 files changed

+126
-49
lines changed

14 files changed

+126
-49
lines changed

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

Lines changed: 53 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
package io.quarkiverse.openapi.generator.deployment;
22

3-
import java.util.Collection;
4-
import java.util.List;
5-
import java.util.Map;
6-
import java.util.stream.Collectors;
7-
8-
import jakarta.enterprise.context.Dependent;
9-
import jakarta.enterprise.inject.Instance;
10-
11-
import org.jboss.jandex.AnnotationInstance;
12-
import org.jboss.jandex.ClassType;
13-
import org.jboss.jandex.DotName;
14-
import org.jboss.jandex.ParameterizedType;
15-
16-
import io.quarkiverse.openapi.generator.*;
17-
import io.quarkiverse.openapi.generator.markers.*;
18-
import io.quarkiverse.openapi.generator.providers.*;
3+
import io.quarkiverse.openapi.generator.AuthName;
4+
import io.quarkiverse.openapi.generator.AuthenticationRecorder;
5+
import io.quarkiverse.openapi.generator.ClassicOidcClientRequestFilterDelegate;
6+
import io.quarkiverse.openapi.generator.OidcClient;
7+
import io.quarkiverse.openapi.generator.OpenApiGeneratorConfig;
8+
import io.quarkiverse.openapi.generator.OpenApiSpec;
9+
import io.quarkiverse.openapi.generator.ReactiveOidcClientRequestFilterDelegate;
10+
import io.quarkiverse.openapi.generator.markers.ApiKeyAuthenticationMarker;
11+
import io.quarkiverse.openapi.generator.markers.BasicAuthenticationMarker;
12+
import io.quarkiverse.openapi.generator.markers.BearerAuthenticationMarker;
13+
import io.quarkiverse.openapi.generator.markers.OauthAuthenticationMarker;
14+
import io.quarkiverse.openapi.generator.markers.OperationMarker;
15+
import io.quarkiverse.openapi.generator.providers.ApiKeyIn;
16+
import io.quarkiverse.openapi.generator.providers.AuthProvider;
17+
import io.quarkiverse.openapi.generator.providers.CompositeAuthenticationProvider;
1918
import io.quarkiverse.openapi.generator.providers.OAuth2AuthenticationProvider.OidcClientRequestFilterDelegate;
19+
import io.quarkiverse.openapi.generator.providers.OperationAuthInfo;
2020
import io.quarkus.arc.deployment.AdditionalBeanBuildItem;
2121
import io.quarkus.arc.deployment.SyntheticBeanBuildItem;
2222
import io.quarkus.deployment.Capabilities;
@@ -27,6 +27,17 @@
2727
import io.quarkus.deployment.annotations.Record;
2828
import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
2929
import io.quarkus.deployment.builditem.FeatureBuildItem;
30+
import jakarta.enterprise.context.Dependent;
31+
import jakarta.enterprise.inject.Instance;
32+
import org.jboss.jandex.AnnotationInstance;
33+
import org.jboss.jandex.ClassType;
34+
import org.jboss.jandex.DotName;
35+
import org.jboss.jandex.ParameterizedType;
36+
37+
import java.util.Collection;
38+
import java.util.List;
39+
import java.util.Map;
40+
import java.util.stream.Collectors;
3041

3142
public class GeneratorProcessor {
3243

@@ -74,12 +85,12 @@ void produceCompositeProviders(AuthenticationRecorder recorder,
7485
beanProducer.produce(SyntheticBeanBuildItem.configure(CompositeAuthenticationProvider.class)
7586
.scope(Dependent.class)
7687
.addQualifier()
77-
.annotation(Authentication.class)
88+
.annotation(OpenApiSpec.class)
7889
.addValue("openApiSpecId", openApiSpecId)
7990
.done()
8091
.addInjectionPoint(
8192
ParameterizedType.create(Instance.class, ClassType.create(AuthProvider.class)),
82-
AnnotationInstance.builder(Authentication.class)
93+
AnnotationInstance.builder(OpenApiSpec.class)
8394
.add("openApiSpecId", openApiSpecId)
8495
.build())
8596
.createWith(recorder.recordCompositeProvider(openApiSpecId))
@@ -91,12 +102,11 @@ void produceCompositeProviders(AuthenticationRecorder recorder,
91102
@BuildStep
92103
@Record(ExecutionTime.STATIC_INIT)
93104
void produceOauthAuthentication(CombinedIndexBuildItem beanArchiveBuildItem,
94-
Capabilities capabilities,
95105
BuildProducer<AuthProviderBuildItem> authenticationProviders,
96106
BuildProducer<SyntheticBeanBuildItem> beanProducer,
97107
AuthenticationRecorder recorder) {
98108
Collection<AnnotationInstance> authenticationMarkers = beanArchiveBuildItem.getIndex()
99-
.getAnnotations(OAUTH_AUTHENTICATION_MARKER);
109+
.getAnnotationsWithRepeatable(OAUTH_AUTHENTICATION_MARKER, beanArchiveBuildItem.getIndex());
100110

101111
Map<String, List<AnnotationInstance>> operationsBySpec = getOperationsBySpec(beanArchiveBuildItem);
102112

@@ -108,7 +118,11 @@ void produceOauthAuthentication(CombinedIndexBuildItem beanArchiveBuildItem,
108118
beanProducer.produce(SyntheticBeanBuildItem.configure(AuthProvider.class)
109119
.scope(Dependent.class)
110120
.addQualifier()
111-
.annotation(Authentication.class)
121+
.annotation(AuthName.class)
122+
.addValue("name", name)
123+
.done()
124+
.addQualifier()
125+
.annotation(OpenApiSpec.class)
112126
.addValue("openApiSpecId", openApiSpecId)
113127
.done()
114128
.addInjectionPoint(ClassType.create(OidcClientRequestFilterDelegate.class),
@@ -132,7 +146,7 @@ void produceBasicAuthentication(CombinedIndexBuildItem beanArchiveBuildItem,
132146
AuthenticationRecorder recorder) {
133147

134148
Collection<AnnotationInstance> authenticationMarkers = beanArchiveBuildItem.getIndex()
135-
.getAnnotations(BASIC_AUTHENTICATION_MARKER);
149+
.getAnnotationsWithRepeatable(BASIC_AUTHENTICATION_MARKER, beanArchiveBuildItem.getIndex());
136150

137151
Map<String, List<AnnotationInstance>> operationsBySpec = getOperationsBySpec(beanArchiveBuildItem);
138152
for (AnnotationInstance authenticationMarker : authenticationMarkers) {
@@ -146,7 +160,11 @@ void produceBasicAuthentication(CombinedIndexBuildItem beanArchiveBuildItem,
146160
beanProducer.produce(SyntheticBeanBuildItem.configure(AuthProvider.class)
147161
.scope(Dependent.class)
148162
.addQualifier()
149-
.annotation(Authentication.class)
163+
.annotation(AuthName.class)
164+
.addValue("name", name)
165+
.done()
166+
.addQualifier()
167+
.annotation(OpenApiSpec.class)
150168
.addValue("openApiSpecId", openApiSpecId)
151169
.done()
152170
.createWith(recorder.recordBasicAuthProvider(
@@ -166,7 +184,7 @@ void produceBearerAuthentication(CombinedIndexBuildItem beanArchiveBuildItem,
166184
AuthenticationRecorder recorder) {
167185

168186
Collection<AnnotationInstance> authenticationMarkers = beanArchiveBuildItem.getIndex()
169-
.getAnnotations(BEARER_AUTHENTICATION_MARKER);
187+
.getAnnotationsWithRepeatable(BEARER_AUTHENTICATION_MARKER, beanArchiveBuildItem.getIndex());
170188

171189
Map<String, List<AnnotationInstance>> operationsBySpec = getOperationsBySpec(beanArchiveBuildItem);
172190
for (AnnotationInstance authenticationMarker : authenticationMarkers) {
@@ -179,7 +197,11 @@ void produceBearerAuthentication(CombinedIndexBuildItem beanArchiveBuildItem,
179197
beanProducer.produce(SyntheticBeanBuildItem.configure(AuthProvider.class)
180198
.scope(Dependent.class)
181199
.addQualifier()
182-
.annotation(Authentication.class)
200+
.annotation(AuthName.class)
201+
.addValue("name", name)
202+
.done()
203+
.addQualifier()
204+
.annotation(OpenApiSpec.class)
183205
.addValue("openApiSpecId", openApiSpecId)
184206
.done()
185207
.createWith(recorder.recordBearerAuthProvider(
@@ -201,7 +223,7 @@ void produceApiKeyAuthentication(CombinedIndexBuildItem beanArchiveBuildItem,
201223
AuthenticationRecorder recorder) {
202224

203225
Collection<AnnotationInstance> authenticationMarkers = beanArchiveBuildItem.getIndex()
204-
.getAnnotations(API_KEY_AUTHENTICATION_MARKER);
226+
.getAnnotationsWithRepeatable(API_KEY_AUTHENTICATION_MARKER, beanArchiveBuildItem.getIndex());
205227
Map<String, List<AnnotationInstance>> operationsBySpec = getOperationsBySpec(beanArchiveBuildItem);
206228
for (AnnotationInstance authenticationMarker : authenticationMarkers) {
207229
String name = authenticationMarker.value("name").asString();
@@ -216,7 +238,11 @@ void produceApiKeyAuthentication(CombinedIndexBuildItem beanArchiveBuildItem,
216238
beanProducer.produce(SyntheticBeanBuildItem.configure(AuthProvider.class)
217239
.scope(Dependent.class)
218240
.addQualifier()
219-
.annotation(Authentication.class)
241+
.annotation(AuthName.class)
242+
.addValue("name", name)
243+
.done()
244+
.addQualifier()
245+
.annotation(OpenApiSpec.class)
220246
.addValue("openApiSpecId", openApiSpecId)
221247
.done()
222248
.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)