Modified: websites/production/camel/content/type-converter.html
==============================================================================
--- websites/production/camel/content/type-converter.html (original)
+++ websites/production/camel/content/type-converter.html Fri Aug 25 14:20:21 
2017
@@ -36,17 +36,6 @@
     <![endif]-->
 
 
-  <link href='//camel.apache.org/styles/highlighter/styles/shCoreCamel.css' 
rel='stylesheet' type='text/css' />
-  <link href='//camel.apache.org/styles/highlighter/styles/shThemeCamel.css' 
rel='stylesheet' type='text/css' />
-  <script src='//camel.apache.org/styles/highlighter/scripts/shCore.js' 
type='text/javascript'></script>
-  <script src='//camel.apache.org/styles/highlighter/scripts/shBrushJava.js' 
type='text/javascript'></script>
-  <script src='//camel.apache.org/styles/highlighter/scripts/shBrushXml.js' 
type='text/javascript'></script>
-  <script src='//camel.apache.org/styles/highlighter/scripts/shBrushPlain.js' 
type='text/javascript'></script>
-  
-  <script type="text/javascript">
-  SyntaxHighlighter.defaults['toolbar'] = false;
-  SyntaxHighlighter.all();
-  </script>
 
     <title>
     Apache Camel: Type Converter
@@ -86,66 +75,29 @@
        <tbody>
         <tr>
         <td valign="top" width="100%">
-<div class="wiki-content maincontent"><h2 
id="TypeConverter-TypeConverter">Type Converter</h2><p>Its very common when 
routing messages from one endpoint to another to need to convert the body 
payloads from one type to another such as to convert to and from the following 
common types</p><ul><li>File</li><li>String</li><li>byte[] and 
ByteBuffer</li><li>InputStream and OutputStream</li><li>Reader and 
Writer</li><li>Document and Source</li><li>...</li></ul><p>The <a shape="rect" 
class="external-link" 
href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Message.html";>Message
 interface</a> defines a helper method to allow conversions to be done via the 
<a shape="rect" class="external-link" 
href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Message.html#getBody(java.lang.Class)">getBody(Class)</a>
 method.</p><p>So in an endpoint you can convert a body to another type 
via</p><div class="code panel pdl" style="border-width: 1px;"><div c
 lass="codeContent panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default" 
type="syntaxhighlighter"><![CDATA[Message message = exchange.getIn();
+<div class="wiki-content maincontent"><h2 
id="TypeConverter-TypeConverter">Type Converter</h2><p>Its very common when 
routing messages from one endpoint to another to need to convert the body 
payloads from one type to another such as to convert to and from the following 
common types</p><ul><li>File</li><li>String</li><li>byte[] and 
ByteBuffer</li><li>InputStream and OutputStream</li><li>Reader and 
Writer</li><li>Document and Source</li><li>...</li></ul><p>The <a shape="rect" 
class="external-link" 
href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Message.html";>Message
 interface</a> defines a helper method to allow conversions to be done via the 
<a shape="rect" class="external-link" 
href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Message.html#getBody(java.lang.Class)">getBody(Class)</a>
 method.</p><p>So in an endpoint you can convert a body to another type 
via</p><plain-text-body>Message message = exchange.getIn();
 Document document = message.getBody(Document.class);
-]]></script>
-</div></div><h3 id="TypeConverter-HowTypeConversionworks">How Type Conversion 
works</h3><p>The type conversion strategy is defined by the <a shape="rect" 
class="external-link" 
href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/TypeConverter.html";>TypeConverter</a>
 interface that can be customized on a <a shape="rect" class="external-link" 
href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/CamelContext.html";>CamelContext</a>.</p><p>The
 default implementation, <a shape="rect" class="external-link" 
href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/impl/converter/DefaultTypeConverter.html";>DefaultTypeConverter</a>,
 uses pluggable strategies to load type converters via <a shape="rect" 
class="external-link" 
href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/impl/converter/TypeConverterLoader.html";>TypeConverterLoader</a>.
 The default strategy, <a shape="rect" class="externa
 l-link" 
href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/impl/converter/AnnotationTypeConverterLoader.html";>AnnotationTypeConverterLoader</a>,
 uses a discovery mechanism to find converters.</p><p><strong>New in Camel 
1.5</strong></p><p>The default implementation, <a shape="rect" 
class="external-link" 
href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/impl/converter/DefaultTypeConverter.html";>DefaultTypeConverter</a>,
 now throws a <a shape="rect" class="external-link" 
href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/NoTypeConversionAvailableException.html";>NoTypeConversionAvailableException</a>
 if a suitable conversion cannot be found (CAMEL-84). The semantical ambiguity 
of <code>null</code> (both valid result and indication of no conversion found) 
is now resolved, but this may impact existing code in that it should now catch 
the exception instead of checking for <code>null</code>.</p><h3 id="T
 ypeConverter-TypeConverterRegistry">TypeConverterRegistry</h3><p><strong>New 
in Camel 2.0</strong></p><p>Exposed the <a shape="rect" class="external-link" 
href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/spi/TypeConverterRegistry.html";>TypeConverterRegistry</a>
 from <a shape="rect" href="camelcontext.html">CamelContext</a> so end users 
more easily will be able to add type converters at runtime. This is also usable 
in situations where the default discovering of type converters fails on 
platforms with classloading issues.</p><p>To access the registry, you get it 
from the CamelContext</p><div class="code panel pdl" style="border-width: 
1px;"><div class="codeContent panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default" 
type="syntaxhighlighter"><![CDATA[   CamelContext context = ...
+</plain-text-body><h3 id="TypeConverter-HowTypeConversionworks">How Type 
Conversion works</h3><p>The type conversion strategy is defined by the <a 
shape="rect" class="external-link" 
href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/TypeConverter.html";>TypeConverter</a>
 interface that can be customized on a <a shape="rect" class="external-link" 
href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/CamelContext.html";>CamelContext</a>.</p><p>The
 default implementation, <a shape="rect" class="external-link" 
href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/impl/converter/DefaultTypeConverter.html";>DefaultTypeConverter</a>,
 uses pluggable strategies to load type converters via <a shape="rect" 
class="external-link" 
href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/impl/converter/TypeConverterLoader.html";>TypeConverterLoader</a>.
 The default strategy, <a shape="rect" class="e
 xternal-link" 
href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/impl/converter/AnnotationTypeConverterLoader.html";>AnnotationTypeConverterLoader</a>,
 uses a discovery mechanism to find converters.</p><p><strong>New in Camel 
1.5</strong></p><p>The default implementation, <a shape="rect" 
class="external-link" 
href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/impl/converter/DefaultTypeConverter.html";>DefaultTypeConverter</a>,
 now throws a <a shape="rect" class="external-link" 
href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/NoTypeConversionAvailableException.html";>NoTypeConversionAvailableException</a>
 if a suitable conversion cannot be found (CAMEL-84). The semantical ambiguity 
of <code>null</code> (both valid result and indication of no conversion found) 
is now resolved, but this may impact existing code in that it should now catch 
the exception instead of checking for <code>null</code>.</p><h3
  
id="TypeConverter-TypeConverterRegistry">TypeConverterRegistry</h3><p><strong>New
 in Camel 2.0</strong></p><p>Exposed the <a shape="rect" class="external-link" 
href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/spi/TypeConverterRegistry.html";>TypeConverterRegistry</a>
 from <a shape="rect" href="camelcontext.html">CamelContext</a> so end users 
more easily will be able to add type converters at runtime. This is also usable 
in situations where the default discovering of type converters fails on 
platforms with classloading issues.</p><p>To access the registry, you get it 
from the CamelContext</p><parameter 
ac:name="">java</parameter><plain-text-body>   CamelContext context = ...
    context.getTypeConverterRegistry()
-]]></script>
-</div></div><h4 
id="TypeConverter-TypeConverterRegistryutilizationstatistics">TypeConverterRegistry
 utilization statistics</h4><p>Camel can gather utilization statistics of the 
