Welcome to Apache Camel
=============================================================================== 

Apache Camel is a powerful Spring based Integration Framework.

Camel implements the Enterprise Integration Patterns allowing you to configure
routing and mediation rules in either a Java based Domain Specific Language
(or Fluent API) or via Spring based XML Configuration files. Either approaches
mean you get smart completion of routing rules in your IDE whether in your
Java or XML editor.

Apache Camel uses URIs so that it can easily work directly with any kind of
transport or messaging model such as HTTP, ActiveMQ, JMS, JBI, SCA, MINA
or CXF Bus API together with and working with pluggable Data Format options.
Apache Camel is a small library which has minimal dependencies for easy
embedding in any Java application.

Apache Camel can be used as a routing and mediation engine for the
following projects:

    * Apache ActiveMQ which is the most popular and powerful open
      source message broker
    * Apache CXF which is a smart web services suite (JAX-WS)
    * Apache MINA a networking framework
    * Apache ServiceMix which is the most popular and powerful distributed
      open source ESB and JBI container


Getting Started
=============================================================================== 

To help you get started, try the following links:

Getting Started
  http://camel.apache.org/getting-started.html

Building
  http://camel.apache.org/building.html

We welcome contributions of all kinds, for details of how you can help
  http://camel.apache.org/contributing.html

Please refer to the website for details of finding the issue tracker, 
email lists, wiki or IRC channel
  http://camel.apache.org/

If you hit any problems please talk to us on the Camel Forums
  http://camel.apache.org/discussion-forums.html

Please help us make Apache Camel better - we appreciate any feedback 
you may have.

Enjoy!

-----------------
The Camel riders!

Licensing
=============================================================================== 

This software is licensed under the terms you may find in the file
named "LICENSE.txt" in this directory.
   
This distribution includes cryptographic software.  The country in
which you currently reside may have restrictions on the import,
possession, use, and/or re-export to another country, of
encryption software.  BEFORE using any encryption software, please
check your country's laws, regulations and policies concerning the
import, possession, or use, and re-export of encryption software, to
see if this is permitted.  See <http://www.wassenaar.org/> for more
information.

The U.S. Government Department of Commerce, Bureau of Industry and
Security (BIS), has classified this software as Export Commodity
Control Number (ECCN) 5D002.C.1, which includes information security
software using or performing cryptographic functions with asymmetric
algorithms.  The form and manner of this Apache Software Foundation
distribution makes it eligible for export under the License Exception
ENC Technology Software Unrestricted (TSU) exception (see the BIS
Export Administration Regulations, Section 740.13) for both object
code and source code.

The following provides more details on the included cryptographic
software:
   * camel-ftp can be configured for secure file transfers
   * camel-mail can be configured for secure email communications
   * camel-cxf can be configured for secure web service communications
   * camel-jetty can be configured to use https
   * camel-jhc can be configured as a secure http server using SSL

