Apache Tuscany SCA 2.0-Beta3 July 2011 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
--------

The Apache Tuscany SCA 2.0-Beta2 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, HTTP, JSON-RPC, 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.
 
For this Beta2 release the remote Domain support is disabled pending 
some up-coming changes in the way that domains are addressed and accessed. 
This means that the scaclient-* samples don't work and cross JVM applications 
that rely on binding-sca won't work. 

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.