runtime usage of type converters. These stats are available in JMX, and as well 
as from the <code>getStatistics()</code> method from 
<code>TypeConverterRegistry</code>.</p><p>From <strong>Camel 
2.11.0/2.10.5</strong> onwards these statistics are turned off by default as 
there is some performance overhead under very high concurrent load. To enable 
the statistics in Java, do the following:</p><div class="code panel pdl" 
style="border-width: 1px;"><div class="codeContent panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default" 
type="syntaxhighlighter"><![CDATA[   CamelContext context = ...
+</plain-text-body><h4 
id="TypeConverter-TypeConverterRegistryutilizationstatistics">TypeConverterRegistry
 utilization statistics</h4><p>Camel can gather utilization statistics of the 
runtime usage of type converters. These stats are available in JMX, and as well 
as from the <code>getStatistics()</code> method from 
<code>TypeConverterRegistry</code>.</p><p>From <strong>Camel 
2.11.0/2.10.5</strong> onwards these statistics are turned off by default as 
there is some performance overhead under very high concurrent load. To enable 
the statistics in Java, do the following:</p><plain-text-body>   CamelContext 
context = ...
    context.setTypeConverterStatisticsEnabled(true);
-]]></script>
-</div></div><p>Or in the XML DSL with:</p><div class="code panel pdl" 
style="border-width: 1px;"><div class="codeContent panelContent pdl">
-<script class="brush: xml; gutter: false; theme: Default" 
type="syntaxhighlighter"><![CDATA[&lt;camelContext 
xmlns=&quot;http://camel.apache.org/schema/spring&quot; 
typeConverterStatisticsEnabled=&quot;true&quot;&gt;
+</plain-text-body><p>Or in the XML DSL with:</p><parameter 
ac:name="">xml</parameter><plain-text-body>&lt;camelContext 
xmlns="http://camel.apache.org/schema/spring"; 
typeConverterStatisticsEnabled="true"&gt;
 ...
 &lt;/camelContext&gt;
-]]></script>
-</div></div><h4 id="TypeConverter-Addtypeconverteratruntime">Add type 
converter at runtime</h4><p>The following sample demonstrates how to add a type 
converter at runtime:</p><div class="code panel pdl" style="border-width: 
1px;"><div class="codeContent panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default" 
type="syntaxhighlighter"><![CDATA[
-// add our own type converter manually that converts from String -&gt; MyOrder 
using MyOrderTypeConverter
-context.getTypeConverterRegistry().addTypeConverter(MyOrder.class, 
String.class, new MyOrderTypeConverter());
-]]></script>
-</div></div>And our type converter is implemented as:<div class="code panel 
pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default" 
type="syntaxhighlighter"><![CDATA[
-private static class MyOrderTypeConverter extends TypeConverterSupport {
-
-    @SuppressWarnings(&quot;unchecked&quot;)
-    public &lt;T&gt; T convertTo(Class&lt;T&gt; type, Exchange exchange, 
Object value) {
-        // converter from value to the MyOrder bean
-        MyOrder order = new MyOrder();
-        order.setId(Integer.parseInt(value.toString()));
-        return (T) order;
-    }
-}
-]]></script>
-</div></div>And then we can convert from String to MyOrder as we are used to 
with the type converter:<div class="code panel pdl" style="border-width: 
1px;"><div class="codeContent panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default" 
type="syntaxhighlighter"><![CDATA[
-MyOrder order = context.getTypeConverter().convertTo(MyOrder.class, 
&quot;123&quot;);
-]]></script>
-</div></div><h3 id="TypeConverter-Addtypeconverterclassesatruntime">Add type 
converter classes at runtime</h3><p><strong>Available as of Camel 
2.16</strong></p><p>From Camel 2.16 onwards you type converter classes can 
implement&#160;<code>org.apache.camel.TypeConverters</code> which is an marker 
interface. Then for each type converter you want use 
the&#160;<code>@Converter</code>&#160;annotation.</p><div class="code panel 
pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default" 
type="syntaxhighlighter"><![CDATA[private class MyOrderTypeConverters 
implements TypeConverters {
- 
+</plain-text-body><h4 id="TypeConverter-Addtypeconverteratruntime">Add type 
converter at runtime</h4><p>The following sample demonstrates how to add a type 
converter at 
runtime:<plain-text-body>{snippet:id=e1|lang=java|url=camel/trunk/camel-core/src/test/java/org/apache/camel/impl/TypeConverterRegistryTest.java}</plain-text-body>And
 our type converter is implemented 
as:<plain-text-body>{snippet:id=e2|lang=java|url=camel/trunk/camel-core/src/test/java/org/apache/camel/impl/TypeConverterRegistryTest.java}</plain-text-body>And
 then we can convert from String to MyOrder as we are used to with the type 
converter:<plain-text-body>{snippet:id=e3|lang=java|url=camel/trunk/camel-core/src/test/java/org/apache/camel/impl/TypeConverterRegistryTest.java}</plain-text-body></p><h3
 id="TypeConverter-Addtypeconverterclassesatruntime">Add type converter classes 
at runtime</h3><p><strong>Available as of Camel 2.16</strong></p><p>From Camel 
2.16 onwards you type converter classes can implement&#160;<co
 de>org.apache.camel.TypeConverters</code> which is an marker interface. Then 
for each type converter you want use 
the&#160;<code>@Converter</code>&#160;annotation.</p><plain-text-body>private 
class MyOrderTypeConverters implements TypeConverters {
+&#160;
     @Converter
     public MyOrder toMyOrder(String orderId) {
         MyOrder order = new MyOrder();
         order.setId(Integer.parseInt(orderId));
         return order;
     }
-}]]></script>
-</div></div><p>&#160;</p><p>Then you can add these converters to the registry 
using</p><div class="code panel pdl" style="border-width: 1px;"><div 
class="codeContent panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default" 
type="syntaxhighlighter"><![CDATA[MyOrderTypeConverters myClass = ...
-context.getTypeConverterRegistry().addTypeConverters(myClass);]]></script>
-</div></div><p>If you are using Spring or Blueprint, then you can just declare 
a &lt;bean&gt; then CamelContext will automatic discover and add the 
converters.</p><div class="code panel pdl" style="border-width: 1px;"><div 
class="codeContent panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default" 
type="syntaxhighlighter"><![CDATA[&lt;bean id=&quot;myOrderTypeConverters&quot; 
class=&quot;...&quot;/&gt;
- 
+}</plain-text-body><p>&#160;</p><p>Then you can add these converters to the 
registry using</p><plain-text-body>MyOrderTypeConverters myClass = ...
+context.getTypeConverterRegistry().addTypeConverters(myClass);</plain-text-body><p>If
 you are using Spring or Blueprint, then you can just declare a &lt;bean&gt; 
then CamelContext will automatic discover and add the 
converters.</p><plain-text-body>&lt;bean id="myOrderTypeConverters" 
class="..."/&gt;
+&#160;
 &lt;camelContext ...&gt;
    ...
-&lt;/camelContext&gt;]]></script>
-</div></div><p>You can declare multiple &lt;bean&gt;s if you have more 
classes.</p><p>Using this technique do not require to scan the classpath and 
using the file 
<code>META-INF/services/org/apache/camel/TypeConverter</code>&#160;as discussed 
in the&#160;<em>Discovering Type Converters</em> section. However the latter is 
highly recommended when developing Camel components or data formats as then the 
type converters is automatic included out of the box. The functionality from 
this section requires the end users to explicit add the converters to their 
Camel applications.</p><h3 
id="TypeConverter-DiscoveringTypeConverters">Discovering Type 
Converters</h3><p>The <a shape="rect" class="external-link" 
href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/impl/converter/AnnotationTypeConverterLoader.html";>AnnotationTypeConverterLoader</a>
 will search the classpath for a file called 
