Apache CXF 2.4.6 Release Notes

1. Overview

The 2.4.x versions of Apache CXF are significant new versions of CXF 
that provides several new features and enhancements.  

New features include: 
* Log Browser Console - see the logbrowser sample for an example
* Transformation feature provides for a fast and effective way to transform inbound 
  and/or outbound XML messages, please see the TransformationFeature page for more 
  information.
* JIBX databinding
* Faster startup and reduced spring configuration. The Spring support has been redone
  to be based on the ExtensionManagerBus. This results in much faster startup. It also
  means that all of the imports of META-INF/cxf/cxf-extension-*.xml are no longer 
  needed and are deprecated.  Additionaly, all features are now available when 
  using the ExtensionManager Bus instead of being forced to use Spring.
* WSS4J has been updated from 1.5.x to 1.6. See http://ws.apache.org/wss4j/wss4j16.html
  for the list of new features and upgrade notes for Apache WSS4J 1.6.  Some notable new 
  features for CXF users include:
    * SAML2 support: WSS4J 1.6 includes full support for creating, manipulating and 
    parsing SAML2 assertions, via the Opensaml2 library. See
    http://coheigea.blogspot.com/2011/02/support-for-saml2-assertions-in-wss4j.html 
    for more information.
    * Performance work: A general code-rewrite has been done with a focus on improving 
    performance.
    * Support for Crypto trust-stores: WSS4J 1.6 separates the concept of keystore and 
    truststores. See http://coheigea.blogspot.com/2011/01/wss4j-16-crypto-property-change.html
    for more information.
 * WS-SecurityPolicy support for SAML tokens.
 * Initial OSGi Blueprint support for JAX-WS and JAX-RS
 * A simple framework for building an STS was added to CXF's WS-Security module.   See the
   sts_issue_operation sample to see this being used to generate SAML tokens based on X509 
   certs used for the authentication.


Users are encourage to review the migration guide at:
http://cxf.apache.org/docs/24-migration-guide.html
for further information and requirements for upgrading to 2.4.0.   In particular, the upgrades 
to WSS4J and Neethi will require some migration work if you use the WSS4J API's directly or
have created your own Policy objects or builders.   Additionally, XmlSchema was update to 2.0 
so any custom Aegis types may need to be updated.


2.4.6 fixes over 25 JIRA issues reported by users and the community.


2. Installation Prerequisites 

Before installing Apache CXF, make sure the following products,
with the specified versions, are installed on your system:

    * Java 5 Development Kit
    * Apache Maven 2.2.1 or 3.x
    * Some samples can be built with Apache Ant 1.6 or later


3.  Integrating CXF Into You Application

If you use Maven to build your application, you need merely add
appropriate dependencies. See the pom.xml files in the samples.

If you don't use Maven, you'll need to add one or more jars to your
classpath. The file lib/WHICH_JARS should help you decide which 
jars you need.

4. Building the Samples

Building the samples included in the binary distribution is easy. Change to
the samples directory and follow the build instructions in the README.txt file 
included with each sample.

5. Reporting Problems

If you have any problems or want to send feedback of any kind, please e-mail the
CXF dev list, dev@cxf.apache.org.  You can also file issues in JIRA at:

http://issues.apache.org/jira/browse/CXF


6. Migration notes:

See the migration guide at:
http://cxf.apache.org/docs/24-migration-guide.html
for caveats when upgrading from CXF 2.3.x to 2.4.x.

7. Specific issues, features, and improvements fixed in this version


** Bug
    * [CXF-3976] - SoapTransportFactory.getConduit(EndpointInfo ei, EndpointReferenceType target) ignores second parameter
    * [CXF-3981] - WS-Addressing related faults do not contain addressing headers
    * [CXF-3984] - Impossible to handle Locale parameters with country qualifiers 
    * [CXF-3986] - Update MessageContext.getContextualProperty to check Exchange if the property is of type Class 
    * [CXF-3989] - messageConetxt.setScope(MessageContext.HTTP_REQUEST_HEADERS, Scope.APPLICATION) leads to  java.lang.IllegalArgumentException
    * [CXF-3991] - Address information should be added to error message if conduit is not found
    * [CXF-3993] - WS-RM's blueprint configuration fails to parse RMAssertion entries
    * [CXF-4007] - Jetty threading parameters doesn't setup threadpool properly
    * [CXF-4012] - The AlgorithmSuite class does not use the WS-SP standard maximum symmetric key size
    * [CXF-4015] - wadl2java: xs:integer param is generated as invalid type
    * [CXF-4016] - JAX-WS schema generation of an Exception annoted with @WebFault that contains a property of a class annotated with @XmlRootElement causes the schema of the WSDL to generate the incorrectly
    * [CXF-4017] - SchemaCollection.addCrossImports handles only XmlSchemaSequence instead of all XmlSchemaGroupParticle
    * [CXF-4018] - JAX-WS Providers created from class (instead of an actual instance bean) do not get the JAXWSMethodInvoker
    * [CXF-4027] - Aegis BeanType does not ignore super type of java.lang.Enum
    * [CXF-4031] - NullPoint Exception Raised when input is nothing  and using Holder to return response
    * [CXF-4036] - JAXBContextInitializer ignores some javax.xml.bind Annotations
    * [CXF-4037] - Problem creating dynamic client when WSDL is hosted with secured transport (https)
    * [CXF-4042] - When generating schema/wsdl, schemaLocations provided via @XmlSchema are dropped
    * [CXF-4043] - JSONProvider can not get a custom prefix set for a collection wrapper element
    * [CXF-4044] - ensure publishedEndpointUrl property could be set to endpoint
    * [CXF-4045] - BusFactory does not catch NoClassDefFoundError

** Improvement
    * [CXF-3979] - specify cxf-bundle start-level less than 60
    * [CXF-3988] - org.apache.cxf.jaxrs.ext.multipart.Attachment object should be mutable
    * [CXF-3990] - Change scope for EffectivePolicyImpl.initilise() and EndpointPolicyImpl.initilise() to more permissive
    * [CXF-3996] - Extend POLICY_OVERRIDE property to service IN
    * [CXF-4000] - Update JSONProvider to get the response optionally formatted
    * [CXF-4033] - Interceptor and Features annotations require context classloader
    * [CXF-4039] - If the wsdlLocation is not a valid URL, you class.getResource(...)

** Task
    * [CXF-3999] - Update Jettison version to 1.3.1



