Author: buildbot
Date: Wed Jul 1 21:19:35 2015
New Revision: 956592
Log:
Production update by buildbot for camel
Modified:
websites/production/camel/content/cache/main.pageCache
websites/production/camel/content/camel-and-scr.html
websites/production/camel/content/debugger.html
websites/production/camel/content/is-there-an-ide.html
Modified: websites/production/camel/content/cache/main.pageCache
==============================================================================
Binary files - no diff available.
Modified: websites/production/camel/content/camel-and-scr.html
==============================================================================
--- websites/production/camel/content/camel-and-scr.html (original)
+++ websites/production/camel/content/camel-and-scr.html Wed Jul 1 21:19:35
2015
@@ -85,30 +85,30 @@
<tbody>
<tr>
<td valign="top" width="100%">
-<div class="wiki-content maincontent"><h2
id="CamelandSCR-WorkingwithCamelandSCR">Working with Camel and SCR</h2><p><span
style="font-size: 14.0px;line-height: 1.4285715;">SCR stands for Service
Component Runtime and is an implementation of OSGi Declarative Services
specification. SCR enables any plain old Java object to expose and use OSGi
services with no boilerplate code.</span></p><p>OSGi framework knows your
object by looking at SCR descriptor files in its bundle which are typically
generated from Java annotations by a plugin such as <code><a shape="rect"
class="external-link"
href="https://felix.apache.org/documentation/subprojects/apache-felix-maven-scr-plugin.html">org.apache.felix:maven-scr-plugin</a></code>.</p><p>Running
Camel in an SCR bundle is a great alternative for Spring DM and Blueprint
based solutions having significantly fewer lines of code between you and the
OSGi framework. Using SCR your bundle can remain completely in Java world;
there is no need to edit XML
or properties files. This offers you full control over everything and means
your IDE of choice knows exactly what is going on in your project.</p><h3
id="CamelandSCR-CamelSCRsupport">Camel SCR support</h3><p><strong>Available as
of Camel 2.15.0</strong></p><p> </p><div
class="confluence-information-macro
confluence-information-macro-information"><span class="aui-icon aui-icon-small
aui-iconfont-info confluence-information-macro-icon"></span><div
class="confluence-information-macro-body"><p>Camel-scr bundle is not included
in Apache Camel versions prior 2.15.0, but the artifact itself can be used with
any Camel version since 2.12.0. This means you can use Camel SCR support in,
for example, Red Hat JBoss Fuse 6.1.</p></div></div><p> </p><p><span
style="line-height: 1.4285715;"><code>org.apache.camel/camel-scr</code> bundle
provides a base class, <code>AbstractCamelRunner</code>, which manages a Camel
context for you and a helper class, <code>ScrHelper</code>, for using your
SCR properties in unit tests. Camel-scr feature for Apache
Karaf </span><span style="line-height: 1.4285715;">defines all features
and bundles required for running Camel in SCR
bundles.</span></p><p><code>AbstractCamelRunner</code> class ties
CamelContext's lifecycle to Service Component's lifecycle and handles
configuration with help of Camel's PropertiesComponent. All you have to do to
make a Service Component out of your java class is to extend it from
<code>AbstractCamelRunner</code> and add the following <code><a
shape="rect" class="external-link"
href="https://felix.apache.org/documentation/subprojects/apache-felix-maven-scr-plugin/scr-annotations.html">org.apache.felix.scr.annotations</a></code>
on class level:</p><p> </p><div class="code panel pdl"
style="border-width: 1px;"><div class="codeHeader panelHeader pdl"
style="border-bottom-width: 1px;"><b>Add required annotations</b></div><div
class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;">@Component
+<div class="wiki-content maincontent"><h2
id="CamelandSCR-WorkingwithCamelandSCR">Working with Camel and SCR</h2><p><span
style="font-size: 14.0px;line-height: 1.4285715;">SCR stands for Service
Component Runtime and is an implementation of OSGi Declarative Services
specification. SCR enables any plain old Java object to expose and use OSGi
services with no boilerplate code.</span></p><p>OSGi framework knows your
object by looking at SCR descriptor files in its bundle which are typically
generated from Java annotations by a plugin such as <code><a shape="rect"
class="external-link"
href="https://felix.apache.org/documentation/subprojects/apache-felix-maven-scr-plugin.html">org.apache.felix:maven-scr-plugin</a></code>.</p><p>Running
Camel in an SCR bundle is a great alternative for Spring DM and Blueprint
based solutions having significantly fewer lines of code between you and the
OSGi framework. Using SCR your bundle can remain completely in Java world;
there is no need to edit XML
or properties files. This offers you full control over everything and means
your IDE of choice knows exactly what is going on in your project.</p><h3
id="CamelandSCR-CamelSCRsupport">Camel SCR support</h3><p><strong>Available as
of Camel 2.15.0</strong></p><p> </p><div
class="confluence-information-macro
confluence-information-macro-information"><span class="aui-icon aui-icon-small
aui-iconfont-info confluence-information-macro-icon"></span><div
class="confluence-information-macro-body"><p>Camel-scr bundle is not included
in Apache Camel versions prior 2.15.0, but the artifact itself can be used with
any Camel version since 2.12.0.</p></div></div><p> </p><p><span
style="line-height: 1.4285715;"><code>org.apache.camel/camel-scr</code> bundle
provides a base class, <code>AbstractCamelRunner</code>, which manages a Camel
context for you and a helper class, <code>ScrHelper</code>, for using your SCR
properties in unit tests. Camel-scr feature for Apache Karaf </span><span
style="line-height: 1.4285715;">defines all features and bundles required for
running Camel in SCR
bundles.</span></p><p><code>AbstractCamelRunner</code> class ties
CamelContext's lifecycle to Service Component's lifecycle and handles
configuration with help of Camel's PropertiesComponent. All you have to do to
make a Service Component out of your java class is to extend it from
<code>AbstractCamelRunner</code> and add the following <code><a
shape="rect" class="external-link"
href="https://felix.apache.org/documentation/subprojects/apache-felix-maven-scr-plugin/scr-annotations.html">org.apache.felix.scr.annotations</a></code>
on class level:</p><p> </p><div class="code panel pdl"
style="border-width: 1px;"><div class="codeHeader panelHeader pdl"
style="border-bottom-width: 1px;"><b>Add required annotations</b></div><div
class="codeContent panelContent pdl">
+<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[@Component
@References({
- @Reference(name = "camelComponent",referenceInterface =
ComponentResolver.class,
+ @Reference(name = "camelComponent",referenceInterface =
ComponentResolver.class,
cardinality = ReferenceCardinality.MANDATORY_MULTIPLE, policy =
ReferencePolicy.DYNAMIC,
- policyOption = ReferencePolicyOption.GREEDY, bind =
"gotCamelComponent", unbind = "lostCamelComponent")
-})</pre>
+ policyOption = ReferencePolicyOption.GREEDY, bind =
"gotCamelComponent", unbind = "lostCamelComponent")
+})]]></script>
</div></div><p> </p><p>Then implement <code>getRouteBuilders()</code>
method which returns the Camel routes you want to run:</p><p> </p><div
class="code panel pdl" style="border-width: 1px;"><div class="codeHeader
panelHeader pdl" style="border-bottom-width: 1px;"><b>Implement
getRouteBuilders()</b></div><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;"> @Override
+<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[ @Override
protected List<RoutesBuilder> getRouteBuilders() {
List<RoutesBuilder> routesBuilders = new ArrayList<>();
routesBuilders.add(new YourRouteBuilderHere(registry));
routesBuilders.add(new AnotherRouteBuilderHere(registry));
return routesBuilders;
- }</pre>
+ }]]></script>
</div></div><p> </p><p>And finally provide the default configuration
with:</p><p> </p><div class="code panel pdl" style="border-width:
1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width:
1px;"><b>Default configuration in annotations</b></div><div class="codeContent
panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;">@Properties({
- @Property(name = "camelContextId", value = "my-test"),
- @Property(name = "active", value = "true"),
- @Property(name = "...", value = "..."),
+<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[@Properties({
+ @Property(name = "camelContextId", value = "my-test"),
+ @Property(name = "active", value = "true"),
+ @Property(name = "...", value = "..."),
...
-})</pre>
+})]]></script>
</div></div><p> </p><p>That's all. And if you used
<code>camel-archetype-scr</code> to generate a project all this is already
taken care of.</p><p>Below is an example of a complete Service Component class,
generated by <code>camel-archetype-scr:</code></p><p> </p><div class="code
panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl"
style="border-bottom-width: 1px;"><b>CamelScrExample.java</b></div><div
class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;">// This file was generated from
org.apache.camel.archetypes/camel-archetype-scr/2.15-SNAPSHOT
+<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[// This file was generated from
org.apache.camel.archetypes/camel-archetype-scr/2.15-SNAPSHOT
package example;
import java.util.ArrayList;
@@ -122,27 +122,27 @@ import org.apache.felix.scr.annotations.
@Component(label = CamelScrExample.COMPONENT_LABEL, description =
CamelScrExample.COMPONENT_DESCRIPTION, immediate = true, metatype = true)
@Properties({
- @Property(name = "camelContextId", value = "camel-scr-example"),
- @Property(name = "camelRouteId", value = "foo/timer-log"),
- @Property(name = "active", value = "true"),
- @Property(name = "from", value = "timer:foo?period=5000"),
- @Property(name = "to", value = "log:foo?showHeaders=true"),
- @Property(name = "messageOk", value = "Success: {{from}} -> {{to}}"),
- @Property(name = "messageError", value = "Failure: {{from}} -> {{to}}"),
- @Property(name = "maximumRedeliveries", value = "0"),
- @Property(name = "redeliveryDelay", value = "5000"),
- @Property(name = "backOffMultiplier", value = "2"),
- @Property(name = "maximumRedeliveryDelay", value = "60000")
+ @Property(name = "camelContextId", value =
"camel-scr-example"),
+ @Property(name = "camelRouteId", value =
"foo/timer-log"),
+ @Property(name = "active", value = "true"),
+ @Property(name = "from", value =
"timer:foo?period=5000"),
+ @Property(name = "to", value =
"log:foo?showHeaders=true"),
+ @Property(name = "messageOk", value = "Success: {{from}}
-> {{to}}"),
+ @Property(name = "messageError", value = "Failure: {{from}}
-> {{to}}"),
+ @Property(name = "maximumRedeliveries", value = "0"),
+ @Property(name = "redeliveryDelay", value = "5000"),
+ @Property(name = "backOffMultiplier", value = "2"),
+ @Property(name = "maximumRedeliveryDelay", value =
"60000")
})
@References({
- @Reference(name = "camelComponent",referenceInterface =
ComponentResolver.class,
+ @Reference(name = "camelComponent",referenceInterface =
ComponentResolver.class,
cardinality = ReferenceCardinality.MANDATORY_MULTIPLE, policy =
ReferencePolicy.DYNAMIC,
- policyOption = ReferencePolicyOption.GREEDY, bind =
"gotCamelComponent", unbind = "lostCamelComponent")
+ policyOption = ReferencePolicyOption.GREEDY, bind =
"gotCamelComponent", unbind = "lostCamelComponent")
})
public class CamelScrExample extends AbstractCamelRunner {
- public static final String COMPONENT_LABEL = "example.CamelScrExample";
- public static final String COMPONENT_DESCRIPTION = "This is the
description for camel-scr-example.";
+ public static final String COMPONENT_LABEL =
"example.CamelScrExample";
+ public static final String COMPONENT_DESCRIPTION = "This is the
description for camel-scr-example.";
@Override
protected List<RoutesBuilder> getRouteBuilders() {
@@ -150,9 +150,9 @@ public class CamelScrExample extends Abs
routesBuilders.add(new CamelScrExampleRoute(registry));
return routesBuilders;
}
-}</pre>
+}]]></script>
</div></div><p> </p><p><code style="font-size: 14.0px;line-height:
1.4285715;">CamelContextId</code><span style="font-size: 14.0px;line-height:
1.4285715;"> and </span><code style="font-size: 14.0px;line-height:
1.4285715;">active</code><span style="font-size: 14.0px;line-height:
1.4285715;"> properties control the CamelContext's name (defaults to
"camel-runner-default") and whether it will be started or not (defaults to
"false"), respectively. In addition to these you can add and use as many
properties as you like. Camel's PropertiesComponent handles recursive
properties and prefixing with fallback without
problem.</span></p><p><code>AbstractCamelRunner</code> will make these
properties available to your RouteBuilders with help of Camel's
PropertiesComponent and it will also inject these values into your Service
Component's and RouteBuilder's fields when their names match. The fields can be
declared with any visibility level, and many types are supported (String
, int, boolean, URL, ...).</p><p>Below is an example of a RouteBuilder class
generated by <code>camel-archetype-scr</code>:</p><p> </p><div class="code
panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl"
style="border-bottom-width: 1px;"><b>CamelScrExampleRoute.java</b></div><div
class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;">// This file was generated from
org.apache.camel.archetypes/camel-archetype-scr/2.15-SNAPSHOT
+<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[// This file was generated from
org.apache.camel.archetypes/camel-archetype-scr/2.15-SNAPSHOT
package example.internal;
import org.apache.camel.LoggingLevel;
@@ -180,7 +180,7 @@ public class CamelScrExampleRoute extend
checkProperties();
// Add a bean to Camel context registry
- registry.put("test", "bean");
+ registry.put("test", "bean");
errorHandler(defaultErrorHandler()
.retryAttemptedLogLevel(LoggingLevel.WARN)
@@ -189,89 +189,89 @@ public class CamelScrExampleRoute extend
.backOffMultiplier(backOffMultiplier)
.maximumRedeliveryDelay(maximumRedeliveryDelay));
- from("{{from}}")
+ from("{{from}}")
.startupOrder(2)
.routeId(camelRouteId)
.onCompletion()
- .to("direct:processCompletion")
+ .to("direct:processCompletion")
.end()
- .removeHeaders("CamelHttp*")
- .to("{{to}}");
+ .removeHeaders("CamelHttp*")
+ .to("{{to}}");
- from("direct:processCompletion")
+ from("direct:processCompletion")
.startupOrder(1)
- .routeId(camelRouteId + ".completion")
+ .routeId(camelRouteId + ".completion")
.choice()
- .when(simple("${exception} == null"))
- .log("{{messageOk}}")
+ .when(simple("${exception} == null"))
+ .log("{{messageOk}}")
.otherwise()
- .log(LoggingLevel.ERROR, "{{messageError}}")
+ .log(LoggingLevel.ERROR, "{{messageError}}")
.end();
}
}
public void checkProperties() {
- Validate.notNull(camelRouteId, "camelRouteId property is not set");
- Validate.notNull(maximumRedeliveries, "maximumRedeliveries property is
not set");
- Validate.notNull(redeliveryDelay, "redeliveryDelay property is not
set");
- Validate.notNull(backOffMultiplier, "backOffMultiplier property is not
set");
- Validate.notNull(maximumRedeliveryDelay, "maximumRedeliveryDelay
property is not set");
+ Validate.notNull(camelRouteId, "camelRouteId property is not
set");
+ Validate.notNull(maximumRedeliveries, "maximumRedeliveries
property is not set");
+ Validate.notNull(redeliveryDelay, "redeliveryDelay property is
not set");
+ Validate.notNull(backOffMultiplier, "backOffMultiplier property
is not set");
+ Validate.notNull(maximumRedeliveryDelay, "maximumRedeliveryDelay
property is not set");
}
-}</pre>
+}]]></script>
</div></div><p> </p><p>Let's take a look at
<code>CamelScrExampleRoute</code> in more detail.</p><p> </p><div
class="code panel pdl" style="border-width: 1px;"><div class="codeContent
panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;"> // Configured fields
+<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[ // Configured fields
private String camelRouteId;
private Integer maximumRedeliveries;
private Long redeliveryDelay;
private Double backOffMultiplier;
- private Long maximumRedeliveryDelay;</pre>
+ private Long maximumRedeliveryDelay;]]></script>
</div></div><p>The values of these fields are set with values from properties
by matching their names.</p><p> </p><div class="code panel pdl"
style="border-width: 1px;"><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;"> // Add a bean to Camel context registry
- registry.put("test", "bean");</pre>
+<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[ // Add a bean to Camel context
registry
+ registry.put("test", "bean");]]></script>
</div></div><p>If you need to add some beans to CamelContext's registry for
your routes, you can do it like this.</p><p> </p><div class="code panel
pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;"> public void checkProperties() {
- Validate.notNull(camelRouteId, "camelRouteId property is not set");
- Validate.notNull(maximumRedeliveries, "maximumRedeliveries property is
not set");
- Validate.notNull(redeliveryDelay, "redeliveryDelay property is not
set");
- Validate.notNull(backOffMultiplier, "backOffMultiplier property is not
set");
- Validate.notNull(maximumRedeliveryDelay, "maximumRedeliveryDelay
property is not set");
- }</pre>
+<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[ public void checkProperties() {
+ Validate.notNull(camelRouteId, "camelRouteId property is not
set");
+ Validate.notNull(maximumRedeliveries, "maximumRedeliveries
property is not set");
+ Validate.notNull(redeliveryDelay, "redeliveryDelay property is
not set");
+ Validate.notNull(backOffMultiplier, "backOffMultiplier property
is not set");
+ Validate.notNull(maximumRedeliveryDelay, "maximumRedeliveryDelay
property is not set");
+ }]]></script>
</div></div><p>It is a good idea to check that required parameters are set and
they have meaningful values before allowing the routes to
start.</p><p> </p><div class="code panel pdl" style="border-width:
1px;"><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;"> from("{{from}}")
+<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[ from("{{from}}")
.startupOrder(2)
.routeId(camelRouteId)
.onCompletion()
- .to("direct:processCompletion")
+ .to("direct:processCompletion")
.end()
- .removeHeaders("CamelHttp*")
- .to("{{to}}");
+ .removeHeaders("CamelHttp*")
+ .to("{{to}}");
- from("direct:processCompletion")
+ from("direct:processCompletion")
.startupOrder(1)
- .routeId(camelRouteId + ".completion")
+ .routeId(camelRouteId + ".completion")
.choice()
- .when(simple("${exception} == null"))
- .log("{{messageOk}}")
+ .when(simple("${exception} == null"))
+ .log("{{messageOk}}")
.otherwise()
- .log(LoggingLevel.ERROR, "{{messageError}}")
- .end();</pre>
+ .log(LoggingLevel.ERROR, "{{messageError}}")
+ .end();]]></script>
</div></div><p>Note that pretty much everything in the route is configured
with properties. This essentially makes your RouteBuilder a template. SCR
allows you to create more instances of your routes just by providing
alternative configurations. More on this in section <em>Using Camel SCR bundle
as a template</em>.</p><h4
id="CamelandSCR-AbstractCamelRunner'slifecycleinSCR">AbstractCamelRunner's
lifecycle in SCR</h4><ol><li>When component's configuration policy and
mandatory references are satisfied SCR calls <code>activate()</code>. This
creates and sets up a CamelContext through the following call chain:
<code>activate()</code> → <code>prepare()</code> → <code>createCamelContext()</code>
→ <code>setupPropertiesComponent()</code>
→ <code>configure()</code>
→ <code>setupCamelContext()</code>. Finally, the context is
scheduled to start after a delay defined in
<code>AbstractCamelRunner.START_DELAY</code> with <code
>runWithDelay()</code>.</li><li><span style="line-height: 1.4285715;">When
>Camel components (<code>ComponentResolver</code> services, to be exact) are
>registered in OSGi, SCR calls </span><code>gotCamelComponent</code><span
>style="line-height: 1.4285715;"><code>()</code> which reschedules/delays the
>CamelContext start further by the same
></span><code>AbstractCamelRunner.START_DELAY</code><span style="line-height:
>1.4285715;">. This in effect makes CamelContext wait until all Camel
>components are loaded or there is a sufficient gap between them. The same
>logic will tell a failed-to-start CamelContext to try again whenever we add
>more Camel components.</span></li><li><span style="line-height:
>1.4285715;">When Camel components are unregistered SCR calls
></span><code>lostCamelComponent</code><span style="line-height:
>1.4285715;"><code>()</code>. This call does nothing.</span></li><li><span
>style="line-height: 1.4285715;">When one of the requirements that caused the
>call to </span><code>
activate</code><span style="line-height: 1.4285715;"><code>()</code> is lost
SCR will call </span><code>deactivate</code><span style="line-height:
1.4285715;"><code>()</code>. This will shutdown the
CamelContext.</span></li></ol><p>In (non-OSGi) unit tests you should use
<code>prepare()</code> → <code>run()</code>
→ <code>stop()</code> instead of <code>activate()</code>
→ <code>deactivate()</code> for more fine-grained control. Also,
this allows us to avoid possible SCR specific operations in tests.</p><h3
id="CamelandSCR-Usingcamel-archetype-scr">Using camel-archetype-scr</h3><p>The
easiest way to create an Camel SCR bundle project is to use
<code>camel-archetype-scr</code> and Maven.</p><p>You can generate a
project with the following steps:</p><div class="code panel pdl"
style="border-width: 1px;"><div class="codeHeader panelHeader pdl"
style="border-bottom-width: 1px;"><b>Generating a project</b></div><div
class="codeContent panelContent pdl
">
-<pre class="brush: text; gutter: false; theme: Default"
style="font-size:12px;">$ mvn archetype:generate
-Dfilter=org.apache.camel.archetypes:camel-archetype-scr
- 
+<script class="brush: text; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[$ mvn archetype:generate
-Dfilter=org.apache.camel.archetypes:camel-archetype-scr
+Â
Choose archetype:
1: local -> org.apache.camel.archetypes:camel-archetype-scr (Creates a new
Camel SCR bundle project for Karaf)
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive
contains): : 1
-Define value for property 'groupId': : example
+Define value for property 'groupId': : example
[INFO] Using property: groupId = example
-Define value for property 'artifactId': : camel-scr-example
-Define value for property 'version': 1.0-SNAPSHOT: :
-Define value for property 'package': example: :
+Define value for property 'artifactId': : camel-scr-example
+Define value for property 'version': 1.0-SNAPSHOT: :
+Define value for property 'package': example: :
[INFO] Using property: archetypeArtifactId = camel-archetype-scr
[INFO] Using property: archetypeGroupId = org.apache.camel.archetypes
[INFO] Using property: archetypeVersion = 2.15-SNAPSHOT
-Define value for property 'className': : CamelScrExample
+Define value for property 'className': : CamelScrExample
Confirm properties configuration:
groupId: example
artifactId: camel-scr-example
@@ -281,11 +281,11 @@ archetypeArtifactId: camel-archetype-scr
archetypeGroupId: org.apache.camel.archetypes
archetypeVersion: 2.15-SNAPSHOT
className: CamelScrExample
-Y: :</pre>
+Y: :]]></script>
</div></div><p><span style="font-size: 14.0px;line-height:
1.4285715;">Done!</span></p><p><span style="font-size: 14.0px;line-height:
1.4285715;">Now run:</span></p><div class="code panel pdl" style="border-width:
1px;"><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;">mvn install</pre>
+<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[mvn install]]></script>
</div></div><p>and the bundle is ready to be deployed.</p><h3
id="CamelandSCR-UnittestingCamelroutes">Unit testing Camel
routes</h3><p>Service Component is a POJO and has no special requirements for
(non-OSGi) unit testing. There are however some techniques that are specific to
Camel SCR or just make testing easier.</p><p><span style="line-height:
1.4285715;">Below is an example unit test, generated by </span><code
style="line-height: 1.4285715;">camel-archetype-scr</code><span
style="line-height: 1.4285715;">:</span></p><p><span style="line-height:
1.4285715;"><br clear="none"></span></p><div class="code panel pdl"
style="border-width: 1px;"><div class="codeHeader panelHeader pdl"
style="border-bottom-width: 1px;"><b>CamelScrExampleTest.java</b></div><div
class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;">// This file was generated from
org.apache.camel.archetypes/camel-archetype-scr/2.15-SNAPSHOT
+<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[// This file was generated from
org.apache.camel.archetypes/camel-archetype-scr/2.15-SNAPSHOT
package example;
import java.util.List;
@@ -319,12 +319,12 @@ public class CamelScrExampleTest {
@Before
public void setUp() throws Exception {
-
log.info("*******************************************************************");
- log.info("Test: " + testName.getMethodName());
-
log.info("*******************************************************************");
+
log.info("*******************************************************************");
+ log.info("Test: " + testName.getMethodName());
+
log.info("*******************************************************************");
// Set property prefix for unit testing
- System.setProperty(CamelScrExample.PROPERTY_PREFIX, "unit");
+ System.setProperty(CamelScrExample.PROPERTY_PREFIX, "unit");
// Prepare the integration
integration = new CamelScrExample();
@@ -335,7 +335,7 @@ public class CamelScrExampleTest {
context.disableJMX();
// Fake a component for test
- context.addComponent("amq", new MockComponent());
+ context.addComponent("amq", new MockComponent());
}
@After
@@ -351,90 +351,90 @@ public class CamelScrExampleTest {
routes.get(0).adviceWith(context, new AdviceWithRouteBuilder() {
@Override
public void configure() throws Exception {
- // Replace "from" endpoint with direct:start
- replaceFromWith("direct:start");
+ // Replace "from" endpoint with direct:start
+ replaceFromWith("direct:start");
// Mock and skip result endpoint
- mockEndpoints("log:*");
+ mockEndpoints("log:*");
}
});
- MockEndpoint resultEndpoint = context.getEndpoint("mock:log:foo",
MockEndpoint.class);
+ MockEndpoint resultEndpoint =
context.getEndpoint("mock:log:foo", MockEndpoint.class);
// resultEndpoint.expectedMessageCount(1); // If you want to just
check the number of messages
- resultEndpoint.expectedBodiesReceived("hello"); // If you want to
check the contents
+ resultEndpoint.expectedBodiesReceived("hello"); // If you
want to check the contents
// Start the integration
integration.run();
// Send the test message
- context.createProducerTemplate().sendBody("direct:start", "hello");
+ context.createProducerTemplate().sendBody("direct:start",
"hello");
resultEndpoint.assertIsSatisfied();
}
-}</pre>
+}]]></script>
</div></div><p> </p><p>Now, let's take a look at the interesting bits one
by one.</p><p> </p><div class="code panel pdl" style="border-width:
1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width:
1px;"><b>Using property prefixing</b></div><div class="codeContent panelContent
pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;"> // Set property prefix for unit testing
- System.setProperty(CamelScrExample.PROPERTY_PREFIX, "unit");</pre>
+<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[ // Set property prefix for unit
testing
+ System.setProperty(CamelScrExample.PROPERTY_PREFIX,
"unit");]]></script>
</div></div><p>This allows you to override parts of the configuration by
prefixing properties with "unit.". For example, <code>unit.from</code>
overrides <code>from</code> for the unit test.</p><p>Prefixes can be used to
handle the differences between the runtime environments where your routes might
run. Moving the unchanged bundle through development, testing and production
environments is a typical use case.</p><p> </p><div class="code panel pdl"
style="border-width: 1px;"><div class="codeHeader panelHeader pdl"
style="border-bottom-width: 1px;"><b>Getting test configuration from
annotations</b></div><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;"> integration.prepare(null,
ScrHelper.getScrProperties(integration.getClass().getName()));</pre>
+<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[ integration.prepare(null,
ScrHelper.getScrProperties(integration.getClass().getName()));]]></script>
</div></div><p>Here we configure the Service Component in test with the same
properties that would be used in OSGi environment.</p><p> </p><div
class="code panel pdl" style="border-width: 1px;"><div class="codeHeader
panelHeader pdl" style="border-bottom-width: 1px;"><b>Mocking components for
test</b></div><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;"> // Fake a component for test
- context.addComponent("amq", new MockComponent());</pre>
+<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[ // Fake a component for test
+ context.addComponent("amq", new MockComponent());]]></script>
</div></div><p>Components that are not available in test can be mocked like
this to allow the route to start.</p><p> </p><div class="code panel pdl"
style="border-width: 1px;"><div class="codeHeader panelHeader pdl"
style="border-bottom-width: 1px;"><b>Adjusting routes for test</b></div><div
class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;"> // Adjust routes
+<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[ // Adjust routes
List<RouteDefinition> routes = context.getRouteDefinitions();
routes.get(0).adviceWith(context, new AdviceWithRouteBuilder() {
@Override
public void configure() throws Exception {
- // Replace "from" endpoint with direct:start
- replaceFromWith("direct:start");
+ // Replace "from" endpoint with direct:start
+ replaceFromWith("direct:start");
// Mock and skip result endpoint
- mockEndpoints("log:*");
+ mockEndpoints("log:*");
}
- });</pre>
+ });]]></script>
</div></div><p>Camel's AdviceWith feature allows routes to be modified for
test.</p><p> </p><div class="code panel pdl" style="border-width:
1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width:
1px;"><b>Starting the routes</b></div><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;"> // Start the integration
- integration.run();</pre>
+<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[ // Start the integration
+ integration.run();]]></script>
</div></div><p>Here we start the Service Component and along with it the
routes.</p><p> </p><div class="code panel pdl" style="border-width:
1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width:
1px;"><b>Sending a test message</b></div><div class="codeContent panelContent
pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;"> // Send the test message
- context.createProducerTemplate().sendBody("direct:start",
"hello");</pre>
+<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[ // Send the test message
+ context.createProducerTemplate().sendBody("direct:start",
"hello");]]></script>
</div></div><p>Here we send a message to a route in test.</p><h3
id="CamelandSCR-RunningthebundleinApacheKaraf">Running the bundle in Apache
Karaf</h3><p>Once the bundle has been built with <code>mvn install</code> it's
ready to be deployed. <span style="font-size: 14.0px;line-height:
1.4285715;">To deploy the bundle on Apache Karaf perform the following steps on
Karaf command line:</span></p><div class="code panel pdl" style="border-width:
1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width:
1px;"><b>Deploying the bundle in Apache Karaf</b></div><div class="codeContent
panelContent pdl">
-<pre class="brush: text; gutter: false; theme: Default"
style="font-size:12px;"># Add Camel feature repository
+<script class="brush: text; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[# Add Camel feature repository
karaf@root> features:chooseurl camel 2.15-SNAPSHOT
- 
+Â
# Install camel-scr feature
karaf@root> features:install camel-scr
- 
+Â
# Install commons-lang, used in the example route to validate parameters
karaf@root> osgi:install mvn:commons-lang/commons-lang/2.6
- 
+Â
# Install and start your bundle
karaf@root> osgi:install -s mvn:example/camel-scr-example/1.0-SNAPSHOT
- 
-# See how it's running
+Â
+# See how it's running
karaf@root> log:tail -n 10
- 
-Press ctrl-c to stop watching the log.</pre>
+Â
+Press ctrl-c to stop watching the log.]]></script>
</div></div><h4 id="CamelandSCR-Overridingthedefaultconfiguration"><span
style="font-size: 14.0px;line-height: 1.4285715;">Overriding the default
configuration</span></h4><p>By default, Service Component's configuration PID
equals the fully qualified name of its class. You can change the example
bundle's properties with Karaf's <code>config:*</code> commands:</p><div
class="code panel pdl" style="border-width: 1px;"><div class="codeHeader
panelHeader pdl" style="border-bottom-width: 1px;"><b>Override a
property</b></div><div class="codeContent panelContent pdl">
-<pre class="brush: text; gutter: false; theme: Default"
style="font-size:12px;"># Override 'messageOk' property
-karaf@root> config:propset -p example.CamelScrExample messageOk "This is
better logging"</pre>
+<script class="brush: text; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[# Override 'messageOk' property
+karaf@root> config:propset -p example.CamelScrExample messageOk "This
is better logging"]]></script>
</div></div><p>Or you can change the configuration by editing property files
in Karaf's <code>etc</code> folder.</p><h4
id="CamelandSCR-UsingCamelSCRbundleasatemplate"><span style="font-size:
16.0px;line-height: 1.5625;">Using Camel SCR bundle as a
template</span></h4><p>Let's say you have a Camel SCR bundle that implements an
integration pattern that you use frequently, say, <strong>from
→ to</strong>, with success/failure logging and redelivery which
also happens to be the pattern our example route implements. You probably don't
want to create a separate bundle for every instance. No worries, SCR has you
covered.</p><p>Create a configuration PID for your Service Component, but add a
tail with a dash and SCR will use that configuration to create a new instance
of your component.</p><div class="code panel pdl" style="border-width:
1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width:
1px;"><b>Creating a new Service Component instance</b></div><div clas
s="codeContent panelContent pdl">
-<pre class="brush: text; gutter: false; theme: Default"
style="font-size:12px;"># Create a PID with a tail
+<script class="brush: text; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[# Create a PID with a tail
karaf@root> config:edit example.CamelScrExample-anotherone
- 
+Â
# Override some properties
karaf@root> config:propset camelContextId my-other-context
-karaf@root> config:propset to "file://removeme?fileName=removemetoo.txt"
- 
+karaf@root> config:propset to
"file://removeme?fileName=removemetoo.txt"
+Â
# Save the PID
-karaf@root> config:update</pre>
+karaf@root> config:update]]></script>
</div></div><p>This will start a new CamelContext with your overridden
properties. How convenient.</p><div class="confluence-information-macro
confluence-information-macro-tip"><span class="aui-icon aui-icon-small
aui-iconfont-approve confluence-information-macro-icon"></span><div
class="confluence-information-macro-body"><p>When designing a Service Component
to be a template you typically don't want it to start without a "tailed"
configuration i.e. with the default configuration.</p><p>To prevent your
Service Component from starting with the default configuration add <code><span
style="font-size: 14.0px;line-height: 1.4285715;">policy =
ConfigurationPolicy.</span><span style="font-size: 14.0px;line-height:
1.4285715;">REQUIRE </span></code><span style="font-family: Arial ,
sans-serif;font-size: 14.0px;line-height: 1.4285715;">to the class level
</span><code style="font-size: 14.0px;line-height:
1.4285715;">@Component</code><span style="font-family: Arial ,
sans-serif;font-size: 14.
0px;line-height: 1.4285715;"> annotation.</span></p></div></div></div>
</td>
<td valign="top">
<div class="navigation">
<div class="navigation_top">
<!-- NavigationBar -->
-<div class="navigation_bottom" id="navigation_bottom"><h3
id="Navigation-Overviewhttps://cwiki.apache.org/confluence/pages/viewpage.action?pageId=49132"><a
shape="rect" href="overview.html">Overview</a></h3><ul
class="alternate"><li><a shape="rect" href="index.html">Home</a></li><li><a
shape="rect" href="download.html">Download</a></li><li><a shape="rect"
href="getting-started.html">Getting Started</a></li><li><a shape="rect"
href="faq.html">FAQ</a></li></ul><h3
id="Navigation-Documentationhttps://cwiki.apache.org/confluence/pages/viewpage.action?pageId=49534"><a
shape="rect" href="documentation.html">Documentation</a></h3><ul
class="alternate"><li><a shape="rect" href="user-guide.html">User
Guide</a></li><li><a shape="rect" href="manual.html">Manual</a></li><li><a
shape="rect" href="books.html">Books</a></li><li><a shape="rect"
href="tutorials.html">Tutorials</a></li><li><a shape="rect"
href="examples.html">Examples</a></li><li><a shape="rect"
href="cookbook.html">Cookbook</a></li>
<li><a shape="rect" href="architecture.html">Architecture</a></li><li><a
shape="rect" href="enterprise-integration-patterns.html">Enterprise Integration
Patterns</a></li><li><a shape="rect" href="dsl.html">DSL</a></li><li><a
shape="rect" href="components.html">Components</a></li><li><a shape="rect"
href="data-format.html">Data Format</a></li><li><a shape="rect"
href="languages.html">Languages</a></li><li><a shape="rect"
href="security.html">Security</a></li><li><a shape="rect"
href="security-advisories.html">Security Advisories</a></li></ul><h3
id="Navigation-Search">Search</h3><form
enctype="application/x-www-form-urlencoded" method="get" id="cse-search-box"
action="http://www.google.com/cse">
+<div class="navigation_bottom" id="navigation_bottom"><h3
id="Navigation-Overview"><a shape="rect"
href="overview.html">Overview</a></h3><ul class="alternate"><li><a shape="rect"
href="index.html">Home</a></li><li><a shape="rect"
href="download.html">Download</a></li><li><a shape="rect"
href="getting-started.html">Getting Started</a></li><li><a shape="rect"
href="faq.html">FAQ</a></li></ul><h3 id="Navigation-Documentation"><a
shape="rect" href="documentation.html">Documentation</a></h3><ul
class="alternate"><li><a shape="rect" href="user-guide.html">User
Guide</a></li><li><a shape="rect" href="manual.html">Manual</a></li><li><a
shape="rect" href="books.html">Books</a></li><li><a shape="rect"
href="tutorials.html">Tutorials</a></li><li><a shape="rect"
href="examples.html">Examples</a></li><li><a shape="rect"
href="cookbook.html">Cookbook</a></li><li><a shape="rect"
href="architecture.html">Architecture</a></li><li><a shape="rect"
href="enterprise-integration-patterns.html">Enterprise
Integration Patterns</a></li><li><a shape="rect"
href="dsl.html">DSL</a></li><li><a shape="rect"
href="components.html">Components</a></li><li><a shape="rect"
href="data-format.html">Data Format</a></li><li><a shape="rect"
href="languages.html">Languages</a></li><li><a shape="rect"
href="security.html">Security</a></li><li><a shape="rect"
href="security-advisories.html">Security Advisories</a></li></ul><h3
id="Navigation-Search">Search</h3><form
enctype="application/x-www-form-urlencoded" method="get" id="cse-search-box"
action="http://www.google.com/cse">
<div>
<input type="hidden" name="cx" value="007878419884033443453:m5nhvy4hmyq">
<input type="hidden" name="ie" value="UTF-8">
@@ -442,7 +442,7 @@ karaf@root> config:update</pre>
<input type="submit" name="sa" value="Search">
</div>
</form>
-<script type="text/javascript"
src="http://www.google.com/coop/cse/brand?form=cse-search-box&lang=en"></script><h3
id="Navigation-Communityhttps://cwiki.apache.org/confluence/pages/viewpage.action?pageId=49115"><a
shape="rect" href="community.html">Community</a></h3><ul
class="alternate"><li><a shape="rect"
href="support.html">Support</a></li><li><a shape="rect"
href="contributing.html">Contributing</a></li><li><a shape="rect"
href="discussion-forums.html">Discussion Forums</a></li><li><a shape="rect"
href="mailing-lists.html">Mailing Lists</a></li><li><a shape="rect"
href="user-stories.html">User Stories</a></li><li><a shape="rect"
href="news.html">News</a></li><li><a shape="rect"
href="articles.html">Articles</a></li><li><a shape="rect"
href="site.html">Site</a></li><li><a shape="rect"
href="team.html">Team</a></li><li><a shape="rect" class="external-link"
href="http://camel-extra.googlecode.com/" rel="nofollow">Camel
Extra</a></li></ul><h3 id="Navigation-Developershttps://cwi
ki.apache.org/confluence/pages/viewpage.action?pageId=49124"><a shape="rect"
href="developers.html">Developers</a></h3><ul class="alternate"><li><a
shape="rect" href="developers.html">Developer Guide</a></li><li><a shape="rect"
href="source.html">Source</a></li><li><a shape="rect"
href="building.html">Building</a></li><li><a shape="rect"
href="javadoc.html">JavaDoc</a></li><li><a shape="rect"
href="irc-room.html">IRC Room</a></li></ul><h3
id="Navigation-ApacheSoftwareFoundation">Apache Software Foundation</h3><ul
class="alternate"><li><a shape="rect" class="external-link"
href="http://www.apache.org/licenses/">License</a></li><li><a shape="rect"
class="external-link"
href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a
shape="rect" class="external-link"
href="http://www.apache.org/foundation/thanks.html">Thanks</a></li><li><a
shape="rect" class="external-link"
href="http://www.apache.org/security/">Security</a></li></ul></div>
+<script type="text/javascript"
src="http://www.google.com/coop/cse/brand?form=cse-search-box&lang=en"></script><h3
id="Navigation-Community"><a shape="rect"
href="community.html">Community</a></h3><ul class="alternate"><li><a
shape="rect" href="support.html">Support</a></li><li><a shape="rect"
href="contributing.html">Contributing</a></li><li><a shape="rect"
href="discussion-forums.html">Discussion Forums</a></li><li><a shape="rect"
href="mailing-lists.html">Mailing Lists</a></li><li><a shape="rect"
href="user-stories.html">User Stories</a></li><li><a shape="rect"
href="news.html">News</a></li><li><a shape="rect"
href="articles.html">Articles</a></li><li><a shape="rect"
href="site.html">Site</a></li><li><a shape="rect"
href="team.html">Team</a></li><li><a shape="rect" class="external-link"
href="http://camel-extra.googlecode.com/" rel="nofollow">Camel
Extra</a></li></ul><h3 id="Navigation-Developers"><a shape="rect"
href="developers.html">Developers</a></h3><ul class="alternate"
><li><a shape="rect" href="developers.html">Developer Guide</a></li><li><a
>shape="rect" href="source.html">Source</a></li><li><a shape="rect"
>href="building.html">Building</a></li><li><a shape="rect"
>href="javadoc.html">JavaDoc</a></li><li><a shape="rect"
>href="irc-room.html">IRC Room</a></li></ul><h3
>id="Navigation-ApacheSoftwareFoundation">Apache Software Foundation</h3><ul
>class="alternate"><li><a shape="rect" class="external-link"
>href="http://www.apache.org/licenses/">License</a></li><li><a shape="rect"
>class="external-link"
>href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a
> shape="rect" class="external-link"
>href="http://www.apache.org/foundation/thanks.html">Thanks</a></li><li><a
>shape="rect" class="external-link"
>href="http://www.apache.org/security/">Security</a></li></ul></div>
<!-- NavigationBar -->
</div>
</div>
Modified: websites/production/camel/content/debugger.html
==============================================================================
--- websites/production/camel/content/debugger.html (original)
+++ websites/production/camel/content/debugger.html Wed Jul 1 21:19:35 2015
@@ -86,42 +86,10 @@
<tbody>
<tr>
<td valign="top" width="100%">
-<div class="wiki-content maincontent"><h2 id="Debugger-Debugger">Debugger </h2>
-<p><strong>Available as of Camel 2.6</strong></p>
-
-<p>Camel <a shape="rect" href="debugger.html">Debugger</a> is much related to
<a shape="rect" href="tracer.html">Tracer</a>, in fact they are sisters.
Debugger is a enhanced tracer with a debugger framework so that tooling can be
developed to easily monitor Camel routes, trace messages and set breakpoints at
points in a route etc.</p>
-
-<div class="confluence-information-macro
confluence-information-macro-tip"><span class="aui-icon aui-icon-small
aui-iconfont-approve confluence-information-macro-icon"></span><div
class="confluence-information-macro-body">
-<p>There is also a <a shape="rect"
href="backlogdebugger.html">BacklogDebugger</a> which allows to debug from JMX,
and 3rd party tooling such as the <a shape="rect" class="external-link"
href="http://hawt.io/" rel="nofollow">hawtio</a> web console.</p></div></div>
-
-<h3 id="Debugger-AbouttheDebugger">About the Debugger</h3>
-
-<p>The Debugger allows tooling or the likes to attach breakpoints which is
being invoked when <a shape="rect" href="exchange.html">Exchange</a>s is being
routed.</p>
-
-<h3 id="Debugger-Defaultimplementation">Default implementation</h3>
-
-<p>Camel provides a default implementation
<code>org.apache.camel.impl.DefaultDebugger</code> which you can set on the
<code>CamelContext</code> using the <code>setDebugger</code> method.<br
clear="none">
-Likewise you can get hold of the <a shape="rect"
href="debugger.html">Debugger</a> using the <code>getDebugger</code> method on
<code>CamelContext</code>.</p>
-
-<p>The <code>org.apache.camel.spi.Debugger</code> has methods to attach and
remove breakpoints. And to suspend/resume all breakpoints etc.<br clear="none">
-You can also attach a condition to the breakpoint so it only reacts if the
condition matches.</p>
-
-<h3 id="Debugger-EasilydebuggingCamelroutesfromcamel-test">Easily debugging
Camel routes from <code>camel-test</code></h3>
-
-<p>If you are developing unit tests using the <code>camel-test</code>
component, then the <a shape="rect" href="debugger.html">Debugger</a> comes out
of the box.<br clear="none">
-From <strong>Camel 2.9</strong> onwards you would need to explicit enable the
debugger, by overriding <code>isUseDebugger()</code> method and return
<code>true</code>.</p>
-
-<h4 id="Debugger-Example">Example </h4>
-
-<p>In this unit test</p>
-<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent
panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;">
-public class DebugTest extends CamelTestSupport
-</pre>
-</div></div>
-
-<p>We want to debug the following route</p>
-<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent
panelContent pdl">
+<div class="wiki-content maincontent"><h2
id="Debugger-Debugger">Debugger</h2><p><strong>Available as of Camel
2.6</strong></p><p>Camel <a shape="rect" href="debugger.html">Debugger</a> is
much related to <a shape="rect" href="tracer.html">Tracer</a>, in fact they are
sisters. Debugger is a enhanced tracer with a debugger framework so that
tooling can be developed to easily monitor Camel routes, trace messages and set
breakpoints at points in a route etc.</p><div
class="confluence-information-macro confluence-information-macro-tip"><span
class="aui-icon aui-icon-small aui-iconfont-approve
confluence-information-macro-icon"></span><div
class="confluence-information-macro-body"><p>There is also a <a shape="rect"
href="backlogdebugger.html">BacklogDebugger</a> which allows to debug from JMX,
and 3rd party tooling.</p></div></div><h3 id="Debugger-AbouttheDebugger">About
the Debugger</h3><p>The Debugger allows tooling or the likes to attach
breakpoints which is being invoked when <a shap
e="rect" href="exchange.html">Exchange</a>s is being routed.</p><h3
id="Debugger-Defaultimplementation">Default implementation</h3><p>Camel
provides a default implementation
<code>org.apache.camel.impl.DefaultDebugger</code> which you can set on the
<code>CamelContext</code> using the <code>setDebugger</code> method.<br
clear="none"> Likewise you can get hold of the <a shape="rect"
href="debugger.html">Debugger</a> using the <code>getDebugger</code> method on
<code>CamelContext</code>.</p><p>The <code>org.apache.camel.spi.Debugger</code>
has methods to attach and remove breakpoints. And to suspend/resume all
breakpoints etc.<br clear="none"> You can also attach a condition to the
breakpoint so it only reacts if the condition matches.</p><h3
id="Debugger-EasilydebuggingCamelroutesfromcamel-test">Easily debugging Camel
routes from <code>camel-test</code></h3><p>If you are developing unit tests
using the <code>camel-test</code> component, then the <a shape="rect"
href="debugger.html">D
ebugger</a> comes out of the box.<br clear="none"> From <strong>Camel
2.9</strong> onwards you would need to explicit enable the debugger, by
overriding <code>isUseDebugger()</code> method and return
<code>true</code>.</p><h4 id="Debugger-Example">Example</h4><p>In this unit
test</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[public class DebugTest extends
CamelTestSupport
+]]></script>
+</div></div><p>We want to debug the following route</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[
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
@@ -137,10 +105,7 @@ protected RouteBuilder createRouteBuilde
};
}
]]></script>
-</div></div>
-
-<p>Which can easily done by overriding the <code>debugBefore</code> method as
shown</p>
-<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent
panelContent pdl">
+</div></div>Which can easily done by overriding the <code>debugBefore</code>
method as shown<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[
@Override
public boolean isUseDebugger() {
@@ -156,26 +121,13 @@ protected void debugBefore(Exchange exch
log.info("Before " + definition + " with body " +
exchange.getIn().getBody());
}
]]></script>
-</div></div>
-
-<p>Then from your Java editor just add a breakpoint inside the
<code>debugBefore</code> method. Then fire up the unit test and wait for the
Java editor to hit the breakpoint. Then you can inspect the <a shape="rect"
href="exchange.html">Exchange</a> during debugging while it advances during
routing. The <code>ProcessorDefinition</code> and the <code>id</code> and
<code>shortName</code> parameters is all information which tells you where in
the route the breakpoint was hit.</p>
-
-<div class="confluence-information-macro
confluence-information-macro-tip"><span class="aui-icon aui-icon-small
aui-iconfont-approve confluence-information-macro-icon"></span><div
class="confluence-information-macro-body">
-<p>There is also a <code>debugAfter</code> method which is invoked after the
processor has been invoked. This allows you to <em>see</em> what happens to the
<a shape="rect" href="exchange.html">Exchange</a> right after it has invoked a
processor in the route.</p></div></div>
-
-<p>The screenshot below shows the <a shape="rect"
href="debugger.html">Debugger</a> in action. The IDE (IDEA) has hit the
breakpoint and we can inspect the parameters.<br clear="none">
-Notice how we can see that the message is to be send to the "mock:a"
endpoint.</p>
-
-<p><span class="confluence-embedded-file-wrapper"><img
class="confluence-embedded-image" src="debugger.data/debug.png"></span></p>
-
-<h3 id="Debugger-SeeAlso">See Also</h3>
-<ul class="alternate"><li><a shape="rect"
href="tracer.html">Tracer</a></li><li><a shape="rect"
href="backlogdebugger.html">BacklogDebugger</a></li></ul></div>
+</div></div>Then from your Java editor just add a breakpoint inside the
<code>debugBefore</code> method. Then fire up the unit test and wait for the
Java editor to hit the breakpoint. Then you can inspect the <a shape="rect"
href="exchange.html">Exchange</a> during debugging while it advances during
routing. The <code>ProcessorDefinition</code> and the <code>id</code> and
<code>shortName</code> parameters is all information which tells you where in
the route the breakpoint was hit.<div class="confluence-information-macro
confluence-information-macro-tip"><span class="aui-icon aui-icon-small
aui-iconfont-approve confluence-information-macro-icon"></span><div
class="confluence-information-macro-body"><p>There is also a
<code>debugAfter</code> method which is invoked after the processor has been
invoked. This allows you to <em>see</em> what happens to the <a shape="rect"
href="exchange.html">Exchange</a> right after it has invoked a processor in the
route.</p></div></div><p>The screens
hot below shows the <a shape="rect" href="debugger.html">Debugger</a> in
action. The IDE (IDEA) has hit the breakpoint and we can inspect the
parameters.<br clear="none"> Notice how we can see that the message is to be
send to the "mock:a" endpoint.</p><p><span
class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image"
src="debugger.data/debug.png"
data-image-src="/confluence/download/attachments/86210/debug.png?version=1&modificationDate=1288586116000&api=v2"
data-unresolved-comment-count="0" data-linked-resource-id="24346680"
data-linked-resource-version="1" data-linked-resource-type="attachment"
data-linked-resource-default-alias="debug.png"
data-base-url="https://cwiki.apache.org/confluence"
data-linked-resource-content-type="image/png"
data-linked-resource-container-id="86210"
data-linked-resource-container-version="30"></span></p><h3
id="Debugger-SeeAlso">See Also</h3><ul class="alternate"><li><a shape="rect"
href="tracer.html">Tracer</a></li><li><
a shape="rect" href="backlogdebugger.html">BacklogDebugger</a></li></ul></div>
</td>
<td valign="top">
<div class="navigation">
<div class="navigation_top">
<!-- NavigationBar -->
-<div class="navigation_bottom" id="navigation_bottom"><h3
id="Navigation-Overviewhttps://cwiki.apache.org/confluence/pages/viewpage.action?pageId=49132"><a
shape="rect" href="overview.html">Overview</a></h3><ul
class="alternate"><li><a shape="rect" href="index.html">Home</a></li><li><a
shape="rect" href="download.html">Download</a></li><li><a shape="rect"
href="getting-started.html">Getting Started</a></li><li><a shape="rect"
href="faq.html">FAQ</a></li></ul><h3
id="Navigation-Documentationhttps://cwiki.apache.org/confluence/pages/viewpage.action?pageId=49534"><a
shape="rect" href="documentation.html">Documentation</a></h3><ul
class="alternate"><li><a shape="rect" href="user-guide.html">User
Guide</a></li><li><a shape="rect" href="manual.html">Manual</a></li><li><a
shape="rect" href="books.html">Books</a></li><li><a shape="rect"
href="tutorials.html">Tutorials</a></li><li><a shape="rect"
href="examples.html">Examples</a></li><li><a shape="rect"
href="cookbook.html">Cookbook</a></li>
<li><a shape="rect" href="architecture.html">Architecture</a></li><li><a
shape="rect" href="enterprise-integration-patterns.html">Enterprise Integration
Patterns</a></li><li><a shape="rect" href="dsl.html">DSL</a></li><li><a
shape="rect" href="components.html">Components</a></li><li><a shape="rect"
href="data-format.html">Data Format</a></li><li><a shape="rect"
href="languages.html">Languages</a></li><li><a shape="rect"
href="security.html">Security</a></li><li><a shape="rect"
href="security-advisories.html">Security Advisories</a></li></ul><h3
id="Navigation-Search">Search</h3><form
enctype="application/x-www-form-urlencoded" method="get" id="cse-search-box"
action="http://www.google.com/cse">
+<div class="navigation_bottom" id="navigation_bottom"><h3
id="Navigation-Overview"><a shape="rect"
href="overview.html">Overview</a></h3><ul class="alternate"><li><a shape="rect"
href="index.html">Home</a></li><li><a shape="rect"
href="download.html">Download</a></li><li><a shape="rect"
href="getting-started.html">Getting Started</a></li><li><a shape="rect"
href="faq.html">FAQ</a></li></ul><h3 id="Navigation-Documentation"><a
shape="rect" href="documentation.html">Documentation</a></h3><ul
class="alternate"><li><a shape="rect" href="user-guide.html">User
Guide</a></li><li><a shape="rect" href="manual.html">Manual</a></li><li><a
shape="rect" href="books.html">Books</a></li><li><a shape="rect"
href="tutorials.html">Tutorials</a></li><li><a shape="rect"
href="examples.html">Examples</a></li><li><a shape="rect"
href="cookbook.html">Cookbook</a></li><li><a shape="rect"
href="architecture.html">Architecture</a></li><li><a shape="rect"
href="enterprise-integration-patterns.html">Enterprise
Integration Patterns</a></li><li><a shape="rect"
href="dsl.html">DSL</a></li><li><a shape="rect"
href="components.html">Components</a></li><li><a shape="rect"
href="data-format.html">Data Format</a></li><li><a shape="rect"
href="languages.html">Languages</a></li><li><a shape="rect"
href="security.html">Security</a></li><li><a shape="rect"
href="security-advisories.html">Security Advisories</a></li></ul><h3
id="Navigation-Search">Search</h3><form
enctype="application/x-www-form-urlencoded" method="get" id="cse-search-box"
action="http://www.google.com/cse">
<div>
<input type="hidden" name="cx" value="007878419884033443453:m5nhvy4hmyq">
<input type="hidden" name="ie" value="UTF-8">
@@ -183,7 +135,7 @@ Notice how we can see that the message i
<input type="submit" name="sa" value="Search">
</div>
</form>
-<script type="text/javascript"
src="http://www.google.com/coop/cse/brand?form=cse-search-box&lang=en"></script><h3
id="Navigation-Communityhttps://cwiki.apache.org/confluence/pages/viewpage.action?pageId=49115"><a
shape="rect" href="community.html">Community</a></h3><ul
class="alternate"><li><a shape="rect"
href="support.html">Support</a></li><li><a shape="rect"
href="contributing.html">Contributing</a></li><li><a shape="rect"
href="discussion-forums.html">Discussion Forums</a></li><li><a shape="rect"
href="mailing-lists.html">Mailing Lists</a></li><li><a shape="rect"
href="user-stories.html">User Stories</a></li><li><a shape="rect"
href="news.html">News</a></li><li><a shape="rect"
href="articles.html">Articles</a></li><li><a shape="rect"
href="site.html">Site</a></li><li><a shape="rect"
href="team.html">Team</a></li><li><a shape="rect" class="external-link"
href="http://camel-extra.googlecode.com/" rel="nofollow">Camel
Extra</a></li></ul><h3 id="Navigation-Developershttps://cwi
ki.apache.org/confluence/pages/viewpage.action?pageId=49124"><a shape="rect"
href="developers.html">Developers</a></h3><ul class="alternate"><li><a
shape="rect" href="developers.html">Developer Guide</a></li><li><a shape="rect"
href="source.html">Source</a></li><li><a shape="rect"
href="building.html">Building</a></li><li><a shape="rect"
href="javadoc.html">JavaDoc</a></li><li><a shape="rect"
href="irc-room.html">IRC Room</a></li></ul><h3
id="Navigation-ApacheSoftwareFoundation">Apache Software Foundation</h3><ul
class="alternate"><li><a shape="rect" class="external-link"
href="http://www.apache.org/licenses/">License</a></li><li><a shape="rect"
class="external-link"
href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a
shape="rect" class="external-link"
href="http://www.apache.org/foundation/thanks.html">Thanks</a></li><li><a
shape="rect" class="external-link"
href="http://www.apache.org/security/">Security</a></li></ul></div>
+<script type="text/javascript"
src="http://www.google.com/coop/cse/brand?form=cse-search-box&lang=en"></script><h3
id="Navigation-Community"><a shape="rect"
href="community.html">Community</a></h3><ul class="alternate"><li><a
shape="rect" href="support.html">Support</a></li><li><a shape="rect"
href="contributing.html">Contributing</a></li><li><a shape="rect"
href="discussion-forums.html">Discussion Forums</a></li><li><a shape="rect"
href="mailing-lists.html">Mailing Lists</a></li><li><a shape="rect"
href="user-stories.html">User Stories</a></li><li><a shape="rect"
href="news.html">News</a></li><li><a shape="rect"
href="articles.html">Articles</a></li><li><a shape="rect"
href="site.html">Site</a></li><li><a shape="rect"
href="team.html">Team</a></li><li><a shape="rect" class="external-link"
href="http://camel-extra.googlecode.com/" rel="nofollow">Camel
Extra</a></li></ul><h3 id="Navigation-Developers"><a shape="rect"
href="developers.html">Developers</a></h3><ul class="alternate"
><li><a shape="rect" href="developers.html">Developer Guide</a></li><li><a
>shape="rect" href="source.html">Source</a></li><li><a shape="rect"
>href="building.html">Building</a></li><li><a shape="rect"
>href="javadoc.html">JavaDoc</a></li><li><a shape="rect"
>href="irc-room.html">IRC Room</a></li></ul><h3
>id="Navigation-ApacheSoftwareFoundation">Apache Software Foundation</h3><ul
>class="alternate"><li><a shape="rect" class="external-link"
>href="http://www.apache.org/licenses/">License</a></li><li><a shape="rect"
>class="external-link"
>href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a
> shape="rect" class="external-link"
>href="http://www.apache.org/foundation/thanks.html">Thanks</a></li><li><a
>shape="rect" class="external-link"
>href="http://www.apache.org/security/">Security</a></li></ul></div>
<!-- NavigationBar -->
</div>
</div>
Modified: websites/production/camel/content/is-there-an-ide.html
==============================================================================
--- websites/production/camel/content/is-there-an-ide.html (original)
+++ websites/production/camel/content/is-there-an-ide.html Wed Jul 1 21:19:35
2015
@@ -75,13 +75,13 @@
<tbody>
<tr>
<td valign="top" width="100%">
-<div class="wiki-content maincontent"><h2
id="IsthereanIDE-IsthereanIDEforeditingCamelroutes?">Is there an IDE for
editing Camel routes?</h2><p>Apache Camel offers no IDE out of the
box.</p><p>You could use your Java IDE for smart completion when creating <a
shape="rect" href="routes.html">Java routing rules</a> via the <a shape="rect"
href="dsl.html">DSL</a> which will give you smart completion in Java code. <br
clear="none"> Or you can use your XML IDE (with XSD smart completion) to edit
the <a shape="rect" href="spring.html">routing rules in XML</a> using the <a
shape="rect" href="xml-configuration.html">Xml Configuration</a></p><p>Some of
the <a shape="rect" href="commercial-camel-offerings.html">Commercial
Companies</a> offers IDE's and other tooling for Camel.</p><h3
id="IsthereanIDE-FuseIDE">Fuse IDE</h3><p>Fuse IDE was developed by Red Hat is
now open sourced under <a shape="rect" class="external-link"
href="http://www.eclipse.org/legal/epl-v10.html" rel="nofollow">EPL 1.0</
a> at <a shape="rect" class="external-link"
href="https://github.com/fusesource/fuseide"
rel="nofollow">Github</a>.</p><p>Here is <a shape="rect" class="external-link"
href="http://lhein.blogspot.de/2014/07/where-can-i-get-jboss-fuse-tooling-and.html"
rel="nofollow">instructions</a> how to install Fuse IDE into Eclipse.</p><p>Or
you could download a version from <a shape="rect" class="external-link"
href="http://www.jboss.org/products/fuse" rel="nofollow">the JBoss Fuse
site</a> or you build it yourself from <a shape="rect" class="external-link"
href="https://github.com/fusesource/fuseide"
rel="nofollow">Github</a>.</p></div>
+<div class="wiki-content maincontent"><h2
id="IsthereanIDE-IsthereanIDEforeditingCamelroutes?">Is there an IDE for
editing Camel routes?</h2><p>Apache Camel offers no IDE out of the
box.</p><p>You could use your Java IDE for smart completion when creating <a
shape="rect" href="routes.html">Java routing rules</a> via the <a shape="rect"
href="dsl.html">DSL</a> which will give you smart completion in Java code. <br
clear="none"> Or you can use your XML IDE (with XSD smart completion) to edit
the <a shape="rect" href="spring.html">routing rules in XML</a> using the <a
shape="rect" href="xml-configuration.html">Xml Configuration</a></p><p>Some of
the <a shape="rect" href="commercial-camel-offerings.html">Commercial
Companies</a> offers IDE's and other tooling for Camel.</p></div>
</td>
<td valign="top">
<div class="navigation">
<div class="navigation_top">
<!-- NavigationBar -->
-<div class="navigation_bottom" id="navigation_bottom"><h3
id="Navigation-Overviewhttps://cwiki.apache.org/confluence/pages/viewpage.action?pageId=49132"><a
shape="rect" href="overview.html">Overview</a></h3><ul
class="alternate"><li><a shape="rect" href="index.html">Home</a></li><li><a
shape="rect" href="download.html">Download</a></li><li><a shape="rect"
href="getting-started.html">Getting Started</a></li><li><a shape="rect"
href="faq.html">FAQ</a></li></ul><h3
id="Navigation-Documentationhttps://cwiki.apache.org/confluence/pages/viewpage.action?pageId=49534"><a
shape="rect" href="documentation.html">Documentation</a></h3><ul
class="alternate"><li><a shape="rect" href="user-guide.html">User
Guide</a></li><li><a shape="rect" href="manual.html">Manual</a></li><li><a
shape="rect" href="books.html">Books</a></li><li><a shape="rect"
href="tutorials.html">Tutorials</a></li><li><a shape="rect"
href="examples.html">Examples</a></li><li><a shape="rect"
href="cookbook.html">Cookbook</a></li>
<li><a shape="rect" href="architecture.html">Architecture</a></li><li><a
shape="rect" href="enterprise-integration-patterns.html">Enterprise Integration
Patterns</a></li><li><a shape="rect" href="dsl.html">DSL</a></li><li><a
shape="rect" href="components.html">Components</a></li><li><a shape="rect"
href="data-format.html">Data Format</a></li><li><a shape="rect"
href="languages.html">Languages</a></li><li><a shape="rect"
href="security.html">Security</a></li><li><a shape="rect"
href="security-advisories.html">Security Advisories</a></li></ul><h3
id="Navigation-Search">Search</h3><form
enctype="application/x-www-form-urlencoded" method="get" id="cse-search-box"
action="http://www.google.com/cse">
+<div class="navigation_bottom" id="navigation_bottom"><h3
id="Navigation-Overview"><a shape="rect"
href="overview.html">Overview</a></h3><ul class="alternate"><li><a shape="rect"
href="index.html">Home</a></li><li><a shape="rect"
href="download.html">Download</a></li><li><a shape="rect"
href="getting-started.html">Getting Started</a></li><li><a shape="rect"
href="faq.html">FAQ</a></li></ul><h3 id="Navigation-Documentation"><a
shape="rect" href="documentation.html">Documentation</a></h3><ul
class="alternate"><li><a shape="rect" href="user-guide.html">User
Guide</a></li><li><a shape="rect" href="manual.html">Manual</a></li><li><a
shape="rect" href="books.html">Books</a></li><li><a shape="rect"
href="tutorials.html">Tutorials</a></li><li><a shape="rect"
href="examples.html">Examples</a></li><li><a shape="rect"
href="cookbook.html">Cookbook</a></li><li><a shape="rect"
href="architecture.html">Architecture</a></li><li><a shape="rect"
href="enterprise-integration-patterns.html">Enterprise
Integration Patterns</a></li><li><a shape="rect"
href="dsl.html">DSL</a></li><li><a shape="rect"
href="components.html">Components</a></li><li><a shape="rect"
href="data-format.html">Data Format</a></li><li><a shape="rect"
href="languages.html">Languages</a></li><li><a shape="rect"
href="security.html">Security</a></li><li><a shape="rect"
href="security-advisories.html">Security Advisories</a></li></ul><h3
id="Navigation-Search">Search</h3><form
enctype="application/x-www-form-urlencoded" method="get" id="cse-search-box"
action="http://www.google.com/cse">
<div>
<input type="hidden" name="cx" value="007878419884033443453:m5nhvy4hmyq">
<input type="hidden" name="ie" value="UTF-8">
@@ -89,7 +89,7 @@
<input type="submit" name="sa" value="Search">
</div>
</form>
-<script type="text/javascript"
src="http://www.google.com/coop/cse/brand?form=cse-search-box&lang=en"></script><h3
id="Navigation-Communityhttps://cwiki.apache.org/confluence/pages/viewpage.action?pageId=49115"><a
shape="rect" href="community.html">Community</a></h3><ul
class="alternate"><li><a shape="rect"
href="support.html">Support</a></li><li><a shape="rect"
href="contributing.html">Contributing</a></li><li><a shape="rect"
href="discussion-forums.html">Discussion Forums</a></li><li><a shape="rect"
href="mailing-lists.html">Mailing Lists</a></li><li><a shape="rect"
href="user-stories.html">User Stories</a></li><li><a shape="rect"
href="news.html">News</a></li><li><a shape="rect"
href="articles.html">Articles</a></li><li><a shape="rect"
href="site.html">Site</a></li><li><a shape="rect"
href="team.html">Team</a></li><li><a shape="rect" class="external-link"
href="http://camel-extra.googlecode.com/" rel="nofollow">Camel
Extra</a></li></ul><h3 id="Navigation-Developershttps://cwi
ki.apache.org/confluence/pages/viewpage.action?pageId=49124"><a shape="rect"
href="developers.html">Developers</a></h3><ul class="alternate"><li><a
shape="rect" href="developers.html">Developer Guide</a></li><li><a shape="rect"
href="source.html">Source</a></li><li><a shape="rect"
href="building.html">Building</a></li><li><a shape="rect"
href="javadoc.html">JavaDoc</a></li><li><a shape="rect"
href="irc-room.html">IRC Room</a></li></ul><h3
id="Navigation-ApacheSoftwareFoundation">Apache Software Foundation</h3><ul
class="alternate"><li><a shape="rect" class="external-link"
href="http://www.apache.org/licenses/">License</a></li><li><a shape="rect"
class="external-link"
href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a
shape="rect" class="external-link"
href="http://www.apache.org/foundation/thanks.html">Thanks</a></li><li><a
shape="rect" class="external-link"
href="http://www.apache.org/security/">Security</a></li></ul></div>
+<script type="text/javascript"
src="http://www.google.com/coop/cse/brand?form=cse-search-box&lang=en"></script><h3
id="Navigation-Community"><a shape="rect"
href="community.html">Community</a></h3><ul class="alternate"><li><a
shape="rect" href="support.html">Support</a></li><li><a shape="rect"
href="contributing.html">Contributing</a></li><li><a shape="rect"
href="discussion-forums.html">Discussion Forums</a></li><li><a shape="rect"
href="mailing-lists.html">Mailing Lists</a></li><li><a shape="rect"
href="user-stories.html">User Stories</a></li><li><a shape="rect"
href="news.html">News</a></li><li><a shape="rect"
href="articles.html">Articles</a></li><li><a shape="rect"
href="site.html">Site</a></li><li><a shape="rect"
href="team.html">Team</a></li><li><a shape="rect" class="external-link"
href="http://camel-extra.googlecode.com/" rel="nofollow">Camel
Extra</a></li></ul><h3 id="Navigation-Developers"><a shape="rect"
href="developers.html">Developers</a></h3><ul class="alternate"
><li><a shape="rect" href="developers.html">Developer Guide</a></li><li><a
>shape="rect" href="source.html">Source</a></li><li><a shape="rect"
>href="building.html">Building</a></li><li><a shape="rect"
>href="javadoc.html">JavaDoc</a></li><li><a shape="rect"
>href="irc-room.html">IRC Room</a></li></ul><h3
>id="Navigation-ApacheSoftwareFoundation">Apache Software Foundation</h3><ul
>class="alternate"><li><a shape="rect" class="external-link"
>href="http://www.apache.org/licenses/">License</a></li><li><a shape="rect"
>class="external-link"
>href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a
> shape="rect" class="external-link"
>href="http://www.apache.org/foundation/thanks.html">Thanks</a></li><li><a
>shape="rect" class="external-link"
>href="http://www.apache.org/security/">Security</a></li></ul></div>
<!-- NavigationBar -->
</div>
</div>