
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 2.0-beta-2
                        Release Notes


INTRODUCTION:

This document contains the release notes for the 2.0-beta-2 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 2.0 and onwards now targets Java 6.0, making use of features that arrived with Java 5.0 
such as generics and concurrency.

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

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

Apache Commons JCS is a distributed, versatile caching system.

JDK 1.6 based major release (beta-2)

Changes in this version include:

New features:
o JCS-54:   Add soft reference memory cache Thanks to Tore Halset.
o           Add verification of block disk cache key file. Thanks to Wiktor Niesiobedzki.
o           Add orderly shutdown of ThreadPoolManager
o JCS-147:  Provide file size limitation for Block Disk Cache and Indexed Disk Cache Thanks to Wiktor Niesiobedzki.

Fixed Bugs:
o JCS-165:  Fix: BlockDiskCache partial remove / group remove doesn't work Thanks to Wiktor Niesiobedzki.
o JCS-156:  BlockDiskCache is limited to 2GB Thanks to Ryan Fong.
o JCS-162:  Fix: Memory region properties documentation incorrect Thanks to Ryan Fong.
o JCS-161:  Fix: Dynamic regions leak memory upon dispose due to ShrinkerTask Thanks to Ryan Fong.
o JCS-78:   Fix: RemoteCacheStartupServlet can't start with config outside classpath Thanks to Marko Stipanov.
o JCS-159:  Fix: BlockDiskCache overwrites data after loading from disk Thanks to Wiktor Niesiobedzki.
o           Fix Javadoc for Java 8 Thanks to Mat Jaggard.
o JCS-116:  Fix: CompositeCacheManager is thread-hostile Thanks to Sebb.
o JCS-158:  Fix NullPointerException in IndexedDiskCache.addToRecycleBin(...) Thanks to Wiktor Niesiobedzki.
o JCS-153:  Fix file size limitation for Block Disk Cache and Indexed Disk Cache Thanks to Wiktor Niesiobedzki.
o JCS-149:  When reading keys from disk, a StreamCorruptedException happens when a custom serializer is applied Thanks to Youngho Cho.
o           Fix removal of items from group cache, added several tests
o JCS-140:  JCacheFilter code logic error, first hit always fails Thanks to liangjiarui.
o JCS-96:   Incomplete shutdown of RemoteCacheServer Thanks to Gregory Fernandez.
o JCS-148:  Unnecessary use of FileChannel.force() in Indexed and Block Disk Caches Thanks to Wiktor Niesiobedzki.
o JCS-146:  IndexedDiskCache: Mismatched memory and disk length (0) for 
            [DED:  pos = 63802 len = 9658] during optimization Thanks to Wiktor Niesiobedzki.
o JCS-145:  AbstractDiskCacheAttributes logs error, when directory already exists Thanks to Wiktor Niesiobedzki.
o JCS-144:  BlockDiskCache hangs on SEVERE: Region [TMS] Failure getting from disk--IOException Thanks to Wiktor Niesiobedzki.
o JCS-141:  RemoteCacheServerFactory ignores configuration Thanks to validruk.

Changes:
o JCS-130:  Simplify management of auxiliary caches
o           Reduce synchronization
o JCS-48:   Replace PoolAccess with a DataSourceFactory model borrowed from DB-Torque Thanks to Hanasaki Jiji.
o JCS-124:  Make the code in Step 5 on the JCS overview page a full working class that can compile Thanks to Richard Eigenmann.

Removed:
o           Remove size limitation configuration of indexed cache recycle bin
o           Replace SortedPreferentialArray with JDK ConcurrentSkipListSet
o           Replace SingleLinkedList with JDK ConcurrentLinkedQueue

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/