
                          Apache Woden/C

  What is it?
  -----------


  Apache Woden C Woden project is aimed at writing a wsdl parser capable of parsing
  the documents conforming to both Wsdl 2.0 and Wsdl 1.0 specifications.
  Axis2 C project use Woden C to parse Wsdl's into a component model.
  
  As a project of the Apache Software Foundation, the
  developers aim to collaboratively develop and maintain a robust,
  commercial-grade, standards-based Web Services stack implementation with
  freely available source code.

  The Latest Version
  ------------------

  You can get the latest svn checkout of Apache Woden/C module from

  https://svn.apache.org/repos/asf/webservices/axis2/trunk/c/woden

  Installation
  ------------

  Please see the file called INSTALL.

  Licensing
  ---------

  Please see the file called LICENSE.

  Contacts
  --------

     o If you want freely available support for using Apache Woden/C please
       join the Apache Axis2/C user community by subscribing to users mailing
       list, axis-c-user@ws.apache.org' as described at
       http://ws.apache.org/axis2/c/mail-lists.html

     o If you have a bug report for Apache Woden/C please go log a Jira issue
       at http://issues.apache.org/jira/browse/AXIS2C

     o If you want to participate in actively developing Apache Woden/C please
       subscribe to the `axis-c-dev@ws.apache.org' mailing list as described at
       http://ws.apache.org/axis2/c/mail-lists.html

  Acknowledgments
  ----------------

  Apache Woden/C relies heavily on the use of autoconf, automake and libtool
  to provide a build environment.
