diff --git a/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/DeploymentInfo.java b/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/DeploymentInfo.java index 0938d9c0be280..2d77b754d7f8f 100644 --- a/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/DeploymentInfo.java +++ b/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/DeploymentInfo.java @@ -159,7 +159,7 @@ public DeploymentInfo setApplicationPath(String applicationPath) { return this; } - public List getGlobalHandlerCustomers() { + public List getGlobalHandlerCustomizers() { return globalHandlerCustomers; } diff --git a/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/startup/RuntimeDeploymentManager.java b/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/startup/RuntimeDeploymentManager.java index 403d8d879bfcd..27279da12bf2b 100644 --- a/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/startup/RuntimeDeploymentManager.java +++ b/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/startup/RuntimeDeploymentManager.java @@ -180,8 +180,9 @@ public BeanFactory.BeanInstance apply(Class aClass) { //pre matching interceptors are run first List preMatchHandlers = new ArrayList<>(); - for (HandlerChainCustomizer customizer : info.getGlobalHandlerCustomers()) { - preMatchHandlers.addAll(customizer.handlers(HandlerChainCustomizer.Phase.BEFORE_PRE_MATCH)); + for (int i = 0; i < info.getGlobalHandlerCustomizers().size(); i++) { + preMatchHandlers + .addAll(info.getGlobalHandlerCustomizers().get(i).handlers(HandlerChainCustomizer.Phase.BEFORE_PRE_MATCH)); } if (!interceptors.getContainerRequestFilters().getPreMatchInterceptors().isEmpty()) { preMatchHandlers = new ArrayList<>(interceptorDeployment.getPreMatchContainerRequestFilters().size()); @@ -190,16 +191,15 @@ public BeanFactory.BeanInstance apply(Class aClass) { preMatchHandlers.add(new ResourceRequestFilterHandler(containerRequestFilter, true)); } } - for (HandlerChainCustomizer customizer : info.getGlobalHandlerCustomers()) { - preMatchHandlers.addAll(customizer.handlers(HandlerChainCustomizer.Phase.AFTER_PRE_MATCH)); + for (int i = 0; i < info.getGlobalHandlerCustomizers().size(); i++) { + preMatchHandlers + .addAll(info.getGlobalHandlerCustomizers().get(i).handlers(HandlerChainCustomizer.Phase.AFTER_PRE_MATCH)); } - Deployment deployment = new Deployment(exceptionMapping, info.getCtxResolvers(), serialisers, + return new Deployment(exceptionMapping, info.getCtxResolvers(), serialisers, abortHandlingChain.toArray(EMPTY_REST_HANDLER_ARRAY), dynamicEntityWriter, prefix, paramConverterProviders, configurationImpl, applicationSupplier, threadSetupAction, requestContextFactory, preMatchHandlers, classMappers); - - return deployment; } //TODO: this needs plenty more work to support all possible types and provide all information the FeatureContext allows diff --git a/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/startup/RuntimeMappingDeployment.java b/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/startup/RuntimeMappingDeployment.java index 17b43fe71cd01..fd23c10477c34 100644 --- a/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/startup/RuntimeMappingDeployment.java +++ b/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/startup/RuntimeMappingDeployment.java @@ -37,13 +37,14 @@ public static Map> buildClassMapper( //now we have all our possible resources List> result = new ArrayList<>(); for (Map.Entry>> entry : i.getValue().entrySet()) { - if (entry.getValue().size() == 1) { + List> requestPaths = entry.getValue(); + if (requestPaths.size() == 1) { //simple case, only one match - result.addAll(entry.getValue()); + result.addAll(requestPaths); } else { - List resources = new ArrayList<>(); - for (RequestMapper.RequestPath val : entry.getValue()) { - resources.add(val.value); + List resources = new ArrayList<>(requestPaths.size()); + for (int j = 0; j < requestPaths.size(); j++) { + resources.add(requestPaths.get(j).value); } MediaTypeMapper mapper = new MediaTypeMapper(resources); //now we just create a fake RuntimeResource diff --git a/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/startup/RuntimeResourceDeployment.java b/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/startup/RuntimeResourceDeployment.java index 9eea8378dbf83..ddb7bdf0871b3 100644 --- a/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/startup/RuntimeResourceDeployment.java +++ b/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/startup/RuntimeResourceDeployment.java @@ -112,7 +112,6 @@ public RuntimeResourceDeployment(DeploymentInfo info, Supplier executo public RuntimeResource buildResourceMethod(ResourceClass clazz, ServerResourceMethod method, boolean locatableResource, URITemplate classPathTemplate, DeploymentInfo info) { URITemplate methodPathTemplate = new URITemplate(method.getPath(), false); - List abortHandlingChain = new ArrayList<>(); MultivaluedMap score = new QuarkusMultivaluedHashMap<>(); Map pathParameterIndexes = buildParamIndexMap(classPathTemplate, methodPathTemplate); @@ -147,7 +146,7 @@ public RuntimeResource buildResourceMethod(ResourceClass clazz, handlers.addAll(interceptorDeployment.setupInterceptorHandler()); //at this point the handler chain only has interceptors //which we also want in the abort handler chain - abortHandlingChain.addAll(handlers); + List abortHandlingChain = new ArrayList<>(handlers); // when a method is blocking, we also want all the request filters to run on the worker thread // because they can potentially set thread local variables @@ -158,7 +157,7 @@ public RuntimeResource buildResourceMethod(ResourceClass clazz, score.add(ScoreSystem.Category.Execution, ScoreSystem.Diagnostic.ExecutionNonBlocking); } - //spec doesn't seem to test this, but RESTEeasy does not run request filters again for sub resources (which makes sense) + //spec doesn't seem to test this, but RESTEasy does not run request filters again for sub resources (which makes sense) if (!locatableResource) { handlers.addAll(interceptorDeployment.setupRequestFilterHandler()); } @@ -189,7 +188,7 @@ public RuntimeResource buildResourceMethod(ResourceClass clazz, handlers.add(new InputHandler(quarkusRestConfig.getInputBufferSize(), executorSupplier)); } } - // if we need the body, let's deserialise it + // if we need the body, let's deserialize it if (bodyParameter != null) { Class typeClass = loadClass(bodyParameter.declaredType); Type genericType = typeClass; @@ -333,13 +332,13 @@ public RuntimeResource buildResourceMethod(ResourceClass clazz, //the response filter handlers, they need to be added to both the abort and //normal chains. At the moment this only has one handler added to it but //in future there will be one per filter - List responseFilterHandlers = new ArrayList<>(); + List responseFilterHandlers; if (method.isSse()) { handlers.add(new SseResponseWriterHandler()); + responseFilterHandlers = Collections.emptyList(); } else { handlers.add(new ResponseHandler()); - - responseFilterHandlers.addAll(interceptorDeployment.setupResponseFilterHandler()); + responseFilterHandlers = new ArrayList<>(interceptorDeployment.setupResponseFilterHandler()); handlers.addAll(responseFilterHandlers); handlers.add(new ResponseWriterHandler(dynamicEntityWriter)); } @@ -355,7 +354,7 @@ public RuntimeResource buildResourceMethod(ResourceClass clazz, abortHandlingChain.add(new ResponseWriterHandler(dynamicEntityWriter)); handlers.add(0, new AbortChainHandler(abortHandlingChain.toArray(EMPTY_REST_HANDLER_ARRAY))); - RuntimeResource runtimeResource = new RuntimeResource(method.getHttpMethod(), methodPathTemplate, + return new RuntimeResource(method.getHttpMethod(), methodPathTemplate, classPathTemplate, method.getProduces() == null ? null : serverMediaType, consumesMediaTypes, invoker, @@ -363,16 +362,15 @@ public RuntimeResource buildResourceMethod(ResourceClass clazz, nonAsyncReturnType, method.isBlocking(), resourceClass, lazyMethod, pathParameterIndexes, score, sseElementType, clazz.resourceExceptionMapper()); - return runtimeResource; } private void addHandlers(List handlers, ServerResourceMethod method, DeploymentInfo info, HandlerChainCustomizer.Phase phase) { - for (HandlerChainCustomizer i : info.getGlobalHandlerCustomers()) { - handlers.addAll(i.handlers(phase)); + for (int i = 0; i < info.getGlobalHandlerCustomizers().size(); i++) { + handlers.addAll(info.getGlobalHandlerCustomizers().get(i).handlers(phase)); } - for (HandlerChainCustomizer i : method.getHandlerChainCustomizers()) { - handlers.addAll(i.handlers(phase)); + for (int i = 0; i < method.getHandlerChainCustomizers().size(); i++) { + handlers.addAll(method.getHandlerChainCustomizers().get(i).handlers(phase)); } }