
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 Commons JCS
                        Version 3.1
                        Release Notes


INTRODUCTION:

This document contains the release notes for the 3.1 version of Apache Commons JCS.
Commons JCS is a distributed caching system written in Java. It is intend to speed up 
applications by providing a means to manage cached data of various dynamic natures.

JCS 3.0 and onwards now targets Java 8.0, making use of features that arrived with Java 8.0 
such as lambdas.

For the advice on upgrading from 2.x to 3.x, see the following page: 

    http://commons.apache.org/proper/commons-jcs/UpgradingFrom2x.html

Changes in this version include:

New features:
o           Add EncryptingSerializer and some documentation
o           Add BlockDiskKeyStore.isEmpty(). Thanks to Gary Gregory.
o           Add IndexedDisk.isEmpty(). Thanks to Gary Gregory.

Fixed Bugs:
o           Use new SecureRandom() instead of SecureRandom.getStrongInstance() to 
            avoid potential performance problems on Linux Thanks to Bruno Kinoshita.
o JCS-228:  Attempt to fix osgi import packages Thanks to Patrick Ziegler.
o JCS-191:  Fix for Server Failover mechanism not working, add test Thanks to Prajakta Uplaikar.
o JCS-186:  Use configured listener address for UDP service broadcast Thanks to Alex L.
o JCS-186:  Fix UDP service discovery with LateralCache Thanks to Alex L.
o           Fix shutdown race conditions

Changes:
o           Update from Apache Log4j 2.14.1 to 2.17.1 Thanks to Gary Gregory.
o           Autodetect lateral service address on the interface used for multicast - 
            depending on the multicast protocol: 
            IPv6 link-local address for IPv6 multicast,
            IPv4 site-local address for IPv4 multicast
o           Use NIO for UDP service discovery, works with IPv6 now
o           Use NIO for LateralTCPListener
o           IMPORTANT CHANGE
            Use IElementSerializer for LateralTCPSender and listener
o           IMPORTANT CHANGE
            Use IElementSerializer for RemoteHttpCacheServlet
o           IMPORTANT CHANGE
            Use IElementSerializer for Block disk key storage
o           IMPORTANT CHANGE
            Use IElementSerializer for UDP service discovery
o           Replace several Runnable classes with Lambdas
            Deprecate original classes
o           Update from Apache Commons Lang 3.10 to 3.12.0. Thanks to Gary Gregory.
o           Bump build actions/setup-java from v1.4.3 to v2. Thanks to Gary Gregory.
o           Update from Apache Commons IO 2.8.0 to 2.10.0, #72. Thanks to Gary Gregory, Dependabot.
o           Bump actions/cache from 2.1.5 to 2.1.6 #70. Thanks to Dependabot.
o           Bump log4j-api from 2.13.2 to 2.17.1 #79, #81. Thanks to Dependabot.

Removed:
o           Remove support for long deprecated and inconsistent 
            RemoteCacheServer configuration keys
            - remote.cache.service.port is now jcs.remotecache.serverattributes.servicePort
            - remote.cache.rmiSocketFactoryTimeoutMillis is now jcs.remotecache.serverattributes.rmiSocketFactoryTimeoutMillis
            - remote.cluster.LocalClusterConsistency is now jcs.remotecache.serverattributes.LocalClusterConsistency
            - remote.cluster.AllowClusterGet is now jcs.remotecache.serverattributes.AllowClusterGet

Historical list of changes: http://commons.apache.org/proper/commons-jcs/changes-report.html

For complete information on Apache Commons JCS, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Commons JCS website:

http://commons.apache.org/proper/commons-jcs/