Apache Tuscany SCA 2.0 April 2012 Release Notes
===============================================

Apache Tuscany provides a runtime based on the Service Component
Architecture. SCA is a set of specifications aimed at simplifying SOA
Application Development which are being standardized at OASIS as part
of Open Composite Services Architecture (Open CSA) - http://www.oasis-opencsa.org/.

Overview
--------

This Apache Tuscany SCA release includes implementations of the main SCA 
specifications and recent updates from Open CSA drafts including:

        * SCA Assembly Model V1.1 
        * SCA Policy Framework V1.1 
        * SCA Java Common Annotations and APIs V1.1
        * SCA Java Component Implementation V1.1
        * SCA Web Services Binding V1.1
        * SCA JMS Binding V1.1
        * SCA Spring Client and Implementation V1.1
        * SCA WS-BPEL Client and Implementation V1.1
        (portions of) SCA JEE Integration V1.1

For those specs marked * the Tuscany runtime passes the 
OASIS conformance tests (otests) for the specs as they stand
at the time of release. If you want to see the tests run you
can manually remove the comment that prevents them running 
in the main build in the following Maven pom:

        testing/compliance-tests/pom.xml

The distribution also includes implementations of many features not 
yet defined by SCA specifications, including:

        - SCA bindings for RMI, REST, WebSockets, Comet, HTTP, JSON-RPC, JSONP, ATOM.
        - Databindings for JAXB, Axis2's AXIOM, DOM, SAX and StAX
        - Integration with various web frameworks

The Tuscany SCA Runtime can be configured as a single node SCA domain.
 
In addition Tuscany SCA supports the following host-deployment options: -
        - running standalone 
        - running in a OSGi enabled runtime Environment (Equinox)
        - running with distributed nodes across multiple JVMs
     
See the CHANGES file for a detailed list of the features in this release.


Support
-------

For more information on Apache Tuscany visit the website at:

    http://tuscany.apache.org/tuscany/
 
Any issues with this release can be reported to Apache Tuscany
using the mailing lists or in the JIRA issue tracker.

    Mailing list archives:

       http://mail-archives.apache.org/mod_mbox/tuscany-user/
       http://mail-archives.apache.org/mod_mbox/tuscany-dev/

    Jira:

       http://issues.apache.org/jira/browse/TUSCANY

To join the project's mailing lists follow the instructions at:

    http://incubator.apache.org/tuscany/mailing-lists.html

To find out more about OASIS Open CSA go to: 

    http://www.oasis-opencsa.org.

Apache Tuscany welcomes your help. Any contribution, including code,
testing, improving the documentation, or bug reporting is always
appreciated. 

Thank you for using Apache Tuscany!

- The Tuscany Team.
