<!--
  ~ Licensed to the Apache Software Foundation (ASF) under one
  ~ or more contributor license agreements. See the NOTICE file
  ~ distributed with this work for additional information
  ~ regarding copyright ownership. The ASF licenses this file
  ~ to you under the Apache License, Version 2.0 (the
  ~ "License"); you may not use this file except in compliance
  ~ with the License. You may obtain a copy of the License at
  ~
  ~ http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing,
  ~ software distributed under the License is distributed on an
  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  ~ KIND, either express or implied. See the License for the
  ~ specific language governing permissions and limitations
  ~ under the License.
  -->
<html>
<head>
  <meta http-equiv="content-type" content="">
  <title>Welcome to Apache Axis2 version @axisVersion@</title>
</head>

<body lang="en">
<h1>Welcome to Apache Axis2 version @axisVersion@</h1>

<h3>@TODAY@</h3>

<pre>Just over 4 months since the original 1.2 release, we are very proud to
announce the release of Apache Axis2 version @axisVersion@.

Downloads are available at:
    http://ws.apache.org/axis2/download.cgi

Apache Axis2 is a complete re-design and re-write of the widely used
Apache Axis engine and is a more efficient, more scalable, more modular
and more XML-oriented Web services framework. It is carefully designed to
support the easy addition of plug-in "modules" that extend its
functionality for features such as security and reliability.

Modules supporting WS-Security/Secure-Conversation (Apache Rampart),
WS-Trust (Apache Rahas), WS-Reliable Messaging (Apache Sandesha) and
WS-Eventing (Apache Savan) will be available soon after the Apache Axis2
@axisVersion@ release. Please see these projects' own sites for further information.

Major Changes Since 1.2:
- Moved to maven2 from maven1
- Significantly improved documentation
- Significantly improved support for POJO services and clients
- Significantly improved Deployment module and custom deployers
- Significantly improved support for Spring services
- Significantly improved Axis Data Binding (ADB) to increase schema
  coverage and overall stability
- Improved handler and module interfaces
- Improved Eclipse and Idea plugins
- Fixed tons of small and not-so-small bugs
- Major code cleanup and improved exception handling
- All the asynchronous MessageReceivers have been deprecated
- Deprecating the introspection to find init()/destroy() methods on service classes.
- Deprecated the Callback interface [http://wiki.apache.org/ws/FrontPage/Axis2/changesfrom1.2to1.3]
- Added a new phase called "Addressing" and moved all the addressing handlers into that phase
- Name of the wsdl2java generated Exception classes changed. 
  Earlier it had the Exception suffix and from Axis2 1.3 it has been removed
- Interface changed in ADB Datasource class
- Classpath module loading support

Known Issues and Limitations in @axisVersion@ Release:
 - Java2WSDL and runtime WSDL generation only support doc-lit/bare and doc-lit/wrapped
 - Custom deployers only work in file system based repository.
 - POJO does not support HasMap , Hastable and Vectors.
 

Apache Axis2 @axisVersion@ is a major new release compared to Axis2 1.2. We are
striving for a simple and happy first time user experience as well as a
satisfying experienced user experience with this release. We welcome any
and all feedback at:
    axis-user@ws.apache.org (please include "[axis2]" in the subject)
    axis-dev@ws.apache.org (please include "[axis2]" in the subject)
    http://issues.apache.org/jira/browse/AXIS2

Thank you for your interest in Apache Axis2!

The Axis2 Development Team
http://ws.apache.org/axis2/

------------------------------------------------------------------------------------

Features of Apache Axis2:

Programming Model
   - Simple XML-centric client API with full WSDL and policy support
   - Support for easy deployemnt of POJO with or without annotation
   - Support for Spring services and clients
   - Support for any message exchange pattern (MEP)
   - Synchronous and asynchronous programming model (both in client side and server side)
   - Archived based service deployment model supporting full service
     encapsulation 
   - Directory based service deployment support
   - Archived module deployment model supporting controlled
     extensibility with versioning support
   - Hot deployment and Hot update suport for services
   - WS-Policy driven code generation extensions
   - Flexible service life cycle model and session managment
   - Automatic support for POX (REST) style invocation of services
   - Support for querying service's WSDL (with ?wsdl), schema (with
     ?xsd) and policies (with ?policy)
   - Java2WSDL support for both doclit/bare and doclit/wrapped
   - Support for custom deployers
   - Classpath module loading support

Supported Specifications
   - SOAP 1.1 and 1.2
   - Message Transmission Optimization Mechanism (MTOM)
   - XML Optimized Packaging (XOP)
   - SOAP with Attachments
   - WSDL 1.1 and WSDL 2.0, including both SOAP and HTTP bindings
   - WS-Addressing submission and 1.0
   - WS-Policy
   - SAAJ 1.1

Transports
   - HTTP/HTTPS
   - SMTP
   - JMS
   - TCP

Supported Data Bindings
   - Axis Data Binding (ADB)
   - XMLBeans
   - JibX
   - JaxMe (Experimental)
   - JaxBRI (Experimental)

Tools
   - WSDL2Java: Generate Java stubs and skeletons from a WSDL document.
   - Java2WSDL: Generate a WSDL document from a Java class.
   - Eclipse Plugins
   - IntelliJ Idea Plugins
   - Maven2 Plugins
   - Web application for administering Apache Axis2
    </pre>
</body>
</html>
