blob: ade0878aa1b3863479b680e6f6c6f407d8c56917 [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 - Using CXF and CDI 1.1 (JSR-346)">
<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/shBrushXml.js'></script>
<script src='/resources/highlighter/scripts/shBrushJava.js'></script>
<script>
SyntaxHighlighter.defaults['toolbar'] = false;
SyntaxHighlighter.all();
</script>
<title>
Apache CXF -- Using CXF and CDI 1.1 (JSR-346)
</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="deployment.html">Deployment</a>&nbsp;&gt;&nbsp;<a href="using-cxf-and-cdi-11-jsr-346.html">Using CXF and CDI 1.1 (JSR-346)</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"><h1 id="UsingCXFandCDI1.1(JSR346)-Introduction">Introduction&#160;</h1><p>The JAX-RS 2.0 specification (JSR-339) mandates the support of CDI 1.1 (JSR-346) and Apache CXF starting from the version 3.0 introduces the initial support of this feature. As the starting point, the emphasis has been done on supporting embedded Jety 8/9 and Tomcat 7/8 containers as primary deployment (though other application servers will be supported in the future).&#160;</p><h1 id="UsingCXFandCDI1.1(JSR346)-Architectureanddesign">Architecture and design&#160;</h1><p>At the moment, the integration of Apache CXF and CDI revolves around two key components, which reside in the new module called <strong>cxf-integration-cdi</strong></p><ul><li><strong>CXFCdiServlet</strong> servlet</li><li><strong>JAXRSCdiResourceExtension</strong> portable CDI extension</li></ul><p>The fact of including <strong>cxf-integration-cdi</strong> as a dependency allows&#160; <strong>JAXRSCdiResourceExtension</strong>&#160;&#160;portable CDI extension to be discovered by CDI container. The&#160; <strong>JAXRSCdiResourceExtension</strong> creates the instance of the <strong>Bus</strong>&#160;and registers&#160;it with <strong>BeanManager</strong>. From this point, the&#160; <strong>Bus</strong> instance is a regular CDI bean (with <span><strong>@</strong><span><strong>Application</strong> scope)</span></span> available for injection.&#160;This instance of the&#160; <strong>Bus</strong> is being injected into&#160;<strong>CXFCdiServlet</strong> servlet once it is initialized by servlet container.</p><p>Depending on the design, <strong>JAXRSCdiResourceExtension</strong> may use zero-based configuration approach or rely on particular JAX-RS <strong>Application</strong> instances. The&#160;<strong>org.apache.cxf.cdi.CXFCdiServlet</strong> should be configured as well (more examples for programmatic and WAR scenarios below).</p><h1 id="UsingCXFandCDI1.1(JSR346)-Zero-basedConfiguration">Zero-based Configuration</h1><p>If the Apache CXF application contains either no instance of JAX-RS <strong>Application</strong> or&#160;only one single instance of JAX-RS <strong>Application</strong> (annotated with <strong>@ApplicationPath</strong>) with no singletons and classes defined, the following rules are being applied by <strong>JAXRSCdiResourceExtension</strong> in order to configure and publish the configured JAX-RS resources:</p><ul><li>the instance of the JAX-RS <strong>Application</strong> (annotated with <strong>@ApplicationPath</strong>) is being created and registered with <strong>BeanManager</strong></li><li>all instances of the discovered JAX-RS <strong>providers </strong>(annotated with <strong>@Provider</strong>) are being created and registered with <strong>BeanManager</strong></li><li>all instances of the discovered JAX-RS <strong>resources</strong> (annotated with <strong>@Path</strong>) are being created and registered with <strong>BeanManager</strong></li></ul><p>Lastly, the instance of the <strong>JAXRSServerFactoryBean</strong> is being created and configured with all service beans and providers discovered before. Additionally, the providers are enriched with the services for <strong>javax.ws.rs.ext.MessageBodyReader</strong> and <strong>javax.ws.rs.ext.MessageBodyWriter</strong>, loaded via <strong>ServiceLoader</strong>. From this moment, Apache CXF application is ready to serve the requests. The quick example is shown below.</p><p>The empty JAX-RS <strong>Application</strong>:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default">@ApplicationPath("/api")
public class BookStoreApplication extends Application {
}</pre>
</div></div><p>And one JAX-RS resource:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default">@Path("/bookstore/")
public class BookStore {
@Inject private BookStoreService service;
@GET
@Path("/books/{bookId}")
@Produces(MediaType.APPLICATION_JSON)
public Book getBook(@PathParam("bookId") String id) {
return service.get(id);
}
}</pre>
</div></div><h1 id="UsingCXFandCDI1.1(JSR346)-CustomizedConfiguration">Customized Configuration</h1><p>If the Apache CXF application contains one or more instances of JAX-RS <strong>Application</strong> (annotated with <strong>@ApplicationPath</strong>) with singletons or classes defined, the following rules are being applied by <strong>JAXRSCdiResourceExtension</strong> in order to configure and publish the configured JAX-RS resources:</p><ul><li>the instance of each JAX-RS <strong>Application</strong> (annotated with <strong>@ApplicationPath</strong>) is being created and registered with <strong>BeanManager</strong></li><li>for each JAX-RS <strong>Application</strong> instance created before, the instance of the <strong>JAXRSServerFactoryBean</strong> is being created and configured in a way that application's singletons/classes are being splitted to providers&#160;(annotated with <strong>@Provider</strong>), service beans (annotated with <strong>@Path</strong>) and features (implementation of <strong>org.apache.cxf.feature.Feature</strong>)<strong> </strong></li></ul><p>From this moment, Apache CXF application is ready to serve the requests. The quick example is shown below.</p><p>The configured JAX-RS <strong>Application</strong>:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default">@ApplicationPath("/custom")
public class BookStoreCustomApplication extends Application {
@Inject private BookStore bookStore;
@Override
public Set&lt; Object &gt; getSingletons() {
return Sets.&lt; Object &gt;newHashSet(
bookStore,
new JacksonJsonProvider(),
new ValidationExceptionMapper(),
new JAXRSBeanValidationFeature());
}
}</pre>
</div></div><p>And one JAX-RS resource:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default">@Path("/bookstore/")
public class BookStore {
@Inject private BookStoreService service;
@GET
@Path("/books/{bookId}")
@Produces(MediaType.APPLICATION_JSON)
public Book getBook(@PathParam("bookId") String id) {
return service.get(id);
}
}</pre>
</div></div><h1 id="UsingCXFandCDI1.1(JSR346)-AdditionalConfigurationCapabilities">Additional Configuration Capabilities</h1><p>If you have a need to, you can configure the underlying&#160;<strong>JAXRSServerFactoryBean</strong> by implementing the interface&#160;<strong>JAXRSServerFactoryCustomizationExtension</strong>.&#160; Instances of this extension can be located via <strong>ServiceLoader</strong> of as CDI beans.&#160; You can use this to programmatically add new providers, or otherwise manipulate the runtime before the server is created.&#160; An example of how this is used can be seen at&#160;<a shape="rect" class="external-link" href="https://github.com/apache/cxf/blob/master/rt/rs/sse/src/main/java/org/apache/cxf/jaxrs/sse/cdi/SseTransportCustomizationExtension.java" rel="nofollow">SseTransportCustomizationExtension</a>.</p><h1 id="UsingCXFandCDI1.1(JSR346)-CDiLifecycleforJAX-RSContextObjects">CDi Lifecycle for JAX-RS Context Objects</h1><p>The CDI extension also supports the injection (via CDI) of&#160;<strong>@Context </strong>objects.&#160; Any known object can be injected via CDI.&#160; This happens automatically when the CDI extension is used, and a&#160;<strong>@Context</strong> is declared as a field on a resource class.&#160; Note that this does allow you to inject your&#160;<strong>@Context</strong> objects in non-JAX-RS components as well.&#160; The logic is in two parts:</p><ol><li>Rewriting injection points<ol><li>When an injection point is found that contains&#160;<strong>@Context</strong> two additional annotations are added</li><li>These annotations are&#160;<strong>@Inject </strong>and&#160;<strong>@ContextResolved</strong></li><li>The use of&#160;<strong>@Inject </strong>will force the CDI runtime to take over the injection of the bean value, while<strong>&#160;@ContextResolved </strong>is simply a qualifier we apply to the injection point to avoid ambiguities</li></ol></li><li><strong>Providing Beans</strong><ol><li>For each of the built in<strong>&#160;@Context </strong>types, we register a bean that provides a<strong>&#160;@RequestScoped </strong>bean that resolves the value, by looking up the internal context value</li><li>In addition, a user or intergrator can implement<strong> ContextClassProvider </strong>to register an additional class as context type to be resolved.</li></ol></li></ol><p>&#160;</p><h1 id="UsingCXFandCDI1.1(JSR346)-DeployingwithembeddedJetty8/9(programmaticconfiguration)">Deploying with embedded Jetty 8/9 (programmatic configuration)</h1><p>With <strong>Jetty 8/9</strong> it possible to create fully embeddable REST / JAX-RS servers without <strong>web.xml</strong> or <strong>WAR</strong>&#160;files involved. For Apache CXF applications which are using CDI 1.1, the&#160;<strong>CXFCdiServlet</strong>&#160;servlet should be used as a starting point. Following example demonstrates the necessary configuration points in order to create embedded <strong>Jetty 8/9</strong> instance. As a CDI 1.1 implementation, <strong>JBoss Weld 2.0</strong> is being used.</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default">System.setProperty("java.naming.factory.url", "org.eclipse.jetty.jndi");
System.setProperty("java.naming.factory.initial", "org.eclipse.jetty.jndi.InitialContextFactory");
// Register and map the dispatcher servlet
final Server server = new Server(&lt;port&gt;);
final ServletHolder servletHolder = new ServletHolder(new CXFCdiServlet());
final ServletContextHandler context = new ServletContextHandler();
context.setContextPath(&lt;context path&gt;);
context.addEventListener(new Listener());
context.addEventListener(new BeanManagerResourceBindingListener());
context.addServlet(servletHolder, "/rest/*");
server.setHandler(context);
server.start();</pre>
</div></div><p>This code snippet is enough to trigger the CDI portable extension discovery, to perform the configuration (depending on JAX-RS <strong>Applications</strong> present) and to wire up all defined dependencies together.</p><h1 id="UsingCXFandCDI1.1(JSR346)-DeployingwithembeddedJetty8/9(WAR-baseddeployment)">Deploying with embedded Jetty 8/9 (WAR-based deployment)&#160;</h1><p>Another option to deploy Apache CXF application with CDI 1.1 support and embedded <strong>Jetty 8/9</strong> is by using <strong>web.xml</strong> descriptor and WAR-like deployment structure. In this case, the Apache CXF application needs to declare <strong>CXFCdiServlet</strong>&#160;servlet (and its mappings) and, if required, CDI-specific listeners (in the example below the <strong>JBoss Weld 2.0</strong> is being used as CDI 1.1 container).</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default">&lt;web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;
&lt;listener&gt;
&lt;listener-class&gt;org.jboss.weld.environment.servlet.Listener&lt;/listener-class&gt;
&lt;/listener&gt;
&lt;servlet&gt;
&lt;servlet-name&gt;CXFServlet&lt;/servlet-name&gt;
&lt;display-name&gt;CXF Servlet&lt;/display-name&gt;
&lt;servlet-class&gt;org.apache.cxf.cdi.CXFCdiServlet&lt;/servlet-class&gt;
&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
&lt;/servlet&gt;
&lt;servlet-mapping&gt;
&lt;servlet-name&gt;CXFServlet&lt;/servlet-name&gt;
&lt;url-pattern&gt;/rest/*&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;
&lt;resource-env-ref&gt;
&lt;resource-env-ref-name&gt;BeanManager&lt;/resource-env-ref-name&gt;
&lt;resource-env-ref-type&gt;javax.enterprise.inject.spi.BeanManager
&lt;/resource-env-ref-type&gt;
&lt;/resource-env-ref&gt;
&lt;/web-app&gt;</pre>
</div></div><p>The server initialization in this case looks simpler.</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default">System.setProperty("java.naming.factory.url", "org.eclipse.jetty.jndi");
System.setProperty("java.naming.factory.initial", "org.eclipse.jetty.jndi.InitialContextFactory");
final Server server = new Server(&lt;port&gt;);
final WebAppContext context = new WebAppContext();
context.setContextPath(&lt;context path&gt;);
context.setWar(&lt;path to WAR folder/file&gt;);
context.setServerClasses(new String[] { "org.eclipse.jetty.servlet.ServletContextHandler.Decorator" });
HandlerCollection handlers = new HandlerCollection();
handlers.setHandlers(new Handler[] {context, new DefaultHandler()});
server.setHandler(handlers);
server.start();</pre>
</div></div><p>Please notice, usage of Jetty-specific server classes ("org.eclipse.jetty.servlet.ServletContextHandler.Decorator") is very important to allow CDI 1.1 injections (backed by <strong>JBoss Weld 2.0</strong>) to work seamlessly across servlets / listeners / filters. It is not stricktly necessary for Apache CXF (everything will work as expected) but complex applications would definitely benefit from that.</p><h1 id="UsingCXFandCDI1.1(JSR346)-DeployingwithembeddedTomcat7/8(WAR-baseddeployment)">Deploying with embedded Tomcat 7/8 (WAR-based deployment)&#160;</h1><p>In case of embedded Tomcat 7/8, Apache CXF application with CDI 1.1 support could be deployed with <strong>web.xml</strong> descriptor and WAR-like deployment structure, similarly to Jetty 8/9 WAR-based deployment. Apache CXF application needs to declare <strong>CXFCdiServlet</strong>&#160;servlet (and its mappings) and, if required, CDI-specific listeners (in the example below the <strong>JBoss Weld 2.0</strong> is being used as CDI 1.1 container).</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default">&lt;web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;
&lt;listener&gt;
&lt;listener-class&gt;org.jboss.weld.environment.servlet.Listener&lt;/listener-class&gt;
&lt;/listener&gt;
&lt;servlet&gt;
&lt;servlet-name&gt;CXFServlet&lt;/servlet-name&gt;
&lt;display-name&gt;CXF Servlet&lt;/display-name&gt;
&lt;servlet-class&gt;org.apache.cxf.cdi.CXFCdiServlet&lt;/servlet-class&gt;
&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
&lt;/servlet&gt;
&lt;servlet-mapping&gt;
&lt;servlet-name&gt;CXFServlet&lt;/servlet-name&gt;
&lt;url-pattern&gt;/rest/*&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;
&lt;resource-env-ref&gt;
&lt;resource-env-ref-name&gt;BeanManager&lt;/resource-env-ref-name&gt;
&lt;resource-env-ref-type&gt;javax.enterprise.inject.spi.BeanManager
&lt;/resource-env-ref-type&gt;
&lt;/resource-env-ref&gt;
&lt;/web-app&gt;</pre>
</div></div><p>Tomcat 7/8 server has a different API, by still quite simple initialization procedure.</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default">final Tomcat server = new Tomcat();
server.setPort(&lt;port&gt;);
final File base = createTemporaryDirectory();
server.setBaseDir(base.getAbsolutePath());
server.getHost().setAppBase(base.getAbsolutePath());
server.getHost().setAutoDeploy(true);
server.getHost().setDeployOnStartup(true);
server.addWebapp(&lt;context path&gt;, &lt;path to WAR folder/file&gt;);
server.start();</pre>
</div></div><h1 id="UsingCXFandCDI1.1(JSR346)-Futurework">Future work</h1><p>The Apache CXF team is committed to improve the CDI integration and to cover more deployment scenarios and wide range of application configurations and demands. However, by and large the CDI integration is implementation-independent and it is expected to work in JBoss WildFly or other EE containers.</p></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=40509086">edit page</a>)
(<a href="https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=40509086&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>