Skip to content

Commit 25cc0e0

Browse files
authored
Merge pull request #47746 from gsmet/fix-application-class
Honor application class predicate in QuarkusInvokerFactory
2 parents 781efb8 + 396ab2f commit 25cc0e0

File tree

8 files changed

+77
-9
lines changed

8 files changed

+77
-9
lines changed

extensions/resteasy-reactive/rest-common/deployment/src/main/java/io/quarkus/resteasy/reactive/common/deployment/ResteasyReactiveCommonProcessor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,8 @@ JaxRsResourceIndexBuildItem resourceIndex(CombinedIndexBuildItem combinedIndex,
276276
for (GeneratedJaxRsResourceBuildItem generatedJaxRsResource : generatedJaxRsResources) {
277277
indexer.index(new ByteArrayInputStream(generatedJaxRsResource.getData()));
278278
generatedBeansProducer
279-
.produce(new GeneratedBeanBuildItem(generatedJaxRsResource.getName(), generatedJaxRsResource.getData()));
279+
.produce(new GeneratedBeanBuildItem(generatedJaxRsResource.internalName(),
280+
generatedJaxRsResource.getData()));
280281
}
281282
return new JaxRsResourceIndexBuildItem(CompositeIndex.create(combinedIndex.getComputingIndex(), indexer.complete()));
282283
}

