blob: a4c33dcb49212402de617e59d8ba3538fb0bbc87 [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<html>
<head>
<link type="text/css" rel="stylesheet" href="/resources/site.css">
<script src='/resources/space.js'></script>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
<meta name="keywords" content="business integration, EAI, SOA, Service Oriented Architecture, web services, SOAP, JBI, JMS, WSDL, XML, EDI, Electronic Data Interchange, standards support, integration standards, application integration, middleware, software, solutions, services, CXF, open source">
<meta name="description" content="Apache CXF, Services Framework - JAX-WS Dispatch API">
<link type="text/css" rel="stylesheet" href="/resources/highlighter/styles/shCoreCXF.css">
<link type="text/css" rel="stylesheet" href="/resources/highlighter/styles/shThemeCXF.css">
<script src='/resources/highlighter/scripts/shCore.js'></script>
<script src='/resources/highlighter/scripts/shBrushBash.js'></script>
<script src='/resources/highlighter/scripts/shBrushJava.js'></script>
<script>
SyntaxHighlighter.defaults['toolbar'] = false;
SyntaxHighlighter.all();
</script>
<title>
Apache CXF -- JAX-WS Dispatch API
</title>
</head>
<body onload="init()">
<table width="100%" cellpadding="0" cellspacing="0">
<tr>
<td id="cell-0-0" colspan="2">&nbsp;</td>
<td id="cell-0-1">&nbsp;</td>
<td id="cell-0-2" colspan="2">&nbsp;</td>
</tr>
<tr>
<td id="cell-1-0">&nbsp;</td>
<td id="cell-1-1">&nbsp;</td>
<td id="cell-1-2">
<!-- Banner -->
<div class="banner" id="banner"><div><table border="0" cellpadding="0" cellspacing="0" width="100%"><tr><td align="left" colspan="1" nowrap>
<a shape="rect" href="http://cxf.apache.org/" title="Apache CXF"><span style="font-weight: bold; font-size: 170%; color: white">Apache CXF</span></a>
</td><td align="right" colspan="1" nowrap>
<a shape="rect" href="http://www.apache.org/" title="The Apache Sofware Foundation"><img border="0" alt="ASF Logo" src="http://cxf.apache.org/images/asf-logo.png"></a>
</td></tr></table></div></div>
<!-- Banner -->
<div id="top-menu">
<table border="0" cellpadding="1" cellspacing="0" width="100%">
<tr>
<td>
<div align="left">
<!-- Breadcrumbs -->
<a href="index.html">Index</a>&nbsp;&gt;&nbsp;<a href="frontends.html">Frontends</a>&nbsp;&gt;&nbsp;<a href="jax-ws.html">JAX-WS</a>&nbsp;&gt;&nbsp;<a href="jax-ws-dispatch-api.html">JAX-WS Dispatch API</a>
<!-- Breadcrumbs -->
</div>
</td>
<td>
<div align="right">
<!-- Quicklinks -->
<div id="quicklinks"><p><a shape="rect" href="http://cxf.apache.org/download.html">Download</a> | <a shape="rect" href="http://cxf.apache.org/docs/index.html">Documentation</a></p></div>
<!-- Quicklinks -->
</div>
</td>
</tr>
</table>
</div>
</td>
<td id="cell-1-3">&nbsp;</td>
<td id="cell-1-4">&nbsp;</td>
</tr>
<tr>
<td id="cell-2-0" colspan="2">&nbsp;</td>
<td id="cell-2-1">
<table>
<tr valign="top">
<td height="100%">
<div id="wrapper-menu-page-right">
<div id="wrapper-menu-page-top">
<div id="wrapper-menu-page-bottom">
<div id="menu-page">
<!-- NavigationBar -->
<div id="navigation"><ul class="alternate"><li><a shape="rect" href="overview.html">Overview</a></li><li><a shape="rect" href="how-tos.html">How-Tos</a></li><li><a shape="rect" href="frontends.html">Frontends</a></li><li><a shape="rect" href="databindings.html">DataBindings</a></li><li><a shape="rect" href="transports.html">Transports</a></li><li><a shape="rect" href="configuration.html">Configuration</a></li><li><a shape="rect" href="debugging-and-logging.html">Debugging and Logging</a></li><li><a shape="rect" href="tools.html">Tools</a></li><li><a shape="rect" href="restful-services.html">RESTful Services</a></li><li><a shape="rect" href="wsdl-bindings.html">WSDL Bindings</a></li><li><a shape="rect" href="service-routing.html">Service Routing</a></li><li><a shape="rect" href="dynamic-languages.html">Dynamic Languages</a></li><li><a shape="rect" href="ws-support.html">WS-* Support</a></li><li><a shape="rect" href="advanced-integration.html">Advanced Integration</a></li><li><a shape="rect" href="deployment.html">Deployment</a></li><li><a shape="rect" href="schemas-and-namespaces.html">Use of Schemas and Namespaces</a></li></ul><hr><ul class="alternate"><li><p>Search</p></li></ul><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="002890367768291051730:o99qiwa09y4">
<input type="hidden" name="ie" value="UTF-8">
<input type="text" name="q" size="21">
<input type="submit" name="sa" value="Search">
</div>
</form>
<script type="text/javascript" src="http://www.google.com/cse/brand?form=cse-search-box&amp;lang=en"></script><hr><ul class="alternate"><li><a shape="rect" href="http://cxf.apache.org/javadoc/latest/">API 3.2.x (Javadoc)</a></li><li><a shape="rect" href="http://cxf.apache.org/javadoc/latest-3.1.x/">API 3.1.x (Javadoc)</a></li><li><a shape="rect" href="http://cxf.apache.org/">CXF Website</a></li></ul><p>&#160;</p><p><a shape="rect" class="external-link" href="http://www.apache.org/events/current-event.html"><span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image confluence-external-resource" src="http://www.apache.org/events/current-event-125x125.png" data-image-src="http://www.apache.org/events/current-event-125x125.png"></span></a></p></div>
<!-- NavigationBar -->
</div>
</div>
</div>
</div>
</td>
<td height="100%">
<!-- Content -->
<div class="wiki-content">
<div id="ConfluenceContent"><h2 id="JAXWSDispatchAPI-UsageModes">Usage Modes</h2>
<h3 id="JAXWSDispatchAPI-Overview">Overview</h3>
<p><code>Dispatch</code> objects have two <em>usage modes</em>:</p>
<ul><li>Message mode</li><li>Message Payload mode (Payload mode)</li></ul>
<p>The usage mode you specify for a <code>Dispatch</code> object determines the amount of detail is passed to the user level code.</p>
<h3 id="JAXWSDispatchAPI-Messagemode">Message mode</h3>
<p>In <em>message mode</em>, a <code>Dispatch</code> object works with complete messages. A complete message includes any binding specific headers and wrappers. For example, a consumer interacting with a service that requires SOAP messages would need to provide the <code>Dispatch</code> object's <code>invoke()</code> method a fully specified SOAP message. The <code>invoke()</code> method will also return a fully specified SOAP message. The consumer code is responsible for completing and reading the SOAP message's headers and the SOAP message's envelope information.</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>Message mode is not ideal when you wish to work with JAXB objects.</p></div></div>
<p>You specify that a <code>Dispatch</code> object uses message mode by providing the value <code>java.xml.ws.Service.Mode.MESSAGE</code> when creating the Dispatch object.</p>
<h3 id="JAXWSDispatchAPI-Payloadmode">Payload mode</h3>
<p>In <em>payload mode</em>, also called message payload mode, a <code>Dispatch</code> object works with only the payload of a message. For example, a <code>Dispatch</code> object working in payload mode works only with the body of a SOAP message. The binding layer processes any binding level wrappers and headers. When a result is returned from <code>invoke()</code> the binding level wrappers and headers are already striped away and only the body of the message is left.</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 working with a binding that does not use special wrappers, such as the XML binding, payload mode and message mode provide the same results.</p></div></div>
<p>You specify that a <code>Dispatch</code> object uses payload mode by providing the value <code>java.xml.ws.Service.Mode.PAYLOAD</code> when creating the <code>Dispatch</code> object.</p>
<h2 id="JAXWSDispatchAPI-DataTypes">Data Types</h2>
<h3 id="JAXWSDispatchAPI-Overview.1">Overview</h3>
<p><code>Dispatch</code> objects, because they are low-level objects, are not optimized for using the same JAXB generated types as the higher level consumer APIs. <code>Dispatch</code> objects work with the following types of objects:</p>
<ul><li><code>javax.xml.transform.Source</code></li><li><code>javax.xml.soap.SOAPMessage</code></li><li><code>javax.activation.DataSource</code></li><li>JAXB</li></ul>
<h3 id="JAXWSDispatchAPI-UsingSourceobjects">Using <code>Source</code> objects</h3>
<p>A <code>Dispatch</code> object can accept and return objects that are derived from the <code>javax.xml.transform.Source</code> interface. Source objects are low level objects that hold XML documents. Each <code>Source</code> implementation provides methods that access the stored XML documents and manipulate its contents. The following objects implement the <code>Source</code> interface:</p>
<ul><li><code>DOMSource</code></li><li><code>SAXSource</code></li><li><code>StreamSource</code>
<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>When using <code>Source</code> objects the developer is responsible for ensuring that all required binding specific wrappers are added to the message. For example, when interacting with a service expecting SOAP messages, the developer must ensure that the required SOAP envelope is added to the outgoing request and that the SOAP envelope's contents are correct.</p></div></div></li></ul>
<h3 id="JAXWSDispatchAPI-UsingSOAPMessageobjects">Using <code>SOAPMessage</code> objects</h3>
<p><code>Dispatch</code> objects can use <code>javax.xml.soap.SOAPMessage</code> objects when the following conditions are true:</p>
<ul><li>the <code>Dispatch</code> object is using the SOAP binding.</li><li>the <code>Dispatch</code> object is using message mode.</li></ul>
<h3 id="JAXWSDispatchAPI-UsingDataSourceobjects">Using <code>DataSource</code> objects</h3>
<p><code>Dispatch</code> objects can use objects that implement the <code>javax.activation.DataSource</code> interface when the following conditions are true:</p>
<ul><li>the <code>Dispatch</code> object is using the HTTP binding.</li><li>the <code>Dispatch</code> object is using message mode.</li></ul>
<p><code>DataSource</code> objects provide a mechanism for working with MIME typed data from a variety of sources including URLs, files, and byte arrays.</p>
<h3 id="JAXWSDispatchAPI-UsingJAXBobjects">Using JAXB objects</h3>
<p>While <code>Dispatch</code> objects are intended to be low level API that allows you to work with raw messages, they also allow you to work with JAXB objects. To work with JAXB objects a <code>Dispatch</code> object must be passed a <code>JAXBContext</code> that knows how to marshal and unmarshal the JAXB objects in use. The <code>JAXBContext</code> is passed when the <code>Dispatch</code> object is created.</p>
<p>You can pass any JAXB object understood by the <code>JAXBContext</code> object as the parameter to the <code>invoke()</code> method. You can also cast the returned message into any JAXB object understood by the <code>JAXBContext</code> object.</p>
<h2 id="JAXWSDispatchAPI-WorkingwithDispatchObjects">Working with <code>Dispatch</code> Objects</h2>
<h3 id="JAXWSDispatchAPI-Procedure">Procedure</h3>
<p>To use a Dispatch object to invoke a remote service you do the following:</p>
<ol><li>Create a <code>Dispatch</code> object.</li><li>Construct a request message.</li><li>Call the proper <code>invoke()</code> method.</li><li>Parse the response message.</li></ol>
<h3 id="JAXWSDispatchAPI-CreatingaDispatchobject">Creating a <code>Dispatch</code> object</h3>
<p>To create a <code>Dispatch</code> object do the following:</p>
<ol><li>Create a <code>Service</code> object to represent the <code>wsdl:service</code> element defining the service on which the <code>Dispatch</code> object will make invocations.</li><li>Create the <code>Dispatch</code> object using the <code>Service</code> object's <code>createDispatch()</code> method.
<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default">
public Dispatch&lt;T&gt; createDispatch(QName portName, java.lang.Class&lt;T&gt; type, Service.Mode mode)
throws WebServiceException;
</pre>
</div></div>
<div class="confluence-information-macro confluence-information-macro-note"><span class="aui-icon aui-icon-small aui-iconfont-warning confluence-information-macro-icon"></span><div class="confluence-information-macro-body">
<p>If you are using JAXB objects the method signature for <code>createDispatch()</code> is:</p>
<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default">
public Dispatch&lt;T&gt; createDispatch(QName portName, javax.xml.bind.JAXBContext context, Service.Mode mode)
throws WebServiceException;
</pre>
</div></div></div></div></li></ol>
<p>The following table describes the parameters for <code>createDispatch()</code>.</p>
<div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p> Parameter </p></th><th colspan="1" rowspan="1" class="confluenceTh"><p> Description </p></th></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p> portName </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> Specifies the QName of the <code>wsdl:port</code> element that represent the service provider on which the <code>Dispatch</code> object will make invocations. </p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p> type </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> Specifies the data type of the objects used by the <code>Dispatch</code> object. </p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p> mode </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> Specifies the usage mode for the <code>Dispatch</code> object. </p></td></tr></tbody></table></div>
<p>The code below creates a <code>Dispatch</code> object that works with <code>DOMSource</code> objects in payload mode.</p>
<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default">
package com.mycompany.demo;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
public class Client {
public static void main(String args[]) {
QName serviceName = new QName("http://org.apache.cxf", "stockQuoteReporter");
Service s = Service.create(serviceName);
QName portName = new QName("http://org.apache.cxf", "stockQuoteReporterPort");
Dispatch&lt;DOMSource&gt; dispatch = s.createDispatch(portName,
DOMSource.class,
Service.Mode.PAYLOAD);
...
}
}
</pre>
</div></div>
<h3 id="JAXWSDispatchAPI-Constructingrequestmessages">Constructing request messages</h3>
<p>When working with <code>Dispatch</code> objects requests must be built from scratch. The developer is responsible for ensuring that the messages passed to a <code>Dispatch</code> object match a request that the targeted service provider can process. This requires precise knowledge about the messages used by the service provider and what, if any, header information it requires.</p>
<p>This information can be provided by a WSDL document or an XMLSchema document that defines the messages. While service providers vary greatly there are a few guidelines that can be followed:</p>
<ul><li>The root element of the request is based in the value of the name attribute of the <code>wsdl:operation</code> element that corresponds to the operation being invoked.
<div class="confluence-information-macro confluence-information-macro-warning"><span class="aui-icon aui-icon-small aui-iconfont-error confluence-information-macro-icon"></span><div class="confluence-information-macro-body">
<p>If the service being invoked uses doc/literal bare messages, the root element of the request will be based on the value of name attribute of the <code>wsdl:part</code> element refered to by the <code>wsdl:operation</code> element.</p></div></div></li><li>The root element of the request will be namespace qualified.</li><li>If the service being invoked uses rpc/literal messages, the top-level elements in the request will not be namespace qualified.
<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>The children of top-level elements may be namespace qualified. To be certain you will need to check their schema definitions.</p></div></div></li><li>If the service being invoked uses rpc/literal messages, none of the top-level elements can be null.</li><li>If the service being invoked uses doc/literal messages, the schema definition of the message determines if any of the elements are namespace qualified.</li></ul>
<p>For more information about how services use XML messages see the WS-I Basic Profile.</p>
<h3 id="JAXWSDispatchAPI-Synchronousinvocation">Synchronous invocation</h3>
<p>For consumers that make synchronous invocations that generate a response, you use the <code>Dispatch</code> object's <code>invoke()</code> method shown bellow.</p>
<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default">
T invoke(T msg) throws WebServiceException;
</pre>
</div></div>
<p>The type of both the response and the request passed to the <code>invoke()</code> method are determined when the Dispatch object is created. For example if you created a <code>Dispatch</code> object using <code>createDispatch(portName, SOAPMessage.class, Service.Mode.MESSAGE)</code> the response and the request would both be <code>SOAPMessage</code> objects.</p>
<div class="confluence-information-macro confluence-information-macro-note"><span class="aui-icon aui-icon-small aui-iconfont-warning confluence-information-macro-icon"></span><div class="confluence-information-macro-body">
<p>When using JAXB objects, the response and the request can be of any type the provided <code>JAXBContext</code> object can marshal and unmarshal. Also, the response and the request can be different JAXB objects.</p></div></div>
<p>The code bellow makes a synchronous invocation on a remote service using a <code>DOMSource</code> object.</p>
<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default">
// Creating a DOMSource Object for the request
DocumentBuilder db = DocumentBuilderFactory.newDocumentBuilder();
Document requestDoc = db.newDocument();
Element root = requestDoc.createElementNS("http://org.apache.cxf/stockExample", "getStockPrice");
root.setNodeValue("DOW");
DOMSource request = new DOMSource(requestDoc);
// Dispatch disp created previously
DOMSource response = disp.invoke(request);
</pre>
</div></div>
<h4 id="JAXWSDispatchAPI-Asynchronousinvocation">Asynchronous invocation</h4>
<p><code>Dispatch</code> objects also support asynchronous invocations. As with the higher level asynchronous APIs discussed in Chapter 4, <code>Dispatch</code> objects can use both the polling approach and the callback approach.</p>
<p>When using the polling approach the <code>invokeAsync()</code> method returns a <code>Response&lt;t&gt;</code> object that can be periodically polled to see if the response has arrived.</p>
<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default">
Response &lt;T&gt; invokeAsync(T msg) throws WebServiceException;
</pre>
</div></div>
<p>When using the callback approach the <code>invokeAsync()</code> method takes an <code>AsyncHandler</code> implementation that processes the response when it is returned.</p>
<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default">
Future&lt;?&gt; invokeAsync(T msg, AsyncHandler&lt;T&gt; handler) throws WebServiceException;
</pre>
</div></div>
<div class="confluence-information-macro confluence-information-macro-note"><span class="aui-icon aui-icon-small aui-iconfont-warning confluence-information-macro-icon"></span><div class="confluence-information-macro-body">
<p>As with the synchronous <code>invoke()</code> method, the type of the response and the type of the request are determined when you create the <code>Dispatch</code> object.</p></div></div>
<h4 id="JAXWSDispatchAPI-Onewayinvocation">Oneway invocation</h4>
<p>When a request does not generate a response, you make remote invocations using the <code>Dispatch</code> object's <code>invokeOneWay()</code>.</p>
<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default">
void invokeOneWay(T msg) throws WebServiceException;
</pre>
</div></div>
<p>The type of object used to package the request is determined when the <code>Dispatch</code> object is created. For example if the <code>Dispatch</code> object is created using <code>createDispatch(portName, DOMSource.class, Service.Mode.PAYLOAD)</code> the request would be packaged into a <code>DOMSource</code> object.</p>
<div class="confluence-information-macro confluence-information-macro-note"><span class="aui-icon aui-icon-small aui-iconfont-warning confluence-information-macro-icon"></span><div class="confluence-information-macro-body">
<p>When using JAXB objects, the response and the request can be of any type the provided <code>JAXBContext</code> object can marshal and unmarshal. Also, the response and the request can be different JAXB objects.</p></div></div>
<p>The code bellow makes a one way invocation on a remote service using a JAXB object.</p>
<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default">
// Creating a JAXBContext and an Unmarshaller for the request
JAXBContext jbc = JAXBContext.newInstance("com.mycompany.StockExample");
Unmarshaller u = jbc.createUnmarshaller();
// Read the request from disk
File rf = new File("request.xml");
GetStockPrice request = (GetStockPrice)u.unmarshal(rf);
// Dispatch disp created previously
disp.invokeOneWay(request);
</pre>
</div></div>
<h4 id="JAXWSDispatchAPI-OperationDetermination">Operation Determination</h4>
<p>When using a <code>Dispatch</code> client with a WSDL file, the operation name will be set under one of the following cases.</p>
<ul><li>The&#160;javax.xml.ws.handler.MessageContext.WSDL_OPERATION property of the request context is set with the operation QName.</li><li>The addressing feature is enabled (in the bus or at the endpoint) and there is a matching operation to the payload element.</li><li>The "<span style="color: rgb(34,34,34);">find.dispatch.operation" property of the request context is set to Boolean.TRUE and there is a matching operation to the payload element. This property is not set by default.</span><span style="color: rgb(34,34,34);">Determining the correct operation will affect the processing such as setting the correct SOAPAction or WS-Addressing's Action.</span></li></ul></div>
</div>
<!-- Content -->
</td>
</tr>
</table>
</td>
<td id="cell-2-2" colspan="2">&nbsp;</td>
</tr>
<tr>
<td id="cell-3-0">&nbsp;</td>
<td id="cell-3-1">&nbsp;</td>
<td id="cell-3-2">
<div id="footer">
<!-- Footer -->
<div id="site-footer">
<a href="http://cxf.apache.org/privacy-policy.html">Privacy Policy</a> -
(<a href="https://cwiki.apache.org/confluence/pages/editpage.action?pageId=59882">edit page</a>)
(<a href="https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=59882&amp;showComments=true&amp;showCommentArea=true#addcomment">add comment</a>)<br>
Apache CXF, CXF, Apache, the Apache feather logo are trademarks of The Apache Software Foundation.<br>
All other marks mentioned may be trademarks or registered trademarks of their respective owners.
</div>
<!-- Footer -->
</div>
</td>
<td id="cell-3-3">&nbsp;</td>
<td id="cell-3-4">&nbsp;</td>
</tr>
<tr>
<td id="cell-4-0" colspan="2">&nbsp;</td>
<td id="cell-4-1">&nbsp;</td>
<td id="cell-4-2" colspan="2">&nbsp;</td>
</tr>
</table>
<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
try {
var pageTracker = _gat._getTracker("UA-4458903-1");
pageTracker._trackPageview();
} catch(err) {}</script>
</body>
</html>