Skip to content

Commit

Permalink
Fix for exceptionmapper scope
Browse files Browse the repository at this point in the history
  • Loading branch information
FroMage committed Mar 19, 2024
1 parent 4beaef4 commit c97e732
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
import org.jboss.jandex.AnnotationValue;
import org.jboss.jandex.ClassInfo;
import org.jboss.jandex.DotName;
import org.jboss.jandex.IndexView;
import org.jboss.jandex.MethodInfo;
import org.jboss.jandex.Type;
import org.jboss.logging.Logger;
Expand Down Expand Up @@ -78,12 +79,15 @@
import io.quarkiverse.renarde.util.Validation;
import io.quarkus.arc.Unremovable;
import io.quarkus.arc.deployment.AdditionalBeanBuildItem;
import io.quarkus.arc.deployment.AutoAddScopeBuildItem;
import io.quarkus.arc.deployment.AutoAddScopeBuildItem.MatchPredicate;
import io.quarkus.arc.deployment.BeanContainerBuildItem;
import io.quarkus.arc.deployment.BuildTimeConditionBuildItem;
import io.quarkus.arc.deployment.ExcludedTypeBuildItem;
import io.quarkus.arc.deployment.GeneratedBeanBuildItem;
import io.quarkus.arc.deployment.GeneratedBeanGizmoAdaptor;
import io.quarkus.arc.deployment.UnremovableBeanBuildItem;
import io.quarkus.arc.processor.BuiltinScope;
import io.quarkus.bootstrap.classloading.QuarkusClassLoader;
import io.quarkus.bootstrap.workspace.ArtifactSources;
import io.quarkus.bootstrap.workspace.SourceDir;
Expand Down Expand Up @@ -432,7 +436,8 @@ void collectControllers(CombinedIndexBuildItem indexBuildItem,
BuildProducer<BytecodeTransformerBuildItem> bytecodeTransformers,
BuildProducer<GeneratedBeanBuildItem> generatedBeans,
BuildProducer<LoginPageBuildItem> loginPageBuildItem,
BuildProducer<ExecutionModelAnnotationsAllowedBuildItem> executionModelAnnotationsAllowedBuildItems) {
BuildProducer<ExecutionModelAnnotationsAllowedBuildItem> executionModelAnnotationsAllowedBuildItems,
BuildProducer<AutoAddScopeBuildItem> autoAddScopeBuildItems) {
Set<DotName> excludedControllers = new HashSet<>();
for (ExcludedControllerBuildItem excludedControllerBuildItem : excludedControllerBuildItems) {
excludedControllers.add(excludedControllerBuildItem.excludedClass);
Expand Down Expand Up @@ -469,17 +474,21 @@ void collectControllers(CombinedIndexBuildItem indexBuildItem,
annotationTransformerBuildItems.produce(new AnnotationsTransformerBuildItem(
AnnotationsTransformer.builder().appliesTo(Kind.CLASS).transform(ti -> transformController(ti, controllers))));

autoAddScopeBuildItems.produce(AutoAddScopeBuildItem.builder()
.defaultScope(BuiltinScope.REQUEST)
.match(new MatchPredicate() {
@Override
public boolean test(ClassInfo klass, Collection<AnnotationInstance> annotations, IndexView index) {
return !klass.isInterface()
&& !Modifier.isAbstract(klass.flags())
&& controllers.contains(klass.name());
}
}).build());

arcTransformers.produce(new io.quarkus.arc.deployment.AnnotationsTransformerBuildItem(
new io.quarkus.arc.processor.AnnotationsTransformer() {
@Override
public void transform(TransformationContext transformationContext) {
if (transformationContext.isClass()
&& !Modifier.isAbstract(transformationContext.getTarget().asClass().flags())
&& controllers.contains(transformationContext.getTarget().asClass().name())) {
// FIXME: probably don't add a scope annotation if it has one already?
transformationContext.transform().add(ResteasyReactiveDotNames.REQUEST_SCOPED)
.done();
}
if (transformationContext.isMethod()) {
MethodInfo method = transformationContext.getTarget().asMethod();
if (controllers.contains(method.declaringClass().name())
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package io.quarkiverse.renarde.test;

import java.net.URL;

import jakarta.ws.rs.Path;
import jakarta.ws.rs.core.Response;

import org.hamcrest.Matchers;
import org.jboss.resteasy.reactive.server.ServerExceptionMapper;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import io.quarkiverse.renarde.Controller;
import io.quarkus.test.QuarkusUnitTest;
import io.quarkus.test.common.http.TestHTTPResource;
import io.restassured.RestAssured;

public class ExceptionMappers {

@RegisterExtension
static final QuarkusUnitTest config = new QuarkusUnitTest()
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)
.addClasses(MyController.class, MyException.class)
.addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml"));

@TestHTTPResource
URL url;

@Test
public void testExceptionMapper() {
RestAssured
.when()
.get("/exception").then()
.statusCode(200)
.body(Matchers.is("OK"));
}

public static class MyException extends RuntimeException {
}

public static class MyController extends Controller {

@Path("/exception")
public String exception() {
throw new MyException();
}

@ServerExceptionMapper
public Response map(MyException x) {
return Response.ok("OK").build();
}
}
}

0 comments on commit c97e732

Please sign in to comment.