Apache Tuscany SCA 2.0-Beta1 November 2010 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-Beta1 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 Client & Implementation: Spring 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 Beta1 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.

Known Issues
------------

If when building using the source distribution of tuscany you see build errors 
relating to use of hazelcast, this is a known issue which occurs in some
environments where our use of hazelcast doesn't match up with your network
configuration. If you see these errors please contact us on the mailing list
as described below. You may wish to build using the
"mvn -fae"
command, so that the rest of the build completes before it reports the issue.

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.
