You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ac...@apache.org on 2018/10/05 09:21:32 UTC

[camel] branch master updated: camel-servlet - Restore missing source snippets in doc (#2553)

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 <sa...@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