This is an automated email from the ASF dual-hosted git repository. jamesnetherton pushed a commit to branch 3.8.x in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
commit 4f95132e32305e0d0877a59f39ffc9e0b8eeddd2 Author: James Netherton <jamesnether...@gmail.com> AuthorDate: Mon Mar 4 15:54:57 2024 +0000 Enable web.xml to be used to configure CamelHttpTransportServlet for the servlet extension Fixes #5835 --- .../ROOT/pages/reference/extensions/servlet.adoc | 37 ++++++++++++ .../servlet/deployment/ServletProcessor.java | 14 ++++- .../component/servlet/test/WebXmlServletTest.java | 65 ++++++++++++++++++++++ extensions/servlet/runtime/src/main/doc/usage.adoc | 37 ++++++++++++ 4 files changed, 152 insertions(+), 1 deletion(-) diff --git a/docs/modules/ROOT/pages/reference/extensions/servlet.adoc b/docs/modules/ROOT/pages/reference/extensions/servlet.adoc index 848ac1299c..39fca43e78 100644 --- a/docs/modules/ROOT/pages/reference/extensions/servlet.adoc +++ b/docs/modules/ROOT/pages/reference/extensions/servlet.adoc @@ -117,6 +117,43 @@ from("servlet://goodbye?servletName=my-custom-b") .setBody().constant("Goodbye World"); ---- +*Finer control of Servlet configuration* + +If you need more control of the Servlet configuration, for example to configure custom init parameters, +then you can do this with a custom Servlet class through the `jakarta.servlet.annotation.WebServlet` annotation options. + +[source,java] +---- +import jakarta.servlet.annotation.WebServlet; +import org.apache.camel.component.servlet.CamelHttpTransportServlet; + +@WebServlet( + urlPatterns = {"/*"}, + initParams = { + @WebInitParam(name = "myParam", value = "myValue") + } +) +public class MyCustomServlet extends CamelHttpTransportServlet { +} +---- + +Or you can configure the `CamelHttpTransportServlet` using a `web-app` descriptor placed into `src/main/resources/META-INF/web.xml`. + +[source,xml] +---- +<web-app> + <servlet> + <servlet-name>CamelServlet</servlet-name> + <servlet-class>org.apache.camel.component.servlet.CamelHttpTransportServlet</servlet-class> + </servlet> + + <servlet-mapping> + <servlet-name>CamelServlet</servlet-name> + <url-pattern>/services/*</url-pattern> + </servlet-mapping> +</web-app> +---- + [id="extensions-servlet-transferexception-option-in-native-mode"] == transferException option in native mode diff --git a/extensions/servlet/deployment/src/main/java/org/apache/camel/quarkus/component/servlet/deployment/ServletProcessor.java b/extensions/servlet/deployment/src/main/java/org/apache/camel/quarkus/component/servlet/deployment/ServletProcessor.java index 6afaf14202..a7ab69969f 100644 --- a/extensions/servlet/deployment/src/main/java/org/apache/camel/quarkus/component/servlet/deployment/ServletProcessor.java +++ b/extensions/servlet/deployment/src/main/java/org/apache/camel/quarkus/component/servlet/deployment/ServletProcessor.java @@ -25,10 +25,14 @@ import io.quarkus.deployment.annotations.BuildStep; import io.quarkus.deployment.builditem.FeatureBuildItem; import io.quarkus.undertow.deployment.ServletBuildItem; import io.quarkus.undertow.deployment.ServletBuildItem.Builder; +import io.quarkus.undertow.deployment.WebMetadataBuildItem; import jakarta.servlet.MultipartConfigElement; import org.apache.camel.quarkus.servlet.runtime.CamelServletConfig; import org.apache.camel.quarkus.servlet.runtime.CamelServletConfig.ServletConfig; import org.apache.camel.quarkus.servlet.runtime.CamelServletConfig.ServletConfig.MultipartConfig; +import org.jboss.metadata.web.spec.WebMetaData; + +import static org.apache.camel.quarkus.servlet.runtime.CamelServletConfig.ServletConfig.DEFAULT_SERVLET_CLASS; class ServletProcessor { private static final String FEATURE = "camel-servlet"; @@ -41,8 +45,16 @@ class ServletProcessor { } @BuildStep - void build(BuildProducer<ServletBuildItem> servlet) { + void build(BuildProducer<ServletBuildItem> servlet, WebMetadataBuildItem webMetadata) { boolean servletCreated = false; + + WebMetaData metaData = webMetadata.getWebMetaData(); + if (metaData != null && metaData.getServlets() != null) { + servletCreated = metaData.getServlets() + .stream() + .anyMatch(meta -> meta.getServletClass().equals(DEFAULT_SERVLET_CLASS)); + } + if (camelServletConfig.defaultServlet.isValid()) { servlet.produce( newServlet(ServletConfig.DEFAULT_SERVLET_NAME, camelServletConfig.defaultServlet)); diff --git a/extensions/servlet/deployment/src/test/java/org/apache/camel/quarkus/component/servlet/test/WebXmlServletTest.java b/extensions/servlet/deployment/src/test/java/org/apache/camel/quarkus/component/servlet/test/WebXmlServletTest.java new file mode 100644 index 0000000000..1c39eb7954 --- /dev/null +++ b/extensions/servlet/deployment/src/test/java/org/apache/camel/quarkus/component/servlet/test/WebXmlServletTest.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.quarkus.component.servlet.test; + +import io.quarkus.test.QuarkusUnitTest; +import io.restassured.RestAssured; +import org.apache.camel.builder.RouteBuilder; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.asset.StringAsset; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import static org.hamcrest.Matchers.equalTo; + +public class WebXmlServletTest { + static final String WEB_XML = """ + <web-app> + <servlet> + <servlet-name>my-servlet</servlet-name> + <servlet-class>org.apache.camel.component.servlet.CamelHttpTransportServlet</servlet-class> + <load-on-startup>1</load-on-startup> + </servlet> + + <servlet-mapping> + <servlet-name>my-servlet</servlet-name> + <url-pattern>/*</url-pattern> + </servlet-mapping> + </web-app> + """; + static final String MESSAGE = "This servlet was configured from web.xml"; + + @RegisterExtension + static final QuarkusUnitTest CONFIG = new QuarkusUnitTest() + .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class) + .addAsResource(new StringAsset(WEB_XML), "META-INF/web.xml")); + + @Test + public void noDefaultServlet() throws Exception { + RestAssured.when().get("/web/xml").then() + .body(equalTo(MESSAGE)); + } + + public static final class Routes extends RouteBuilder { + @Override + public void configure() { + from("servlet://web/xml?servletName=my-servlet") + .setBody(constant(MESSAGE)); + } + } +} diff --git a/extensions/servlet/runtime/src/main/doc/usage.adoc b/extensions/servlet/runtime/src/main/doc/usage.adoc index 7ad44a268c..6124e06f72 100644 --- a/extensions/servlet/runtime/src/main/doc/usage.adoc +++ b/extensions/servlet/runtime/src/main/doc/usage.adoc @@ -64,3 +64,40 @@ from("servlet://greet?servletName=my-custom-a") from("servlet://goodbye?servletName=my-custom-b") .setBody().constant("Goodbye World"); ---- + +*Finer control of Servlet configuration* + +If you need more control of the Servlet configuration, for example to configure custom init parameters, +then you can do this with a custom Servlet class through the `jakarta.servlet.annotation.WebServlet` annotation options. + +[source,java] +---- +import jakarta.servlet.annotation.WebServlet; +import org.apache.camel.component.servlet.CamelHttpTransportServlet; + +@WebServlet( + urlPatterns = {"/*"}, + initParams = { + @WebInitParam(name = "myParam", value = "myValue") + } +) +public class MyCustomServlet extends CamelHttpTransportServlet { +} +---- + +Or you can configure the `CamelHttpTransportServlet` using a `web-app` descriptor placed into `src/main/resources/META-INF/web.xml`. + +[source,xml] +---- +<web-app> + <servlet> + <servlet-name>CamelServlet</servlet-name> + <servlet-class>org.apache.camel.component.servlet.CamelHttpTransportServlet</servlet-class> + </servlet> + + <servlet-mapping> + <servlet-name>CamelServlet</servlet-name> + <url-pattern>/services/*</url-pattern> + </servlet-mapping> +</web-app> +----