//
// 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 WSS4J 2.2.0 Migration Guide

This section is a migration guide for helping Apache WSS4J 2.1.x users to migrate
to the 2.2.x releases. 

==== JDK8 minimum requirement

WSS4J 2.1.x required JDK7 as a minimum requirement. WSS4J 2.2.x requires at
least JDK8. 

==== Base64 changes

In WSS4J 2.1.x, the Base64 implementation that ships with the JDK
(java.util.Base64) is used, instead of the Base64 implementation that ships 
with Apache Santuario. It is unlikely, but this may have an impact on users
who are parsing messages with Base64 implementations that depend on specific
CR or LF characters, as the Santuario and Java Base64 implementations differ
slightly. Both the Apache Santuario and Java Base64 implementations can 
correctly decode the messages created with Apache WSS4J 2.2.x.

==== Kerberos changes

There are some changes with regards to Kerberos in WSS4J 2.1.x. The
KerberosClientAction and KerberosServiceAction classes are removed. Instead 
use KerberosClientExceptionAction and KerberosServiceExceptionAction in the
same package. The KerberosTokenDecoderImpl is removed as we can now get access
to the secret key via the JDK APIs. As a consequence, the ws-security-common
module no longer has a dependency on Apache Directory.