<em>META-INF/services/org/apache/camel/TypeConverter</em>. The contents are 
expecte
 d to be comma separated package names. These packages are then recursively 
searched for any objects with the <a shape="rect" class="external-link" 
href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Converter";>@Converter</a>
 annotation. Then any method marked with @Converter is assumed to be a 
conversion method; where the parameter is the from value and the return is the 
to value.</p><p>e.g. the following shows how to register a converter from File 
-&gt; InputStream</p><div class="code panel pdl" style="border-width: 
1px;"><div class="codeContent panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default" 
type="syntaxhighlighter"><![CDATA[@Converter
+&lt;/camelContext&gt;</plain-text-body><p>You can declare multiple 
&lt;bean&gt;s if you have more classes.</p><p>Using this technique do not 
require to scan the classpath and using the file 
<code>META-INF/services/org/apache/camel/TypeConverter</code>&#160;as discussed 
in the&#160;<em>Discovering Type Converters</em> section. However the latter is 
highly recommended when developing Camel components or data formats as then the 
type converters is automatic included out of the box. The functionality from 
this section requires the end users to explicit add the converters to their 
Camel applications.</p><h3 
id="TypeConverter-DiscoveringTypeConverters">Discovering Type 
Converters</h3><p>The <a shape="rect" class="external-link" 
href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/impl/converter/AnnotationTypeConverterLoader.html";>AnnotationTypeConverterLoader</a>
 will search the classpath for a file called 
<em>META-INF/services/org/apache/camel/TypeConverter</em
 >. The contents are expected to be comma separated package names. These 
 >packages are then recursively searched for any objects with the <a 
 >shape="rect" class="external-link" 
 >href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Converter";>@Converter</a>
 > annotation. Then any method marked with @Converter is assumed to be a 
 >conversion method; where the parameter is the from value and the return is 
 >the to value.</p><p>e.g. the following shows how to register a converter from 
 >File -&gt; InputStream</p><plain-text-body>@Converter
 public class IOConverter {
 
     @Converter
@@ -153,9 +105,7 @@ public class IOConverter {
         return new BufferedInputStream(new FileInputStream(file));
     }
 }
-]]></script>
-</div></div><p>Static methods are invoked; non-static methods require an 
instance of the converter object to be created (which is then cached). If a 
converter requires configuration you can plug in an Injector interface to the 
DefaultTypeConverter which can construct and inject converter objects via 
Spring or Guice.</p><p>We have most of the common converters for common Java 
types in the <a shape="rect" class="external-link" 
href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/converter/package-summary.html";>org.apache.camel.converter</a>
 package and its children.</p><h4 
id="TypeConverter-Returningnullvalues">Returning null values</h4><p>By default 
when using a method in a POJO annotation with @Converter returning null is not 
a valid response. If null is returned, then Camel will regard that type 
converter as a <em>miss</em>, and prevent from using it in the future. If null 
should be allowed as a valid response, then from <strong>Camel 
2.11.2/2.12</strong>
  onwards you can specify this in the annotation as shown:</p><div class="code 
panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default" 
type="syntaxhighlighter"><![CDATA[    @Converter(allowNull = true)
+</plain-text-body><p>Static methods are invoked; non-static methods require an 
instance of the converter object to be created (which is then cached). If a 
converter requires configuration you can plug in an Injector interface to the 
DefaultTypeConverter which can construct and inject converter objects via 
Spring or Guice.</p><p>We have most of the common converters for common Java 
types in the <a shape="rect" class="external-link" 
href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/converter/package-summary.html";>org.apache.camel.converter</a>
 package and its children.</p><h4 
id="TypeConverter-Returningnullvalues">Returning null values</h4><p>By default 
when using a method in a POJO annotation with @Converter returning null is not 
a valid response. If null is returned, then Camel will regard that type 
converter as a <em>miss</em>, and prevent from using it in the future. If null 
should be allowed as a valid response, then from <strong>Camel 2.11.2/2.12</s
 trong> onwards you can specify this in the annotation as 
shown:</p><plain-text-body>    @Converter(allowNull = true)
     public static InputStream toInputStream(File file) throws IOException {
         if (file.exist()) {
             return new BufferedInputStream(new FileInputStream(file));
@@ -163,17 +113,11 @@ public class IOConverter {
             return null;
         }
     }
-]]></script>
-</div></div><h3 
id="TypeConverter-DiscoveringFallbackTypeConverters">Discovering Fallback Type 
Converters</h3><p><strong>Available in Camel 2.0</strong><br clear="none"> The 
<a shape="rect" class="external-link" 
href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/impl/converter/AnnotationTypeConverterLoader.html";>AnnotationTypeConverterLoader</a>
 has been enhanced to also look for methods defined with a @FallbackConverter 
annotation, and register it as a fallback type converter.</p><p>Fallback type 
converters are used as a last resort for converting a given value to another 
type. Its used when the regular type converters give up.<br clear="none"> The 
fallback converters is also meant for a broader scope, so its method signature 
is a bit different:</p><div class="code panel pdl" style="border-width: 
1px;"><div class="codeContent panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default" 
type="syntaxhighlighter"><![CDATA[    @FallbackConverter
+</plain-text-body><h3 
id="TypeConverter-DiscoveringFallbackTypeConverters">Discovering Fallback Type 
Converters</h3><p><strong>Available in Camel 2.0</strong><br clear="none"> The 
<a shape="rect" class="external-link" 
href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/impl/converter/AnnotationTypeConverterLoader.html";>AnnotationTypeConverterLoader</a>
 has been enhanced to also look for methods defined with a @FallbackConverter 
annotation, and register it as a fallback type converter.</p><p>Fallback type 
converters are used as a last resort for converting a given value to another 
type. Its used when the regular type converters give up.<br clear="none"> The 
fallback converters is also meant for a broader scope, so its method signature 
is a bit different:</p><plain-text-body>    @FallbackConverter
     public static &lt;T&gt; T convertTo(Class&lt;T&gt; type, Exchange 
exchange, Object value, TypeConverterRegistry registry)
-]]></script>
-</div></div><p>Or you can use the non generic signature.</p><div class="code 
panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default" 
type="syntaxhighlighter"><![CDATA[    @FallbackConverter
+</plain-text-body><p>Or you can use the non generic 
signature.</p><plain-text-body>    @FallbackConverter
     public static Object convertTo(Class type, Exchange exchange, Object 
value, TypeConverterRegistry registry)
-]]></script>
-</div></div><p>And the method name can be anything (<code>convertTo</code> is 
not required as a name), so it can be named <code>convertMySpecialTypes</code> 
if you like.<br clear="none"> The <code>Exchange</code> parameter is optional, 
just as its with the regular <code>@Converter</code> methods.</p><p>The purpose 
with this broad scope method signature is allowing you to control if you can 
convert the given type or not. The <code>type</code> parameter holds the type 
we want the <code>value</code> converted to. Its used internally in Camel for 
wrapper objects so we can delegate the type convertions to the body that is 
wrapped.</p><p>For instance in the method below we will handle all type 
conversions that is based on the wrapper class <code>GenericFile</code> and we 
let Camel do the type conversions on its body instead.</p><div class="code 
panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default" 
type="syntaxhighlighter"><![CDATA[    @FallbackConverter
+</plain-text-body><p>And the method name can be anything 
(<code>convertTo</code> is not required as a name), so it can be named 
<code>convertMySpecialTypes</code> if you like.<br clear="none"> The 
<code>Exchange</code> parameter is optional, just as its with the regular 
<code>@Converter</code> methods.</p><p>The purpose with this broad scope method 
signature is allowing you to control if you can convert the given type or not. 
The <code>type</code> parameter holds the type we want the <code>value</code> 
converted to. Its used internally in Camel for wrapper objects so we can 
delegate the type convertions to the body that is wrapped.</p><p>For instance 
in the method below we will handle all type conversions that is based on the 
wrapper class <code>GenericFile</code> and we let Camel do the type conversions 
on its body instead.</p><plain-text-body>    @FallbackConverter
     public static &lt;T&gt; T convertTo(Class&lt;T&gt; type, Exchange 
exchange, Object value, TypeConverterRegistry registry) {
         // use a fallback type converter so we can convert the embedded body 
if the value is GenericFile
         if (GenericFile.class.isAssignableFrom(value.getClass())) {
@@ -188,18 +132,12 @@ public class IOConverter {
         
         return null;
     }
-]]></script>
-</div></div><h3 id="TypeConverter-WritingyourownTypeConverters">Writing your 
own Type Converters</h3><p>&#160;</p><div class="confluence-information-macro 
confluence-information-macro-information"><p class="title">Use FQN</p><span 
class="aui-icon aui-icon-small aui-iconfont-info 
confluence-information-macro-icon"></span><div 
class="confluence-information-macro-body"><p>In Camel 2.8 the TypeConverter 
file now supports specifying the FQN class name. This is recommended to be 
used. See below for more details. Using FQN must be used. The older way with 
just package name is deprecated and should not be used, and it may also not 
work in some application servers due to classpath scanning 
issues.</p></div></div><p>&#160;</p><p>You are welcome to write your own 
converters. Remember to use the @Converter annotations on the classes and 
methods you wish to use. Then add the packages to a file called 
<em>META-INF/services/org/apache/camel/TypeConverter</em> in your jar. Remember 
to make sure tha
 t :-</p><ul><li>static methods are encouraged to reduce caching, but instance 
methods are fine, particularly if you want to allow optional dependency 
injection to customize the converter</li><li>converter methods should be thread 
safe and reentrant</li></ul><h4 
id="TypeConverter-ExamplesofTypeConverterfile">Examples of TypeConverter 
file</h4><p>The file in the JAR: 
<code>META-INF/services/org/apache/camel/TypeConverter</code> contains the 
following line(s)</p><div class="code panel pdl" style="border-width: 
1px;"><div class="codeContent panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default" 
type="syntaxhighlighter"><![CDATA[com.foo
+</plain-text-body><h3 id="TypeConverter-WritingyourownTypeConverters">Writing 
your own Type Converters</h3><p>&#160;</p><parameter ac:name="title">Use 
FQN</parameter><rich-text-body><p>In Camel 2.8 the TypeConverter file now 
supports specifying the FQN class name. This is recommended to be used. See 
below for more details. Using FQN must be used. The older way with just package 
name is deprecated and should not be used, and it may also not work in some 
application servers due to classpath scanning 
issues.</p></rich-text-body><p>&#160;</p><p>You are welcome to write your own 
converters. Remember to use the @Converter annotations on the classes and 
methods you wish to use. Then add the packages to a file called 
<em>META-INF/services/org/apache/camel/TypeConverter</em> in your jar. Remember 
to make sure that :-</p><ul><li>static methods are encouraged to reduce 
caching, but instance methods are fine, particularly if you want to allow 
optional dependency injection to customize the conve
 rter</li><li>converter methods should be thread safe and 
reentrant</li></ul><h4 id="TypeConverter-ExamplesofTypeConverterfile">Examples 
of TypeConverter file</h4><p>The file in the JAR: 
<code>META-INF/services/org/apache/camel/TypeConverter</code> contains the 
following line(s)</p><plain-text-body>com.foo
 com.bar
-]]></script>
-</div></div><p>Each line in the file is a package name. This tells Camel to go 
scan those packages for any classes that has been annotated with the 
@Converter.</p><h3 
id="TypeConverter-ImprovedTypeConverterbyusingFQNclassnames">Improved 
TypeConverter by using FQN class names</h3><p><strong>Available as of Camel 
2.8</strong><br clear="none"> In Camel 2.8 we improved the type converter 
loader to support specifying the FQN class name of the converter classes. This 
has the advantage of avoiding having to scan packages for @Converter classes. 
Instead it loads the @Converter class directly. This is a 
<strong>highly</strong> recommend approach to use going forward.</p><h4 
id="TypeConverter-ExamplesofTypeConverterfile.1">Examples of TypeConverter 
file</h4><p>The file in the JAR: 
<code>META-INF/services/org/apache/camel/TypeConverter</code> contains the 
following line(s) for FQN class names</p><div class="code panel pdl" 
style="border-width: 1px;"><div class="codeContent panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default" 
type="syntaxhighlighter"><![CDATA[com.foo.MyConverter
+</plain-text-body><p>Each line in the file is a package name. This tells Camel 
to go scan those packages for any classes that has been annotated with the 
@Converter.</p><h3 
id="TypeConverter-ImprovedTypeConverterbyusingFQNclassnames">Improved 
TypeConverter by using FQN class names</h3><p><strong>Available as of Camel 
2.8</strong><br clear="none"> In Camel 2.8 we improved the type converter 
loader to support specifying the FQN class name of the converter classes. This 
has the advantage of avoiding having to scan packages for @Converter classes. 
Instead it loads the @Converter class directly. This is a 
<strong>highly</strong> recommend approach to use going forward.</p><h4 
id="TypeConverter-ExamplesofTypeConverterfile.1">Examples of TypeConverter 
file</h4><p>The file in the JAR: 
<code>META-INF/services/org/apache/camel/TypeConverter</code> contains the 
following line(s) for FQN class names</p><plain-text-body>com.foo.MyConverter
 com.bar.MyOtherConverter
 com.bar.YetOtherConverter
-]]></script>
-</div></div><p>As you can see each line in the file now contains a FQN class 
name. This is the recommended approach.</p><h3 
id="TypeConverter-Encodingsupportforbyte[]andStringConversion">Encoding support 
for byte[] and String Conversion</h3><p><strong>Available in Camel 
1.5</strong></p><p>Since Java provides converting the byte[] to String and 
String to byte[] with the <a shape="rect" class="external-link" 
href="http://java.sun.com/j2se/1.5.0/docs/api/java/nio/charset/Charset.html"; 
rel="nofollow">charset name</a> parameter. You can define the charset name by 
setting the exchange property name <code>Exchange.CHARSET_NAME</code> with the 
charset name, such as <code>"UTF-8"</code> or <code>"iso-8859-1"</code>.</p><h3 
id="TypeConverter-Exchangeparameter">Exchange 
parameter</h3><p><strong>Available in Camel 1.5</strong></p><p>The type 
converter accepts the <code>Exchange</code> as an optional 2nd parameter. This 
is usable if the type converter for instance needs information from the curr
 ent exchange. For instance combined with the encoding support its possible for 
type converters to convert with the configured encoding. An example from 
camel-core for the <code>byte[] -&gt; String</code> converter:</p><div 
class="code panel pdl" style="border-width: 1px;"><div class="codeContent 
panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default" 
type="syntaxhighlighter"><![CDATA[    @Converter
+</plain-text-body><p>As you can see each line in the file now contains a FQN 
class name. This is the recommended approach.</p><h3 
id="TypeConverter-Encodingsupportforbyte[]andStringConversion">Encoding support 
for byte[] and String Conversion</h3><p><strong>Available in Camel 
1.5</strong></p><p>Since Java provides converting the byte[] to String and 
String to byte[] with the <a shape="rect" class="external-link" 
href="http://java.sun.com/j2se/1.5.0/docs/api/java/nio/charset/Charset.html"; 
rel="nofollow">charset name</a> parameter. You can define the charset name by 
setting the exchange property name <code>Exchange.CHARSET_NAME</code> with the 
charset name, such as <code>"UTF-8"</code> or <code>"iso-8859-1"</code>.</p><h3 
id="TypeConverter-Exchangeparameter">Exchange 
parameter</h3><p><strong>Available in Camel 1.5</strong></p><p>The type 
converter accepts the <code>Exchange</code> as an optional 2nd parameter. This 
is usable if the type converter for instance needs information from th
 e current exchange. For instance combined with the encoding support its 
possible for type converters to convert with the configured encoding. An 
example from camel-core for the <code>byte[] -&gt; String</code> 
converter:</p><plain-text-body>    @Converter
     public static String toString(byte[] data, Exchange exchange) {
         if (exchange != null) {
             String charsetName = exchange.getProperty(Exchange.CHARSET_NAME, 
String.class);
@@ -207,14 +145,13 @@ com.bar.YetOtherConverter
                 try {
                     return new String(data, charsetName);
                 } catch (UnsupportedEncodingException e) {
-                    LOG.warn(&quot;Can&#39;t convert the byte to String with 
the charset &quot; + charsetName, e);
+                    LOG.warn("Can't convert the byte to String with the 
charset " + charsetName, e);
                 }
             }
         }
         return new String(data);
     }
-]]></script>
-</div></div></div>
+</plain-text-body></div>
         </td>
         <td valign="top">
           <div class="navigation">

Modified: websites/production/camel/content/websocket.html
==============================================================================
--- websites/production/camel/content/websocket.html (original)
+++ websites/production/camel/content/websocket.html Fri Aug 25 14:20:21 2017
@@ -36,17 +36,6 @@
     <![endif]-->
 
 
-  <link href='//camel.apache.org/styles/highlighter/styles/shCoreCamel.css' 
rel='stylesheet' type='text/css' />
-  <link href='//camel.apache.org/styles/highlighter/styles/shThemeCamel.css' 
rel='stylesheet' type='text/css' />
-  <script src='//camel.apache.org/styles/highlighter/scripts/shCore.js' 
type='text/javascript'></script>
-  <script src='//camel.apache.org/styles/highlighter/scripts/shBrushJava.js' 
type='text/javascript'></script>
-  <script src='//camel.apache.org/styles/highlighter/scripts/shBrushXml.js' 
type='text/javascript'></script>
-  <script src='//camel.apache.org/styles/highlighter/scripts/shBrushPlain.js' 
type='text/javascript'></script>
-  
-  <script type="text/javascript">
-  SyntaxHighlighter.defaults['toolbar'] = false;
-  SyntaxHighlighter.all();
-  </script>
 
     <title>
     Apache Camel: Websocket
@@ -86,33 +75,17 @@
        <tbody>
         <tr>
         <td valign="top" width="100%">
-<div class="wiki-content maincontent"><h2 
id="Websocket-WebsocketComponent">Websocket Component</h2><p><strong>Available 
as of Camel 2.10</strong></p><p>The <strong>websocket</strong> component 
provides websocket <a shape="rect" href="endpoint.html">endpoints</a> for 
communicating with clients using websocket. The component uses Eclipse Jetty 
Server which implements the <a shape="rect" class="external-link" 
href="http://tools.ietf.org/html/rfc6455"; rel="nofollow">IETF</a> specification 
(drafts and RFC 6455). It supports the protocols ws:// and wss://. To use 
wss:// protocol, the SSLContextParameters must be defined.</p><div 
class="confluence-information-macro 
confluence-information-macro-information"><p class="title">Version currently 
supported</p><span class="aui-icon aui-icon-small aui-iconfont-info 
confluence-information-macro-icon"></span><div 
class="confluence-information-macro-body"><p>As Camel 2.10 uses Jetty 
7.5.4.v20111024, only the D00 to <a shape="rect" class="external-li
 nk" href="http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-13"; 
rel="nofollow">D13</a> IETF implementations are available.<br clear="none"> 
Camel 2.11 uses Jetty 7.6.7.</p></div></div><h3 id="Websocket-URIformat">URI 
format</h3><div class="code panel pdl" style="border-width: 1px;"><div 
class="codeContent panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default" 
type="syntaxhighlighter"><![CDATA[websocket://hostname[:port][/resourceUri][?options]
-]]></script>
-</div></div><p>You can append query options to the URI in the following 
format, <code>?option=value&amp;option=value&amp;...</code></p><h3 
id="Websocket-ComponentOptions">Component Options</h3><p>The 
<code>WebsocketComponent</code> can be configured prior to use, to setup host, 
to act as a websocket server.</p><div class="table-wrap"><table 
class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" 
class="confluenceTh"><p>Option</p></th><th colspan="1" rowspan="1" 
class="confluenceTh"><p>Default</p></th><th colspan="1" rowspan="1" 
class="confluenceTh"><p>Description</p></th></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><p>host</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>0.0.0.0</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>The hostname.</p></td></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><p>port</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>9292</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>The p
 ort number.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p>staticResources</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>null</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>Path for static resources such as index.html files etc. 
If this option has been configured, then a server is started on the given 
hostname and port, to service the static resources, eg such as an index.html 
file. If this option has not been configured, then no server is 
started.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p>sslContextParameters</p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>&#160;</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>Reference to a 
<code>org.apache.camel.util.jsse.SSLContextParameters</code> in the <a 
shape="rect" class="external-link" 
href="http://camel.apache.org/registry.html";>Registry</a>. This reference 
overrides any configured SSLContextParameters at the component level.&
 #160; See <a shape="rect" href="camel-configuration-utilities.html">Using the 
JSSE Configuration Utility</a>.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>enableJmx</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>If this option is true, Jetty JMX support 
will be enabled for this endpoint. See <a shape="rect" 
href="#Websocket-JettyJMXsupport">Jetty JMX support</a> for more 
details.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>sslKeyPassword</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>null</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p><strong>Consumer only</strong>: The 
password for the keystore when using SSL.</p></td></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>sslPassword</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>null</code><
 /p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Consumer 
only</strong>: The password when using SSL.</p></td></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>sslKeystore</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>null</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><strong>Consumer only</strong>: 
The path to the keystore.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>minThreads</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>1</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p><strong>Consumer only</strong>: To set a 
value for minimum number of threads in server thread pool. <strong>From Camel 
2.18</strong>: MinThreads/MaxThreads or threadPool fields are required due to 
switch to Jetty 9</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>maxThreads</code></p></td><td colspan="1" 
rowspan="1" class="conflue
 nceTd"><p><code>1 + noCores * 2<br clear="none"></code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><strong>Consumer only</strong>: 
To set a value for maximum number of threads in server thread pool. 
<strong>From Camel 2.18</strong>: MinThreads/MaxThreads or threadPool fields 
are required due to switch to Jetty 9</p></td></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>threadPool</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>null</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><strong>Consumer only</strong>: 
To use a custom thread pool for the server. <strong>From Camel 2.18</strong>: 
MinThreads/MaxThreads or threadPool fields are required due to switch to Jetty 
9</p></td></tr></tbody></table></div><h3 
id="Websocket-EndpointOptions">Endpoint Options</h3><p>The 
<code>WebsocketEndpoint</code> can be configured prior to use</p><div 
class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1"
  rowspan="1" class="confluenceTh"><p>Option</p></th><th colspan="1" 
rowspan="1" class="confluenceTh"><p>Default</p></th><th colspan="1" rowspan="1" 
class="confluenceTh"><p>Description</p></th></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><p>sslContextParametersRef</p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p><strong>Deprecated and will be removed in 
Camel 3.0:</strong> Reference to a 
<code>org.apache.camel.util.jsse.SSLContextParameters</code> in the <a 
shape="rect" class="external-link" 
href="http://camel.apache.org/registry.html";>Registry</a>.&#160; This reference 
overrides any configured SSLContextParameters at the component level. See <a 
shape="rect" href="camel-configuration-utilities.html">Using the JSSE 
Configuration Utility</a>. Use the <code>sslContextParameters</code> option 
instead</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p>sslContextParameters</p></td><
 td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.11.1:</strong> 
Reference to a <code>org.apache.camel.util.jsse.SSLContextParameters</code> in 
the <a shape="rect" class="external-link" 
href="http://camel.apache.org/registry.html";>Registry</a>. This reference 
overrides any configured SSLContextParameters at the component level.&#160; See 
<a shape="rect" href="camel-configuration-utilities.html">Using the JSSE 
Configuration Utility</a>.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p>sendToAll</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>null</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><strong>Producer only:</strong> To send to all 
websocket subscribers. Can be used to configure on endpoint level, instead of 
having to use the <code>WebsocketConstants.SEND_TO_ALL</code> header on the 
message.</p></td></tr><tr><td colspan="1" rowspan="1" c
 lass="confluenceTd"><p>staticResources</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>null</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>The root directory for the web resources or classpath. 
Use the protocol file: or classpath: depending if you want that the component 
loads the resource from file system or classpath.</p></td></tr><tr><td 
colspan="1" rowspan="1" class="confluenceTd"><p>&#160;bufferSize</p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>null</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.12.3:</strong> 
set the buffer size of the websocketServlet, which is also the max frame byte 
size (default 8192)</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p>maxIdleTime</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>null</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><strong>Camel 2.12.3:</strong> set the time in ms that 
the websoc
 ket created by the websocketServlet may be idle before closing. (default is 
300000)</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p>maxTextMessageSize</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>null</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><strong>Camel 2.12.3:</strong> can be used to set the 
size in characters that the websocket created by the websocketServlet may be 
accept before closing.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p>maxBinaryMessageSize</p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>null</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p><strong>Camel 2.12.3:</strong> can be used 
to set the size in bytes that the websocket created by the websocketServlet may 
be accept before closing. (Default is -1 - or unlimited)</p></td></tr><tr><td 
colspan="1" rowspan="1" class="confluenceTd"><p>minVersion</p></td><td 
colspan="1" rowspan="1" class="co
 nfluenceTd"><p><code>null</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><strong>Camel 2.12.3:</strong> can be used to set the 
minimum protocol version accepted for the websocketServlet. (Default 13 - the 
RFC6455 version)</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd">sendTimeout</td><td colspan="1" rowspan="1" 
class="confluenceTd">30000</td><td colspan="1" rowspan="1" 
class="confluenceTd"><strong>Camel 2.18:</strong> Timeout in millis when 
sending to a websocket channel. The default timeout is 30000 (30 
seconds).</td></tr></tbody></table></div><p>&#160;</p><h3 
id="Websocket-MessageHeaders">Message Headers</h3><p>The websocket component 
uses 2 headers to indicate to either send messages back to a single/current 
client, or to all clients.</p><div class="table-wrap"><table 
class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" 
class="confluenceTh"><p>Key</p></th><th colspan="1" rowspan="1" 
class="confluenceTh"><p>Description</p></th></tr>
 <tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>WebsocketConstants.SEND_TO_ALL</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>Sends the message to all 
clients which are currently connected. You can use the <code>sendToAll</code> 
option on the endpoint instead of using this header.</p></td></tr><tr><td 
colspan="1" rowspan="1" 
class="confluenceTd"><p><code>WebsocketConstants.CONNECTION_KEY</code></p></td><td
 colspan="1" rowspan="1" class="confluenceTd"><p>Sends the message to the 
client with the given connection key.</p></td></tr></tbody></table></div><h3 
id="Websocket-Usage">Usage</h3><p>In this example we let Camel exposes a 
websocket server which clients can communicate with. The websocket server uses 
the default host and port, which would be <code>0.0.0.0:9292</code>.<br 
clear="none"> The example will send back an echo of the input. To send back a 
message, we need to send the transformed message to the same endpoint 
<code>"websocket://echo"</code>
 . This is needed<br clear="none"> because by default the messaging is 
InOnly.</p><div class="code panel pdl" style="border-width: 1px;"><div 
class="codeContent panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default" 
type="syntaxhighlighter"><![CDATA[
-// expose a echo websocket client, that sends back an echo
-from(&quot;websocket://echo&quot;)
-    .log(&quot;&gt;&gt;&gt; Message received from WebSocket Client : 
${body}&quot;)
-    .transform().simple(&quot;${body}${body}&quot;)
-    // send back to the client, by sending the message to the same endpoint
-    // this is needed as by default messages is InOnly
-    // and we will by default send back to the current client using the 
provided connection key
-    .to(&quot;websocket://echo&quot;);
-]]></script>
-</div></div>This example is part of an unit test, which you can find <a 
shape="rect" class="external-link" 
href="https://svn.apache.org/repos/asf/camel/trunk/components/camel-websocket/src/test/java/org/apache/camel/component/websocket/WebsocketRouteExampleTest.java";>here</a>.
 As a client we use the <a shape="rect" href="ahc.html">AHC</a> library which 
offers support for web socket as well.<p>Here is another example where webapp 
resources location have been defined to allow the Jetty Application Server to 
not only register the WebSocket servlet but also to expose web resources for 
the browser. Resources should be defined under the webapp directory.</p><div 
class="code panel pdl" style="border-width: 1px;"><div class="codeContent 
panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default" 
type="syntaxhighlighter"><![CDATA[from(&quot;activemq:topic:newsTopic&quot;)
-   .routeId(&quot;fromJMStoWebSocket&quot;)
-   
.to(&quot;websocket://localhost:8443/newsTopic?sendToAll=true&amp;staticResources=classpath:webapp&quot;);
-]]></script>
-</div></div><h3 id="Websocket-SettingupSSLforWebSocketComponent">Setting up 
SSL for WebSocket Component</h3><h4 
id="Websocket-UsingtheJSSEConfigurationUtility">Using the JSSE Configuration 
Utility</h4><p>As of Camel 2.10, the WebSocket component supports SSL/TLS 
configuration through the <a shape="rect" 
href="camel-configuration-utilities.html">Camel JSSE Configuration 
Utility</a>.&#160; This utility greatly decreases the amount of component 
specific code you need to write and is configurable at the endpoint and 
component levels.&#160; The following examples demonstrate how to use the 
utility with the Cometd component.</p><h5 
id="Websocket-Programmaticconfigurationofthecomponent">Programmatic 
configuration of the component</h5><div class="code panel pdl" 
style="border-width: 1px;"><div class="codeContent panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default" 
type="syntaxhighlighter"><![CDATA[KeyStoreParameters ksp = new 
KeyStoreParameters();
-ksp.setResource(&quot;/users/home/server/keystore.jks&quot;);
-ksp.setPassword(&quot;keystorePassword&quot;);
+<div class="wiki-content maincontent"><h2 
id="Websocket-WebsocketComponent">Websocket Component</h2><p><strong>Available 
as of Camel 2.10</strong></p><p>The <strong>websocket</strong> component 
provides websocket <a shape="rect" href="endpoint.html">endpoints</a> for 
communicating with clients using websocket. The component uses Eclipse Jetty 
Server which implements the <a shape="rect" class="external-link" 
href="http://tools.ietf.org/html/rfc6455"; rel="nofollow">IETF</a> specification 
(drafts and RFC 6455). It supports the protocols ws:// and wss://. To use 
wss:// protocol, the SSLContextParameters must be defined.</p><parameter 
ac:name="title">Version currently supported</parameter><rich-text-body><p>As 
Camel 2.10 uses Jetty 7.5.4.v20111024, only the D00 to <a shape="rect" 
class="external-link" 
href="http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-13"; 
rel="nofollow">D13</a> IETF implementations are available.<br clear="none"> 
Camel 2.11 uses Jetty 7.6.7.</p></rich-
 text-body><h3 id="Websocket-URIformat">URI 
format</h3><plain-text-body>websocket://hostname[:port][/resourceUri][?options]
+</plain-text-body><p>You can append query options to the URI in the following 
format, <code>?option=value&amp;option=value&amp;...</code></p><h3 
id="Websocket-ComponentOptions">Component Options</h3><p>The 
<code>WebsocketComponent</code> can be configured prior to use, to setup host, 
to act as a websocket server.</p><div class="table-wrap"><table 
class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" 
class="confluenceTh"><p>Option</p></th><th colspan="1" rowspan="1" 
class="confluenceTh"><p>Default</p></th><th colspan="1" rowspan="1" 
class="confluenceTh"><p>Description</p></th></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><p>host</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>0.0.0.0</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>The hostname.</p></td></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><p>port</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>9292</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p
 >The port number.</p></td></tr><tr><td colspan="1" rowspan="1" 
 >class="confluenceTd"><p>staticResources</p></td><td colspan="1" rowspan="1" 
 >class="confluenceTd"><p><code>null</code></p></td><td colspan="1" rowspan="1" 
 >class="confluenceTd"><p>Path for static resources such as index.html files 
 >etc. If this option has been configured, then a server is started on the 
 >given hostname and port, to service the static resources, eg such as an 
 >index.html file. If this option has not been configured, then no server is 
 >started.</p></td></tr><tr><td colspan="1" rowspan="1" 
 >class="confluenceTd"><p>sslContextParameters</p></td><td colspan="1" 
 >rowspan="1" class="confluenceTd"><p>&#160;</p></td><td colspan="1" 
 >rowspan="1" class="confluenceTd"><p>Reference to a 
 ><code>org.apache.camel.util.jsse.SSLContextParameters</code> in the <a 
 >shape="rect" class="external-link" 
 >href="http://camel.apache.org/registry.html";>Registry</a>. This reference 
 >overrides any configured SSLContextParameters at the component l
 evel.&#160; See <a shape="rect" 
href="camel-configuration-utilities.html">Using the JSSE Configuration 
Utility</a>.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>enableJmx</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>If this option is true, Jetty JMX support 
will be enabled for this endpoint. See <a shape="rect" 
href="#Websocket-JettyJMXsupport">Jetty JMX support</a> for more 
details.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>sslKeyPassword</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>null</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p><strong>Consumer only</strong>: The 
password for the keystore when using SSL.</p></td></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>sslPassword</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>null</
 code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><strong>Consumer only</strong>: The password when using 
SSL.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>sslKeystore</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>null</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p><strong>Consumer only</strong>: The path to 
the keystore.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>minThreads</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>1</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p><strong>Consumer only</strong>: To set a 
value for minimum number of threads in server thread pool. <strong>From Camel 
2.18</strong>: MinThreads/MaxThreads or threadPool fields are required due to 
switch to Jetty 9</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>maxThreads</code></p></td><td colspan="1" 
rowspan="1" class="c
 onfluenceTd"><p><code>1 + noCores * 2<br clear="none"></code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><strong>Consumer only</strong>: 
To set a value for maximum number of threads in server thread pool. 
<strong>From Camel 2.18</strong>: MinThreads/MaxThreads or threadPool fields 
are required due to switch to Jetty 9</p></td></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>threadPool</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><code>null</code></p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><strong>Consumer only</strong>: 
To use a custom thread pool for the server. <strong>From Camel 2.18</strong>: 
MinThreads/MaxThreads or threadPool fields are required due to switch to Jetty 
9</p></td></tr></tbody></table></div><h3 
id="Websocket-EndpointOptions">Endpoint Options</h3><p>The 
<code>WebsocketEndpoint</code> can be configured prior to use</p><div 
class="table-wrap"><table class="confluenceTable"><tbody><tr><th colsp
 an="1" rowspan="1" class="confluenceTh"><p>Option</p></th><th colspan="1" 
rowspan="1" class="confluenceTh"><p>Default</p></th><th colspan="1" rowspan="1" 
class="confluenceTh"><p>Description</p></th></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><p>sslContextParametersRef</p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p><strong>Deprecated and will be removed in 
Camel 3.0:</strong> Reference to a 
<code>org.apache.camel.util.jsse.SSLContextParameters</code> in the <a 
shape="rect" class="external-link" 
href="http://camel.apache.org/registry.html";>Registry</a>.&#160; This reference 
overrides any configured SSLContextParameters at the component level. See <a 
shape="rect" href="camel-configuration-utilities.html">Using the JSSE 
Configuration Utility</a>. Use the <code>sslContextParameters</code> option 
instead</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p>sslContextParameters</p>
 </td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td><td 
colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.11.1:</strong> 
Reference to a <code>org.apache.camel.util.jsse.SSLContextParameters</code> in 
the <a shape="rect" class="external-link" 
href="http://camel.apache.org/registry.html";>Registry</a>. This reference 
overrides any configured SSLContextParameters at the component level.&#160; See 
<a shape="rect" href="camel-configuration-utilities.html">Using the JSSE 
Configuration Utility</a>.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p>sendToAll</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>null</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><strong>Producer only:</strong> To send to all 
websocket subscribers. Can be used to configure on endpoint level, instead of 
having to use the <code>WebsocketConstants.SEND_TO_ALL</code> header on the 
message.</p></td></tr><tr><td colspan="1" rowspan
 ="1" class="confluenceTd"><p>staticResources</p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>null</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>The root directory for the web resources or 
classpath. Use the protocol file: or classpath: depending if you want that the 
component loads the resource from file system or 
classpath.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p>&#160;bufferSize</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>null</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><strong>Camel 2.12.3:</strong> set the buffer size of 
the websocketServlet, which is also the max frame byte size (default 
8192)</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p>maxIdleTime</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>null</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><strong>Camel 2.12.3:</strong> set the time in ms that 
the 
 websocket created by the websocketServlet may be idle before closing. (default 
is 300000)</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p>maxTextMessageSize</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><code>null</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><strong>Camel 2.12.3:</strong> can be used to set the 
size in characters that the websocket created by the websocketServlet may be 
accept before closing.</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p>maxBinaryMessageSize</p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p><code>null</code></p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p><strong>Camel 2.12.3:</strong> can be used 
to set the size in bytes that the websocket created by the websocketServlet may 
be accept before closing. (Default is -1 - or unlimited)</p></td></tr><tr><td 
colspan="1" rowspan="1" class="confluenceTd"><p>minVersion</p></td><td 
colspan="1" rowspan="1" cla
 ss="confluenceTd"><p><code>null</code></p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p><strong>Camel 2.12.3:</strong> can be used to set the 
minimum protocol version accepted for the websocketServlet. (Default 13 - the 
RFC6455 version)</p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd">sendTimeout</td><td colspan="1" rowspan="1" 
class="confluenceTd">30000</td><td colspan="1" rowspan="1" 
class="confluenceTd"><strong>Camel 2.18:</strong> Timeout in millis when 
sending to a websocket channel. The default timeout is 30000 (30 
seconds).</td></tr></tbody></table></div><p>&#160;</p><h3 
id="Websocket-MessageHeaders">Message Headers</h3><p>The websocket component 
uses 2 headers to indicate to either send messages back to a single/current 
client, or to all clients.</p><div class="table-wrap"><table 
class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" 
class="confluenceTh"><p>Key</p></th><th colspan="1" rowspan="1" 
class="confluenceTh"><p>Description</p></th
 ></tr><tr><td colspan="1" rowspan="1" 
 >class="confluenceTd"><p><code>WebsocketConstants.SEND_TO_ALL</code></p></td><td
 > colspan="1" rowspan="1" class="confluenceTd"><p>Sends the message to all 
 >clients which are currently connected. You can use the <code>sendToAll</code> 
 >option on the endpoint instead of using this header.</p></td></tr><tr><td 
 >colspan="1" rowspan="1" 
 >class="confluenceTd"><p><code>WebsocketConstants.CONNECTION_KEY</code></p></td><td
 > colspan="1" rowspan="1" class="confluenceTd"><p>Sends the message to the 
 >client with the given connection key.</p></td></tr></tbody></table></div><h3 
 >id="Websocket-Usage">Usage</h3><p>In this example we let Camel exposes a 
 >websocket server which clients can communicate with. The websocket server 
 >uses the default host and port, which would be <code>0.0.0.0:9292</code>.<br 
 >clear="none"> The example will send back an echo of the input. To send back a 
 >message, we need to send the transformed message to the same endpoint 
 ><code>"websocket://echo"<
 /code>. This is needed<br clear="none"> because by default the messaging is 
InOnly.<plain-text-body>{snippet:id=e1|lang=java|url=camel/trunk/components/camel-websocket/src/test/java/org/apache/camel/component/websocket/WebsocketRouteExampleTest.java}</plain-text-body>This
 example is part of an unit test, which you can find <a shape="rect" 
class="external-link" 
href="https://svn.apache.org/repos/asf/camel/trunk/components/camel-websocket/src/test/java/org/apache/camel/component/websocket/WebsocketRouteExampleTest.java";>here</a>.
 As a client we use the <a shape="rect" href="ahc.html">AHC</a> library which 
offers support for web socket as well.</p><p>Here is another example where 
webapp resources location have been defined to allow the Jetty Application 
Server to not only register the WebSocket servlet but also to expose web 
resources for the browser. Resources should be defined under the webapp 
directory.</p><parameter 
ac:name="">java</parameter><plain-text-body>from("activemq:topic:n
 ewsTopic")
+   .routeId("fromJMStoWebSocket")
+   
.to("websocket://localhost:8443/newsTopic?sendToAll=true&amp;staticResources=classpath:webapp");
+</plain-text-body><h3 id="Websocket-SettingupSSLforWebSocketComponent">Setting 
up SSL for WebSocket Component</h3><h4 
id="Websocket-UsingtheJSSEConfigurationUtility">Using the JSSE Configuration 
Utility</h4><p>As of Camel 2.10, the WebSocket component supports SSL/TLS 
configuration through the <a shape="rect" 
href="camel-configuration-utilities.html">Camel JSSE Configuration 
Utility</a>.&#160; This utility greatly decreases the amount of component 
specific code you need to write and is configurable at the endpoint and 
component levels.&#160; The following examples demonstrate how to use the 
utility with the Cometd component.</p><h5 
id="Websocket-Programmaticconfigurationofthecomponent">Programmatic 
configuration of the component</h5><plain-text-body>KeyStoreParameters ksp = 
new KeyStoreParameters();
+ksp.setResource("/users/home/server/keystore.jks");
+ksp.setPassword("keystorePassword");
 
 KeyManagersParameters kmp = new KeyManagersParameters();
 kmp.setKeyStore(ksp);
-kmp.setKeyPassword(&quot;keyPassword&quot;);
+kmp.setKeyPassword("keyPassword");
 
 TrustManagersParameters tmp = new TrustManagersParameters();
 tmp.setKeyStore(ksp);
@@ -121,46 +94,40 @@ SSLContextParameters scp = new SSLContex
 scp.setKeyManagers(kmp);
 scp.setTrustManagers(tmp);
 
-CometdComponent commetdComponent = 
getContext().getComponent(&quot;cometds&quot;, CometdComponent.class);
+CometdComponent commetdComponent = getContext().getComponent("cometds", 
CometdComponent.class);
 commetdComponent.setSslContextParameters(scp);
-]]></script>
-</div></div><h5 id="Websocket-SpringDSLbasedconfigurationofendpoint">Spring 
DSL based configuration of endpoint</h5><div class="code panel pdl" 
style="border-width: 1px;"><div class="codeContent panelContent pdl">
-<script class="brush: xml; gutter: false; theme: Default" 
type="syntaxhighlighter"><![CDATA[...
+</plain-text-body><h5 
id="Websocket-SpringDSLbasedconfigurationofendpoint">Spring DSL based 
configuration of endpoint</h5><parameter 
ac:name="">xml</parameter><plain-text-body>...
   &lt;camel:sslContextParameters
-      id=&quot;sslContextParameters&quot;&gt;
+      id="sslContextParameters"&gt;
     &lt;camel:keyManagers
-        keyPassword=&quot;keyPassword&quot;&gt;
+        keyPassword="keyPassword"&gt;
       &lt;camel:keyStore
-          resource=&quot;/users/home/server/keystore.jks&quot;
-          password=&quot;keystorePassword&quot;/&gt;
+          resource="/users/home/server/keystore.jks"
+          password="keystorePassword"/&gt;
     &lt;/camel:keyManagers&gt;
     &lt;camel:trustManagers&gt;
       &lt;camel:keyStore
-          resource=&quot;/users/home/server/keystore.jks&quot;
-          password=&quot;keystorePassword&quot;/&gt;
+          resource="/users/home/server/keystore.jks"
+          password="keystorePassword"/&gt;
     &lt;/camel:trustManagers&gt;
   &lt;/camel:sslContextParameters&gt;...
 ...
-  &lt;to 
uri=&quot;websocket://127.0.0.1:8443/test?sslContextParameters=#sslContextParameters&quot;/&gt;...
-]]></script>
-</div></div><h5 id="Websocket-JavaDSLbasedconfigurationofendpoint">Java DSL 
based configuration of endpoint</h5><div class="code panel pdl" 
style="border-width: 1px;"><div class="codeContent panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default" 
type="syntaxhighlighter"><![CDATA[...
+  &lt;to 
uri="websocket://127.0.0.1:8443/test?sslContextParameters=#sslContextParameters"/&gt;...
+</plain-text-body><h5 id="Websocket-JavaDSLbasedconfigurationofendpoint">Java 
DSL based configuration of endpoint</h5><parameter 
ac:name="">java</parameter><plain-text-body>...
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {
             public void configure() {
                 
-                String uri = 
&quot;websocket://127.0.0.1:8443/test?sslContextParameters=#sslContextParameters&quot;;
+                String uri = 
"websocket://127.0.0.1:8443/test?sslContextParameters=#sslContextParameters";
                 
                 from(uri)
-                     .log(&quot;&gt;&gt;&gt; Message received from WebSocket 
Client : ${body}&quot;)
-                     .to(&quot;mock:client&quot;)
+                     .log("&gt;&gt;&gt; Message received from WebSocket Client 
: ${body}")
+                     .to("mock:client")
                      .loop(10)
-                         .setBody().constant(&quot;&gt;&gt; Welcome on 
board!&quot;)
+                         .setBody().constant("&gt;&gt; Welcome on board!")
                          .to(uri);
 ...
-]]></script>
-</div></div><p></p><h3 id="Websocket-SeeAlso">See Also</h3>
-<ul><li><a shape="rect" href="configuring-camel.html">Configuring 
Camel</a></li><li><a shape="rect" 
href="component.html">Component</a></li><li><a shape="rect" 
href="endpoint.html">Endpoint</a></li><li><a shape="rect" 
href="getting-started.html">Getting Started</a></li></ul><ul 
class="alternate"><li><a shape="rect" href="ahc.html">AHC</a></li><li><a 
shape="rect" href="jetty.html">Jetty</a></li><li><a shape="rect" 
href="twitter-websocket-example.html">Twitter Websocket Example</a> 
demonstrates how to poll a constant feed of twitter searches and publish 
results in real time using web socket to a web page.</li></ul></div>
+</plain-text-body><p><parameter ac:name=""><a shape="rect" 
href="endpoint-see-also.html">Endpoint See Also</a></parameter></p><ul 
class="alternate"><li><a shape="rect" href="ahc.html">AHC</a></li><li><a 
shape="rect" href="jetty.html">Jetty</a></li><li><a shape="rect" 
href="twitter-websocket-example.html">Twitter Websocket Example</a> 
demonstrates how to poll a constant feed of twitter searches and publish 
results in real time using web socket to a web page.</li></ul></div>
         </td>
         <td valign="top">
           <div class="navigation">


Reply via email to