This is an automated email from the ASF dual-hosted git repository. acosentino pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/master by this push: new 9001350 camel-servlet - Restore missing source snippets in doc (#2553) 9001350 is described below commit 9001350772361fc201be5aea909bbd5b65f46293 Author: Tadayoshi Sato <sato.tadayo...@gmail.com> AuthorDate: Fri Oct 5 18:21:20 2018 +0900 camel-servlet - Restore missing source snippets in doc (#2553) --- .../src/main/docs/servlet-component.adoc | 247 ++++++++++++++++++--- 1 file changed, 218 insertions(+), 29 deletions(-) diff --git a/components/camel-servlet/src/main/docs/servlet-component.adoc b/components/camel-servlet/src/main/docs/servlet-component.adoc index a22025d..04ef4d3 100644 --- a/components/camel-servlet/src/main/docs/servlet-component.adoc +++ b/components/camel-servlet/src/main/docs/servlet-component.adoc @@ -226,22 +226,66 @@ Spring web applications. See link:servlet-tomcat-example.html[Servlet Tomcat Example] for details. In this sample, we define a route that exposes a HTTP service at -http://localhost:8080/camel/services/hello. + - First, you need to publish the -http://svn.apache.org/repos/asf/camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/CamelHttpTransportServlet.java[CamelHttpTransportServlet] -through the normal Web Container, or OSGi Service. + - Use the `Web.xml` file to publish the -http://svn.apache.org/repos/asf/camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/CamelHttpTransportServlet.java[CamelHttpTransportServlet] +http://localhost:8080/camel/services/hello. + +First, you need to publish the +https://github.com/apache/camel/blob/master/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/CamelHttpTransportServlet.java[CamelHttpTransportServlet] +through the normal Web Container, or OSGi Service. Use the `Web.xml` file to publish the +https://github.com/apache/camel/blob/master/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/CamelHttpTransportServlet.java[CamelHttpTransportServlet] as follows: +[source,xml] +------------------------------------------------------------------------- +<web-app> + + <servlet> + <servlet-name>CamelServlet</servlet-name> + <display-name>Camel Http Transport Servlet</display-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> +------------------------------------------------------------------------- + + Then you can define your route as follows: -NOTE: *Specify the relative path for camel-servlet endpoint* -Since we are binding the Http transport with a published servlet, and we +[source,java] +------------------------------------------------------------------------- +from("servlet:hello?matchOnUriPrefix=true").process(new Processor() { + public void process(Exchange exchange) throws Exception { + String contentType = exchange.getIn().getHeader(Exchange.CONTENT_TYPE, String.class); + String path = exchange.getIn().getHeader(Exchange.HTTP_URI, String.class); + path = path.substring(path.lastIndexOf("/")); + + assertEquals("Get a wrong content type", CONTENT_TYPE, contentType); + // assert camel http header + String charsetEncoding = exchange.getIn().getHeader(Exchange.HTTP_CHARACTER_ENCODING, String.class); + assertEquals("Get a wrong charset name from the message heaer", "UTF-8", charsetEncoding); + // assert exchange charset + assertEquals("Get a wrong charset naem from the exchange property", "UTF-8", exchange.getProperty(Exchange.CHARSET_NAME)); + exchange.getOut().setHeader(Exchange.CONTENT_TYPE, contentType + "; charset=UTF-8"); + exchange.getOut().setHeader("PATH", path); + exchange.getOut().setBody("<b>Hello World</b>"); + } +}); +------------------------------------------------------------------------- + +[NOTE] +==== +*Specify the relative path for camel-servlet endpoint* + +Since we are binding the HTTP transport with a published servlet, and we don't know the servlet's application context path, the `camel-servlet` endpoint uses the relative path to specify the endpoint's URL. A client can access the `camel-servlet` endpoint through the servlet publish -address: `("http://localhost:8080/camel/services") + RELATIVE_PATH("/hello")`. +address: `("http://localhost:8080/camel/services") + RELATIVE_PATH("/hello")` +==== ==== Sample when using Spring 3.x @@ -254,42 +298,187 @@ often required to load the Spring ApplicationContext _after_ the Servlet component has started. This can be accomplished by using Spring's `ContextLoaderServlet` instead of `ContextLoaderListener`. In that case you'll need to start `ContextLoaderServlet` after -http://svn.apache.org/repos/asf/camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/CamelHttpTransportServlet.java[CamelHttpTransportServlet] +https://github.com/apache/camel/blob/master/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/CamelHttpTransportServlet.java[CamelHttpTransportServlet] like this: [source,xml] ------------------------------------------------------------------------- - <web-app> - <servlet> - <servlet-name>CamelServlet</servlet-name> - <servlet-class> - org.apache.camel.component.servlet.CamelHttpTransportServlet - </servlet-class> - <load-on-startup>1</load-on-startup> - </servlet> - <servlet> - <servlet-name>SpringApplicationContext</servlet-name> - <servlet-class> - org.springframework.web.context.ContextLoaderServlet - </servlet-class> - <load-on-startup>2</load-on-startup> - </servlet> + <servlet> + <servlet-name>CamelServlet</servlet-name> + <servlet-class> + org.apache.camel.component.servlet.CamelHttpTransportServlet + </servlet-class> + <load-on-startup>1</load-on-startup> + </servlet> + <servlet> + <servlet-name>SpringApplicationContext</servlet-name> + <servlet-class> + org.springframework.web.context.ContextLoaderServlet + </servlet-class> + <load-on-startup>2</load-on-startup> + </servlet> <web-app> ------------------------------------------------------------------------- ==== Sample when using OSGi From *Camel 2.6.0*, you can publish the -http://svn.apache.org/repos/asf/camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/CamelHttpTransportServlet.java[CamelHttpTransportServlet] -as an OSGi service with help of SpringDM like this. +https://github.com/apache/camel/blob/master/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/CamelHttpTransportServlet.java[CamelHttpTransportServlet] +as an OSGi service with help of SpringDM like this: + +[source,xml] +------------------------------------------------------------------------- +<beans xmlns="http://www.springframework.org/schema/beans" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:osgi="http://www.springframework.org/schema/osgi" + xsi:schemaLocation=" + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd"> + + <bean id="camelServlet" class="org.apache.camel.component.servlet.CamelHttpTransportServlet"> + </bean> + + <!-- + Enlist it in OSGi service registry + This will cause two things: + 1) As the pax web whiteboard extender is running the CamelServlet will + be registered with the OSGi HTTP Service + 2) It will trigger the HttpRegistry in other bundles so the servlet is + made known there too + --> + <osgi:service ref="camelServlet"> + <osgi:interfaces> + <value>javax.servlet.Servlet</value> + <value>org.apache.camel.component.http.CamelServlet</value> + </osgi:interfaces> + <osgi:service-properties> + <entry key="alias" value="/camel/services" /> + <entry key="matchOnUriPrefix" value="true" /> + <entry key="servlet-name" value="CamelServlet"/> + </osgi:service-properties> + </osgi:service> + +</beans> +------------------------------------------------------------------------- Then use this service in your camel route like this: +[source,xml] +------------------------------------------------------------------------- +<beans xmlns="http://www.springframework.org/schema/beans" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:camel="http://camel.apache.org/schema/spring" + xmlns:osgi="http://www.springframework.org/schema/osgi" + xsi:schemaLocation=" + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd + http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> + + <osgi:reference id="servletref" interface="org.apache.camel.component.http.CamelServlet"> + <osgi:listener bind-method="register" unbind-method="unregister"> + <ref bean="httpRegistry"/> + </osgi:listener> + </osgi:reference> + + <bean id="httpRegistry" class="org.apache.camel.component.servlet.DefaultHttpRegistry"/> + + <bean id="servlet" class="org.apache.camel.component.servlet.ServletComponent"> + <property name="httpRegistry" ref="httpRegistry" /> + </bean> + + <bean id="servletProcessor" class="org.apache.camel.itest.osgi.servlet.ServletProcessor" /> + + <camelContext xmlns="http://camel.apache.org/schema/spring"> + <route> + <!-- notice how we can use the servlet scheme which is that osgi:reference above --> + <from uri="servlet:///hello"/> + <process ref="servletProcessor"/> + </route> + </camelContext> + +</beans> +------------------------------------------------------------------------- + For versions prior to Camel 2.6 you can use an `Activator` to publish the -http://svn.apache.org/repos/asf/camel/trunk/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/CamelHttpTransportServlet.java[CamelHttpTransportServlet] -on the OSGi platform +https://github.com/apache/camel/blob/master/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/CamelHttpTransportServlet.java[CamelHttpTransportServlet] +on the OSGi platform: + +[source,java] +------------------------------------------------------------------------- +import java.util.Dictionary; +import java.util.Hashtable; + +import org.apache.camel.component.servlet.CamelHttpTransportServlet; +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceReference; +import org.osgi.service.http.HttpContext; +import org.osgi.service.http.HttpService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.osgi.context.BundleContextAware; + +public final class ServletActivator implements BundleActivator, BundleContextAware { + private static final Logger LOG = LoggerFactory.getLogger(ServletActivator.class); + private static boolean registerService; + + /** + * HttpService reference. + */ + private ServiceReference<?> httpServiceRef; + + /** + * Called when the OSGi framework starts our bundle + */ + public void start(BundleContext bc) throws Exception { + registerServlet(bc); + } + + /** + * Called when the OSGi framework stops our bundle + */ + public void stop(BundleContext bc) throws Exception { + if (httpServiceRef != null) { + bc.ungetService(httpServiceRef); + httpServiceRef = null; + } + } + + protected void registerServlet(BundleContext bundleContext) throws Exception { + httpServiceRef = bundleContext.getServiceReference(HttpService.class.getName()); + + if (httpServiceRef != null && !registerService) { + LOG.info("Register the servlet service"); + final HttpService httpService = (HttpService)bundleContext.getService(httpServiceRef); + if (httpService != null) { + // create a default context to share between registrations + final HttpContext httpContext = httpService.createDefaultHttpContext(); + // register the hello world servlet + final Dictionary<String, String> initParams = new Hashtable<String, String>(); + initParams.put("matchOnUriPrefix", "false"); + initParams.put("servlet-name", "CamelServlet"); + httpService.registerServlet("/camel/services", // alias + new CamelHttpTransportServlet(), // register servlet + initParams, // init params + httpContext // http context + ); + registerService = true; + } + } + } + + public void setBundleContext(BundleContext bc) { + try { + registerServlet(bc); + } catch (Exception e) { + LOG.error("Cannot register the servlet, the reason is " + e); + } + } + +} +------------------------------------------------------------------------- ==== Usage with Spring-Boot