extensions/resteasy-reactive/rest-common/spi-deployment/src/main/java/io/quarkus/resteasy/reactive/spi/GeneratedJaxRsResourceBuildItem.java

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,38 @@
88
*/
99
public final class GeneratedJaxRsResourceBuildItem extends MultiBuildItem {
1010

11-
private final String name;
11+
private final String binaryName;
12+
private final String internalName;
1213
private final byte[] data;
1314

1415
public GeneratedJaxRsResourceBuildItem(String name, byte[] data) {
15-
this.name = name;
16+
this.internalName = name.replace('.', '/');
17+
this.binaryName = name.replace('/', '.');
1618
this.data = data;
1719
}
1820

21+
/**
22+
* @return the internal name for this class
23+
*
24+
* @deprecated Use {@link #internalName()} instead.
25+
*/
26+
@Deprecated(since = "3.23", forRemoval = true)
1927
public String getName() {
20-
return name;
28+
return internalName;
29+
}
30+
31+
/**
32+
* {@return the <em>binary name</em> of the class, which is delimited by <code>.</code> characters}
33+
*/
34+
public String binaryName() {
35+
return binaryName;
36+
}
37+
38+
/**
39+
* {@return the <em>internal name</em> of the class, which is delimited by <code>/</code> characters}
40+
*/
41+
public String internalName() {
42+
return internalName;
2143
}
2244

2345
public byte[] getData() {

extensions/resteasy-reactive/rest/deployment/src/main/java/io/quarkus/resteasy/reactive/server/deployment/QuarkusInvokerFactory.java

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

33
import java.lang.reflect.Modifier;
44
import java.util.Arrays;
5+
import java.util.function.Predicate;
56
import java.util.function.Supplier;
67

78
import org.jboss.jandex.ClassInfo;
@@ -22,11 +23,14 @@
2223

2324
public class QuarkusInvokerFactory implements EndpointInvokerFactory {
2425

26+
private final Predicate<String> applicationClassPredicate;
2527
final BuildProducer<GeneratedClassBuildItem> generatedClassBuildItemBuildProducer;
2628
final ResteasyReactiveRecorder recorder;
2729

28-
public QuarkusInvokerFactory(BuildProducer<GeneratedClassBuildItem> generatedClassBuildItemBuildProducer,
30+
public QuarkusInvokerFactory(Predicate<String> applicationClassPredicate,
31+
BuildProducer<GeneratedClassBuildItem> generatedClassBuildItemBuildProducer,
2932
ResteasyReactiveRecorder recorder) {
33+
this.applicationClassPredicate = applicationClassPredicate;
3034
this.generatedClassBuildItemBuildProducer = generatedClassBuildItemBuildProducer;
3135
this.recorder = recorder;
3236
}
@@ -43,7 +47,9 @@ public Supplier<EndpointInvoker> create(ResourceMethod method, ClassInfo current
4347
String baseName = currentClassInfo.name() + "$quarkusrestinvoker$" + method.getName() + "_"
4448
+ HashUtil.sha1(endpointIdentifier);
4549
try (ClassCreator classCreator = new ClassCreator(
46-
new GeneratedClassGizmoAdaptor(generatedClassBuildItemBuildProducer, true), baseName, null,
50+
new GeneratedClassGizmoAdaptor(generatedClassBuildItemBuildProducer,
51+
applicationClassPredicate.test(currentClassInfo.name().toString())),
52+
baseName, null,
4753
Object.class.getName(), EndpointInvoker.class.getName())) {
4854
MethodCreator mc = classCreator.getMethodCreator("invoke", Object.class, Object.class, Object[].class);
4955
ResultHandle[] args = new ResultHandle[method.getParameters().length];

extensions/resteasy-reactive/rest/deployment/src/main/java/io/quarkus/resteasy/reactive/server/deployment/ResteasyReactiveProcessor.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@
204204
import io.quarkus.resteasy.reactive.spi.DynamicFeatureBuildItem;
205205
import io.quarkus.resteasy.reactive.spi.EndpointValidationPredicatesBuildItem;
206206
import io.quarkus.resteasy.reactive.spi.ExceptionMapperBuildItem;
207+
import io.quarkus.resteasy.reactive.spi.GeneratedJaxRsResourceBuildItem;
207208
import io.quarkus.resteasy.reactive.spi.JaxrsFeatureBuildItem;
208209
import io.quarkus.resteasy.reactive.spi.MessageBodyReaderBuildItem;
209210
import io.quarkus.resteasy.reactive.spi.MessageBodyReaderOverrideBuildItem;
@@ -474,7 +475,8 @@ public void setupEndpoints(ApplicationIndexBuildItem applicationIndexBuildItem,
474475
ResourceInterceptorsBuildItem resourceInterceptorsBuildItem,
475476
Capabilities capabilities,
476477
Optional<AllowNotRestParametersBuildItem> allowNotRestParametersBuildItem,
477-
List<EndpointValidationPredicatesBuildItem> validationPredicatesBuildItems) {
478+
List<EndpointValidationPredicatesBuildItem> validationPredicatesBuildItems,
479+
List<GeneratedJaxRsResourceBuildItem> generatedJaxRsResourcesBuildItems) {
478480

479481
if (!resourceScanningResultBuildItem.isPresent()) {
480482
// no detected @Path, bail out
@@ -512,13 +514,18 @@ public void setupEndpoints(ApplicationIndexBuildItem applicationIndexBuildItem,
512514

513515
List<ResteasyReactiveResourceMethodEntriesBuildItem.Entry> resourceMethodEntries = new ArrayList<>();
514516

517+
// Generated JAX-RS resources are application classes
518+
Set<String> applicationGeneratedJaxRsResources = generatedJaxRsResourcesBuildItems.stream()
519+
.map(r -> r.binaryName())
520+
.collect(Collectors.toSet());
521+
515522
Predicate<String> applicationClassPredicate = s -> {
516523
for (ApplicationClassPredicateBuildItem i : applicationClassPredicateBuildItems) {
517524
if (i.test(s)) {
518525
return true;
519526
}
520527
}
521-
return false;
528+
return applicationGeneratedJaxRsResources.contains(s);
522529
};
523530

524531
final boolean filtersAccessResourceMethod = filtersAccessResourceMethod(
@@ -537,7 +544,8 @@ public void setupEndpoints(ApplicationIndexBuildItem applicationIndexBuildItem,
537544
.addContextTypes(additionalContextTypes(contextTypeBuildItems))
538545
.setFactoryCreator(new QuarkusFactoryCreator(recorder, beanContainerBuildItem.getValue()))
539546
.setEndpointInvokerFactory(
540-
new QuarkusInvokerFactory(generatedClassBuildItemBuildProducer, recorder))
547+
new QuarkusInvokerFactory(applicationClassPredicate, generatedClassBuildItemBuildProducer,
548+
recorder))
541549
.setGeneratedClassBuildItemBuildProducer(generatedClassBuildItemBuildProducer)
542550
.setExistingConverters(existingConverters)
543551
.setScannedResourcePaths(scannedResourcePaths)

integration-tests/maven/src/test/java/io/quarkus/maven/it/DevMojoIT.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1701,6 +1701,7 @@ public void testResteasyReactiveExternalArtifact() throws Exception {
17011701

17021702
Assertions.assertEquals("Quarkus", devModeClient.getHttpResponse("/hello/Quarkus"));
17031703
Assertions.assertEquals("OK", devModeClient.getHttpResponse("/hello/parameterized-type-external"));
1704+
Assertions.assertEquals("Hello from Quarkus REST", devModeClient.getHttpResponse("/greet"));
17041705
}
17051706

17061707
@Test
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
!lib

integration-tests/maven/src/test/resources-filtered/projects/rr-external-artifacts/external-lib/pom.xml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,19 @@
5252
<artifactId>maven-jar-plugin</artifactId>
5353
<version>\${maven.jar.plugin.version}</version>
5454
</plugin>
55+
<plugin>
56+
<groupId>io.smallrye</groupId>
57+
<artifactId>jandex-maven-plugin</artifactId>
58+
<version>${jandex.version}</version>
59+
<executions>
60+
<execution>
61+
<id>make-index</id>
62+
<goals>
63+
<goal>jandex</goal>
64+
</goals>
65+
</execution>
66+
</executions>
67+
</plugin>
5568
</plugins>
5669
</build>
5770
</project>
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package org.acme.lib;
2+
3+
import jakarta.ws.rs.GET;
4+
import jakarta.ws.rs.Path;
5+
import jakarta.ws.rs.Produces;
6+
import jakarta.ws.rs.core.MediaType;
7+
8+
@Path("/greet")
9+
class GreetingResource {
10+
11+
@GET
12+
@Produces(MediaType.TEXT_PLAIN)
13+
public String greet() {
14+
return "Hello from Quarkus REST";
15+
}
16+
}

0 commit comments

Comments
 (0)