<!--
  ~ 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>Axis2 1.4.1 release mainly fixes a security vulnerability in Axis2 1.4.  

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.

Known Issues and Limitations in @axisVersion@ Release:
- Please see JIRA

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 POJO and Spring services and clients
   - Support for any message exchange pattern (MEP)
   - Synchronous and asynchronous programming model
   - Archived service deployment model supporting full service
     encapsulation with versioning support
   - Archived module deployment model supporting controlled
     extensibility with versioning support
   - Hot deployment
   - WS-Policy driven code generation extensions
   - Flexible service life cycle model
   - Automatic support for POX (REST) style invocation of services
   - Support for querying service's WSDL (with ?wsdl), schema (with
     ?xsd) and policies (with ?policy)

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

Transports
   - HTTP
   - SMTP
   - JMS
   - TCP

Supported Data Bindings
   - Axis Data Binding (ADB)
   - XMLBeans
   - JibX
   - 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
   
Bugs marked as Resolved/Fixed after 1.4 Release:

AXIS2-3821 JMS binding details are not included in the generated wsdl (?wsdl)
AXIS2-3529 Axis2 server responds with Http 200 instead of 202 for the request of a dual channel invocation
AXIS2-3916 ADB does not handles the daylight saving times
AXIS2-3917 Out bound binding message is not set correctly
AXIS2-3958 ConcurrentModificationException in AxisConfiguration
AXIS2-3942 Binding operations are not added for Modules having module operations
AXIS2-3935 Faults in the binding section od WSDL2 should be fault and not outfault
AXIS2-3859 If a service is deployed using WSDL 2.0 the genarated ?wsdl2 does not show the endpoints
AXIS2-3870 Memory Leak using ServiceClient
AXIS2-3950 Message level policies not picked up by Codegen
AXIS2-3907 Message level policy not serialized correctly in wsdl 1.1
AXIS2-3930 Missing policy reference serialization in AxisService2WSDL11
AXIS2-3913 Multiple policies not serialized correctly at service level (as portType PolicyURIs attribute)
AXIS2-3819 Parameter ordering screws up in the genarated WSDL when the original WSDL has multiple message parts
AXIS2-3915 Policies attached using the wsp:PolicyURIs attribute are not included in the code generated Stub
AXIS2-3936 Private assertions are not filtered in WSDL 2.0
AXIS2-3914 Remove servlet-api-2.3.jar from axis2.war
AXIS2-3905 Requests coming through the old EPR are not dispatched to a binding
AXIS2-3961 The endpoint address for a JMS endpoint appears as null in the WSDL
AXIS2-3887 The servlet transport does not set the HTTP response code to 500 when a SOAP fault is returned (unless an exception was thrown)
AXIS2-3903 rfc-2822 issues with Mail transport
AXIS2-3877 whttp:locations do not take into the account correct endpoint urls of the form service.endpoint name
AXIS2-3908 Prevent StackOverFlowError in AxisServlet
AXIS2-3920 Allow to disable HTTP binding at service level using a parameter in services.xml
AXIS2-3909 icu4j.jar packaged in the axis2.war contains a corrupt class file

    </pre>
</body>
</html>
