~~ 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.

           -----------------------------------
           Apache Neethi - Migration Guide
           -----------------------------------

Migrating from Apache Neethi 2 to 3

    Neethi 3 is a major upgrade from Neethi 2 providing several new features 
    and enhanced capabilities.  While effort was made to make it easy to 
    transition from Neeth 2 to Neethi 3, some changes are required.

    * Java 5 collections - all the collections and iterators have been 
    updated to specify the proper types they contain.  Upgrading to Neethi
    3 will likely require proper typing in existing code to reduce warnings.

    * Assertion.isIgnorable() - to support WS-Policy 1.5, an isIgnorable 
    method was added to the Assertion interface and any policy assertions
    that implement that interface must be updated to add that method.
    In addition, it is recommend that all AssertionBuilders builders be
    updated to look for the ignorable attribute and set it appropriately.

    * AssertionBuilders - AssertionBuilders are no longer tied to Axiom.  
    The AssertionBuilder interface is now typed to specify the object model
    the builder expects for the first parameter for the build method.  The
    type can be any type for which there is a Converter registered.  By 
    default, there are converters for DOM Elements and XMLStreamReaders. 
    If the Axiom jars are available, there are Converters for OMElement as 
    well.  The easiest migration path is to make your builders implement 
    "AssertionBuilder<OMElement>".   

    * The default assertion implement has changed.  In 2.x, the default
    implementation was the XmlPrimitiveAssertion which just wrappered
    the OMElement.  With 3.x, the default depends on the assertion
    being built.   If its a single element with either no content or 
    text content, it will be a PrimitiveAssertion.   If it contains
    a single child Policy element, it will be a 
    PolicyContainingPrimitiveAssertion.  Otherwise it will be a 
    XmlPrimitiveAssertion. These changes to the default assertions allows 
    the runtime to know more about the policy so methods like intersect 
    could be added.   

    * Two new interfaces were added that Assertions can (optionally) 
    implement.  The PolicyContainingAssertion interface is used
    to mark assertions that contain an internal Policy.  This allows
    the normalization and intersect operations to examine the internal
    policy as well.  The IntersectableAssertion interface adds methods
    that an Assertion can override algorithms in the intersection
    process to provide custom behavoir.  For example, per spec, the
    intersection algorithm should not consider attributes.   However,
    an application internal policy may want to consider them for 
    various reasons. 


  
